7 Stimmen

Array von Zeichenketten in Fortran 77

Ich habe eine Frage zu Fortran 77 und konnte bisher keine Lösung finden.

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

character matname(255)*255

Das ist ein Array von 255 Zeichenfolgen der Länge 255.

Später lese ich die Liste der Namen aus einer Datei und setze den Inhalt des Arrays wie folgt:

matname(matcount) = mname

EDIT: Eigentlich mname Wert ist hartkodiert als mname = 'AIR' vom Typ character*255 ist er ein Parameter einer Funktion matadd() was 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 mit ausdrucken:

write(*,*) matname(matidx)

Aber es scheint alle 255 Zeichen zu drucken, es druckt die Zeichenfolge, die ich zugewiesen habe, und eine Menge Müll.

  • Das ist also meine Frage, wie kann ich die Länge der gespeicherten Zeichenfolge kennen?
  • Sollte ich ein weiteres Feld mit allen Längen anlegen?
  • Und wie kann ich die Länge der gelesenen Zeichenfolge ermitteln?

Merci.

5voto

Timotei Punkte 1848

Sie können diese Funktion verwenden, um die Länge (ohne leeres Ende) zu ermitteln

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

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

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

4voto

dagorym Punkte 5395

Die Funktion, die Timotei gepostet hat, gibt Ihnen die Länge der Zeichenkette, solange der Teil der Zeichenkette, an dem Sie interessiert sind, nur Leerzeichen enthält, was, wenn Sie die Werte im Programm zuweisen, wahr sein sollte, da FORTRAN die Variablen so initialisieren soll, dass sie leer sind, und für Zeichen bedeutet das ein Leerzeichen.

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

Hier ist meine Version der Funktion, die neben Leerzeichen auch nach anderen Leerzeichen am Ende sucht.

  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 sich noch andere Zeichen im "Müll"-Bereich befinden, wird dies trotzdem nicht vollständig funktionieren.

Angenommen, dass dies für Ihre Daten funktioniert, können Sie Ihre Schreibanweisung wie folgt ändern:

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

und es wird nur die aktuelle Zeichenkette ausgedruckt.

Ob Sie ein weiteres Array verwenden sollten, um die Länge der Zeichenkette zu speichern, bleibt Ihnen überlassen. Die Funktion strlen() ist O(n), während das Nachschlagen der Länge in einer Tabelle O(1) ist. Wenn Sie die Längen dieser statischen Zeichenketten häufig berechnen müssen, kann es die Leistung verbessern, die Länge einmal beim Einlesen 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.

1voto

Tim Whitcomb Punkte 9987

Je nach dem von Ihnen verwendeten Compiler können Sie möglicherweise die trim() intrinsische Funktion, um alle führenden/nachfolgenden Leerzeichen aus einer Zeichenkette zu entfernen, und verarbeiten Sie sie dann wie gewohnt, d. h.

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

sollte drucken :AIR: .

Bearbeiten: Noch besser: Es sieht so aus, als gäbe es eine len_trim() Funktion, die die Länge einer Zeichenkette zurückgibt, nachdem sie abgeschnitten wurde.

0voto

Paul Punkte 84

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

Wenn Sie führende Leerzeichen unterdrücken wollen, verwenden Sie "Adjust Left", d.h. ADJUSTF(STRING)

In diesen FORTRANs stelle ich auch eine nützliche Funktion fest: Wenn Sie eine Zeichenkette als Argument an eine Funktion oder ein Unterprogramm übergeben und sie innerhalb des Unterprogramms als CHARACTER*(*) deklariert ist, dann die Funktion LEN(STRING) im Unterprogramm die tatsächliche Länge der übergebenen Zeichenkette aus und nicht die im aufrufenden Programm deklarierte Länge der Zeichenkette.

Beispiel: ZEICHEN*1000 ZEICHENFOLGE

        .
        .

  CALL SUBNAM(STRING(1:72)

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X