Fortran: Fortran 95: Felder

Aus Wikibooks
Zur Navigation springen Zur Suche springen
<<< 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:

FORTRAN77 feld mehrdimensional 1.png

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
  • 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 >