Dynamische Speicherverwaltung

In Fortran müssen alle Variablen vor der ersten Anweisung eines Blocks definiert werden. Dh. der Compiler kann bereits beim Start eines Unterprogramms Speicherplatz für die Variablen anfordern, und muss sich während der Laufzeit keine Gedanken machen. Dieses Verhalten bringt aber das Problem mit sich, dass Felder nicht dynamisch alloziert werden können, dh. dass nur Felder fester Größe vereinbart werden können.

Allocatable

In Fortran 90 gibt es das Attribut ALLOCATABLE, um den Compiler mitzuteilen, dass erst während des Programmlaufs Speicher geholt werden soll.

program main
  integer, allocatable :: i
  double precision, allocatable :: d
  real, dimension(:), allocatable :: r
 
! Anweisugnen
end program

Das Feld r wird mit einem Platzhalter als Dimensionsangabe festgelegt. So können wir später im Programmlauf entscheiden, wie groß das Feld sein soll.

Speicher anfordern

Speicher anfordern ist mit der Funktion allocate möglich. Dabei kann für Felder in Klammern hinter dem Variablennamen festgelegt werden, wie viele Speicherstellen benötigt werden (also wie groß das Feld sein soll). Die Größenangabe kann auch eine Variable sein.

  allocate (i)
  allocate (d)
  i=123
  allocate (r(i))

Speicher freigeben

Zum Freigeben von Speicher wird die Funktion deallocate verwendet. Dabei wird lediglich der Name des freizugebenen Speicherstücks angegeben:

  deallocate (i)
  deallocate (d)
  deallocate (r)

Abfrage ob ein Feld alloziert ist

In Fortran ist es möglich abzufragen, ob ein Feld bereits alloziert ist. Falls nicht, könnte das Feld bspw. alloziert werden.

  if (allocated(r) == .FALSE.) then
    allocate (r(10))
  endif