2009-04-07 14 views
7

Ich habe eine Frage zu Fortran 77 und ich konnte keine Lösung finden.Array von Strings in Fortran 77

Ich versuche, ein Array von Strings wie folgt definiert zu speichern:

character matname(255)*255 

Wich ist ein Array von 255 Strings der Länge 255

Später las ich die Liste der Namen von a Datei und ich den Inhalt des Array wie folgt:

matname(matcount) = mname 

EDIT: Eigentlich mname Wert wird als harcoded mname = 'AIR' vom Typ character*255, es ist ein Parameter einer Funktion matadd(), die die vorherige Zeile ausführt. Aber das ist nur zum Testen, in Zukunft wird es aus einer Datei gelesen werden.

Später möchte ich es drucken, mit:

write(*,*) matname(matidx) 

Aber es scheint, alle 255 Zeichen zu drucken, druckt es die Zeichenfolge I zugeordnet und eine Menge Müll.

  • Also das ist meine Frage, wie kann ich die Länge der gespeicherten Zeichenfolge wissen?
  • Sollte ich ein anderes Array mit allen Längen haben?
  • Und wie kann ich die Länge der gelesenen Zeichenfolge wissen?

Danke.

+1

+1 - Fortran? sind Sie im Ernst? –

+1

@Ian - Warum nicht? – Rook

Antwort

4

Die Funktion Timotei veröffentlicht geben Sie die Länge der Zeichenfolge, solange der Teil der Zeichenfolge, die Sie interessiert sind nur Leerzeichen enthält, die, wenn Sie ordnen die Werte im Programm shou zu ld sei wahr, da FORTRAN die Variablen als leer und für Zeichen als Leerzeichen initialisieren soll.

Wenn Sie jedoch aus einer Datei einlesen, können Sie am Ende der Zeilen andere Steuerzeichen (insbesondere Wagenrücklauf- und/oder Zeilenvorschubzeichen, \ r und/oder \ n abhängig von Ihrem Betriebssystem) auswählen. . Sie sollten diese auch in der Funktion wegwerfen, um die korrekte Stringlänge zu erhalten. Sonst könnten Sie lustige Ausdrucke erhalten, wenn diese Zeichen ebenfalls gedruckt werden.

Hier ist meine Version der Funktion, die neben Leerzeichen auf alternative Leerzeichen am Ende prüft.

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 

Wenn im "Müll" -Abschnitt andere Zeichen vorhanden sind, funktioniert dies immer noch nicht vollständig.

Unter der Annahme, dass es für Ihre Daten nicht funktioniert, jedoch können Sie dann Ihre Schreib Aussage wie folgt aussehen ändern:

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

und es wird nur die tatsächliche Zeichenfolge ausdrucken.

Ob Sie ein anderes Array verwenden sollten, um die Länge der Zeichenfolge zu halten, bleibt Ihnen überlassen. Die Funktion strlen() ist O (n), während das Nachschlagen der Länge in einer Tabelle O (1) ist. Wenn Sie feststellen, dass die Längen dieser statischen Strings oft berechnet werden, kann die Leistung verbessert werden, um die Länge beim Einlesen einmal zu berechnen, sie in einem Array zu speichern und sie bei Bedarf nachzuschlagen. Wenn Sie die Verlangsamung jedoch nicht bemerken, würde ich mir keine Sorgen machen.

+0

Ich musste die Typdefinition der Funktion ändern, die den String als Parameter an Folgendes anliefert: 'character mname * (*)'. Vorher war das Ende dieser Variablen ein zufälliger Müll, jetzt ist es mit Leerzeichen aufgefüllt. Danke für die Erklärung, war sehr klar. Ich wusste auch nichts über die Notation. – Siu

5

können Sie diese Funktion verwenden, um die Länge zu erhalten (ohne Leer Schwanz)

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 

Got von hier: http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS: Wenn Sie sagen: matname (matidx) es wird die gesamte Zeichenfolge (256) chars ... also das ist Ihre Zeichenfolge plus Leerzeichen oder Müll

+0

+1 aber ich wünschte, es könnte mehr sein. –

+0

Vielen Dank auch, ich möchte Sie wählen, aber ich habe immer noch nicht genug Ruf. – Siu

1

auf dem Compiler Je, die Sie verwenden, können Sie in der Lage sein, die trim() intrinsische Funktion verwenden, um alle führenden zu entfernen/Leerzeichen aus einem String Hinter, dann verarbeiten sie wie gewohnt, dh

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

sollte :AIR: drucken.

Bearbeiten: Besser noch, es sieht aus wie es gibt eine len_trim() Funktion, die die Länge einer Zeichenfolge zurückgibt, nachdem es getrimmt wurde.

0

Intel und Compaq Visual Fortran haben die intrinsische Funktion LEN_TRIM (STRING), die die Länge ohne abschließende Leerzeichen oder Leerzeichen zurückgibt.

Wenn Sie führende Leerzeichen oder Leerzeichen zu unterdrücken möchten, verwenden Sie „Adjust Left“, dh ADJUSTF (STRING)

In diesen FORTRANS Ich stelle auch eine nützliche Funktion: Wenn Sie eine Zeichenfolge in eine Funktion oder ein Unterprogramm übergeben als ein Argument, und innerhalb der Subroutine wird es als CHARACTER * (*) deklariert, dann mit der LEN (STRING) -Funktion in der Unterroutine retruns die tatsächlich übergebene Zeichenfolge Länge und nicht die Länge der Zeichenfolge wie im aufrufenden Programm deklariert .

Beispiel: CHARACTER * 1000 STRING

 . 
     . 

    CALL SUBNAM(STRING(1:72) 

    SUBROUTINE SYBNAM(STRING) 
    CHARACTER*(*) STRING 
    LEN(STRING) will be 72, not 1000 
+0

Die Verwendung einer Struktur für die Zeichenfolge und deren Länge ist manchmal sinnvoll. – Holmz

Verwandte Themen