Fortran: Cray Pointer
<< zur Fortran-Startseite | |
< Ratfor | Anhang A: Gegenüberstellung von Fortran- und C-Sprachelementen > |
Einleitung
BearbeitenCray Pointer (auch Integer Pointer genannt) waren und sind teilweise heute noch in Fortran ein Ersatz für die aus der Programmiersprache C bekannten Zeiger. Sie sind nicht Teil der Fortran-Standards, werden jedoch von einigen Compilerherstellern als Erweiterung des Fortran-Sprachumfangs angeboten. Cray Pointer haben nicht viel mit den unter Fortran 90/95 neu eingeführten Zeigern gemeinsam und können Portabilitätsprobleme bereiten. Die Bezeichnung Cray Pointer deutet auf den "Erfinder" dieser Erweiterung hin - Cray Research[1] (firmiert aktuell als Cray Inc.).
Grundlagen
BearbeitenPärchenbildung: Speicheradresse ↔ Objekt
Bearbeitenpointer( pointeradr, pointee ) [, ...]
pointeradr
...integer
-Skalar (Speicheradresse)pointee
... Skalar oder Vektor
Der Datentyp für pointeradr
muss groß genug gewählt werden, damit die Speicheradresse auch aufgenommen werden kann. Dies stellt schon das erste Problem dar, da diese "Zeigergröße" systemabhängig ist. In weitere Folge muss dieser Speicherplatzbedarf je Zeiger auch bei der Verwendung von "zeigerarithmetischen Kunststücken" beachtet werden. Um portabel zu bleiben darf pointeradr
gar nicht deklariert werden. Das Codeschnipsel
! ... integer :: ptradr pointer( ptradr, var ) ! ...
würde von gfortran und ifort auf 32bit-Systemen akzeptieren werden. Der Sun-Compiler weist diesen Code jedoch in jedem Fall mit einer eindeutigen Fehlermeldung ab.
Speicheradresse ermitteln
Bearbeiteni = loc( var )
Diese Funktion gibt die Speicheradresse von var
zurück.
Speicherplatz anfordern
Bearbeitenptradr = malloc( bytes )
Fordert bytes
Speicherplatz an und gibt die erste dazugehörende Speicheradresse zurück.
Speicherplatz freigeben
Bearbeitenfree( ptradr )
Sonstiges
Bearbeiten- Cray Pointer können auch auf Unterprogramme zeigen.
Beispiel
BearbeitenFortran 90/95-Code (free source form) |
program bsp implicit none real, dimension(4) :: arr = (/ 12.5, -3.3, -55.0, -144.9 /) real :: pointee ! ***** Pärchenbildung und loc() ***** ! iptradr wird nicht explizit deklariert, der Compiler ermittelt automatisch ! den erforderlichen Datentyp (kind-Wert) -> 4 Byte-Integer bei ! 32bit-Systemen, 8 Byte-Integer bei 64bit-Systemen, ... pointer( iptradr, pointee(2, 2) ) iptradr = loc( arr(1) ) write( *,* ) pointee ! Ausgabe: ! 12.5 -3.3 -55.0 -144.9 write( *,* ) pointee(:, 2) ! Ausgabe: ! -55.0 -144.9 iptradr = loc ( arr(2) ) write( *,* ) pointee ! Ausgabe: ! -3.3 -55.0 -144.9 1.4012985E-45 ! ***** Zeigerarithmetik, Ergebnis systemabhängig ***** iptradr = iptradr + 4 ! + 4 Bytes write( *,* ) pointee(1, 1) ! Ausgabe: ! -55.0 ! ***** malloc() und free() ***** iptradr = malloc( 16 ) pointee( 1, 1 ) = 99.9 pointee( 2, 1 ) = 999.9 write( *,* ) pointee ! Ausgabe: ! 99.9 999.9 0.0E+0 0.0E+0 call free( iptradr ) end program bsp |
Kompilieren, Linken:
- gfortran:
gfortran -fcray-pointer bsp.f90
- Sun:
f95 bsp.f90
- Intel:
ifort bsp.f90
Weblinks
Bearbeiten
<< zur Fortran-Startseite | |
< Ratfor | Anhang A: Gegenüberstellung von Fortran- und C-Sprachelementen > |