Differenze tra le versioni di "Variabili di tipo Puntatore e loro dereferenziazione"
Riga 92: | Riga 92: | ||
− | + | ===Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna=== | |
Per quest'argomento rimandiamo alla specifica pagina presente nella WIKI: | Per quest'argomento rimandiamo alla specifica pagina presente nella WIKI: | ||
<BR>[[Dereferenziare_senza_Memory-Stream_un_pointer_ad_una_Struttura%2C_passato_da_una_funzione_esterna|Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna]]. | <BR>[[Dereferenziare_senza_Memory-Stream_un_pointer_ad_una_Struttura%2C_passato_da_una_funzione_esterna|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. | [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 [http://www.gambas-it.org/smf/index.php?topic=586.0 puntatori]. | [2] Per restare come riferimento al Forum di Gambas-it.org, vedere anche questa discussione sui [http://www.gambas-it.org/smf/index.php?topic=586.0 puntatori]. |
Versione delle 22:01, 26 gen 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:
' Gambas class file 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 End
In quest'altro esempio andremo più semplicemente a dereferenziare lo stesso pointer con le due modalità sopra descritte:
' Gambas class file 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.