Zum Inhalt springen

Fortran: FORTRAN 77: Felder

Aus Wikibooks
<<< zur Fortran-Startseite
<< FORTRAN 77 Fortran 90/95 >>
< Datentypen Arithmetische Ausdrücke >

Bei allem, was mehr oder weniger wie ein Vektor, eine Matrix oder eine sonstige Aneinanderreihung von gleichartigen Elementen aussieht, kann der Einsatz von Feldern (Arrays) sinnvoll sein.

Eindimensionale Felder

[Bearbeiten]

Für die Deklaration von eindimensionalen Feldern gibt es mehrere Möglichkeiten. Die Feldgrenzen müssen konstante Werte sein. Die Varianten werden nun anhand von Beispielen gezeigt.

Variante 1: Einfach

[Bearbeiten]
REAL ARR(10)

Beachte: Der Feldindex läuft hier von 1 bis 10 und nicht von 0 bis 9, wie es bei vielen modernen Hochsprachen der Fall ist.

Variante 2: Das DIMENSION-Schlüsselwort

[Bearbeiten]
REAL ARR
DIMENSION ARR(10)

Variante 3: Verwendung von benannten Konstanten

[Bearbeiten]
INTEGER MAXIND                    
PARAMETER (MAXIND=10)                   
REAL ARR(MAXIND)

Hier erfolgt die Festlegung der Feldgröße über eine benannte Konstante.

Variante 4: Explizite Angabe der Indexgrenzen

[Bearbeiten]
REAL ARR(0:9)

Hier wird Unter- und Obergrenze explizit angegeben. Der Index läuft nun von 0 bis 9. Auch negative Werte für die Indizes sind möglich, z. B.

REAL ARR(-4:5)

Beispiel

[Bearbeiten]
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      PROGRAM BSP
 
      INTEGER MAXIND                    
      PARAMETER (MAXIND=10)                   
      REAL ARR(MAXIND)
C ACHTUNG! Array startet mit dem Index 1 
C ARR(0) waere ein Fehler!       
      ARR(1) = 1.5
      ARR(2) = 2.5          
      ARR(10) = 10.5  
 
      WRITE (*,*) ARR(1) 
C  1.5 wird ausgegeben       
 
      WRITE (*,*) ARR(10) 
C  10.5 wird ausgegeben       

      END
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  


Ein

WRITE (*,*) ARR

listet den gesamten Feldinhalt.

1.500000       2.500000       0.000000      3.9876625E-34   0.000000      3.9902670E-34 -2.7682916E-05  
-2.7269103E-05 -2.9040850E-05   10.50000

Im Beispielsfall wurden die Feldelemente ARR(3) bis ARR(9) nicht explizit vorbelegt. Sie sind deshalb undefinierten Inhalts und können bei jedem Programmaufruf andere Werte annehmen.

Mehrdimensionale Felder

[Bearbeiten]

Für mehrdimensionale Felder gelten die gleichen Varianten wie für eindimensionale Felder. Standardmäßig kann ein Feld bis zu sieben Dimensionen besitzen. Die Speicherreihenfolge ist spaltenorientiert. Das bedeutet, der erste Index variiert am schnellsten:

Beispiel: Ein 2-dimensionales Feld

[Bearbeiten]
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      PROGRAM BSP                                
 
      CHARACTER*10 ARR(0:9, 2:5)              
 
      ARR(0, 2) = 'Hallo'            
      ARR(1, 2) = 'Welt' 
C  ...         
      ARR(9, 5) = 'Universum'         

      WRITE (*,*) ARR(0, 2) 
C  Hallo  
 
      WRITE (*,*) ARR(9, 5) 
C  Universum       
 
      END
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  

Beispiel: Spaltenorientierte Speicherreihenfolge

[Bearbeiten]

Die 3×3-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.

0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      PROGRAM BSP
 
      INTEGER ARR(3,3)

C Feldelemente einlesen
      WRITE (*,*) 'Werte (spaltenorientierte Eingabe):'
      READ (*,*) ARR
 
C Komplettes Feld ausgeben 
      WRITE (*,*) 'Gesamtfeld = ' , ARR 

C  a23 ausgeben
      WRITE (*,*) 'a23 = ', ARR(2,3) 

      END
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  

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

<<< zur Fortran-Startseite
<< FORTRAN 77 Fortran 90/95 >>
< Datentypen Arithmetische Ausdrücke >