Differenze tra le versioni di "Assegnare a una Struttura i valori contenuti in un'area di memoria creata con la funzione Alloc()"
Da Gambas-it.org - Wikipedia.
(4 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | In un'area di memoria riservata, creata con la funzione | + | In un'area di memoria riservata, creata con la funzione "[[Alloc|Alloc()]]" ed avente le medesime dimensioni della ''Struttura'', vengono impostati mediante i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' i valori da passare ad uno o più membri di quella ''Struttura''. Successivamente si assegna tale area di memoria alla ''Struttura''. |
Mostriamo dunque un esempio: | Mostriamo dunque un esempio: | ||
Riga 9: | Riga 9: | ||
− | + | Public Sub Main() | |
Dim stru As New STRUTTURA | Dim stru As New STRUTTURA | ||
Riga 26: | Riga 26: | ||
Write #st, 0 As Byte <FONT Color=gray>' ''Si rispetta l'Allineamento dei membri''</font> | Write #st, 0 As Byte <FONT Color=gray>' ''Si rispetta l'Allineamento dei membri''</font> | ||
Write #st, &2222 As Short | Write #st, &2222 As Short | ||
− | Write #st, & | + | Write #st, &44444444 As Integer |
st.Close | st.Close | ||
Riga 42: | Riga 42: | ||
Free(p) | Free(p) | ||
− | + | End | |
Se si vogliono leggere i valori, presenti nei membri della ''Struttura'', utilizzando l'indirizzo di memoria dell'Oggetto ''Struttura'' e le funzioni di dereferenziazione dei ''Puntatori'', potremo usare questa parte di codice. | Se si vogliono leggere i valori, presenti nei membri della ''Struttura'', utilizzando l'indirizzo di memoria dell'Oggetto ''Struttura'' e le funzioni di dereferenziazione dei ''Puntatori'', potremo usare questa parte di codice. | ||
<FONT Color=#B22222>'''stru = p'''</font> | <FONT Color=#B22222>'''stru = p'''</font> | ||
− | <FONT Color=gray>' ''In | + | <FONT Color=gray>' ''In questo caso il Metodo "Object.Address()" ritorna il "Puntatore di un Puntatore", pertanto è necessario innanzitutto dereferenziare tale tipo di dato.'' |
− | ' | + | ' ''Come è noto, i dati dell'area di memoria della "Stuttura" sono contenuti a partire dal 25° (indice 24) byte'' <SUP>[[[#Note|nota 1]]]</sup>''. Ciò si spiega con il fatto che il Metodo "Object.Address()" restituisce l'indirizzo di un Oggetto Gambas (in tal caso una Struttura) in memoria, non l'indirizzo dei dati a cui fa riferimento.''</font> |
Print Byte@(Pointer@(Object.Address(stt) + 24)) | Print Byte@(Pointer@(Object.Address(stt) + 24)) | ||
Print Short@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Short)) | Print Short@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Short)) | ||
Print Integer@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Integer)) | Print Integer@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Integer)) | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Vedere anche la seguente pagina: [[Ottenere il puntatore di una variabile di tipo Struttura]] |
Versione attuale delle 18:23, 7 giu 2024
In un'area di memoria riservata, creata con la funzione "Alloc()" ed avente le medesime dimensioni della Struttura, vengono impostati mediante i Memory Stream i valori da passare ad uno o più membri di quella Struttura. Successivamente si assegna tale area di memoria alla Struttura.
Mostriamo dunque un esempio:
Public Struct STRUTTURA b As Byte s As Short i As Integer End Struct Public Sub Main() Dim stru As New STRUTTURA Dim p As Pointer Dim st As Stream Dim b As Byte ' Riserviamo un'area di memoria riservata avente una dimensione pari a quella della Struttura: p = Alloc(Object.SizeOf(stru), 1) ' Otteniamo dal Puntatore uno "Stream" in scrittura: st = Memory p For Write ' Scriviamo dei valori nell'area riservata di memoria nel rispetto della disposizione dei byte all'interno dell'analoga area di memoria rappresentata dalla "Struttura", nonché della norma dell'Allineamento dei suoi membri: Write #st, &11 As Byte Write #st, 0 As Byte ' Si rispetta l'Allineamento dei membri Write #st, &2222 As Short Write #st, &44444444 As Integer st.Close ' Assegnamo l'area riservata di memoria alla "Struttura": stru = p ' Verifichiamo i valori ora presenti nei tre membri della "Struttura": With stru Print .b, Null, Hex(.b, 2) Print .s, Null, Hex(.s, 4) Print .i, Hex(.i, 8) End With Free(p) End
Se si vogliono leggere i valori, presenti nei membri della Struttura, utilizzando l'indirizzo di memoria dell'Oggetto Struttura e le funzioni di dereferenziazione dei Puntatori, potremo usare questa parte di codice.
stru = p ' In questo caso il Metodo "Object.Address()" ritorna il "Puntatore di un Puntatore", pertanto è necessario innanzitutto dereferenziare tale tipo di dato. ' Come è noto, i dati dell'area di memoria della "Stuttura" sono contenuti a partire dal 25° (indice 24) byte [nota 1]. Ciò si spiega con il fatto che il Metodo "Object.Address()" restituisce l'indirizzo di un Oggetto Gambas (in tal caso una Struttura) in memoria, non l'indirizzo dei dati a cui fa riferimento. Print Byte@(Pointer@(Object.Address(stt) + 24)) Print Short@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Short)) Print Integer@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Integer))
Note
[1] Vedere anche la seguente pagina: Ottenere il puntatore di una variabile di tipo Struttura