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/)

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

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 >