Fortran: FORTRAN 77: Datentypen

Aus Wikibooks
<<< zur Fortran-Startseite
<< FORTRAN 77 Fortran 90/95 >>
< Programmaufbau Felder >

Dieses Kapitel handelt von Datentypen, Variablen, Konstanten und der Wertzuweisung.

Datentypen[Bearbeiten]

Arithmetische Datentypen[Bearbeiten]

FORTRAN 77 unterscheidet standardmäßig zwischen vier arithmetischen Datentypen:

Datentyp Kommentar Literale (Beispiele)
INTEGER Ganzzahlen 15, -6500, 200 000 000
REAL Reelle Zahlen einfacher Genauigkeit 3.1415, -5.5, .7E3, 12.5E-5
DOUBLE PRECISION Reelle Zahlen doppelter Genauigkeit 3.1415D0, -5.5D0, .7D3, 12.5D-5
COMPLEX Komplexe Zahlen (zwei REAL-Zahlen) (3.1415, -5.5), (1.4, 7.1E4)

Logischer Datentyp[Bearbeiten]

Datentyp Kommentar Literale (alle)
LOGICAL Logischer Datentyp (wahr oder falsch) .TRUE., .FALSE.

Manchmal sind in alten FORTRAN-Programmen auch folgende Schreibweisen zu finden, welche jedoch nicht standardkonform sind:

  • INTEGER*4, REAL*4, LOGICAL*4 (Standardgrößen)
  • INTEGER*1, LOGICAL*1
  • INTEGER*2, LOGICAL*2
  • REAL*8 (entspricht DOUBLE PRECISION)
  • COMPLEX*16 (komplexe Zahlen mit zwei DOUBLE-PRECISION-Elementen)

Die Zahlen geben den Speicherplatzbedarf in Byte an.

Zeichenketten[Bearbeiten]

Datentyp Kommentar Beispiel (Konstante)
CHARACTER*n Zeichenkette (String) mit einer Länge von n Zeichen 'Hallo, Welt!'
CHARACTER Zeichenkette mit einer Länge von einem Zeichen (entspricht CHARACTER*1) 'A'


Beachte: Im Gegensatz zu vielen anderen Programmiersprachen werden Zeichenketten in FORTRAN 77 nicht in Anführungszeichen eingeschlossen, sondern in Apostrophe.

Tritt in einem String ein Apostroph auf, so muss dieses verdoppelt werden, z. B.

'Wie geht''s?'

Beispiel:

CHARACTER*5 STR
STR = 'Hallo'

Alternative Schreibweise:

CHARACTER STR*5
STR = 'Hallo'

Variablen[Bearbeiten]

Eine Variable ist charakterisiert durch einen

  • symbolischen Namen
  • Datentyp
  • Wert
  • Speicherplatz

Beim Programmstart hat eine Variable keinen definierten Wert. Eine Variable kann ihren Datentyp auf zwei Arten erhalten, durch implizite oder explizite Typanweisung.

Implizite Typanweisung[Bearbeiten]

Bei der impliziten Typanweisung bestimmt der Anfangsbuchstabe des Variablenbezeichners den Datentyp.

Anfangsbuchstabe der Variablen Impliziter Datentyp
I, J, K, L, M oder N INTEGER
alle restliche Buchstaben REAL

Beispiel:

0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      PROGRAM BSP
 
      B1 = 8.9
      C1 = 3.
      I1 = B1/C1  
 					
      WRITE (*,*) I1
C  Das Ergebnis ist 2, da I1 implizit als INTEGER definiert ist  
      END
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  

Die Standardzuordnung der Anfangsbuchstaben kann durch das Schlüsselwort IMPLICIT auch geändert werden.

Es gibt noch ein weiteres Problem dieser impliziten Datentypzuordnung. Durch Tippfehler können unbeabsichtigt neue Variablen entstehen. Entschärft werden kann diese Tatsache durch folgende Festlegung im Vereinbarungsteil des Programms:

IMPLICIT LOGICAL (A-Z)

Dadurch werden alle Variablen mit implizit festgelegtem Datentyp automatisch zu Variablen mit logischem Datentyp. In vielen Fällen konnten so Tippfehler bei Variablennamen schnell eingegrenzt werden.

Beispiel:

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

      IMPLICIT LOGICAL (A-Z)
      REAL REE
      
      REE = 5.8

C  Tippfehler: REA anstatt REE
      WRITE (*,*) REA + 2.1
      
      END
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  

Der Compilierungsversuch mit g77, gfortran und g95 endet mit einer Fehlermeldung. Bei gfortran sieht das so aus

 In file test.f:9

      WRITE (*,*) REA + 2.1
               1
Error: Operands of binary numeric operator '+' at (1) are LOGICAL(4)/REAL(4)

Doch der Intel Fortran Compiler 9.0 zeigt die Grenzen der Sinnhaftigkeit der IMPLICIT-Anweisung in der dargestellten Art und Weise beim heutigen Einsatz von FORTRAN-77-Code auf. Dieser Compiler akzeptiert den Beispielcode warnhinweislos und liefert bei Programmausführung den Wert 2.1. Wirklich Abhilfe schafft also erst die IMPLICIT NONE-Anweisung. Diese legt eindeutig fest, dass ausschließlich die explizite Datentypfestlegung Verwendung finden soll. Allerdings ist IMPLICIT NONE erst ab Fortran-90/95-Standard. In einigen noch erhältlichen FORTRAN-77-Compilern, wie dem g77, ist diese Anweisung im Vorgriff auf den genannten neueren Standard bereits implementiert.

Explizite Typanweisung[Bearbeiten]

Durch die Vorgabe von

datentyp variablenbezeichner

im Vereinbarungsteil des Programms wird der Datentyp einer Variablen explizit festgelegt. Die explizite Typanweisung hat gegenüber der impliziten Typanweisung Vorrang.


Beispiel:

0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      PROGRAM BSP
 
      IMPLICIT LOGICAL (A-Z)
      REAL B
      REAL C
      REAL I
 
      B = 8.9
      C = 3.
      I = B/C  
 					
      WRITE (*,*) I
C  Das Ergebnis ist 2.966666
      END
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  

Benannte Konstanten[Bearbeiten]

Benannte Konstanten können durch das PARAMETER-Schlüsselwort festgelegt werden.

CHARACTER*5 STR
PARAMETER (PI=3.1415, PIFAK=PI/2., STR='Hallo')

Der zugewiesene Wert kann eine Konstante (Literal) oder eine schon definierte benannte Konstante sein. Der Datentyp muss vorher vereinbart werden oder ist implizit bekannt.

Für Zeichenketten ist im Zusammenwirken mit PARAMETER auch eine *-Schreibweise möglich. Dies erspart die explizite Angabe der Stringlänge.

Beispiel:

0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      PROGRAM BSP                                
       
      CHARACTER*(*) A
      PARAMETER (A = 'Jetzt wird auch die Stringlaenge festgelegt')
      
      WRITE (*,*) A
C  Ausgabe: Jetzt wird auch die Stringlaenge festgelegt
 
      END
12345678901234567890123456789012345678901234567890123456789012345678901234567890
0   . |  1    .    2    .    3    .    4    .    5    .    6    .    7 |  .    8  

Wertzuweisung[Bearbeiten]

Wertzuweisungen haben wir schon kennengelernt:

variable = ausdruck

Beispiel:

K = 1
K = K + 2

Die Wertzuweisung an eine Variable ist, wie am vorigen Beispiel und auch nachfolgend zu ersehen, nicht zu verwechseln mit einer mathematischen Gleichung. Der Ausdruck

K + 2 = 5 

wäre zwar mathematisch korrekt. Als Wertzuweisung in einem FORTRAN-Programm ist dies aber keine gültige Formulierung. K + 2 ist kein zulässiger Ausdruck auf der linken Seite des Zuweisungsoperators (L-Wert).

Beachte: In FORTRAN 77 ist auch keine Kette von Wertzuweisungen möglich. Der folgende Ausdruck ist in FORTRAN 77 nicht erlaubt und liefert eine Fehlermeldung.

      I = J = K = 1.5
C Fehler!

<<< zur Fortran-Startseite
<< FORTRAN 77 Fortran 90/95 >>
< Programmaufbau Felder >