next up previous contents
Nächste Seite: Kommunikation zwischen Programmeinheiten Aufwärts: FORTRAN Vorherige Seite: Benutzerdefinierte Unterprogramme - Subroutinen   Inhalt


Speicherplatz-Zuordnung (COMMON) und Einbettung von Programmzeilen (INLUDE)

Bei der Übersetzung (Compilierung) bzw. beim Laden eines Programms werden den vorkommenden Größen Speicherplätze (Adressen) zugeordnet. Diese Zuordnung kann durch die im folgenden besprochenen Anweisungen beeinflußt werden.

Die COMMON-Anweisung ordnet Variablen verschiedener Programmeinheiten gleiche Plätze im Arbeitsspeicher zu und erlaubt daher, neben der Parameterliste, die Übertragung von Werten zwischen Programmeinheiten.

Formalparametern eines Unterprogramms, also allen Parametern der Parameterliste, werden keine Speicherplätze zugewiesen. Vielmehr werden beim Aufruf dem gerufenen Unterprogramm die Speicheradressen der aktuellen Parameter im rufenden Programm übermittelt.

Daraus ergibt sich die folgende Regel:

Formalparameter von Unterprogrammen dürfen nicht in einer COMMON-, SAVE-, DATA- oder EQUIVALENCE4.2-Anweisung stehen. Umgekehrt dürfen aber Größen, die in einer solchen Anweisung auftreten als Aktualparameter in Unterprogrammaufrufen verwendet werden.

Normalerweise werden Programme und Daten für jede Programmeinheit getrennt gespeichert, so daß beispielsweise eine Größe, die in einem Unterprogramm gespeichert ist und nicht in der Parameterliste oder einem Unterprogrammaufruf steht, von keiner anderen Programmeinheit aus erreicht werden kann (lokale Größe). Demgegenüber gibt es noch den allen Programmeinheiten gemeinsamen Speicherbereich (COMMON-Bereich), der über die COMMON-Anweisung definiert wird

COMMON /$name_1$/ $liste_1$ , /$name_2$/ $liste_2$, ...

$name_i $ ist der Name eines gemeinsamen Speicherbereichs, der einen benannten COMMON-Bereich identifiziert und dessen Elemente in $liste_i $ aufgeführt sind. Die Elemente von $liste_i $ können Namen von einfachen und indizierten Variablen (ggfs. einschließlich der Dimensionen) sein, die durch Kommata getrennt werden. Die Verwendung von COMMON-Bereichen wird im Abschnitt 4.2.21 ,,Kommunikation zwischen Programmeinheiten`` beispielhaft erläutert.

Wird der Name des COMMON-Blocks weggelassen, so ist der gemeinsame Speicherbereich ein unbenannter COMMON-Block.

Die Zuordnung der Namen von Komponenten eines COMMON-Blocks zu den zugehörigen Speicherplätzen (Adressen) ergibt sich unabhängig von der Programmeinheit allein aus der Stellung der Komponenten innerhalb der Liste $liste_i $. Innerhalb einer Programmeinheit darf ein symbolischer Name nur einmal in einer COMMON-Anweisung auftreten, aber gemeinsame Speicherbereiche dürfen mehrmals vereinbart werden. Dabei werden durch $liste_i $, die dem Namen des COMMON-Blocks folgt, dem COMMON-Block weitere Elemente angehängt.

Beispiel:

COMMON /ALL/ MARS, VENUS

COMMON /ALL/ ERDE, MOND

ist gleichbedeutend mit:

COMMON /ALL/ MARS, VENUS, ERDE, MOND

Die Länge eines COMMON-Blocks ist die Gesamtzahl der Speicherplätze, die die Elemente des COMMON-Blocks belegen. Die Länge eines benannten COMMON-Blocks muß in allen Programmeinheiten gleich sein, der unbenannte COMMON-Block kann dagegen in verschiedenen Programmeinheiten verschiedene Längen haben.

Das Auftreten einer Zeichengröße in einem COMMON-Block bedeutet, daß alle anderen Größen in diesem Block ebenfalls vom Typ Zeichen sein müssen.

Elemente in benannten COMMON-Blöcken können mittels DATA-Anweisungen in Blockdaten-Unterprogrammen (BLOCKDATA, hier nicht weiter besprochen) mit Anfangswerten versehen (initialisiert) werden. Elemente im unbenannten COMMON-Block können nicht auf diese Weise initialisiert werden.

Vor der Verwendung von COMMON-Blöcken sei aber gewarnt, denn sie erfordert äußerste Sorgfalt beim Programmieren wegen der möglichen Speicherplatzverschiebung bei unkorrekten Listen. Eine mögliche Lösung dieses Problems könnte dier Verwendung des INCLUDE-Befehls sein.

Die INCLUDE-Anweisung erlaubt es, Quellcodeteile, die sich in einer seperaten (externen) Datei befinden, in den eigentlichen Quelltext einzufügen.

INCLUDE $filename$

Dabei wird die INCLUDE-Anweisung durch den kompletten Inhalt der angegebenen Datei $filename$ ersetzt. Um sich dieses nun bei der Verwendung der COMMON-Blöcke zunutze zu machen, lagert man die Definition des COMMON-Blockes mitsamt den Deklarationen der darin enthaltenen Variablen in ein Datei beliebigen Namens aus und included sie in allen Unterprogrammen, in denen der COMMON-Block verwendet werden soll:

             PROGRAM Main
             INCLUDE "comm.inc"
               :
             CALL Subb (...)
               :
             END

             SUBROUTINE Subb (...)
             INCLUDE "comm.inc"
               :
             END


comm.inc:
             INTEGER :: I, J
             REAL :: X(100)

             COMMON / COM / I, J, X


next up previous contents
Nächste Seite: Kommunikation zwischen Programmeinheiten Aufwärts: FORTRAN Vorherige Seite: Benutzerdefinierte Unterprogramme - Subroutinen   Inhalt
Lars Tornow 2003-03-31