2009-08-10 5 views
2

Ich brauche eine portable Funktion/Subroutine, um die Position des letzten nicht leeren Zeichens in einer Zeichenfolge zu finden. Ich habe zwei Optionen gefunden: LEN_TRIM und LNBLNK. Verschiedene Compiler scheinen jedoch unterschiedliche Standards zu haben. Die offizielle Dokumentation für folgende Compiler schlägt vor, dass LEN_TRIM Teil des Fortran 95-Standard auf den folgenden Plattformen ist:Zeichenketten in Fortran: Portable LEN_TRIM und LNBLNK?

Allerdings ist es Es scheint, dass bei Compilern, die vor dem F95-Standard veröffentlicht wurden, nichts garantiert ist. Meine Erfahrung ist, dass ältere Compiler entweder LEN_TRIM oder LNBLNK angeben können, aber nicht unbedingt beides. Meine Lösung war Präprozessor conditionals zu verwenden:

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

und dann -DUSE_LEN_TRIM an den Präprozessor übergeben. Allerdings bin ich kein großer Fan von Präprozessor-Bedingungen & zusätzliche Kompilierzeit Flags. Haben Sie Vorschläge für eine portable Funktion (vor dem Fortran 95-Standard), die die Position des letzten nicht leeren Zeichens in einer Zeichenfolge feststellt?

Antwort

3

LEN_TRIM ist Teil des Fortran 95-Standards. Mir ist keine einfache Kombination von intrinsischen Substanzen in Fortran 77 bekannt, die dieses Problem lösen könnte (TRIM erschien auch mit Fortran 95 und war in Fortran 77 nicht verfügbar). Aber Sie können eine einfache Benutzer Funktion verwenden, um diese Aufgabe zu erfüllen, wenn Sie wirklich tragbar sein wollen, ohne sich auf Compiler-Spezifika und Präprozessor:

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 

(getestet mit g77 und gfortran; verwenden Sie die Option -ffree-form Freiform-Quelle zu kompilieren so was).

2

Vor dem Standard würde ich Nein sagen. Ich habe gesehen, dass die len_trim-Funktion von Hand auf F77-Codes implementiert wurde. Wenn Sie gegenüber älteren Compilern Standard sein möchten, müssen Sie Ihre eigene Implementierung als Failsafe bereitstellen und einen Präprozessor-Conditional verwenden, um auszuwählen, was Sie benötigen.

2

Ich bin stecken versuchen zu finden, wenn es sich um einen Pre-Fortran 95 oder nicht, aber tut

len(trim(s)) 

Arbeit?

+0

mhmhmh. sieht so aus, obwohl ich nicht darauf wetten würde. Getestet sowohl auf G95 als auch auf G77. –

+1

LEN == F77 Standard; TRIM == F95-Standard – Pete