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

Da Gambas-it.org - Wikipedia.
 
Riga 1: Riga 1:
Come sappiamo per dereferenziare un ''Puntatore'', ossia per leggere i valori salvati all'interno dell'area di memoria riservata da esso puntata <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>, possiamo utilizzare in Gambas due risorse:
+
Come sappiamo per dereferenziare un ''Puntatore'', ossia per leggere i valori salvati all'interno dell'area di memoria riservata da esso puntata <SUP>&#091;[[#Note|nota 1]]&#093;</sup>, possiamo utilizzare in Gambas due risorse:
 
* le funzioni specifiche di dereferenziazione dei ''Puntatori'' (ad esempio: ''Byte@()'', ''Short@()'', etc.);
 
* le funzioni specifiche di dereferenziazione dei ''Puntatori'' (ad esempio: ''Byte@()'', ''Short@()'', etc.);
 
* i ''Memory Stream''.
 
* i ''Memory Stream''.
  
Possiamo, però, adoperare anche le ''Strutture'', avendo cura di creare un'apposita ''Struttura'' che <SPAN Style="text-decoration:underline">rispetti rigidamente</span> la dimensione dell'area di memoria riservata puntata dal ''Puntatore'' e il tipo di valori contenuti nei vari membri che compongono la ''Struttura'' medesima. <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
+
Possiamo, però, adoperare anche le ''Strutture'', avendo cura di creare un'apposita ''Struttura'' che <SPAN Style="text-decoration:underline">rispetti rigidamente</span> la dimensione dell'area di memoria riservata puntata dal ''Puntatore'' e il tipo di valori contenuti nei vari membri che compongono la ''Struttura'' medesima. <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
  
 
Facciamo un semplice esempio:
 
Facciamo un semplice esempio:
Riga 14: Riga 14:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim <FONT Color=red>p</font> As Pointer
 
   Dim <FONT Color=red>p</font> As Pointer
Riga 44: Riga 44:
 
   Free(<FONT Color=red>p</font>)
 
   Free(<FONT Color=red>p</font>)
 
    
 
    
  '''End'''
+
  End
  
  
Riga 52: Riga 52:
  
 
[2] Per l'uso di questa modalità con le funzioni esterne, vedere:
 
[2] Per l'uso di questa modalità con le funzioni esterne, vedere:
<BR>[[Dereferenziare_senza_Memory-Stream_un_pointer_ad_una_Struttura,_passato_da_una_funzione_esterna|Dereferenziare senza Memory-Stream un pointer ad una Struttura, passato da una funzione esterna]]
+
<BR>[[Dereferenziare senza Memory-Stream un Puntatore ad una Struttura, passato da una funzione esterna]]

Versione attuale delle 09:41, 5 ago 2023

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 Puntatore ad una Struttura, passato da una funzione esterna