Zeiger und Speicherzugriff

Pointer (Zeiger)

Um einen Pointer (Zeiger) zu benutzen, schreiben Sie einen * vor den Variablen-Namen. Ein Zeiger ist eine Long-Variable, welche eine Adresse speichert. Er wird generell in Verbindung mit dem Struktur-Typ benutzt. Mit dem Zeiger erhalten Sie Zugriff auf die Struktur.

Beispiel:

  *MyScreen.Screen = OpenScreen(0,320,200,8,0)
  mouseX = *MyScreen\MouseX ; setzt voraus, dass die Screen Struktur ein MouseX Feld beinhaltet
Es gibt nur drei gültige Methoden, den Wert eines Zeigers zu setzen:
* Erhalt als Ergebnis einer Funktion (wie im obigen Beispiel gezeigt)
* Kopieren des Werts von einem anderen Zeiger
* Ermitteln der Adresse einer Variable, einer Prozedur oder einer Sprungmarke (siehe weiter unten)

Hinweis: Anders als in C/C++ ist in PureBasic der * immer Teil des Variablennamens. Damit sind *ptr und ptr zwei verschiedene Variablen.

Adressen von Variablen

Um die Adresse einer Variable in Ihrem Programmcode zu ermitteln, benutzen Sie das 'at' Symbol (@). Ein üblicher Grund für die Benutzung dieser Methode ist, wenn Sie die Variable eines Struktur-Typs an eine Prozedur übergeben wollen. Sie müssen einen Zeiger auf diese Variable übergeben, da Sie strukturierte Variablen nicht direkt übergeben können.

Beispiel:

  Structure astruct
    a.w
    b.l
    c.w
  EndStructure
  
  Procedure SetB(*myptr.astruct)
    *myptr\b = 69
  EndProcedure
  
  If OpenConsole()
    DefType.astruct myvar
    myvar\b = 0
    SetB( @myvar )
    PrintN(Str(myvar\b))
    Input()
    CloseConsole()
  EndIf
  End

Adressen von Prozeduren

Normalerweise sind nur fortgeschrittene Programmierer darauf angewiesen, die Adresse einer Prozedur zu ermitteln. Wahrscheinlich ist die häufigste Ursache für das Ermitteln einer Adresse, wenn auf "low-level" Ebene mit dem OS gearbeitet werden soll. Einige OS erlauben "Callback"- oder "Hook"-Funktionen (für einige Operationen) zu definieren, welche durch das OS aufgerufen werden und dem Programmierer den Ausbau der Fähigkeiten der betreffenden OS-Routine ermöglichen. Die Adresse einer Prozedur wird auf ähnliche Art und Weise wie bei Variablen ermittelt.

Beispiel:

  Procedure WindowCB(WindowID.l, Message.l, wParam.l, lParam.l)
    ; Hier wird Ihre Callback Prozedur abgearbeitet.
  EndProcedure
  
  ; Ein spezielles Callback für Windows OS ermöglicht die Verarbeitung von Window-Ereignissen.
  SetWindowCallback( @WindowCB() )

Adressen von Sprungmarken (Labels)

Es kann auch nützlich sein, die Adresse einer Sprungmarke innerhalb Ihres Programmcodes zu ermitteln. Dies ist möglich, wenn Sie Zugriff auf an dieser Sprungmarke gespeicherten Code oder Daten erhalten möchten. Oder jede andere gute Möglichkeit, die Sie sich vorstellen können. Um die Adresse einer Sprungmarke zu ermitteln, schreiben Sie ein Fragezeichen (?) vor den Namen der Sprungmarke.

Beispiel:

  Debug "Größe der Daten = " + Str(?EndOfMyData - ?MyData)
  End
  
  DataSection
    MyData:
      IncludeBinary "somefile.bin"
    EndOfMyData: