Differenze tra le versioni di "Variabili di tipo Puntatore e loro dereferenziazione"
Riga 1: | Riga 1: | ||
− | Per porre l'indirizzo di memoria di una variabile qualsiasi in una variabile di tipo Puntatore (''As Pointer''), si utilizza la funzione ''VarPtr''. | + | Per porre l'indirizzo di memoria di una variabile qualsiasi in una variabile di tipo Puntatore (''As Pointer''), si utilizza la funzione ''VarPtr''. |[[#Note|1]]| |
variabile_puntatore = VarPtr(variabile_da_puntare) | variabile_puntatore = VarPtr(variabile_da_puntare) | ||
− | Successivamente, per ''dereferenziare''|[[#Note| | + | Successivamente, per ''dereferenziare''|[[#Note|2]]| 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|[[#Note| | + | * più brevemente una specifica funzione che restituisca il valore memorizzato all'indirizzo specificato dal Puntatore|[[#Note|3]]|: Int@, Byte@, Float@, etc, a seconda del tipo. |
Riga 93: | Riga 93: | ||
+ | =Note= | ||
+ | [1] Se la variabile di tipo ''Puntatore'' deve puntare ad una variabile (o meglio: contenere l'indirizzo di memoria di una variabile) già presente e già valorizzata, allora si userà la funzione ''VarPtr''. | ||
+ | <BR>Se la variabile di tipo ''Puntatore'' deve essere utilizzata per creare un variabile di tipo ''Stream'', nel quale successivamente scrivere dati, allora si allocherà una parte di memoria mediante la funzione ''Alloc( )''. | ||
− | + | [2] ''Dereferenziare un Pointer'': accedere al valore della variabile puntata dal puntatore. | |
− | [ | ||
− | [ | + | [3] 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 05:14, 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. |1|
variabile_puntatore = VarPtr(variabile_da_puntare)
Successivamente, per dereferenziare|2| 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|3|: 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] Se la variabile di tipo Puntatore deve puntare ad una variabile (o meglio: contenere l'indirizzo di memoria di una variabile) già presente e già valorizzata, allora si userà la funzione VarPtr.
Se la variabile di tipo Puntatore deve essere utilizzata per creare un variabile di tipo Stream, nel quale successivamente scrivere dati, allora si allocherà una parte di memoria mediante la funzione Alloc( ).
[2] Dereferenziare un Pointer: accedere al valore della variabile puntata dal puntatore.
[3] Per restare come riferimento al Forum di Gambas-it.org, vedere anche questa discussione sui puntatori.