Ab Blatt 2 dieses Semesters werden wir uns mit Pointern beschaeftigen.
Pointer: Referenz auf ein Objekt (von best. Objekttyp). In FTN nur Attribut fuer Variable
Ab dem 2. Aufgabenblatt des Semesters werden in einigen Aufgaben auch Zeiger/Pointer verwendet.
Vorteile: - Pointer koennen die komplexitaet des Codes stark reduzieren
- Pointer koennen Speicher im Heap dynamisch zur Laufzeit allokieren (aehnlich zu ALLOCATE) und
- der Heap ist betraechtlich groesser als der Stack (gilt nicht fuer Variablen mit TARGET-Attribut)
- Das verwenden von z.B. Listen ist von Vorteil, wenn Daten oft in die Mitte der Liste eingefuegt werden muessen
(Arrays hier eher unpraktisch)
- Pointer sind noetig, um kompliziertere Datenstrukturen (z.B. trees) ordentlich zu implementieren
Pointer: Ein Zeiger/Pointer ist eine Referenz auf ein (Ziel-)Objekt/Target. Da FTN eine streng typisierte Sprache ist, müssen der Pointer und sein Zielobjekt von demselben Typ sein: Zeigertyp = Objekttyp.
In FTN werden Pointer ausser bei der "=>" Zuweisung automatisch dereferenziert.
Zur Typdeklaration einer Pointer-Variable (kann auch Typkomponente eines heterogenen Typs sein) wird in FTN das POINTER-Attribut verwendet:
INTEGER, POINTER :: iptr, num_ref ! "ALIAS" access to normal INTEGER variables with TARGET attribute
TYPE(treenode), POINTER :: left, right ! pointers to left and right subtrees of a binary tree
TYPE(listnode), POINTER :: succ, pred ! successor (forward) and predecessor (backward) pointer in doubly-linked list
Syntax:
Vorteile:
1. Über Pointer koennen Speicherblöcke im Heap dynamisch (d.h. zur Laufzeit) angelegt und auch wieder freigegeben werden (mit ALLOCATE bzw. DEALLOCATE).
2. Pointer sind noetig, um kompliziertere Datenstrukturen (z.B. Bäume/Trees und allgemeinere Datenstrukturen, welche in der Mathematik gerichteten Graphen entsprechen) quasi direkt zu implementieren.
3. Als Komponenten eines heterogenen Datentyps, welcher der Typ der Knoten im Graph ist, sind Pointer die Zeiger/Referenzen von einem Knoten auf einen anderen Knoten, d.h. sie repräsentieren die gerichteten Kanten im Graph. Auf diese Weise können im Heap verzeigerte Datenstrukturen aufgebaut werden.
4. Verzeigerte/verkettete Listen sind von Vorteil, wenn Daten/Elemente an beliebigen Stellen in eine Liste eingefuegt oder aus dieser entfernt werden sollen; bei einer Implementierung mit einem 1-dimensionalen Feld/Array müssten dabei sehr viele Elemente positionell verschoben werden.
PROGRAM testprog
IMPLICIT NONE
INTEGER, POINTER :: ptr
...
In FTN werden Pointer in der Regel automatisch dereferenziert, insbesondere in Ausdrücken (expressions). Dies bedeutet, dass die Referenzinformation im Pointer für den Zugriff auf das mit diesem Pointer assoziierte Zielobjekt genutzt wird. Hierzu wird die im Pointer gespeicherte Anfangsadresse des Speicherblocks, in dem das Zielobjekt liegt, verwendet.
Wichtige "Pointer"-Anweisungen, in denen Pointer NICHT automatisch dereferenziert werden, sind: