Differenze tra le versioni di "Dereferenziare un Puntatore di Puntatore con le funzioni specifiche di dereferenziazione e con i Memory Stream"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
 
Per dereferenziare un ''Puntatore'' di ''Puntatore'', esistono almeno due modalità:
 
Per dereferenziare un ''Puntatore'' di ''Puntatore'', esistono almeno due modalità:
 
* mediante le apposite funzioni di dereferenziazione posseduta dai tipi nativi di dati;
 
* mediante le apposite funzioni di dereferenziazione posseduta dai tipi nativi di dati;
* mediante i ''Memory Stream''.
+
* mediante i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]''.
  
  
Riga 11: Riga 11:
  
  
Vediamo un esempio pratico, nel quale prima verrà generato mediante la funzione ''VarPtr()'' un ''Puntatore'' di ''Puntatore'', e poi si percorrerà il cammino all'indietro riottenendo il valore puntato da un ''Puntatore'' puntato a sua volta da un ''Puntataore'', così come lo abbiamo realizzato, attraverso nella prima modalità con una delle suddette funzioni di dereferenziazione, nella seconda modalità con i ''Memory Stream''. Ad ogni modo, in entrambe le modalità di dereferenziazione il processo avviene con due fasi:
+
Vediamo un esempio pratico, nel quale prima verrà generato mediante la funzione ''VarPtr()'' un ''Puntatore'' di ''Puntatore'', e poi si percorrerà il cammino all'indietro riottenendo il valore puntato da un ''Puntatore'' puntato a sua volta da un ''Puntataore'', così come lo abbiamo realizzato, attraverso nella prima modalità con una delle suddette funzioni di dereferenziazione, nella seconda modalità con i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]''. Ad ogni modo, in entrambe le modalità di dereferenziazione il processo avviene con due fasi:
 
* dereferenziazione del "Puntatore" di "Puntatore", ottenendo il primo "Puntatore" (ossia l'indirizzo di memoria della variabile contnente il dato iniziale);
 
* dereferenziazione del "Puntatore" di "Puntatore", ottenendo il primo "Puntatore" (ossia l'indirizzo di memoria della variabile contnente il dato iniziale);
 
* dereferenziazione del "Puntatore", ottenendo il valore contenuto dalla variabile contenente il dato di partenza.
 
* dereferenziazione del "Puntatore", ottenendo il valore contenuto dalla variabile contenente il dato di partenza.
Riga 39: Riga 39:
 
   
 
   
 
  Print "-----------------------"
 
  Print "-----------------------"
  <FONT Color=gray>' ''Ora, dereferenziamo il "Puntatore" di "Puntatore" con i "Memory Stream":''</font>
+
  <FONT Color=gray>' ''Ora, dereferenziamo il "Puntatore" di "Puntatore" con i "[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]":''</font>
 
    
 
    
 
   st2 = Memory p2 For Read
 
   st2 = Memory p2 For Read

Versione delle 14:53, 22 giu 2016

Un Puntatore di Puntatore è una variabile di tipo Puntatore che punta ad un'altra variabile di tipo Puntatore. E' pertanto una variabile che contiene l'indirizzo di memoria di una variabile che a sua volta contiene l'indirizzo di memoria di una variabile contenente un valore, un dato, oppure di un'area riservata di memoria.


Per dereferenziare un Puntatore di Puntatore, esistono almeno due modalità:

  • mediante le apposite funzioni di dereferenziazione posseduta dai tipi nativi di dati;
  • mediante i Memory Stream.


Le funzioni direferenziazione sono quelle che derefenziano il Puntatore nel relativo tipo di dato, al quale ese si riferiscono.
Esse sono: Byt@(), Short@(), Singl@(), Int@(), Long@(), Pointer@().


Vediamo un esempio pratico, nel quale prima verrà generato mediante la funzione VarPtr() un Puntatore di Puntatore, e poi si percorrerà il cammino all'indietro riottenendo il valore puntato da un Puntatore puntato a sua volta da un Puntataore, così come lo abbiamo realizzato, attraverso nella prima modalità con una delle suddette funzioni di dereferenziazione, nella seconda modalità con i Memory Stream. Ad ogni modo, in entrambe le modalità di dereferenziazione il processo avviene con due fasi:

  • dereferenziazione del "Puntatore" di "Puntatore", ottenendo il primo "Puntatore" (ossia l'indirizzo di memoria della variabile contnente il dato iniziale);
  • dereferenziazione del "Puntatore", ottenendo il valore contenuto dalla variabile contenente il dato di partenza.
Public Sub Main()

 Dim b, n As Byte
 Dim p, p2, ritP, sP As Pointer
 Dim st, st2 As Stream

 
' Valore iniziale, che alla fine della dereferenziazione si dovrà riottenere:
  b = 44
  
' Creiamo il primo "Puntatore", che punta all'indirizzo di memoria della varianbile "b":
  p = VarPtr(b)
   
' Creiamo il secondo "Puntatore", che punta all'indirizzo di memoria della varianbile "p":
  p2 = VarPtr(p)
   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Ora, dereferenziamo il "Puntatore" di "Puntatore" con le apposite funzioni di dereferenziazione:
  ritP = Pointer@(p2)
   
  Print Byte@(ritP)


Print "-----------------------"
' Ora, dereferenziamo il "Puntatore" di "Puntatore" con i "Memory Stream":
 
  st2 = Memory p2 For Read
    Read #st2, sP
    st = Memory sP For Read
      Read #st, b
      Print b
       
    st.Close
  st2.Close

End