2009-08-10 10 views
2

J'ai besoin d'une fonction/sous-routine portable pour localiser la position du dernier caractère non vide dans une chaîne. J'ai trouvé deux options: LEN_TRIM et LNBLNK. Cependant, différents compilateurs semblent avoir des normes différentes. La documentation officielle pour les compilateurs suivants suggère que LEN_TRIM fait partie de la norme Fortran 95 sur les plates-formes suivantes:Chaînes de caractères dans Fortran: Portable LEN_TRIM et LNBLNK?

Cependant, il semble que rien n'est garanti sur les compilateurs sortis avant la norme F95. Mon expérience a été que les anciens compilateurs pourraient spécifier soit LEN_TRIM ou LNBLNK, mais pas nécessairement les deux. Ma solution a été d'utiliser conditionals préprocesseur:

#ifdef USE_LEN_TRIM 
     iNameLen = LEN_TRIM(cabase) 
     iExtLen = LEN_TRIM(caext) 
#else 
     iNameLen = LNBLNK(cabase) 
     iExtLen = LNBLNK(caext) 
#endif 

puis passer -DUSE_LEN_TRIM au préprocesseur. Cependant, je ne suis pas un grand fan de conditionnels préprocesseur & drapeaux supplémentaires à la compilation. Avez-vous des suggestions pour une fonction portable (avant la norme Fortran 95) qui localise la position du dernier caractère non vide dans une chaîne?

Répondre

3

LEN_TRIM fait partie de la norme Fortran 95. Je ne suis pas au courant d'une simple combinaison d'intrinsèques dans Fortran 77 qui pourrait résoudre ce problème (TRIM est également apparu avec Fortran 95, et n'était pas disponible dans Fortran 77). Mais vous pouvez utiliser une fonction utilisateur simple pour effectuer cette tâche si vous voulez vraiment être portable sans compter sur intrinsics du compilateur et préprocesseur:

function lentrim(s) 
    implicit none 
    character(len=*) :: s 
    integer lentrim 

    do lentrim = len(s), 1, -1 
     if (s(lentrim:lentrim) .ne. ' ') return 
    end do 
    end function lentrim 

(testé avec g77 et gfortran, utilisez l'option -ffree-form pour compiler la source de forme libre comme ça).

2

Avant le standard, je dirais non. J'ai vu la fonction len_trim implémentée à la main sur les codes F77. Si vous voulez être standard avec les anciens compilateurs, vous devrez fournir votre propre implémentation comme sécurité intégrée, et utiliser un préprocesseur conditionnel pour choisir ce dont vous avez besoin.

2

Je suis coincé en essayant de trouver si cela est un pré-Fortran 95 ou non, mais ne

len(trim(s)) 

travail?

+0

mhmhmh. On dirait que c'est le cas, bien que je ne parierais pas dessus. testé à la fois sur g95 et g77. –

+1

LEN == F77 standard; TRIM == F95 standard – Pete