3 Stimmen

Schwierigkeiten mit dem Geltungsbereich von Fortran-Variablen

Ich habe eine Variable in einer der Fortran-Funktionen intialisiert. Ich verwende sie in einer anderen Funktion. Aber der Wert bleibt nicht derselbe. In anderen Funktionsaufrufen erhalte ich einen Müllwert. Wie kann ich den initialisierten Wert beibehalten.

Ex:

entry a()
num\_calls=0

entry b()
num\_calls= num\_calls + 1

Von Eintrag "b" erhalte ich num_calls als irgendeinen Müll

5voto

Jonathan Leffler Punkte 694013

In klassischem Fortran (Fortran 77 oder früher) würden Sie sicherstellen, dass num_calls in einem gemeinsamen Block definiert ist - wahrscheinlich einem benannten gemeinsamen Block.

COMMON /magic/ num_calls

Ich habe Fortran 90 nicht benutzt, daher weiß ich nicht, welche zusätzlichen Möglichkeiten es bietet. Wahrscheinlich behält es die benannten gemeinsamen Blöcke aus Gründen der Abwärtskompatibilität bei, bietet aber wahrscheinlich auch etwas Besseres.

Ich habe auch geschummelt und eine implizite Deklaration der Variablen verwendet. Vollständig sollte ich schreiben:

INTEGER*4 num_calls
COMMON /magic/ num_calls

4voto

Tim Whitcomb Punkte 9987

Für FORTRAN 77 funktioniert die Methode von Jonathan Leffler, der darauf hinweist, dass Fortran 90 und höher auch COMMON Blöcke. Da Sie jedoch Zugang zu einem Fortran 90/Fortran 2003 Compiler haben, gibt es keinen Grund, einen COMMON Block - lassen Sie sie auf dem Aschehaufen der Geschichte zusammen mit berechneten GOTO y ENTRY .

Die Fortran 90-Methode zum Speichern einer Gruppe von zusammenhängenden Variablen (und Funktionen) ist nicht mehr die COMMON Block, sondern ein MODULE . Für Ihren Code ist dies relativ einfach:

module count_calls

    integer :: num_calls = 0

end module count_calls

Dann fügen Sie in Ihren Unterprogrammen, in denen Sie num_calls verwenden wollen, Folgendes hinzu

use count_calls

entweder zu den Unterprogrammen selbst oder zu dem Bereich, der sie enthält (d. h. ein program oder eine andere module ).

1voto

RBerteig Punkte 39719

Sie müssen Folgendes angeben num_calls außerhalb eines der beiden Unterprogramme, so dass seine Lebensdauer nicht von einem der beiden Unterprogrammaufrufe abhängig ist. Jemand, der FORTRAN beherrscht, kann Ihnen einen Beispielcode zur Verfügung stellen...

1voto

Kurt Glaesemann Punkte 91

Sie sollten die Variable mit dem Attribut "save" deklarieren. Auf diese Weise lebt die Variable zwischen den Aufrufen. Es gibt Compiler-Optionen, um alle Variablen als "save" zu markieren, da alte Compiler dies standardmäßig oder je nach Optimierungsstufe taten.

    integer*4, save :: num_calls

Es ist ein Standardmerkmal der meisten Sprachen, dass lokale Variablen undefiniert werden, wenn sie den Gültigkeitsbereich verlassen.

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