next up previous contents
Nächste Seite: Speicherplatz-Zuordnung und Einbettung von Aufwärts: FORTRAN Vorherige Seite: Benutzerdefinierte Funktionen   Inhalt


Benutzerdefinierte Unterprogramme - Subroutinen

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 $sname$ ($d_1 , d_2 $, ...)

Der Name $sname$ 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 $d_i $ 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 $sname$ ($a_1 , a_2 $, ...)

Der Name der gerufenen Subroutine ist $sname$ und $a_i $ 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: x$\rightarrow$f, NDIM$\rightarrow$n, xmin$\rightarrow$fmi und xmax$\rightarrow$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.


next up previous contents
Nächste Seite: Speicherplatz-Zuordnung und Einbettung von Aufwärts: FORTRAN Vorherige Seite: Benutzerdefinierte Funktionen   Inhalt
Lars Tornow 2003-03-31