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

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
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, possiamo utilizzare in Gabmas 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 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]]&#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 15: 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 22: Riga 21:
 
    
 
    
 
  <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>
  <FONT Color=red>p</font> = Alloc(Object.SizeOf(<FONT Color=green>strut</font>), 1)
+
  <FONT Color=red>p</font> = Alloc(Object.SizeOf(<FONT Color=green>strut</font>), 1)
  st = Memory <FONT Color=red>p</font> 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
  Write #st, 999 As Short
+
  Write #st, 999 As Short
  Write #st, 99999 As Integer
+
  Write #st, 99999 As Integer
  Write #st, 9999999 As Long
+
  Write #st, 9999999 As Long
  st.Close
+
  st.Close
 
    
 
    
 
  <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>
  <FONT Color=green>strut</font> = <FONT Color=red>p</font>
+
  <B><FONT Color=green>strut</font> = <FONT Color=red>p</font></b>
 
    
 
    
 
  <FONT Color=gray>' ''Vediamo il risultato per ciascun valore in console:''</font>
 
  <FONT Color=gray>' ''Vediamo il risultato per ciascun valore in console:''</font>
  With <FONT Color=green>strut</font>
+
  With <FONT Color=green>strut</font>
    Print .b
+
    Print .b
    Print .s
+
    Print .s
    Print .i
+
    Print .i
    Print .l
+
    Print .l
  End With
+
  End With
 
    
 
    
  Free(<FONT Color=red>p</font>)
+
  Free(<FONT Color=red>p</font>)
 
    
 
    
  '''End'''
+
  End
  
  
  
 
=Note=
 
=Note=
[1] Vedere anche: [[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]]
+
[1] Vedere la seguente pagina: [[Differenza_fra_Assegnazione_a_un_Puntatore_di_un_indirizzo_di_memoria_e_Dereferenziazione_di_un_Puntatore#Dereferenziazione_di_un_Puntatore|Dereferenziazione di un Puntatore]]
 +
 
 +
[2] Per l'uso di questa modalità con le funzioni esterne, vedere:
 +
<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