Zum Inhalt springen

Fortran: Fortran 2003: Datentypen

Aus Wikibooks
<<< zur Fortran-Startseite
<< Fortran 2003 Bibliotheken >>
< Programmaufbau Zeiger >



Intrinsische Datentypen

[Bearbeiten]

Die 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 Funktionen selected_int_kind und selected_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

[Bearbeiten]

Mit 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

[Bearbeiten]

Der 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

[Bearbeiten]

Beispiel:

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

[Bearbeiten]

Ab 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

[Bearbeiten]

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