Assegnare un Puntatore ad una Struttura per dereferenziarlo

Da Gambas-it.org - Wikipedia.

Come sappiamo per dereferenziare un Puntatore, ossia per leggere i valori salvati all'interno dell'area di memoria riservata da esso puntata [Nota 1], possiamo utilizzare in Gambas due risorse:

  • le funzioni specifiche di dereferenziazione dei Puntatori (ad esempio: Byte@(), Short@(), etc.);
  • i Memory Stream.

Possiamo, però, adoperare anche le Strutture, avendo cura di creare un'apposita Struttura che rispetti rigidamente la dimensione dell'area di memoria riservata puntata dal Puntatore e il tipo di valori contenuti nei vari membri che compongono la Struttura medesima. [Nota 2]

Facciamo un semplice esempio:

Public Struct STRUTTURA
  b As Byte
  s As Short
  i As Integer
  l As Long
End Struct


Public Sub Main()
 
 Dim p As Pointer
 Dim st As Stream
 Dim strut As New STRUTTURA
 
' Procediamo a riempire l'area di memoria riservata con valori di diverso tipo di dati:
 p = Alloc(Object.SizeOf(strut), 1)
 st = Memory p For Write
 Write #st, 99 As Byte
 Seek #st, 2
 Write #st, 999 As Short
 Write #st, 99999 As Integer
 Write #st, 9999999 As Long
 st.Close
  
' Assegnamo il "Puntatore" alla variabile di tipo della "Struttura" dichiarata.
' Di fatto il "Puntatore" viene dereferenziato attraverso l'impiego della "Struttura."
 strut = p
  
' Vediamo il risultato per ciascun valore in console:
 With strut
   Print .b
   Print .s
   Print .i
   Print .l
 End With
  
 Free(p)
  
End


Note

[1] Vedere la seguente pagina: Dereferenziazione di un Puntatore

[2] Per l'uso di questa modalità con le funzioni esterne, vedere:
Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna