Differenze tra le versioni di "Ottenere il puntatore di una variabile di tipo Struttura"
Riga 3: | Riga 3: | ||
* con il Metodo "Object.Address()". | * con il Metodo "Object.Address()". | ||
− | + | =Ottenere il puntatore di una variabile di tipo Struttura mediante la funzione "VarPtr()"= | |
− | |||
La funzione "VarPtr()" ritorna un ''Puntatore'' che punta alla variabile contenuta in memoria; pertanto si utilizzerà con la variabile di tipo ''Struttura'' con la seguente sintassi: | La funzione "VarPtr()" ritorna un ''Puntatore'' che punta alla variabile contenuta in memoria; pertanto si utilizzerà con la variabile di tipo ''Struttura'' con la seguente sintassi: | ||
<FONT color=B22222><B>VarPtr</b></font>(Variabile_Struttura) As Pointer | <FONT color=B22222><B>VarPtr</b></font>(Variabile_Struttura) As Pointer | ||
Riga 84: | Riga 83: | ||
− | + | =Ottenere il puntatore di una variabile di tipo Struttura mediante il Metodo "Object.Address()"= | |
− | + | Il Metodo ".Address()" della Classe '' Object'' ritorna l'indirizzo di memoria dell'Oggetto ''Struttura'', e si utilizzerà con la variabile di tipo ''Struttura'' con la seguente sintassi: | |
<FONT color=B22222><B>Object.Address</b></font>(Variabile_Struttura) As Pointer | <FONT color=B22222><B>Object.Address</b></font>(Variabile_Struttura) As Pointer | ||
In questo caso è preferibile optare per la dichiarazione della variabile di tipo ''Struttura'' con la parola ''New'': | In questo caso è preferibile optare per la dichiarazione della variabile di tipo ''Struttura'' con la parola ''New'': |
Versione delle 16:56, 13 apr 2023
E' possibile ottenere il Puntatore di una variabile di tipo Struttura (ossia una variabile di tipo Puntatore che punta all'indirizzo di memoria di una variabile di tipo Struttura) mediante almeno due modalità:
- con la funzione "VarPtr()";
- con il Metodo "Object.Address()".
Ottenere il puntatore di una variabile di tipo Struttura mediante la funzione "VarPtr()"
La funzione "VarPtr()" ritorna un Puntatore che punta alla variabile contenuta in memoria; pertanto si utilizzerà con la variabile di tipo Struttura con la seguente sintassi:
VarPtr(Variabile_Struttura) As Pointer
V'è da sottolineare che la variabile di tipo Struttura andrà assolutamente dichiarata all'esterno delle routine, come globale, e preceduta dalla parola chiave Struct:
Private variabile_struttura As Struct STRUTTURA
Da sottolineare che in questo caso i dati sono presenti all'interno dell'area di memoria, puntata dal Puntatore, a cominciare dal 1° byte (indice 0).
Esempio:
Public Struct ABCDE a As Byte b As Short c As Integer d As Long e As String End Struct Private vrSt As Struct ABCDE Public Sub Main() Dim p1, p2 As Pointer Dim b As Byte Dim sr As Short Dim i As Integer Dim l As Long Dim t As Stream With vrSt .a = 9 .b = 999 .c = 999999 .d = 999999999 .e = "testo" End With ' Ottiene il "Puntatore" alla variabile di tipo "Struttura": p1 = VarPtr(vrSt) ' Ora ri-ottiene i valori presenti nella "Struttura" dereferenziando con i "Memory-Stream" il "Puntatore": t = Memory p1 For Read Read #t, b Print b Seek #t, 2 Read #t, sr Print sr Read #t, i Print i Read #t, l Print l ' Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", allora leggiamo insieme questi byte e li assegnamo ad una variabile di tipo "Puntatore"; quindi dereferenzia per ottenere la stringa: Seek #t, 16 Read #t, p2 Print String@(p2) ' oppure anche con un ciclo per l'intera dimensione della "Struttura", mostrando così tutta area di memoria della "Struttura": Seek #t, 0 For i = 0 To Object.SizeOf(vrSt) - 1 If i = Object.SizeOf(vrSt) - 8 Then Read #t, p2 Print String@(p2) Quit Endif Read #t, b Print i, b, Hex(b, 16) Next t.Close End
Ottenere il puntatore di una variabile di tipo Struttura mediante il Metodo "Object.Address()"
Il Metodo ".Address()" della Classe Object ritorna l'indirizzo di memoria dell'Oggetto Struttura, e si utilizzerà con la variabile di tipo Struttura con la seguente sintassi:
Object.Address(Variabile_Struttura) As Pointer
In questo caso è preferibile optare per la dichiarazione della variabile di tipo Struttura con la parola New:
Dim variabile_struttura As New STRUTTURA
Da sottolineare che in questo caso i dati sono presenti all'interno dell'area di memoria, puntata dal Puntatore, a cominciare dal 25° byte (indice 24).
Mostriamo un esempio riprendendo come base quello precedente:
Public Struct ABCDE a As Byte b As Short c As Integer d As Long e As String End Struct Public Sub Main() Dim vrSt As New ABCDE Dim p1, p2 As Pointer Dim b As Byte Dim sr As Short Dim i As Integer Dim l As Long Dim t As Stream With vrSt .a = 9 .b = 999 .c = 999999 .d = 999999999 .e = "testo" End With ' Ottiene il "Puntatore" alla variabile di tipo "Struttura": p1 = Object.Address(vrSt) ' Ottiene una variabile di tipo "Stream" che punta al numero d'indice "24" dell'area allocata appartenente alla Struttura: t = Memory p1 + 24 For Read Read #t, b Print b Seek #t, 2 Read #t, sr Print sr Read #t, i Print i Read #t, l Print l ' Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", allora legge insieme questi byte e li assegna ad una variabile di tipo "Puntatore"; quindi dereferenzia per ottenere la stringa: Seek #t, 16 Read #t, p2 Print String@(p2) ' oppure anche con un ciclo per l'intera dimensione della "Struttura", mostrando così tutta area di memoria della "Struttura": Seek #t, 0 For i = 0 To Object.SizeOf(vrSt) - 1 If i = Object.SizeOf(vrSt) - 8 Then Read #t, p2 Print String@(p2) Quit Endif Read #t, b Print i, b, Hex(b, 16) Next t.Close End
Per vedere un altro esempio del suo uso si rinvia a questa pagina della Wiki: Leggere e scrivere direttamente nell'area di memoria di una Struttura accedendovi con la classe Object.