Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Pointer?

Pointer?
Michael
Hallo Leute,
kurz: was sind Pointer und wozu braucht man die?
mfg
Michael

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: In welchem Zusammenhang steht Deien Frage?
Uwe
Pointer ist ersteinmal ein Zeiger, also ein Instrument, das auf etwas anders verweist.
Gruß!

AW: In welchem Zusammenhang steht Deien Frage?
Michael
Hallo,
habe im Beitrag weiter unten Pointer gelesen und erinnerte mich an diverse C/C++ Vorlesungen. Da habe ich Pointer mal gehört, aber nie verstanden für was die gut sind!
Für was braucht man die in (XL)-VBA?
Viele Grüsse
Micha
Anzeige
AW: In welchem Zusammenhang steht Deien Frage?
Uwe
Nun, Micha,
Deien Erinnerung trügt Dich bestimmt nicht, denn ich kann mir nicht vorstellen, dass eine C/C++-Vorlesung nicht sehr rasch zum Instrument des Pointers vordringt.
Vielleict hast Du aber eine Vorleseung versäumt, denn das Prinzip des Pointer ist relativ simpel, wenn man es mit anderen Worten beschreibt und nicht gleich in die Besonderheiten der Operationen mit Pointers eindringt.
Wo allerdings bei VBA besonders von Pointer die Rede ist, weiß ich nicht; verwendet werden ein Pointer indirekt, durch die Übergabe eines Wertes ByRef (Übergabe bei Referenz).
Eine einfache Referenz (oder eben ein Pointer) ist nicht anderes, als eine Variable, die die Adresse des Beginns eines Speicherplatzes enthält, an dem der Start des Inhaltes der eigentliche Variable/Struktur bzw. des Arrays beginnt.
Ein Pointer in C/C++ ist also wie eine Variable zu deklarieren, also auch mit der Information des Datentyps, auf den der Zeiger weisen soll. Dadurch "behinhaltet der Pointer das Wissen", wie groß der Speicherbereich eines Elementes ist, auf den er verweist.
Hat z.B. der Datentyp double einen Platzbedarf von 8 Bytes, so kann eine Pointer vom Typ double angelegt werden ( double *ptrd in C/C++; *** ByRef prtd as Double, wobei *** für verschiedene Deklarationstypen oder Aufrufe steht).
Diese Variable, der Pointer, belegt im Speicher einen Platz, der ausreicht, um die Größe der Adresse einer beliebigen Speicherstellung je nach Modell, aufnehmen zu können. Nun unterscheidet sich C/C++ und VBA-Basic vermutlich grundlegend. Für das weiter Verständnis hier, genügt es festzustellen, dass, sobald eine Variable deklariert oder angelegt/übergeben wird, ein Speicherplatz gesucht wird, in dem der Wert der Variablen geschrieben wird und gleichzeitig die Adresse in dem Zeiger notiert wird.
Soweit sollte der Zeiger verständlich sein, er ist der "Schlüsselcode" zum Auffinden des Variablenwert bzw. dessen Speicherplatz selbst.
Wird nun ein Parameter ByVal an eine Unterroutine übergeben, so wird in der Unterroutine ein Duplikat angelegt; es existieren also zu diesem Zeitpunkt des Ausführens der aufgerufenen Routine mindesten zwei Speicherstellen, die die Varibale enthält. Im Unterprogramm wird nun nur die Kopie benutzt, die nach beendigung des Progamms "verschwindet" (Speicherplatz der Kopie wird freigegeben), während die Ursprungsvariable, die als Kopie übergeben wurde nicht angetastet wurde und somit weiterhin den Wert behält, den sie beim Aufruf des Unterprogrammes hat.
Anders ist es, wenn ich den Pointer/Zeiger übergebe (ByRef.. Standard in VBA), dann wird, das der eigentliche Variablenwert indirekt über den Inhalt des Zeigers angesprochen wird, in der Unterfunktion verändert.

Sub main()
Dim ptr As Double, val As Double
Dim text As String
ptr = 5#
val = 5#
Cells(1, 1) = Str(ptr) + " = ptr in Main vor Aufruf CallByRef"
Cells(2, 1) = Str(val) + " = val in Main vor Aufruf CallByVal"
Call CallByRef(ptr)
Call CallByVal(val)
Cells(7, 1) = Str(ptr) + " = ptr in Main nach Aufruf CallByRef"
Cells(8, 1) = Str(val) + " = val in Main nach Aufruf CallByVal"
End Sub
Sub CallByRef(ByRef ptr As Double)
ptr = 2 * ptr
Cells(4, 1) = Str(ptr) + " = ptr in CallByRef"
End Sub
Sub CallByVal(ByVal val As Double)
val = 2 * val
Cells(5, 1) = Str(val) + " = value in CallByVal"
End Sub


Ich hoffe, die notwendigenInformationenzur Beantwortung Deiner Fragen gegeben zu haben. Über Zeigerarithmetik habe ich hier geschwiegen, da sie in VBA meines Wissens nach ohne Bedeutung für die programmierung via VBA ist.
Gruß!
Anzeige
AW: In welchem Zusammenhang steht Deien Frage?
michael
Hi,
danke für die umfassende Erklärung!
Ein bißel fiel mir beim Lesen wieder ein, danke.
den COde schau ich mir jetzt mal an!
Gruß
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Pointer in VBA: Alles, was Du wissen musst


Schritt-für-Schritt-Anleitung

  1. Verstehen, was ein Pointer ist: Ein Pointer ist ein Zeiger, der auf eine Speicheradresse verweist. Dies ist besonders wichtig in Programmiersprachen wie C/C++, aber auch in VBA (Visual Basic for Applications) spielt der Pointer eine Rolle, insbesondere bei der Übergabe von Variablen an Funktionen.

  2. Deklaration eines Pointers: In VBA kannst Du Pointer indirekt nutzen, indem Du die Übergabeparameter in Funktionen mit ByRef deklarierst. Dies sorgt dafür, dass Änderungen an der Variablen innerhalb der Funktion auch außerhalb sichtbar sind.

    Sub Beispiel()
       Dim wert As Double
       wert = 10
       Call FunktionMitPointer(wert)
       MsgBox wert ' Dieser Wert kann sich ändern, je nach Funktion
    End Sub
    
    Sub FunktionMitPointer(ByRef p As Double)
       p = p * 2 ' Hier wird der Wert von wert in der übergeordneten Sub verändert
    End Sub
  3. Nutzen von Pointer in Excel: Du kannst Pointer in Excel verwenden, um Daten effizienter zu verwalten. Dies kann insbesondere hilfreich sein, wenn Du große Datenmengen verarbeiten musst.


Häufige Fehler und Lösungen

  • Fehler: "Variable nicht definiert"
    Lösung: Stelle sicher, dass Du alle Variablen korrekt deklariert hast. Achte darauf, dass die Pointer richtig initialisiert sind.

  • Fehler: "Unzulässiger Funktionsaufruf"
    Lösung: Überprüfe, ob Du die Parameter in der Funktion korrekt übergibst. Bei der Verwendung von ByRef sollte der Typ übereinstimmen.

  • Fehler: "Wert kann nicht zugewiesen werden"
    Lösung: Achte darauf, dass Du keine Konstanten oder nicht veränderbaren Werte als Pointer übergibst.


Alternative Methoden

Es gibt einige alternative Methoden zur Verwendung von Pointer in VBA:

  • Array-Referenzen: Du kannst Arrays nutzen, um mehrere Werte zu speichern und durch Pointer darauf zuzugreifen. Dies kann den Speicherbedarf reduzieren.

  • Objekte: In VBA kannst Du auch Objekte verwenden, um komplexere Datenstrukturen zu erstellen und Pointer auf diese Objekte zu setzen.

  • API-Aufrufe: Bei Bedarf kannst Du API-Aufrufe in VBA nutzen, um die Funktionen von externen Programmen zu integrieren. Hierbei sind Pointer oft entscheidend.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie Pointer in VBA verwendet werden können:

Sub PointerBeispiel()
    Dim a As Double
    a = 5
    MsgBox "Wert vor Funktionsaufruf: " & a
    Call Doublen(a)
    MsgBox "Wert nach Funktionsaufruf: " & a
End Sub

Sub Doublen(ByRef num As Double)
    num = num * 2
End Sub

In diesem Beispiel wird der Wert von a verdoppelt, da wir ihn durch den Pointer ByRef übergeben haben.


Tipps für Profis

  • Verwende ByVal und ByRef bewusst: Verstehe, wann Du welche Methode verwenden solltest. ByRef ist nützlich, wenn Du den Wert ändern möchtest, während ByVal sicherstellt, dass der Originalwert nicht verändert wird.

  • Optimierung der Performance: Wenn Du mit großen Datenmengen arbeitest, achte darauf, wie Du Pointer einsetzt, um die Performance zu optimieren. Manchmal kann die Verwendung von Arrays anstelle von einzelnen Variablen effizienter sein.

  • Debugging-Tools: Nutze die Debugging-Tools in VBA, um den Wert von Pointer während der Laufzeit zu verfolgen. Dies hilft, Fehler schneller zu finden.


FAQ: Häufige Fragen

1. Was ist ein Pointer?
Ein Pointer ist ein Zeiger, der auf die Speicheradresse einer Variablen verweist. In VBA wird er hauptsächlich durch die Übergabe von Werten mit ByRef genutzt.

2. Wie kann ich Pointer in Excel verwenden?
Du kannst Pointer in Excel verwenden, indem Du Funktionen mit ByRef deklarierst, um sicherzustellen, dass Änderungen an den Variablen auch außerhalb der Funktion sichtbar sind.

3. Gibt es Unterschiede zwischen C/C++ und VBA bei der Verwendung von Pointern?
Ja, in C/C++ hast Du direkten Zugriff auf die Speicheradressen, während VBA eine einfachere Implementierung hat, die eher auf Referenzen basiert.

4. Warum sollte ich Pointer in VBA verwenden?
Die Verwendung von Pointern kann die Performance verbessern und den Speicherbedarf reduzieren, insbesondere bei großen Datenmengen und komplexen Berechnungen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige