Differenze tra le versioni di "Ottenere il puntatore di una variabile di tipo Struttura"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
  
  
==Ottenere il puntatore di una variabile di tipo Struttura mediante la funzione "VarPtr( )"==
+
==Ottenere il puntatore di una variabile di tipo Struttura mediante la funzione "VarPtr()"==
 
La funzione "VarPtr()" ritorna un ''Puntatore'' che punta alla variabile contenuta in memoria; pertanto si utilizzerà con la variabile di tipo ''Struttura'' con la seguente sintassi:
 
La funzione "VarPtr()" ritorna un ''Puntatore'' che punta alla variabile contenuta in memoria; pertanto si utilizzerà con la variabile di tipo ''Struttura'' con la seguente sintassi:
 
  <FONT color=B22222><B>VarPtr</b></font>(Variabile_Struttura) As Pointer
 
  <FONT color=B22222><B>VarPtr</b></font>(Variabile_Struttura) As Pointer
Riga 43: Riga 43:
 
   
 
   
 
   
 
   
  <FONT color=gray>' ''Creiamo il "Puntatore" alla variabile di tipo "Struttura":''</font>
+
  <FONT color=gray>' ''Ottiene il "Puntatore" alla variabile di tipo "Struttura":''</font>
   p1 = <FONT color=B22222>VarPtr(</font>vrSt<FONT color=B22222>)</font>
+
   p1 = <FONT color=B22222><B>VarPtr</b></font>(vrSt)
 
   
 
   
<FONT color=gray>' ' ' ' ' '</font>
+
  <FONT color=gray>' ''Ora ri-ottiene i valori presenti nella "Struttura" dereferenziando con i "Memory-Stream" il "Puntatore":''</font>
 
  <FONT color=gray>' ''Ora ri-otteniamo i valori presenti nella "Struttura" dereferenziando con i "Memory-Stream" il "Puntatore" prima creato:''</font>
 
 
   t = Memory p1 For Read
 
   t = Memory p1 For Read
 
   
 
   
Riga 64: Riga 62:
 
   Print l
 
   Print l
 
   
 
   
  <FONT color=gray>' ''Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", allora leggiamo insieme questi byte e li assegnamo ad una variabile di tipo "Puntatore"; quindi poi dereferenziamo per ottenere la stringa:''</font>
+
  <FONT color=gray>' ''Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", allora leggiamo insieme questi byte e li assegnamo ad una variabile di tipo "Puntatore"; quindi dereferenzia per ottenere la stringa:''</font>
 
   Seek #t, 16
 
   Seek #t, 16
 
   Read #t, p2
 
   Read #t, p2
Riga 84: Riga 82:
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
====Uso della funzione "VarPtr()" con variabile di tipo ''Struttura'' dichiarata senza alcuna parola chiave====
 
E' possibile, inoltre, utilizzare la funzione ''VarPtr()'' anche quando la variabile di tipo ''Struttura'' è dichiarata come ''globale'' e priva sia della parola chiave ''Struct'' che della parola chiave ''New'':
 
Private variabile_struttura As STRUTTURA
 
 
  
  
Riga 99: Riga 91:
 
Da sottolineare che in questo caso i dati sono presenti all'interno dell'area di memoria, puntata dal ''Puntatore'', a cominciare dal 25° byte (indice 24).
 
Da sottolineare che in questo caso i dati sono presenti all'interno dell'area di memoria, puntata dal ''Puntatore'', a cominciare dal 25° byte (indice 24).
  
Per vedere un esempio del suo uso si rinvia a questa pagina della Wiki: [[Leggere_e_scrivere_in_una_Struttura_con_i_Memory_Stream]].
+
Mostriamo un esempio riprendendo come base quello precedente:
 +
Public Struct ABCDE
 +
  a As Byte
 +
  b As Short
 +
  c As Integer
 +
  d As Long
 +
  e As String
 +
End Struct
 +
 
 +
 +
'''Public''' Sub Main()
 +
 +
  Dim vrSt As <FONT color=B22222>'''New'''</font> ABCDE
 +
  Dim p1, p2 As Pointer
 +
  Dim b As Byte
 +
  Dim sr As Short
 +
  Dim i As Integer
 +
  Dim l As Long
 +
  Dim t As Stream
 +
 +
  With vrSt
 +
    .a = 9
 +
    .b = 999
 +
    .c = 999999
 +
    .d = 999999999
 +
    .e = "testo"
 +
  End With
 +
 +
 +
<FONT color=gray>' ''Ottiene il "Puntatore" alla variabile di tipo "Struttura":''</font>
 +
  p1 = <FONT color=B22222><B>Object.Address</b></font>(vrSt)
 +
 +
<FONT color=gray>' ''Ottiene una variabile di tipo "Stream" che punta al numero d'indice "24" dell'area allocata appartenente alla Struttura:''</font>
 +
  t = Memory p1 <FONT color=B22222><B>+ 24</b></font> For Read
 +
 +
  Read #t, b
 +
  Print b
 +
 +
  Seek #t, 2
 +
  Read #t, sr
 +
  Print sr
 +
 +
  Read #t, i
 +
  Print i
 +
 +
  Read #t, l
 +
  Print l
 +
 +
<FONT color=gray>' ''Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", allora legge insieme questi byte e li assegna ad una variabile di tipo "Puntatore"; quindi dereferenzia per ottenere la stringa:''</font>
 +
  Seek #t, 16
 +
  Read #t, p2
 +
  Print String@(p2)
 +
 +
<FONT color=gray>' ''oppure anche con un ciclo per l'intera dimensione della "Struttura", mostrando così tutta area di memoria della "Struttura":''</font>
 +
  Seek #t, 0
 +
  For i = 0 To Object.SizeOf(vrSt) - 1
 +
    If i = Object.SizeOf(vrSt) - 8 Then
 +
      Read #t, p2
 +
      Print String@(p2)
 +
      Quit
 +
    Endif
 +
    Read #t, b
 +
    Print i, b, Hex(b, 16)
 +
  Next</font>
 +
 +
  t.Close
 +
 +
'''End'''
 +
Per vedere un altro esempio del suo uso si rinvia a questa pagina della Wiki: [[Leggere_e_scrivere_in_una_Struttura_con_i_Memory_Stream]].

Versione delle 19:39, 20 ago 2022

E' possibile ottenere il Puntatore di una variabile di tipo Struttura (ossia una variabile di tipo Puntatore che punta all'indirizzo di memoria di una variabile di tipo Struttura) mediante almeno due modalità:

  • con la funzione "VarPtr()";
  • con il Metodo "Object.Address()".


Ottenere il puntatore di una variabile di tipo Struttura mediante la funzione "VarPtr()"

La funzione "VarPtr()" ritorna un Puntatore che punta alla variabile contenuta in memoria; pertanto si utilizzerà con la variabile di tipo Struttura con la seguente sintassi:

VarPtr(Variabile_Struttura) As Pointer

V'è da sottolineare che la variabile di tipo Struttura andrà assolutamente dichiarata all'esterno delle routine, come globale, e preceduta dalla parola chiave Struct:

Private variabile_struttura As Struct STRUTTURA

Da sottolineare che in questo caso i dati sono presenti all'interno dell'area di memoria, puntata dal Puntatore, a cominciare dal 1° byte (indice 0).

Esempio:

Public Struct ABCDE
  a As Byte
  b As Short
  c As Integer
  d As Long
  e As String
End Struct

Private vrSt As Struct ABCDE


Public Sub Main()

  Dim p1, p2 As Pointer
  Dim b As Byte
  Dim sr As Short
  Dim i As Integer
  Dim l As Long
  Dim t As Stream

  With vrSt
    .a = 9
    .b = 999
    .c = 999999
    .d = 999999999
    .e = "testo"
  End With


' Ottiene il "Puntatore" alla variabile di tipo "Struttura":
  p1 = VarPtr(vrSt)

' Ora ri-ottiene i valori presenti nella "Struttura" dereferenziando con i "Memory-Stream" il "Puntatore":
  t = Memory p1 For Read

  Read #t, b
  Print b

  Seek #t, 2
  Read #t, sr
  Print sr

  Read #t, i
  Print i

  Read #t, l
  Print l

' Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", allora leggiamo insieme questi byte e li assegnamo ad una variabile di tipo "Puntatore"; quindi dereferenzia per ottenere la stringa:
  Seek #t, 16
  Read #t, p2
  Print String@(p2)

' oppure anche con un ciclo per l'intera dimensione della "Struttura", mostrando così tutta area di memoria della "Struttura":
  Seek #t, 0
  For i = 0 To Object.SizeOf(vrSt) - 1
    If i = Object.SizeOf(vrSt) - 8 Then
      Read #t, p2
      Print String@(p2)
      Quit
    Endif
    Read #t, b
    Print i, b, Hex(b, 16)
  Next</font>

  t.Close

End


Ottenere il puntatore di una variabile di tipo Struttura mediante il Metodo "Object.Address()"

In particolare tale metodo ritorna l'indirizo di memoria dell'oggetto posto come parametro del metodo stesso, e si utilizzerà con la variabile di tipo Struttura con la seguente sintassi:

Object.Address(Variabile_Struttura) As Pointer

In questo caso è preferibile optare per la dichiarazione della variabile di tipo Struttura con la parola New:

Dim variabile_struttura As New STRUTTURA

Da sottolineare che in questo caso i dati sono presenti all'interno dell'area di memoria, puntata dal Puntatore, a cominciare dal 25° byte (indice 24).

Mostriamo un esempio riprendendo come base quello precedente:

Public Struct ABCDE
  a As Byte
  b As Short
  c As Integer
  d As Long
  e As String
End Struct
 

Public Sub Main()

  Dim vrSt As New ABCDE
  Dim p1, p2 As Pointer
  Dim b As Byte
  Dim sr As Short
  Dim i As Integer
  Dim l As Long
  Dim t As Stream

  With vrSt
    .a = 9
    .b = 999
    .c = 999999
    .d = 999999999
    .e = "testo"
  End With


' Ottiene il "Puntatore" alla variabile di tipo "Struttura":
  p1 = Object.Address(vrSt)

' Ottiene una variabile di tipo "Stream" che punta al numero d'indice "24" dell'area allocata appartenente alla Struttura:
  t = Memory p1 + 24 For Read

  Read #t, b
  Print b

  Seek #t, 2
  Read #t, sr
  Print sr

  Read #t, i
  Print i

  Read #t, l
  Print l

' Se i byte dell'area di memoria dello "Stream" contengono un indirizzo di memoria di una "Stringa", allora legge insieme questi byte e li assegna ad una variabile di tipo "Puntatore"; quindi dereferenzia per ottenere la stringa:
  Seek #t, 16
  Read #t, p2
  Print String@(p2)

' oppure anche con un ciclo per l'intera dimensione della "Struttura", mostrando così tutta area di memoria della "Struttura":
  Seek #t, 0
  For i = 0 To Object.SizeOf(vrSt) - 1
    If i = Object.SizeOf(vrSt) - 8 Then
      Read #t, p2
      Print String@(p2)
      Quit
    Endif
    Read #t, b
    Print i, b, Hex(b, 16)
  Next</font>

  t.Close

End

Per vedere un altro esempio del suo uso si rinvia a questa pagina della Wiki: Leggere_e_scrivere_in_una_Struttura_con_i_Memory_Stream.