Differenze tra le versioni di "Variabili di tipo Puntatore e loro dereferenziazione"

Da Gambas-it.org - Wikipedia.
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|1]]| il pointer, ossia per estrarre il valore contenuto nella variabile puntata dal puntatore, è possibile usare:
+
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|2]]|: Int@, Byte@, Float@, etc, a seconda del tipo.
+
* 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( )''.
  
=Note=
+
[2] ''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].
+
[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.