Differenze tra le versioni di "Assegnare un Puntatore ad una Struttura per dereferenziarlo"

Da Gambas-it.org - Wikipedia.
Riga 17: Riga 17:
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim strut As New STRTTURA
 
   Dim strut As New STRTTURA
 
+
 
 
   i = 9999
 
   i = 9999
+
 
 
  <FONT Color=gray>' ''Generiamo il "Puntatore" alla variabile di tipo "Intero":''</font>
 
  <FONT Color=gray>' ''Generiamo il "Puntatore" alla variabile di tipo "Intero":''</font>
 
   p = VarPtr(i)
 
   p = VarPtr(i)
Riga 26: Riga 26:
 
   strut = p
 
   strut = p
 
    
 
    
   With strut
+
   Print strut.i
    Print .i
+
    
   End With
 
 
 
  '''End'''
 
  '''End'''
  

Versione delle 09:12, 20 apr 2018

Come sappiamo per dereferenziare un Puntatore, ossia per leggere i valori salvati all'interno dell'area di memoria riservata da esso puntata, possiamo utilizzare in Gabmas 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, nonché il tipo di valori da contenere nei vari membri che compongono la Struttura medesima.


Facciamo un primo semplice esempio,nel quale sarà dereferenziato un Puntatore ad una variabile di tipo Intero:

Public Struct STRUTTURA
  i As Integer
End Struct


Public Sub Main()
 
 Dim p As Pointer
 Dim i As Integer
 Dim strut As New STRTTURA
  
  i = 9999
  
' Generiamo il "Puntatore" alla variabile di tipo "Intero":
  p = VarPtr(i)
  
' Procediamo a dereferenziare il "Puntatore" assegnandolo alla "Struttura":
  strut = p
  
  Print strut.i
  
End


In quest'altro esempio l'area di memoria riservata, puntata dal Puntatore, contiene valori appartenenti a diversi tipi di dati; pertanto la Struttura adoperata per dereferenziare il Puntatore sarà più complessa:

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(STRUTTURA))
  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 di dereferenziazione per ciascun valore in console:
  With strut
    Print .b
    Print .s
    Print .i
    Print .l
  End With
  
  Free(p)
  
End