Fortran: Cray Pointer

Aus Wikibooks
<< zur Fortran-Startseite
< Ratfor Anhang A: Gegenüberstellung von Fortran- und C-Sprachelementen >


Einleitung[Bearbeiten]

Cray 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[Bearbeiten]

Pärchenbildung: Speicheradresse ↔ Objekt[Bearbeiten]

pointer( 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[Bearbeiten]

i = loc( var ) 

Diese Funktion gibt die Speicheradresse von var zurück.

Speicherplatz anfordern[Bearbeiten]

ptradr = malloc( bytes )

Fordert bytes Speicherplatz an und gibt die erste dazugehörende Speicheradresse zurück.

Speicherplatz freigeben[Bearbeiten]

free( ptradr )

Sonstiges[Bearbeiten]

  • Cray Pointer können auch auf Unterprogramme zeigen.

Beispiel[Bearbeiten]

Fortran 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]


  1. w:Cray


<< zur Fortran-Startseite
< Ratfor Anhang A: Gegenüberstellung von Fortran- und C-Sprachelementen >