Dies ist eine alte Version des Dokuments!
In diesem Kapitel geht es um die Verwendung von Variablen in Fortran.
In Fortran existieren folgende Datentypen:
Fortran entscheidet anhand des Namen der Variablen, welchen Datentyp eine Variable hat. Das wird implizite Typzuweisung genannt. Dabei wird der Datentyp anhand des ersten Buchstabend gewählt, anhand folgender Tabelle:
Anfangsbuchstabe | Datentyp |
---|---|
A bis L | Real |
I bis N | Integer |
M bis Z | Real |
Dh. verwenden wir eine Variable in unserem Programmcode, die nicht explizit definiert wurde, erhält sie vom Fortran Compiler automatisch einen Datentyp zugewiesen. Beachtet man das nicht, können schnell Rundungsfehler auftreten, wenn ungünstige Variablennamen verwendet werden. Man kann das auch umbdefinieren:
PROGRAM main IMPLICIT LOGICAL (a-d) ! ... write (*,*) a * 0.3 ! .. end PROGRAM
Dieser Programmcode wird durch den Compiler nicht übersetzt, weil die Variable a eine LOGICAL
-Variable ist, und versucht wird eine LOGICAL
-Variable mit einem REAL
-Wert zu multiplizieren.
Empfehlung schalten Sie bei jedem Programmstück die implizite Typzuweisung aus. So erhalten Sie bei jeder nicht definierten Variable eine Fehlermeldung des Compilers (und finden damit Programmierfehler schneller).
PROGRAM main IMPLICIT NONE ! ... end PROGRAMM
Fortran fordert die Variablendefinition als erste Codezeilen in einem (Unter-)Programm. Wollen wir eine Integer-Variable (Ganzzahl) definieren, geschieht das wie folgt:
PROGRAM main IMPLICIT NONE INTEGER myvar c ... END PROGRAM
Es ist nicht möglich im Programmcode Variablen anzulegen, da das immer zu Beginn geschehen muss. Wollen Sie mehrere Variablen des gleichen Typs definieren, schreiben Sie einfach mehrere Variablennamen mit Komma getrennt hinter den Variablennamen:
PROGRAM main IMPLICIT NONE INTEGER var1, var2, var3 REAL var4, var5, var6 c ... END PROGRAM
Fortran 90 hat einige Neuerungen bei der Variablendefinition gebracht. Es können nun Attribute an die Variablendefinition gestellt werden. Hier sei nur die allgemeine Syntax beschrieben:
<datentyp> [(KIND=...)[, <attribute>] ::] <variable>, ..
Wichtig ist also zunächst, dass zwei Doppelpunkte vor dem ersten Variablennamen stehen soll. Ein Fortran 90 Compiler lässt aber auch die Fortran 77 Variante durchgehen. Es ist nun möglich weitere Attribute anzugeben, bspw. die Länge des Datentyps, Dimensionen des Feldes (siehe Felder),… Mögliche Attribute sind:
Manchmal ist es notwendig einen kleineren oder größeren Ganzzahldatentyp zu verwenden (also bspw. einen 16 Bit oder 64 Bit Integer). Dazu kann in Fortran 77 mit einem Stern am Datentyp die Breite des Datentyps angegeben werden:
integer*2 var16bit integer*4 var32bit integer*8 var64bit
In Fortran 90 sieht das wie folgt aus:
integer (KIND=2) :: var16bit integer (4) :: var32bit integer (8) :: var64bit
Der Selektor KIND
kann angegeben werden, muss aber nicht.
Der Datentyp DOUBLEPRECISION
stellt einen besonderen Datentyp dar, weil er eine Sonderform von REAL
ist. Double-Zahlen sind i.d.R. 64 Bit lang, dh. folgende Codezeilen sind quasi äquivalent:
REAL*8 a DOUBLE PRECISION b
Variablen werden durch die Verwendung des Namens im Programmcode verwendet:
PROGRAM main INTEGER :: a,b REAL :: c,d a = 12 b = 42 c = 0.3 d = a + b * c write (*,*) d END PROGRAM
Es kann sinnvoll sein Variablen einen Anfangswert zuzuweisen, dafür gibt es verschiedene Methoden in Fortran.
In Fortran 77 ist es üblich das DATA-Statement zu verwenden um Variablen einen Anfangswert zuzuweisen:
DOUBLE PRECISION pi, e DATA pi /3.14159d0/ DATA e /2.718281d0/
Zunächst legen wir die Variablen an, dann wird mittels DATA
angekündigt, dass der nachfolgenden Variablen der folgende Wert zugewiesen werden soll. Dabei ist der Wert in Schrägstriche zu klammern.
Auch möglich ist folgendes:
DOUBLE PRECISION pi /3.141d0/ DOUBLE PRECISION e /2.7162d0/
In Fortran 90 kann die Anfangswertzuweisung direkt bei der Definition des Variablen geschehen:
DOUBLE PRECISION :: pi = 3.14159d0 DOUBLE PRECISION :: e = 2.718281d0
Es kann nützlich sein Konstanten zu benennen, bspw. wenn ein Wert im Programm verwendet werden soll, aber nicht verändert - so kann der Wert einmal oben definiert werden und im eigentlichen Code dann mit seinem Namen angesprochen werden. Das kann vor allem dann nützlich sein, wenn der Wert oft gebraucht wird, und bspw. zum Testen mit unterschiedlichen Werten übersetzt werden soll (während des Programmlaufs aber konstant bleiben soll).
Dafür gibt es die Anweisung PARAMETER
, der in Klammern der Konstantenname und der Wert folgt. Die Konstante wird zuvor wie eine normale Variable erstellt:
REAL*8 pi, e PARAMETER (pi=3.14159d0, e=2.718281d0) INTEGER testvar PARAMETER (testvar=100)
bzw. in Fortran 90:
REAL*8,PARAMETER :: pi=3.14159d0, e=2.718281d0 INTEGER,PARAMETER :: testvar=100