Die Community zu .NET und Classic VB.
Menü

Zeiger in VB - Seite 2

 von 

Das Heap-Modul
Nächste Seite >>
Übersicht
<< Vorherige Seite

Einleitung  

Motivation

Zuerst eine ganz simple Frage: wozu das alles?

Nun, Zeiger können oft sehr nützlich sein, da sie einen sehr flexiblen Zugriff auf den Speicher erlauben; Zeiger sind Adressen und als solche sind sie manipulierbar, ohne dass der Speicher, auf den sie verweisen, direkt angetastet werden muss. Als Paradebeispiel zur Verwendung von Zeigern kann man daher dynamische Datenstrukturen zählen, die wie dynamische Felder in ihrer Größe während der Laufzeit variieren. Anders als dynamische Felder hingegen kommen sie ohne ReDim aus, eben dank Zeigern.

Ein sehr einfaches Beispiel für die Funktionsweise von Zeigern sind Aliase, wie in folgendem Pseudocode gezeigt:

Dim Lng1 As Long
Dim Lng2 As Long

@Lng2 = @Lng1
Lng1 = 5

Debug.Print Lng1
Debug.Print Lng2

Listing 1

Dabei bedeutet das Zeichen @ "Zeiger auf", also "Zeiger auf Lng1" und "Zeiger auf Lng2". Wenn es diese Syntax in VB gäbe, so wäre die Ausgabe von Lng1 und Lng2 die selbe, nämlich "5".

Nun, diese Syntax gibt es in VB aber leider nicht. Oft wird Abhilfe geschaffen, indem die API bemüht wird, dabei bietet VB doch eine zumindest recht ähnliche Lösung zum obigen Code schon an, über Klassen. Klassen arbeiten nämlich mit Referenzen und der Code

Set Objekt1 = Objekt2

Listing 2

kommt der Zuweisung im obigen Code quasi gleich. Wenn ich nun Mitglieder von Objekt1 ändere, ändern sich auch die von Objekt2 und umgekehrt.

Aber auch Klassen haben einen Nachteil: da sie auf den COM-Schnittstellen aufbauen, sind sie relativ langsam. Doch es gibt auch andere Methoden, die Abhilfe schaffen.

Abhilfe

In den folgenden Beiträgen werde ich ein Modul vorstellen, das einen speziellen Bereich des RAMs, der für Zeiger von Bedeutung ist, den Heap, simuliert. Den Heap zu simulieren ist relativ unproblematisch. Es reicht, ein dynamisches Feld zu verwenden. Die Indizes des Feldes stellen unsere Adressen (= Zeiger) dar. "Relativ" habe ich geschrieben, weil man eben bei einem Feld nicht umhin kommt, ein ReDim auszuführen, falls das Feld zu klein werden sollte; oder aber man erstellt das Feld statisch und irgendwann ist Schluss. Dies ist in der Realität zwar auch der Fall, trotzdem gebe ich einer dynamischen Variante des Heap den Vorzug, da sie praxistauglicher ist.

Das Modul Heap.bas stellt uns alles zur Verfügung was wir brauchen, um mit simulierten Zeigern arbeiten zu können. Es gibt jedoch zwei Nachteile:

  • Es werden keine "typisierten Zeiger" unterstützt: ein Zeiger auf ein Long ist das selbe wie ein Zeiger auf einen String, denn unsere Zeiger sind lediglich die Indizes eines Feldes.

  • Der Heap hingegen ist sehr wohl typisiert: es wird also pro Heap nur ein Zeigertyp unterstützt. Hier kann man Abhilfe schaffen, indem man mehrere Heaps erstellt, einen für jeden Datentyp.

Unter Zuhilfenahme von API wäre es relativ einfach, zumindest den zweiten Nachteil aus dem Weg zu räumen. Wer das mag, kann das Heap-Modul gerne seinen Wünschen entsprechend umschreiben. Ich habe darauf wie gesagt verzichtet, um das Ganze so einfach wie möglich zu halten. In den Downloads hingegen ist der Heap in die jeweilige Klasse eingegliedert.

Nächste Seite >>
Das Heap-Modul
<< Vorherige Seite
Übersicht