Passaggio di un argomento per 'indirizzo' ad una Funzione

Da Gambas-it.org - Wikipedia.

Il passaggio come argomento ad una Funzione mediante un Puntatore dell'indirizzo di memoria di una variabile automatica ovvero di un'area di memoria appositamente allocata, viene definito "passaggio per Indirizzo". [Nota 1]
Per passare l'Indirizzo di memoria di una variabile, bisognerà servirsi della funzione VarPtr( ).
Per passare, invece, l'Indirizzo di memoria di un'area di memoria appositamente allocata mediante la funzione Alloc( ), si passerà come argomento la variabile di tipo Puntatore che punta alla predetta area di memoria riservata.

Il passaggio degli argomenti per indirizzo consente di eliminare l'istruzione Return, e di ritornare, così, il valore dalla Funzione chiamata alla routine principale chiamante attraverso il parametro medesimo di tipo Puntatore della Funzione.
Per scrivere in uno dei parametri di tipo Puntatore della Funzione chiamata il risultato finale delle operazioni compiute dalla Funzione medesima, bisognerà utilizzare i Memory Stream.


Esempi pratici

Esempio di passaggio per Indirizzo di una variabile dichiarata come tipo Intero:

Public Sub Main()
 
 Dim i As Integer
 
' Assegnamo un valore iniziale alla variabile di tipo "Intero":
  i = 1000
   
' Passiamo mediante la funzione "VarPtr()" l'indirizzo di memoria della variabile di tipo "Intero":
  Funzione(VarPtr(i))
   
  Print i
  
End


Private Function Funzione(p As Pointer)
 
 Dim st As Stream
    
' Otteniamo una variabile "Stream" dal "Puntatore" mediante i "Memory Stream":
  st = Memory p For Write
' Scriviamo nel flusso dell'area di memoria, puntata dalla variabile "p", il risultato di una moltiplicazione:
  Write #st, Int@(p) * 1000 As Integer
' Chiudiamo il flusso di dati verso l'area di memoria:
  st.Close
 
End


Esempio di passaggio per Indirizzo di una variabile di tipo Puntatore che punta ad una piccola area di memoria opportunamente allocata:

Public Sub Main()
 
 Dim p As Pointer
 
' Allochiamo un'area di memoria:
  p = Alloc(SizeOf(gb.Byte), 2)
   
' Passiamo la viariabile di tipo "Puntatore" alla Funzione secondaria:
  Funzione(p)
   
' Dereferenziamo il "Puntatore", per vedere il valore presente nel primo byte dell'area riservata puntata:
  Print Byte@(p)
   
' Liberiamo la memoria precedentemente allocata:
  Free(p)
  
' Ci assicuriamo che la variabile di tipo "Puntatore" non punti più ad alcuna cella di memoria:
  p = 0
  
End


Private Function Funzione(po As Pointer)
 
 Dim st As Stream
 
' Creiamo una variabile di tipo "Stream" mediante i "Memory Stream", al fine di poter scrivere all'interno dell'area di memoria allocata:
  st = Memory po For Write
  
' Scriviamo un valore di tipo "Byte" nel primo byte dell'area di memoria allocata:
  Write #st, 199 As Byte
  
' Chiudiamo il flusso di dati:
   st.Close
  
End



Note

[1] Su questo argomento vedere anche la seguente pagina della WIKI: http://www.gambas-it.org/wiki/index.php?title=Scrivere_una_Funzione#Passaggio_per_indirizzo