Question

J'ai une question sur Fortran 77 et je ne l'ai pas été en mesure de trouver une solution.

Je suis en train de stocker un tableau de chaînes définies comme suit:

character matname(255)*255

Wich est un tableau de chaînes de longueur 255 255.

Plus tard, je lis la liste des noms d'un fichier et je mis le contenu du tableau comme ceci:

matname(matcount) = mname

EDIT: En fait, la valeur mname est harcoded comme mname = 'AIR' de type character*255, il est un paramètre d'une fonction matadd() wich exécute la ligne précédente. Mais cela est uniquement pour les tests, dans l'avenir, il sera lu à partir d'un fichier.

Plus tard je veux l'imprimer avec:

write(*,*) matname(matidx)

Mais il semble imprimer tous les 255 caractères, il imprime la chaîne I attribué et beaucoup de déchets.

  • C'est donc ma question, comment puis-je connaître la longueur de la chaîne stockée?
  • Dois-je avoir un autre tableau avec toutes les longueurs?
  • Et comment puis-je connaître la longueur de la chaîne lue?

Merci.

Était-ce utile?

La solution

La fonction Timotei affichée vous donnera la longueur de la chaîne tant que la partie de la chaîne qui vous intéresse seulement contient des espaces, qui, si vous assignez les valeurs dans le programme doit être vrai que FORTRAN est censé initialiser les variables à vide et pour les caractères qui désigne un espace.

Cependant, si vous lisez depuis un fichier que vous pouvez prendre d'autres caractères de contrôle à la fin des lignes (en particulier de retour chariot et / ou des caractères de saut de ligne, \ r et / ou \ n en fonction de votre système d'exploitation). Vous devez également lancer ceux dans la fonction pour obtenir la longueur de chaîne correcte. Sinon, vous pouvez obtenir des déclarations d'impression drôles que ces personnages sont imprimés aussi bien.

Voici ma version de la fonction qui vérifie les caractères blancs alternatifs à la fin en dehors des espaces.

  function strlen(st)
  integer           i,strlen
  character         st*(*)
  i = len(st)
  do while ((st(i:i).eq.' ').or.(st(i:i).eq.'\r').or.
 +  (st(i:i).eq.'\n').or.(st(i:i).eq.'\t'))
    i = i - 1
  enddo
  strlen = i
  return
  end

S'il y a d'autres caractères dans la section « poubelle » ce ne fonctionne toujours pas complètement.

En supposant que cela ne fonctionne pour vos données, mais vous pouvez modifier votre déclaration d'écriture à ressembler à ceci:

write(*,*) matname(matidx)(1:strlen(matname(matidx)))

et il affichera simplement la chaîne réelle.

Quant à savoir si de tenir la longueur de la chaîne, vous devez utiliser un autre tableau ou non, qui est à vous. la fonction strlen () est O (n), tandis que la longueur recherchant dans une table est O (1). Si vous vous calculer les longueurs de ces chaînes statiques souvent, il peut améliorer les performances de calculer la longueur une fois quand ils sont lus, les stocker dans un tableau et les regarder à trouver si vous en avez besoin. Toutefois, si vous ne remarquez pas le ralentissement, je ne vous inquiétez pas.

Autres conseils

Vous pouvez utiliser cette fonction pour obtenir la longueur (sans queue blanc)

integer function strlen(st)
      integer       i
      character     st*(*)
      i = len(st)
      do while (st(i:i) .eq. ' ')
        i = i - 1
      enddo
      strlen = i
      return
      end

A été d'ici: http://www.ibiblio.org/ pub / langues / Fortran / ch2-13.html

PS: Quand vous dites: matname (matidx) il obtient toute la chaîne (256) caractères ... alors qui est votre chaîne ainsi que des blancs ou des déchets

Selon le compilateur que vous utilisez, vous pouvez être en mesure d'utiliser la fonction intrinsèque trim() pour éliminer les principaux espaces de fin / d'une chaîne, puis traiter comme vous le feriez normalement, i.e..

character(len=25) :: my_string
my_string = 'AIR'
write (*,*) ':', trim(my_string), ':'

devrait imprimer :AIR:.

Edit: Mieux encore, il semble qu'il y ait une fonction len_trim() qui retourne la longueur d'une chaîne après avoir été coupé.

Intel et Compaq Fortran visuel ont la fonction intrinsèque LEN_TRIM (chaîne) qui renvoie la longueur sans fuite des flans ou des espaces.

Si vous voulez supprimer les blancs ou les espaces, utilisez à savoir « Ajuster gauche » ADJUSTF (STRING)

Dans ces FORTRANS Je note également une fonction utile: Si vous passez une chaîne à une fonction ou sous-routine comme argument, et à l'intérieur du sous-programme, il est déclaré que le caractère * (*), puis en utilisant la fonction LEN (chaîne) dans la sous-routine retruns la longueur de chaîne réelle passée dans, et non pas la longueur de la chaîne tel que déclaré dans le programme appelant.

Exemple:       PERSONNAGE * 1000 STRING

        .
        .

  CALL SUBNAM(STRING(1:72)

  SUBROUTINE SYBNAM(STRING)
  CHARACTER*(*) STRING
  LEN(STRING) will be 72, not 1000
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top