Differenze tra le versioni di "Assegnare un Puntatore ad una Struttura per dereferenziarlo"
Da Gambas-it.org - Wikipedia.
(9 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 | + | Come sappiamo per dereferenziare un ''Puntatore'', ossia per leggere i valori salvati all'interno dell'area di memoria riservata da esso puntata <SUP>[[[#Note|nota 1]]]</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'' | + | 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>[[[#Note|nota 2]]]</sup> |
− | + | Facciamo un semplice esempio: | |
− | Facciamo un | + | Public Struct <FONT Color=darkgreen>STRUTTURA</font> |
− | Public Struct | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
b As Byte | b As Byte | ||
s As Short | s As Short | ||
Riga 40: | Riga 14: | ||
− | + | 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> | ||
− | + | <FONT Color=red>p</font> = Alloc(Object.SizeOf(<FONT Color=green>strut</font>), 1) | |
− | + | st = Memory <FONT Color=red>p</font> 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 | |
<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> | ||
− | + | <B><FONT Color=green>strut</font> = <FONT Color=red>p</font></b> | |
− | <FONT Color=gray>' ''Vediamo il risultato | + | <FONT Color=gray>' ''Vediamo il risultato per ciascun valore in console:''</font> |
− | + | With <FONT Color=green>strut</font> | |
− | + | Print .b | |
− | + | Print .s | |
− | + | Print .i | |
− | + | Print .l | |
− | + | End With | |
− | + | Free(<FONT Color=red>p</font>) | |
− | + | End | |
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [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