Dereferenziare senza Memory-Stream un Puntatore ad una Struttura, passato da una funzione esterna

Da Gambas-it.org - Wikipedia.

Con la rev. #4978 è ora possibile dereferenziare in modo più diretto, senza l'uso di Memory-Stream, un Puntatore, passato da una funzione esterna, che punta ad una Struttura esterna.

Il caso in questione prevede una funzione esterna che passa un puntatore ad una Struttura esterna [nota 1]. Il programma Gambas può dereferenziare il Puntatore, passato dalla funzione esterna, sia con i Memory-Stream, sia - ora - mediante una capacità specifica della variabile del tipo della Struttura, dichiarata nel programma Gambas e simile negli elementi a quella puntata dal Puntatore passato dalla funzione esterna. [nota 2]
Nel codice ciò avviene assegnando la variabile di tipo Puntatore alla variabile del tipo della Struttura da utilizzare:

variabile_struttura = variabile_puntatore

Facciamo il seguente esempio astratto:

' Ricreiamo nell'applicativo Gambas una Struttura "simile" a quella esterna, puntata dal pointer, che sarà passato dalla funzione esterna, e che raccoglierà i dati presenti in quella struttura esterna puntata:
Public Struct STRUTTURA
  primo_membro As Byte
  secondo_membro As Short
  terzo_membro As Integer
End Struct

' Dichiariamo con "Extern" la funzione esterna:
Private Extern funzioneEsterna(pnt As Pointer)


Public Sub Main()

' Dichiariamo il puntatore che sarà passato dalla funzione esterna:
 Dim po As Pointer
' Quindi anche la variabile del tipo della Struttura:
 Dim variabile_tipo_Struttura As STRUTTURA

' Chiamiamo la funzione esterna:
 funzioneEsterna(VarPtr(po))

' ...oppure se ritorna "per Valore" il Puntatore:
' po = funzioneEsterna([...eventuali_parametri...])

' Assegnamo alla nostra variabile del tipo della Struttura il Puntatore passato dalla funzione esterna:
 variabile_tipo_Struttura = po

' Andiamo quindi a vedere in console i valori dereferenziati con la nuova funzionalità:
 With variabile_tipo_Struttura
   Print primo_membro
   Print secondo_membro
   Print terzo_membro
 End With
 
End

Convertendo il Puntatore, passato dalla funzione esterna, in un oggetto Struttura di Gambas, in realtà si crea un nuovo oggetto speciale del tipo della Struttura di Gambas che non memorizza qualcosa come un oggetto normale, ma che punta a ciò che il Puntatore punta.


Note

[1] Vedere anche questa pagina: Assegnare un Puntatore ad una Struttura per dereferenziarlo

[2] Vedere anche questa pagina: Utilizzare come Struttura in Gambas una Struttura esterna dichiarata, come proprio membro di tipo Puntatore, da una Struttura principale esterna