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.
(Creata pagina con "In un'area di memoria riservata, creata con la funzione ''Alloc()'' ed avente le medesime dimensioni della ''Struttura'', vengono impostati mediante i ''Definizione_ed_uso_d...")
 
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
In un'area di memoria riservata, creata con la funzione ''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''.
+
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 43: Riga 43:
 
   
 
   
 
  '''End'''
 
  '''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.
 +
  <FONT Color=#B22222>'''stru = p'''</font>
 +
 +
<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. 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 Short@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Short))
 +
  Print Integer@(Pointer@(Object.Address(stt) + 24) + SizeOf(gb.Integer))

Versione attuale delle 07:36, 27 mar 2023

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, &4444444444 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. 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))