Skip to content
Snippets Groups Projects
Commit 2f0eb3aa authored by Walter, Wolfgang's avatar Walter, Wolfgang
Browse files

Extensive correction, rephrasing and update of "einfuehrung_pointer.txt"

parent d36d4057
No related branches found
No related tags found
No related merge requests found
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:
NULLIFY ( ptr1, ptr2, ... ) !! Pointer auf NULL setzen
ALLOCATE ( ptr1, ptr2, ... [ , STAT = ivar ] ) !! Zielobjekte für die Pointer erzeugen (im Heap)
DEALLOCATE ( ptr1, ptr2, ... [ , STAT = ivar ] ) !! Zielobjekte dieser Pointer loeschen, Referenzen auf NULL setzen
ptr => ptr2 !! Pointer-Zuweisung: kopiert Pointerzustand (Referenzinformation in ptr2) in den Pointer ptr
!! Danach zeigen beide Pointer auf dasselbe Zielobjekt -- oder sie sind beide NULL, falls ptr2 NULL war
END PROGRAM
ptr => tgt !! Pointer-Zuweisung: assoziiert Pointer ptr mit Zeigerziel tgt (Variable mit TARGET-Attribut)
Wichtige Funktionen sind:
Abfragefunktion des Pointer-Zustands (hier werden die Pointer EBENFALLS NICHT automatisch dereferenziert):
NULLIFY(ptr) !! ptr zeigt nun auf NULL
ASSOCIATED(ptr) !! Ist ptr mit (irgend) einem Zeigerziel assoziiert, also nicht NULL?
ALLOCATE(ptr) !! erzeugt (in unserem Fall) Integer Objekt im Heap
ASSOCIATED(ptr1, ptr2) !! Sind beide Pointer mit demselben Zeigerziel assoziiert?
DEALLOCATE(ptr) !! loescht diese Element im Heap
ASSOCIATED(ptr, tgt) !! Ist ptr mit dem Zeigerziel tgt assoziiert (welches das TARGET-Attribut trägt, also kein Pointer ist)?
ASSOCIATED(ptr) !! schaut, ob ptr nicht auf NULL zeigt
ASSOCIATED(ptr1, ptr2) !! schaut, ob ptr und ptr2 auf das selbe El. zeigen
Die oben stehenden 5 (syntaktisch erkennbaren) Sprachkonstrukte (4 Anweisungen und 1 Abfragefunktion) nennt man POINTER-KONTEXT.
Pointer Zuweisungen: "=>"
- ptr => tgt !! assoziiert Pointer mit Target tgt (tgt Variable mit TARGET-Attribut)
- ptr1 => ptr2 !! kopiert Pointerreferenz von ptr2 auf ptr1
Beispiel:
PROGRAM testprog
IMPLICIT NONE
INTEGER, POINTER :: ptr, q
INTEGER, TARGET :: n, m
INTEGER, POINTER :: p, q
INTEGER, TARGET :: n, m
n = 1
m = 4
ptr => n !! ptr zeigt auf n
q => ptr !! q zeigt auf n
ptr => m !! ptr zeigt auf m
ptr = q + n !! nun ist m == 2 !! Hier sieht man gut die automatische Deref.
END PROGRAM
p => n !! p zeigt auf n
q => p !! q zeigt auf n
p => m !! p zeigt auf m
p = q + n !! nun ist m == 2 !! Hier sieht man gut die automatische Dereferenzierung
END PROGRAM testprog
Gefahren beim Umgang mit Pointern:
- Verwendung/Deref. eines nicht initialisierten/definierten Pointers
- Verwendung/Dereferenzierung eines nicht initialisierten oder undefinierten Pointers
- "Dangling Pointer" : q => n
ptr => q
DEALLOCATE(q) !! ptr nun undefiniert
- memory leaks : nichterreichbare Objekte im Heap (z.B. wenn man DEALLOCATE vergisst)
- ASSOCIATED abfrage auf einen undef. Pointer
- memory leaks (Speichermüll): nichterreichbare Objekte im Heap (z.B. wenn man DEALLOCATE vergisst)
- ASSOCIATED-Abfrage auf einen undefinierten Pointer
Anzeige von
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment