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

Da Gambas-it.org - Wikipedia.
(Nuova pagina: 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(vari...)
 
Riga 91: Riga 91:
 
<BR>a2Post = 2
 
<BR>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:
 +
<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]].
  
  

Versione delle 18:12, 21 lug 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.