Fortran: Fortran 95: Felder
<<< zur Fortran-Startseite | |
<< Fortran 95 | Fortran 2003 >> |
< Datentypen | Arithmetische Ausdrücke > |
Beispiel
[Bearbeiten]Fortran 90/95-Code (free source form) |
program bsp implicit none real, dimension(10) :: arr ! ACHTUNG! Array startet mit dem Index 1 ! arr(0) waere ein Fehler! arr(1) = 1.5 arr(2) = 2.5 arr(10) = 10.5 write(*,*) arr(1) ! 1.500000 wird ausgegeben write(*,*) arr(10) ! 10.500000 wird ausgegeben end program bsp |
Eindimensionale Felder
[Bearbeiten]Statische Speicherallokation
[Bearbeiten]Variante 1: Die dimension
-Anweisung
[Bearbeiten]real, dimension(10) :: arr
Der Feldindex läuft von 1 bis 10.
Variante 2: Einfach
[Bearbeiten]real :: var(10)
Variante 3: Verwendung von benannten Konstanten
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]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 90/95-Code (free source form) |
program bsp implicit none real, dimension(:), allocatable :: arr ! dynamisches eindimensionales Feld integer :: status ! Allokation allocate(arr(0:9), stat=status) ! Feld mit Werten belegen, ! .... ! .... ! Deallokation deallocate(arr, stat=status) end program bsp |
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
[Bearbeiten]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
[Bearbeiten]Fortran 90/95-Code (free source form) |
program bsp implicit none character(10), dimension(0:9, 2:5) :: arr arr(0, 2) = 'Hallo' arr(1, 2) = 'Welt' ! ... arr(9, 5) = 'Universum' write (*,*) arr(0, 2) ! Ausgabe: Hallo write (*,*) arr(9, 5) ! Ausgabe: Universum end program bsp |
Beispiel: Spaltenorientierte Speicherreihenfolge
[Bearbeiten]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.
Fortran 90/95-Code (free source form) |
program bsp implicit none integer, dimension(3,3) :: arr(3,3) ! Feldelemente einlesen write (*,*) 'Werte (spaltenorientierte Eingabe):' read (*,*) arr ! Komplettes Feld ausgeben write (*,*) 'Gesamtfeld = ' , arr ! a23 ausgeben write (*,*) 'a23 = ', ARR(2,3) end program bsp |
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
[Bearbeiten]Felder lassen sich auch gleich bei der Deklaration mit Werten initialisieren.
Array constructor
[Bearbeiten]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
[Bearbeiten]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
[Bearbeiten]Ä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 90/95-Code (free source form) |
program bsp implicit none character(2), dimension(5) :: arr = (/'A1', 'A2', 'A3', 'A4', 'A5'/) integer, dimension(-3:1) :: i = (/-30, -20, -10, 0, 10/) write (*,*) arr(2:4) ! Ausgabe: A2A3A4 write (*,*) arr(2:) ! Ausgabe: A2A3A4A5 write (*,*) arr(:3) ! Ausgabe: A1A2A3 write (*,*) arr(1) ! Ausgabe: A1 write (*,*) arr ! Ausgabe: A1A2A3A4A5 write (*,*) i(-2:0) ! Ausgabe: -20 -10 0 end program bsp |
<<< zur Fortran-Startseite | |
<< Fortran 95 | Fortran 2003 >> |
< Datentypen | Arithmetische Ausdrücke > |