Fortran: Fortran 95: Felder
Beispiel
Eindimensionale Felder
Statische Speicherallokation
Variante 1: Die dimension-Anweisung
real, dimension(10) :: arr
Der Feldindex läuft von 1 bis 10.
Variante 2: Einfach
real :: var(10)
Variante 3: Verwendung von benannten Konstanten
integer, parameter :: MAXIND = 10 real, dimension(MAXIND) :: arr
Hier erfolgt die Festlegung der Feldgröße über eine benannte Konstante.
Variante 4: Explizite Angabe der Feldgrenzen
real, dimension(0:9) :: arr
Hier wird Unter- und Obergrenze explizit angegeben. Der Index läuft nun von 0 bis 9. Die Feldgrenzen können auch negativ sein.
Dynamische Speicherallokation
Mit Fortran 90/95 kann der benötigte Speicherplatz für ein Feld dynamisch angefordert werden. Zu diesem Zweck gibt es das Schlüsselwort allocatable, welches unmittelbar bei der Felddeklaration die beabsichtigte dynamische Speicherallokation signalisiert.
| datentyp, dimension(:), allocatable :: variablenbezeichner |
Die intrinsische Funktion allocate dient dann der konkreten Speicherallokation im Aktionsteil des Programmes, also u.a. der Festlegung der konkreten Feldgröße. Der reservierte Speicherplatz kann mit der Funktion deallocate auch wieder freigegeben werden.
Beispiel:
Fortran:Vorlage: Pre2
Die Statusvariable sollte nach Ausführung der Allokationsfunktionen jeweils den Wert 0 aufweisen. Andere Werte stehen für eine Fehlermeldung.
Die Funktion allocated() hilft bei der Überprüfung des Allokationsstatus eines Feldes. Ist für das abgefragte Feld bereits Speicherplatz allokiert, dann liefert die Funktion .TRUE., ansonsten .FALSE.
! ... if (.not. allocated(arr)) then allocate(arr(groesse), stat=s) end if ! ...
Weitere Funktionen bezüglich Feldern sind im Kapitel Standardfunktionen aufgelistet.
Mehrdimensionale Felder
Für mehrdimensionale Felder gelten die gleichen Varianten wie für eindimensionale Felder. Die Speicherreihenfolge ist spaltenorientiert. Das bedeutet, der erste Index variiert am schnellsten:
Ein mehrdimensionales Feld kann auch in Fortran 90/95 maximal 7-dimensional gestaltet werden.
Beispiel: Ein 2-dimensionales Feld
Beispiel: Spaltenorientierte Speicherreihenfolge
Die 3x3-Matrix soll in ein Fortran-Programm eingelesen und wieder komplett ausgegeben werden. Zusätzlich soll auch der Wert des Feldelementes a23 (2. Zeile, 3.Spalte, Wert=-2) separat ausgegeben werden.
Ein-/Ausgabe:
Werte (spaltenorientierte Eingabe):
1
40
-1
-5
3
9
0
-2
65
Gesamtfeld = 1 40 -1 -5 3 9 0
-2 65
a23 = -2
Feldinitialisierung
Felder lassen sich auch gleich bei der Deklaration mit Werten initialisieren.
Array constructor
Bei eindimensionalen Feldern kann die Feldinitialisierung direkt mittels array constructor erfolgen.
Beispiel:
real, dimension(5) :: arr = (/1.1, 1.2, 1.3, 2.1, 2.4/)
Reshape
Für mehrdimensionale Felder besteht die Möglichkeit der direkten Verwendung des array constructors nicht.
Stattdessen kann eine derartige Initialisierung über den Umweg der reshape-Funktion geschehen.
Beispiel: Die Matrix
7 8 9 7 8 9
soll in einem 2D-Feld gespeichert werden.
integer, dimension(2,3) :: arr = reshape( (/7, 7, 8, 8, 9, 9/), (/2, 3/) )
Teilfelder
Ähnlich wie das schon in FORTRAN 77 bei Zeichenketten möglich war, können nun auch Teilfelder direkt angesprochen werden.
| Prinzip | Beschreibung |
|---|---|
| feldname (anfang:ende) | von anfang bis ende |
| feldname (:ende) | vom 1. Feldelement bis ende |
| feldname (anfang:) | von anfang bis zum letzten Feldelement |
| |
Beispiel: Eindimensionale Felder Fortran:Vorlage: Pre2
