Fortran: Fortran 95: Felder

Aus testwiki
Zur Navigation springen Zur Suche springen

Fortran:Vorlage: NavigationUS



Beispiel

Fortran:Vorlage: Pre2

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: a11,a21,,a(n1)m,anm

Ein mehrdimensionales Feld kann auch in Fortran 90/95 maximal 7-dimensional gestaltet werden.

Beispiel: Ein 2-dimensionales Feld

Fortran:Vorlage: Pre2

Beispiel: Spaltenorientierte Speicherreihenfolge

Die 3x3-Matrix A=(15040321965) 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.

Fortran:Vorlage: Pre2

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
  • anfang >= untere Indexgrenze
  • ende <= obere Indexgrenze

Beispiel: Eindimensionale Felder Fortran:Vorlage: Pre2


Fortran:Vorlage: NavigationUS