Differenze tra le versioni di "Variabili di tipo Puntatore e loro dereferenziazione"
Riga 3: | Riga 3: | ||
variabile_puntatore = VarPtr(variabile_da_puntare) | variabile_puntatore = VarPtr(variabile_da_puntare) | ||
− | Successivamente, per ''dereferenziare'' | + | Successivamente, per ''dereferenziare''|[[#Note|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''); | * 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 | + | * più brevemente una specifica funzione che restituisca il valore memorizzato all'indirizzo specificato dal Puntatore|[[#Note|2]]|: Int@, Byte@, Float@, etc, a seconda del tipo. |
Versione delle 04:25, 5 dic 2012
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.