Fortran: Fortran 2003: Datentypen
<<< zur Fortran-Startseite | |
<< Fortran 2003 | Bibliotheken >> |
< Programmaufbau | Zeiger > |
Intrinsische Datentypen
BearbeitenDie aus Fortran 90/95 bekannten intrinsischen Datentypen sind weiterhin uneingeschränkt gültig.
Datentyp | Kommentar |
---|---|
integer | Ganzzahlen |
real | Reelle Zahlen einfacher Genauigkeit |
(double precision) | Reelle Zahlen doppelter Genauigkeit |
complex | Komplexe Zahlen |
logical | Logischer Datentyp (.true., .false.) |
character | Zeichen(kette) |
Im Umfeld des character
-Datentyps gab es einige Ergänzungen:
- Unterstützung internationaler Zeichensätze in Rahmen der ISO 10646-Norm (Universal Coded Character Set). Im Kapitel iso_fortran_env ist ein kleines Beispiel zu diesem Thema zu finden.
- Die Funktion
selected_char_kind
ist neu. Ihre Funktionsweise ist äquivalent zu den bereits aus Fortran 90/95 bekannten Funktionenselected_int_kind
undselected_real_kind
. - Zeichenkette (String) mit variabler Länge von Zeichen:
character(:), allocatable
Ein Beispiel mit einem String variabler Länge:
Fortran 2003 (oder neuer)-Code |
program bsp implicit none character(:), allocatable :: str str = "Hallo" print *, str print *, "Laenge = ", len(str), " Zeichen" ! Ausgabe: ! Hallo ! Laenge = 5 Zeichen str = "Hallo, Welt" print *, str print *, "Laenge = ", len(str), " Zeichen" ! Ausgabe: ! Hallo, Welt ! Laenge = 11 Zeichen end program bsp |
Ab Fortran 2008 kann auf den Real- und Imaginärteil von komplexen Zahlen mittels %-Datenverbund-Zeichen zugegriffen werden:
Fortran 2003 (oder neuer)-Code |
program bsp implicit none complex img img%re = 1.5 img%im = img%re + 2.5 print *, img ! Ausgabe ! (1.50000000,4.00000000) end program bsp |
Enumeration
BearbeitenMit Fortran 2003 sind auch in dieser Programmiersprache Enumerationen (Aufzählungstypen) möglich. Die Werte in einer solchen Enumeration besitzen einen integer
-Datentyp.
enum, bind( C ) enumerator :: wert(e) // ... end enum |
Die von C-Enumerationen bekannten Eigenschaften gelten gleichermaßen für Fortran-Enumerationen, z.B.:
- ohne explizite Zuweisung von Werten wird mit dem Wert 0 gestartet.
- ohne explizite Zuweisung von Werten wird in der Anordnungsreihenfolge der Elemente sukzessiv immer um 1 hochgezählt.
- Wurde dem Vorgängerelement eine Ganzzahl zugewiesen, dem Element jedoch nicht, so ist der Wert dieses Elementes die dem Vorgängerelement zugeordnete Ganzzahl + 1.
Beispiel:
Fortran 2003 (oder neuer)-Code |
program bsp implicit none integer :: wert enum, bind( C ) enumerator :: MON, DIE, MIT = 3, DON, FRE = 5, SAM = 66, SON = 77 end enum write( *, * ) MON write( *, * ) MIT write( *, * ) SAM wert = 4 if( wert == MIT + 1 ) then write( *, * ) "Donnerstag" endif ! Ausgabe: ! 0 ! 3 ! 66 ! Donnerstag end program bsp |
Obwohl der Fortran 2003-Working Draft J3/04-007 durch das bind(c)
eine zwingende Anbindung an einen Aufzählungstyp in der Programmiersprache C vorgaukelt, ist dies nicht der Fall. Fortran-Enumerationen funktionierten auch ohne entsprechendes C-Gegenstück. Sie werden im Fortran 2003-Working Draft auch nicht im Abschnitt Interoperability with C geführt, sondern direkt im Abschnitt über die Fortran-Datentypen. Diese Tatsache dürften die Compilerbauer auch unterschiedlich interpretieren. So wäre beim g95-Compiler das Attribut bind(C)
nicht unbedingt erforderlich, ist jedoch möglich. Beim Einsatz des gfortran ist der Zusatz bind(C)
obligatorisch. Aus Kompatibilitätsgründen ist somit immer die strikte Schreibweise nach Fortran 2003-Standard empfehlenswert. Der Intel Fortran Compiler 9.1 unterstützt dieses Sprachmerkmal ohnehin noch nicht.
Derived Type
BearbeitenDer Derived Type wurde in Fortran 2003 wesentlich erweitert. Er ist nun kein reiner Datenverbund wie noch in Fortran 90/95, sondern eine richtige Klasse. Genauer beschrieben wird dieser Typ später im Kapitel zur OOP, hier zunächst nur einige einfache Erweiterungsmerkmale gegenüber Fortran 90/95.
Benannte Parameter
BearbeitenBeispiel:
Fortran 2003 (oder neuer)-Code |
program bsp implicit none type test integer :: i character( 20) :: str end type type( test ) :: t1 = test ( i = 1, str = "Wiesenfeld" ) write( *, *) t1 ! Ausgabe: ! 1 Wiesenfeld end program bsp |
Die Verwendung von benannten Parametern bei der Konstruktion einer Derived Type-Variable kann vor allem in Verbindung mit Vorgabewerten sinnvoll sein.
Vorgabewerte
BearbeitenAb Fortran 2003 dürfen Variablen in einem Derived Type auch mit Vorgabewerten (default values) belegt werden.
Beispiel:
Fortran 2003 (oder neuer)-Code |
program bsp implicit none type test integer :: i = -1 character( 20) :: str = "NN" end type type( test ) :: t1 = test () type( test ) :: t2 = test ( str = "Wiesenfeld" ) type( test ) :: t3 = test ( str = "Walddorf", i = 1 ) write( *, *) t1 write( *, *) t2 write( *, *) t3 ! Ausgabe: ! -1 NN ! -1 Wiesenfeld ! 1 Walddorf end program bsp |
Felder
BearbeitenEin mehrdimensionales Feld kann ab Fortran 2008 maximal 15-dimensional gestaltet werden.
Ein benanntes konstantes Feld kann wie folgt initialisiert werden. Die obere Feldgrenze wird durch den Stern (*) ersetzt. Durch den array constructor wird die Feldgröße automatisch festgelegt:
Fortran 2003 (oder neuer)-Code |
program bsp implicit none integer, parameter, dimension(1:*) :: arr1 = [1, 2, 3, 4, 5] integer, parameter :: arr2(0:*) = [0, 1, 2] print *, arr1 print *, arr1(2) print *, arr2 print *, arr2(2) ! Ausgabe: ! 1 2 3 4 5 ! 2 ! 0 1 2 ! 2 end program bsp |
<<< zur Fortran-Startseite | |
<< Fortran 2003 | Bibliotheken >> |
< Programmaufbau | Zeiger > |