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

Da Gambas-it.org - Wikipedia.
Riga 19: Riga 19:
 
   datoInt = 2
 
   datoInt = 2
 
   
 
   
  ''<Font Color= #006400>' poniamo nel pointer "dato1Ptr" l'indirizzo che punta alla variabile Integer "datoInt":''</font>
+
  <Font Color= #006400>' ''Poniamo nel pointer "dato1Ptr" l'indirizzo che punta alla variabile Integer "datoInt":''</font>
 
     datoPtr = VarPtr(datoInt)
 
     datoPtr = VarPtr(datoInt)
 
   
 
   
  ''<Font Color= #006400>' Allochiamo memoria sufficiente:''</font>
+
  <Font Color= #006400>' ''Allochiamo memoria sufficiente:''</font>
 
   byPtr = Alloc(2)
 
   byPtr = Alloc(2)
 
   
 
   
  ''<Font Color= #006400>' supponiamo che venga usata una funzione esterna (ovviamente dichiarata con Extern, che qui si omette)
+
<Font Color= #006400>' ''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:''</font>
 
  '' ' la quale passi un dato byte alla variabile "byPtr", e che quindi possiamo raccogliere:''</font>
 
   funzione_esterna(param1, byPtr)
 
   funzione_esterna(param1, byPtr)
 
   
 
   
 
   
 
   
  ''<Font Color= #006400>' Andiamo ora a "dereferenziare" i pointer, ossia ad estrarre i valori contenuti nelle variabili,
+
<Font Color= #006400>' ''Andiamo ora a "dereferenziare" i pointer, ossia ad estrarre i valori contenuti nelle variabili,
 
  '' ' i cui indirizzi di memoria sono puntati dai precedenti puntatori.''</font>
 
  '' ' i cui indirizzi di memoria sono puntati dai precedenti puntatori.''</font>
 
    
 
    
  ''<Font Color= #006400>' Dereferenziamo il pointer "datoPtr" con la funzione specifica "Int@":''</font>
+
  <Font Color= #006400>' ''Dereferenziamo il pointer "datoPtr" con la funzione specifica "Int@":''</font>
 
   intDef = Int@(datoPtr)
 
   intDef = Int@(datoPtr)
 
   
 
   
  ''<Font Color= #006400>' Dereferenziamo ora il pointer "byPtr" con i "Memory-Stream":''</font>
+
  <Font Color= #006400>' ''Dereferenziamo ora il pointer "byPtr" con i "Memory-Stream":''</font>
 
   byStrm = Memory byPtr For Read
 
   byStrm = Memory byPtr For Read
  ''<Font Color= #006400>' Leggiamo quindi la variabile di tipo "stream", e poniamo il valore nella variabile di tipo byte:''</font>
+
  <Font Color= #006400>' ''Leggiamo quindi la variabile di tipo "stream", e poniamo il valore nella variabile di tipo byte:''</font>
 
   Read #byStrm, byDef
 
   Read #byStrm, byDef
 
   
 
   
 
   
 
   
  ''<Font Color= #006400>' Andiamo quindi a mostrare i relativi dati:''</font>
+
  <Font Color= #006400>' ''Andiamo quindi a mostrare i relativi dati:''</font>
 
   Print intDef
 
   Print intDef
 
   Print byDef
 
   Print byDef
Riga 53: Riga 53:
  
 
In quest'altro esempio andremo più semplicemente a dereferenziare lo stesso pointer con le due modalità sopra descritte:
 
In quest'altro esempio andremo più semplicemente a dereferenziare lo stesso pointer con le due modalità sopra descritte:
 
''<Font Color= #006400>' Gambas class file''</font>
 
 
 
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
Riga 66: Riga 62:
 
     a = 2
 
     a = 2
 
    
 
    
  ''<Font Color= #006400>' poniamo nella variabile pointer l'indirizzo della variabile byte "a":''</font>
+
  <Font Color= #006400>' ''Poniamo nella variabile pointer l'indirizzo della variabile byte "a":''</font>
 
     aPtr = VarPtr(a)
 
     aPtr = VarPtr(a)
 
      
 
      
 
      
 
      
  ''<Font Color= #006400>' Dereferenziamo il Pointer:''</font>
+
  <Font Color= #006400>' ''Dereferenziamo il Pointer:''</font>
 
   
 
   
  ''<Font Color= #006400>' con la funzione specifica "Byte@":''</font>
+
  <Font Color= #006400>' ''con la funzione specifica "Byte@":''</font>
 
     a1Post = Byte@(aPtr)
 
     a1Post = Byte@(aPtr)
 
        
 
        
  ''<Font Color= #006400>' e con i Memory-Stream:''</font>
+
  <Font Color= #006400>' ''e con i Memory-Stream:''</font>
 
     aSt = Memory aPtr For Read
 
     aSt = Memory aPtr For Read
 
     Read #aSt, a2Post
 
     Read #aSt, a2Post
 
        
 
        
 
        
 
        
  ''<Font Color= #006400>' quindi leggiamo i due valori restituiti:''</font>
+
  <Font Color= #006400>' ''Quindi leggiamo i due valori restituiti:''</font>
 
     Print "a1Post = "; a1Post
 
     Print "a1Post = "; a1Post
 
     Print "a2Post = "; a2Post
 
     Print "a2Post = "; a2Post

Versione delle 05:03, 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.

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:

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] 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.