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, NDIMn, xminfmi und xmaxfma. 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.