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

Da Gambas-it.org - Wikipedia.
Riga 3: Riga 3:
 
* i ''Memory Stream''.
 
* 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.
+
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. <SUP>&&091;[[#Note|Nota 1]]&#091;</sup>
  
  
Facciamo un primo semplice esempio,nel quale sarà dereferenziato un ''Puntatore'' ad una variabile di tipo ''Intero'':
+
Facciamo un semplice esempio:
  Public Struct STRUTTURA
+
  Public Struct <FONT Color=darkgreen>STRUTTURA</font>
  i As Integer
 
End Struct
 
 
 
'''Public''' Sub Main()
 
 
 
  Dim p As Pointer
 
  Dim i As Integer
 
  Dim strut As New STRTTURA
 
 
 
  i = 9999
 
 
 
<FONT Color=gray>' ''Generiamo il "Puntatore" alla variabile di tipo "Intero":''</font>
 
  p = VarPtr(i)
 
 
 
<FONT Color=gray>' ''Procediamo a dereferenziare il "Puntatore" assegnandolo alla "Struttura":''</font>
 
  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
 
   b As Byte
 
   s As Short
 
   s As Short
Riga 42: Riga 17:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
   Dim p As Pointer
+
   Dim <FONT Color=red>p</font> As Pointer
 
   Dim st As Stream
 
   Dim st As Stream
   Dim strut As New STRUTTURA
+
   Dim <FONT Color=green>strut</font> As New <FONT Color=darkgreen>STRUTTURA</font>
 
    
 
    
 
  <FONT Color=gray>' ''Procediamo a riempire l'area di memoria riservata con valori di diverso tipo di dati:''</font>
 
  <FONT Color=gray>' ''Procediamo a riempire l'area di memoria riservata con valori di diverso tipo di dati:''</font>
   p = Alloc(Object.SizeOf(STRUTTURA))
+
   <FONT Color=red>p</font> = Alloc(Object.SizeOf(<FONT Color=green>strut</font>), 1)
   st = Memory p For Write
+
   st = Memory <FONT Color=red>p</font> For Write
 
   Write #st, 99 As Byte
 
   Write #st, 99 As Byte
 
   Seek #st, 2
 
   Seek #st, 2
Riga 58: Riga 33:
 
  <FONT Color=gray>' ''Assegnamo il "Puntatore" alla variabile di tipo della "Struttura" dichiarata.''
 
  <FONT Color=gray>' ''Assegnamo il "Puntatore" alla variabile di tipo della "Struttura" dichiarata.''
 
  ' ''Di fatto il "Puntatore" viene dereferenziato attraverso l'impiego della "Struttura."</font>
 
  ' ''Di fatto il "Puntatore" viene dereferenziato attraverso l'impiego della "Struttura."</font>
   strut = p
+
   <FONT Color=green>strut</font> = <FONT Color=red>p</font>
 
    
 
    
  <FONT Color=gray>' ''Vediamo il risultato di dereferenziazione per ciascun valore in console:''</font>
+
  <FONT Color=gray>' ''Vediamo il risultato per ciascun valore in console:''</font>
   With strut
+
   With <FONT Color=green>strut</font>
 
     Print .b
 
     Print .b
 
     Print .s
 
     Print .s
Riga 68: Riga 43:
 
   End With
 
   End With
 
    
 
    
   Free(p)
+
   Free(<FONT Color=red>p</font>)
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 05:40, 8 ago 2020

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. &&091;Nota 1[


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