Während Funktionsunterprogramme bei jedem Aufruf einen einzigen Wert -- den Funktionswert -- berechnen, können in FORTRAN mit Subroutinen-Unterprogrammen mehrere Werte bei einem Aufruf berechnet und der rufenden Programmeinheit zur Verfügung gestellt werden. Eine Subroutine beginnt stets mit der SUBROUTINE-Anweisung
SUBROUTINE (
, ...)
Der Name dient ausschließlich
zur Identifikation der Subroutine.
Er besitzt keinen Datentyp und kann nicht
zur Werteübergabe an das rufende
Programm benutzt werden. Die
Parameterübergabe zwischen rufendem
Programm und Subroutine findet über die
Parameterliste statt, wobei
die
formalen Parameter sind. Daneben ist noch
eine Parameterübergabe über
gemeinsame Speicherbereiche (siehe unten)
möglich. Jede Subroutine muß mit einer
END SUBROUTINE-Anweisung abgeschlossen werden und
kann eine RETURN-Anweisung enthalten,
die den vorzeitigen Rücksprung ins rufende Programm bewirkt.
Es gibt auch bei Subroutinen interne und externe Subroutinen. Ihre Unterscheidung bezüglich Gültigkeit und Definition entsprechen denen der internen und externen Funktionen, und sollen deshalb hier nicht erneut aufgeführt werden.
Subroutinen stellen selbständige Programmeinheiten dar, weshalb auch alle erforderlichen Spezifikationen (z.B. Typdeklarationen) angegeben werden müssen. Der Aufruf einer Subroutine geschieht mit der CALL-Anweisung
CALL (
, ...)
Der Name der gerufenen Subroutine ist
und
sind die
Aktualparameter. Diese müssen, wie auch
bei Funktionen, bezüglich
Anzahl, Typ und Reihenfolge mit den
Formalparametern übereinstimmen. Die
Parameter der Liste können Eingabe-
oder Ausgabeparameter sein oder auch
beide Funktionen gleichzeitig erfüllen.
Aus Gründen der Übersichtlichkeit
sollte man jedoch für Eingabe-, Ausgabe-
und Durchgangs-Parameter
jeweils unterschiedliche Parameter verwenden.
Beispiel:
PROGRAM Extrem IMPLICIT NONE INTEGER :: i INTEGER, PARAMETER :: NDIM = 10 REAL :: x(NDIM), xmin, xmax PRINT*, 'Bitte die 10 Feldwerte eingeben:' READ*, (x(i), i = 1,10) CALL MinMax (x, NDIM, xmin, xmax) PRINT*, 'Das Minimum betraegt:', xmin PRINT*, 'Das Maximum betraegt:', xmax END ! --- Subroutine zur Berechnung von Minimum und Maximum eines Feldes SUBROUTINE MinMax (f, n, fmi, fma) IMPLICIT NONE INTEGER :: n, i REAL :: f(n), fmI, fmA fmI = f(1) fmA = f(1) DO i = 1, n fmi = MIN (fmi, f(i)) fma = MAX (fma, f(i)) ENDDO END SUBROUTINE
Im Hauptprogramm werden 10 Werte über die Tastatur eingegeben. Zur Ermittlung der Extremwerte wird das Feld x mit den 10 Werten an das Unterprogramm übergeben. Ein weiterer Eingabeparameter ist die aktuelle Dimension NDIM des Feldes. Die beiden letzten Parameter der Liste xmin und xmax sind Ausgabeparameter, die gesuchten Extremwerte.
Das Unterprogramm MinMax benutzt
variable Dimensionierung, d.h. es
ist für allgemeine, beliebig große
Felder geschrieben. Die jeweilige
aktuelle Dimensionierung (hier: n)
muß dann als Parameter vom rufenden
Programm übergeben werden.
Beim Aufruf des Unterprogramms werden
die Werte der aktuellen Parameter (im
rufenden Programm) den
formalen Parametern (im Unterprogramm)
zugeordnet, und zwar
in der Reihenfolge ihres Auftretens in
der Parameterliste: xf,
NDIM
n, xmin
fmi
und xmax
fma.
Der Algorithmus zur Extremwertbestimmung ist
wie folgt: Das Unterprogramm setzt zunächst
Minimum und Maximum auf den Wert des ersten
Feldelements. In der Schleife werden dann
durch Vergleich der bisher gefundenen
Extremwerte mit dem laufenden
Feldelement die globalen Extremwerte
ermittelt.
Der FORTRAN-Standard besagt, daß beim Rücksprung in das rufende Programm alle lokalen Größen nicht mehr definiert sind. Möchte man dem entgegenwirken muß für die betreffenden Variablen das SAVE-Attribut gesetzt werden.