Differenze tra le versioni di "Leggere e scrivere direttamente nell'area di memoria di una Struttura accedendovi con la classe Object"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
  
 
=Leggere e scrivere direttamente nell'area di memoria di una ''Struttura'' usando il Metodo "Object.Data()"=
 
=Leggere e scrivere direttamente nell'area di memoria di una ''Struttura'' usando il Metodo "Object.Data()"=
Poiché il Metodo "Object.Data()" restituisce un ''Puntatore'' all'indirizzo di memoria ove sono referenziati i dati, contenuti dalla ''Struttura'',
+
La lettura nell'area di memoria di una ''Struttura'' potrà avvenire attraverso le funzioni naive di Gambas di dereferenziazione dei ''Puntatori'' oppure tramite la risorsa ''Memory Stream''.
 +
 
 +
 
 +
=Leggere e scrivere direttamente nell'area di memoria di una ''Struttura'' usando il Metodo "Object.Address()"=
 +
Anche nel caso di uso del Metodo "Object.Address()" è possibile leggere e scrivere direttamente all'interno dell'area di memoria di una ''Struttura'' attraverso le funzioni naive di Gambas di dereferenziazione dei ''Puntatori'' oppure tramite la risorsa ''Memory Stream''.
 +
 
 +
===Leggere e scrivere con i Memory Stream===
 +
Come sappiamo, una ''Struttura'' in sostanza non è altro che un'area riservata di memoria suddivisa al suo interno per settori (''membri'') di dimensione fra loro non (necessariamente) omogenea.
 +
 
 +
Lo scopo, quindi, è assegnare tale area di memoria ad un ''Puntatore'', e successivamente attraverso i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' <SUP>&#091;[[#Note|nota 1]]&#093;</sup> andare a leggere e/o scrivere in tale area, ossia nella ''Struttura''. Come è evidente, dunque, il processo di lettura e di scrittura all'interno dei membri della ''Struttura'' avverrà in modo diverso, atipico rispetto alla normale modalità di lettura/assegnazione di valori che avviene richiamando direttamente i membri della ''Struttura'' medesima.
 +
 
 +
Mostriamo dunque un esempio,pratico: <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 +
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, j As Byte
 +
 +
<FONT Color=gray>' ''Assegnamo dei valori ai membri della Struttura:''</font>
 +
  With stru
 +
    .b = &01
 +
    .s = &1234
 +
    .i = &12345678
 +
  End With
 +
 +
<FONT Color=gray>' ''Otteniamo l'indirizzo di memoria della Struttura:''</font>
 +
  p = <FONT Color=#B22222><B>Object.Address</b></font>(stru)
 +
 +
<FONT Color=gray>' ''Otteniamo dal Puntatore uno "Stream" in lettura e scrittura:''</font>
 +
  st = Memory p For Read Write
 +
 +
<FONT Color=gray>' ''Leggiamo i valori contenuti nell'area di memoria della Struttura, per la sua intera dimensione, alla quale aggiungiamo 24 byte, dato che - utilizzando la parola "New" nella dichiarazione dela variabile di tipo "Struttura" ed il Metodo "Object.Address()" per ottenerne l'indirizzo di memoria - il valore del primo membro è posizionato al 25° byte (indice 24) dello "stream":</font>
 +
  For j = 0 To 24 + Object.SizeOf(stru) - 1
 +
    Read #st, b
 +
    If j == 24 Then
 +
      Print "\e[31m"; j, Hex(b, 2)
 +
    Else
 +
      Print j, Hex(b, 2)
 +
    Endif
 +
  Next
 +
 +
<FONT Color=gray>' ''Modifichiamo un valore (in questo caso quello del secondo membro, quello di tipo "Short") all'interno della Struttura usando lo "stream" precedentemente creato:''</font>
 +
  Seek #st, 26
 +
  Write #st, &0987 As Short
 +
 +
  st.Close
 +
 +
<FONT Color=gray>' ''Verifichiamo la scrittura del dato, leggendo ora direttamente il membro di tipo "Short" della Struttura:''</font>
 +
    Print "\n\e[0m"; Hex(stru.s, 4)
 +
 +
'''End'''
 +
 
 +
 
 +
 
 +
=Note=
 +
[1] Vedere anche: [[Assegnare valori ad una Struttura mediante i Memory Stream]]
 +
 
 +
[2] Vedere anche: [[Ottenere il puntatore di una variabile di tipo Struttura]]
  
  
  
 
<FONT Color=red size=5>'''Pagina in costruzione !'''</font>
 
<FONT Color=red size=5>'''Pagina in costruzione !'''</font>

Versione delle 13:05, 28 mar 2023

Per poter leggere e scrivere dati in una Struttura, oltre all'uso più semplice dei suoi membri, è possibile accedere direttamente all'area di memoria della Struttura mediante i seguenti Metodi della Classe Object:

  • "Object.Data()", il quale ritorna un Puntatore all'indirizzo di memoria ove sono referenziati i dati contenuti dai membri della Struttura;
  • "Object.Address()", che ritorna l'indirizzo di memoria dell'Oggetto Struttura.

Leggere e scrivere direttamente nell'area di memoria di una Struttura usando il Metodo "Object.Data()"

La lettura nell'area di memoria di una Struttura potrà avvenire attraverso le funzioni naive di Gambas di dereferenziazione dei Puntatori oppure tramite la risorsa Memory Stream.


Leggere e scrivere direttamente nell'area di memoria di una Struttura usando il Metodo "Object.Address()"

Anche nel caso di uso del Metodo "Object.Address()" è possibile leggere e scrivere direttamente all'interno dell'area di memoria di una Struttura attraverso le funzioni naive di Gambas di dereferenziazione dei Puntatori oppure tramite la risorsa Memory Stream.

Leggere e scrivere con i Memory Stream

Come sappiamo, una Struttura in sostanza non è altro che un'area riservata di memoria suddivisa al suo interno per settori (membri) di dimensione fra loro non (necessariamente) omogenea.

Lo scopo, quindi, è assegnare tale area di memoria ad un Puntatore, e successivamente attraverso i Memory Stream [nota 1] andare a leggere e/o scrivere in tale area, ossia nella Struttura. Come è evidente, dunque, il processo di lettura e di scrittura all'interno dei membri della Struttura avverrà in modo diverso, atipico rispetto alla normale modalità di lettura/assegnazione di valori che avviene richiamando direttamente i membri della Struttura medesima.

Mostriamo dunque un esempio,pratico: [nota 2]

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, j As Byte

' Assegnamo dei valori ai membri della Struttura:
  With stru
    .b = &01
    .s = &1234
    .i = &12345678
  End With

' Otteniamo l'indirizzo di memoria della Struttura:
  p = Object.Address(stru)

' Otteniamo dal Puntatore uno "Stream" in lettura e scrittura:
  st = Memory p For Read Write

' Leggiamo i valori contenuti nell'area di memoria della Struttura, per la sua intera dimensione, alla quale aggiungiamo 24 byte, dato che - utilizzando la parola "New" nella dichiarazione dela variabile di tipo "Struttura" ed il Metodo "Object.Address()" per ottenerne l'indirizzo di memoria - il valore del primo membro è posizionato al 25° byte (indice 24) dello "stream":
  For j = 0 To 24 + Object.SizeOf(stru) - 1
    Read #st, b
    If j == 24 Then 
      Print "\e[31m"; j, Hex(b, 2)
    Else
      Print j, Hex(b, 2)
    Endif
  Next

' Modifichiamo un valore (in questo caso quello del secondo membro, quello di tipo "Short") all'interno della Struttura usando lo "stream" precedentemente creato:
  Seek #st, 26
  Write #st, &0987 As Short

  st.Close

' Verifichiamo la scrittura del dato, leggendo ora direttamente il membro di tipo "Short" della Struttura:
   Print "\n\e[0m"; Hex(stru.s, 4)

End


Note

[1] Vedere anche: Assegnare valori ad una Struttura mediante i Memory Stream

[2] Vedere anche: Ottenere il puntatore di una variabile di tipo Struttura


Pagina in costruzione !