Differenze tra le versioni di "Variabili di tipo Puntatore e loro dereferenziazione"
Riga 19: | Riga 19: | ||
datoInt = 2 | datoInt = 2 | ||
− | + | <Font Color= #006400>' ''Poniamo nel pointer "dato1Ptr" l'indirizzo che punta alla variabile Integer "datoInt":''</font> | |
datoPtr = VarPtr(datoInt) | datoPtr = VarPtr(datoInt) | ||
− | + | <Font Color= #006400>' ''Allochiamo memoria sufficiente:''</font> | |
byPtr = Alloc(2) | byPtr = Alloc(2) | ||
− | + | <Font Color= #006400>' ''Supponiamo che venga usata una funzione esterna (ovviamente dichiarata con Extern, che qui si omette) | |
'' ' la quale passi un dato byte alla variabile "byPtr", e che quindi possiamo raccogliere:''</font> | '' ' la quale passi un dato byte alla variabile "byPtr", e che quindi possiamo raccogliere:''</font> | ||
funzione_esterna(param1, byPtr) | funzione_esterna(param1, byPtr) | ||
− | + | <Font Color= #006400>' ''Andiamo ora a "dereferenziare" i pointer, ossia ad estrarre i valori contenuti nelle variabili, | |
'' ' i cui indirizzi di memoria sono puntati dai precedenti puntatori.''</font> | '' ' i cui indirizzi di memoria sono puntati dai precedenti puntatori.''</font> | ||
− | + | <Font Color= #006400>' ''Dereferenziamo il pointer "datoPtr" con la funzione specifica "Int@":''</font> | |
intDef = Int@(datoPtr) | intDef = Int@(datoPtr) | ||
− | + | <Font Color= #006400>' ''Dereferenziamo ora il pointer "byPtr" con i "Memory-Stream":''</font> | |
byStrm = Memory byPtr For Read | byStrm = Memory byPtr For Read | ||
− | + | <Font Color= #006400>' ''Leggiamo quindi la variabile di tipo "stream", e poniamo il valore nella variabile di tipo byte:''</font> | |
Read #byStrm, byDef | Read #byStrm, byDef | ||
− | + | <Font Color= #006400>' ''Andiamo quindi a mostrare i relativi dati:''</font> | |
Print intDef | Print intDef | ||
Print byDef | Print byDef | ||
Riga 53: | Riga 53: | ||
In quest'altro esempio andremo più semplicemente a dereferenziare lo stesso pointer con le due modalità sopra descritte: | In quest'altro esempio andremo più semplicemente a dereferenziare lo stesso pointer con le due modalità sopra descritte: | ||
− | |||
− | |||
− | |||
− | |||
'''Public''' Sub Button1_Click() | '''Public''' Sub Button1_Click() | ||
Riga 66: | Riga 62: | ||
a = 2 | a = 2 | ||
− | + | <Font Color= #006400>' ''Poniamo nella variabile pointer l'indirizzo della variabile byte "a":''</font> | |
aPtr = VarPtr(a) | aPtr = VarPtr(a) | ||
− | + | <Font Color= #006400>' ''Dereferenziamo il Pointer:''</font> | |
− | + | <Font Color= #006400>' ''con la funzione specifica "Byte@":''</font> | |
a1Post = Byte@(aPtr) | a1Post = Byte@(aPtr) | ||
− | + | <Font Color= #006400>' ''e con i Memory-Stream:''</font> | |
aSt = Memory aPtr For Read | aSt = Memory aPtr For Read | ||
Read #aSt, a2Post | Read #aSt, a2Post | ||
− | + | <Font Color= #006400>' ''Quindi leggiamo i due valori restituiti:''</font> | |
Print "a1Post = "; a1Post | Print "a1Post = "; a1Post | ||
Print "a2Post = "; a2Post | Print "a2Post = "; a2Post |
Versione delle 05:03, 18 feb 2013
Per porre l'indirizzo di memoria di una variabile qualsiasi in una variabile di tipo Puntatore (As Pointer), si utilizza la funzione VarPtr.
variabile_puntatore = VarPtr(variabile_da_puntare)
Successivamente, per dereferenziare|1| il pointer, ossia per estrarre il valore contenuto nella variabile puntata dal puntatore, è possibile usare:
- i Memory-Stream in lettura (soprattutto se è stata utilizzata una zona riservata di memoria con la funzione Alloc, e l'indirizzo è stato passato alla variabile pointer da una funzione esterna richiamata con Extern);
- più brevemente una specifica funzione che restituisca il valore memorizzato all'indirizzo specificato dal Puntatore|2|: Int@, Byte@, Float@, etc, a seconda del tipo.
Esempio:
Public Sub Button1_Click() Dim datoInt, intDef As Integer Dim byDef As Byte Dim datoPtr As Pointer Dim byPtr As Pointer Dim byStrm As Stream datoInt = 2 ' Poniamo nel pointer "dato1Ptr" l'indirizzo che punta alla variabile Integer "datoInt": datoPtr = VarPtr(datoInt) ' Allochiamo memoria sufficiente: byPtr = Alloc(2) ' Supponiamo che venga usata una funzione esterna (ovviamente dichiarata con Extern, che qui si omette) ' la quale passi un dato byte alla variabile "byPtr", e che quindi possiamo raccogliere: funzione_esterna(param1, byPtr) ' Andiamo ora a "dereferenziare" i pointer, ossia ad estrarre i valori contenuti nelle variabili, ' i cui indirizzi di memoria sono puntati dai precedenti puntatori. ' Dereferenziamo il pointer "datoPtr" con la funzione specifica "Int@": intDef = Int@(datoPtr) ' Dereferenziamo ora il pointer "byPtr" con i "Memory-Stream": byStrm = Memory byPtr For Read ' Leggiamo quindi la variabile di tipo "stream", e poniamo il valore nella variabile di tipo byte: Read #byStrm, byDef ' Andiamo quindi a mostrare i relativi dati: Print intDef Print byDef ' De-allochiamo la memoria precedentemente riservata: free(byPtr) End
In quest'altro esempio andremo più semplicemente a dereferenziare lo stesso pointer con le due modalità sopra descritte:
Public Sub Button1_Click() Dim a As Byte Dim aPtr As Pointer Dim aSt As Stream Dim a1Post, a2Post As Byte a = 2 ' Poniamo nella variabile pointer l'indirizzo della variabile byte "a": aPtr = VarPtr(a) ' Dereferenziamo il Pointer: ' con la funzione specifica "Byte@": a1Post = Byte@(aPtr) ' e con i Memory-Stream: aSt = Memory aPtr For Read Read #aSt, a2Post ' Quindi leggiamo i due valori restituiti: Print "a1Post = "; a1Post Print "a2Post = "; a2Post End
In console avremo coerentemente:
a1Post = 2
a2Post = 2
Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna
Per quest'argomento rimandiamo alla specifica pagina presente nella WIKI:
Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna.
Note
[1] Dereferenziare un Pointer: accedere al valore della variabile puntata dal puntatore.
[2] Per restare come riferimento al Forum di Gambas-it.org, vedere anche questa discussione sui puntatori.