Differenze tra le versioni di "Ottenere il puntatore di una variabile di tipo Struttura"
Riga 4: | Riga 4: | ||
− | ==Ottenere il puntatore di una variabile di tipo Struttura mediante la funzione | + | ==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 14: | Riga 14: | ||
Esempio: | Esempio: | ||
− | + | Public Struct ABCDE | |
a As Byte | a As Byte | ||
b As Short | b As Short | ||
Riga 20: | Riga 20: | ||
d As Long | d As Long | ||
e As String | e As String | ||
− | + | End Struct | |
− | + | Private vrSt As <FONT color=B22222>Struct</font> ABCDE | |
'''Public''' Sub Main() | '''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 | With vrSt | ||
Riga 49: | Riga 48: | ||
<FONT color=gray>' ' ' ' ' '</font> | <FONT color=gray>' ' ' ' ' '</font> | ||
− | <FONT color=gray>' ''Ora ri-otteniamo i valori presenti nella "Struttura" | + | <FONT color=gray>' ''Ora ri-otteniamo i valori presenti nella "Struttura" dereferenziando con i "Memory-Stream" il "Puntatore" prima creato:''</font> |
− | |||
t = Memory p1 For Read | t = Memory p1 For Read | ||
Riga 66: | Riga 64: | ||
Print l | Print l | ||
− | <FONT color=gray>' ''Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", | + | <FONT color=gray>' ''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 poi dereferenziamo per ottenere la stringa:''</font> |
− | |||
Seek #t, 16 | Seek #t, 16 | ||
Read #t, p2 | Read #t, p2 | ||
Riga 73: | Riga 70: | ||
<FONT color=gray>' ''oppure anche con un ciclo per l'intera dimensione della "Struttura", mostrando così tutta area di memoria della "Struttura":'' | <FONT color=gray>' ''oppure anche con un ciclo per l'intera dimensione della "Struttura", mostrando così tutta area di memoria della "Struttura":'' | ||
− | For | + | For i = 0 To Object.SizeOf(vrSt) - 1 |
− | If | + | If i = Object.SizeOf(vrSt) - 8 Then |
Read #t, p2 | Read #t, p2 | ||
Print String@(p2) | Print String@(p2) | ||
Riga 80: | Riga 77: | ||
Endif | Endif | ||
Read #t, b | Read #t, b | ||
− | Print | + | Print i, b, Hex(b, 16) |
Next</font> | Next</font> | ||
− | |||
t.Close | t.Close | ||
Riga 89: | Riga 85: | ||
− | ====Uso della funzione | + | ====Uso della funzione "VarPtr()" con variabile di tipo ''Struttura'' dichiarata senza alcuna parola chiave==== |
E' possibile, inoltre, utilizzare la funzione ''VarPtr()'' anche quando la variabile di tipo ''Struttura'' è dichiarata come ''globale'' e priva sia della parola chiave ''Struct'' che della parola chiave ''New'': | E' possibile, inoltre, utilizzare la funzione ''VarPtr()'' anche quando la variabile di tipo ''Struttura'' è dichiarata come ''globale'' e priva sia della parola chiave ''Struct'' che della parola chiave ''New'': | ||
Private variabile_struttura As STRUTTURA | Private variabile_struttura As STRUTTURA | ||
Riga 95: | Riga 91: | ||
− | ==Ottenere il puntatore di una variabile di tipo Struttura mediante il | + | ==Ottenere il puntatore di una variabile di tipo Struttura mediante il Metodo "Object.Address()"== |
In particolare tale metodo ritorna l'indirizo di memoria dell'oggetto posto come parametro del metodo stesso, e si utilizzerà con la variabile di tipo ''Struttura'' con la seguente sintassi: | In particolare tale metodo ritorna l'indirizo di memoria dell'oggetto posto come parametro del metodo stesso, 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 |
Versione delle 18:59, 20 ago 2022
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 ' Creiamo il "Puntatore" alla variabile di tipo "Struttura": p1 = VarPtr(vrSt) ' ' ' ' ' ' ' Ora ri-otteniamo i valori presenti nella "Struttura" dereferenziando con i "Memory-Stream" il "Puntatore" prima creato: 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 poi dereferenziamo 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": 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
Uso della funzione "VarPtr()" con variabile di tipo Struttura dichiarata senza alcuna parola chiave
E' possibile, inoltre, utilizzare la funzione VarPtr() anche quando la variabile di tipo Struttura è dichiarata come globale e priva sia della parola chiave Struct che della parola chiave New:
Private variabile_struttura As STRUTTURA
Ottenere il puntatore di una variabile di tipo Struttura mediante il Metodo "Object.Address()"
In particolare tale metodo ritorna l'indirizo di memoria dell'oggetto posto come parametro del metodo stesso, 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).
Per vedere un esempio del suo uso si rinvia a questa pagina della WIKI.