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 //
, /
/
, ...
ist der Name eines gemeinsamen
Speicherbereichs, der einen
benannten COMMON-Bereich
identifiziert und dessen
Elemente in
aufgeführt sind. Die Elemente von
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 . 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
, 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
Dabei wird die INCLUDE-Anweisung durch den
kompletten Inhalt der angegebenen Datei 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