fb:porticula NoPaste
Private mit Pointern umgehen
Uploader: | MOD |
Datum/Zeit: | 21.01.2010 18:27:19 |
#Define varname(n) #n
Type test
Declare Constructor()
Declare Sub pr()
Declare Function k_ptr() As UInteger Ptr
Public:
i As Integer
j As Double
Private:
k As Integer
End Type
Constructor test
this.i = 3 'this nicht nötig
this.j = 4
this.k = 5
End Constructor
Sub test.pr()
Print varname(i) & " hat den Wert: " & i
Print varname(j) & " hat den Wert: " & j
Print varname(k) & " hat den Wert: " & k
End Sub
Function test.k_ptr() As UInteger Ptr
Return @k
End Function
'======================================================================
Dim As test private_test
Print "Ausgabe aller Variablen des Types ueber die interne Sub"
Print "Alle drei Variablen werden wie erwartet angezeigt:"
Print
private_test.pr()
Sleep
Cls
'======================================================================
Print "Ausgabe ueber den Variablennamen des Types - Direktzugriff!"
Print "k musste auskommentiert werden, weil es geschuetzt wird"
Print
Print varname(i) & " hat den Wert: " & private_test.i
Print varname(j) & " hat den Wert: " & private_test.j
'Print varname(k) & " hat den Wert: " & private_test.k
Sleep
Cls
'======================================================================
Print "Wie waer's mit Pointern?"
Print
Print "Da wir wissen wie viele Variablen im Type stecken, holen wir uns k"
Print "illegalerweise ueber den Pointer"
Print
Sleep
Print "Dafuer muessen wir etwas umstaendlich zwischen UInteger und UInteger Ptr casten"
Print "und schwups haben wir die richtige Adresse"
Dim As UInteger Ptr pointer_to_k = Cast(UInteger Ptr, Cast(UInteger, (@private_test.j)) + 8)
Print
Sleep
Print "Zur Sicherheit mal die Adressen anzeigen lassen: "
Print private_test.k_ptr, pointer_to_k
Print
Sleep
Print varname(k) " hat den Wert: " & *pointer_to_k
Sleep
Cls
'======================================================================
Print "Und so zeigt sich mal wieder: Pointer sind klasse! ;)"
Print
Print "Ende"
Sleep