Leggere e scrivere in un vettore mediante i Memory Stream

Da Gambas-it.org - Wikipedia.

Per poter leggere i dati da un vettore e/o scrivere dati in un vettore mediante i Memory Stream, è necessario ottenere l'indirizzo di memoria del vettore medesimo. Tale risultato con i vettori, così come anche con le matrici, si ottiene mediante la proprietà .Data, la quale ritorna un Puntatore ai dati contenuti dal vettore. [nota 1]


Leggere e scrivere in un vettore

Mostriamo dunque un esempio, nel quale si legge e si scrive in un vettore di tipo Byte[] mediante i Memory Stream ed usando la proprietà .Data dei vettori:

Public Sub Main()

 Dim v As Byte[] = [10, 20, 30, 40]
 Dim p As Pointer
 Dim st As Stream
 Dim b, j As Byte

' Assegnamo ad un "Puntatore" l'area di memoria del vettore:
  p = v.Data
   
  st = Memory p For Read Write
  
' Aggiungiamo (scriviamo) subito un valore alla fine del vettore:
  Seek #st, 4
' Scriviamo nel "Puntatore" mediante lo "Stream":
  Write #st, 99 As Byte
   
' Leggiamo nell'indirizzo di memoria del vettore: 
  For j = 0 To v.Count
    Seek #st, j
    Read #st, b
    Print b
  Next
 
' Sostituiamo (scriviamo) un valore nel 3° elemento del vettore:
  Seek #st, 2
  Write #st, 88 As Byte
   
' Leggiamo nell'indirizzo di memoria del vettore come definitivamente modificato: 
  For j = 0 To v.Count
    Seek #st, j
    Read #st, b
    Print b
  Next

  st.Close
 
End


Stesso esempio, ma con vettore di tipo Short[]

Ovviamente valori di tipo Short occupano ciascuno 2 byte, quindi:

Public Sub Main()

 Dim v As Short[] = [10, 20, 30, 40]
 Dim p As Pointer
 Dim st As Stream
 Dim j As Byte
 Dim sh As Short

' Assegnamo ad un "Puntatore" l'area di memoria del vettore:
  p = v.Data
   
  st = Memory p For Read Write
  
' Aggiungiamo (scriviamo) subito un valore alla fine del vettore:
  Seek #st,  4 * SizeOf(gb.Short)
' Scriviamo nel "Puntatore" mediante lo "Stream":
  Write #st, 99 As Byte
   
' Leggiamo nell'indirizzo di memoria del vettore: 
  For j = 0 To  v.Count * SizeOf(gb.Short) Step 2
    Seek #st, j
    Read #st, sh
    Print sh
  Next
 
' Sostituiamo (scriviamo) un valore nel 3° elemento del vettore:
  Seek #st, 2 * SizeOf(gb.Short)
  Write #st, 88 As Byte
   
' Leggiamo nell'indirizzo di memoria del vettore come definitivamente modificato: 
  For j = 0 To v.Count * SizeOf(gb.Short) Step 2
    Seek #st, j
    Read #st, sh
    Print sh
  Next

  st.Close
 
End


Stesso esempio, ma con vettore di tipo Integer[]

Ovviamente valori di tipo Integer occupano ciascuno 4 byte, quindi:

Public Sub Main()

 Dim v As Integer[] = [10, 20, 30, 40]
 Dim p As Pointer
 Dim st As Stream
 Dim j As Byte
 Dim i As Integer

' Assegnamo ad un "Puntatore" l'area di memoria del vettore:
  p = v.Data
   
  st = Memory p For Read Write
  
' Aggiungiamo (scriviamo) subito un valore alla fine del vettore:
  Seek #st, 4 * SizeOf(gb.Integer)
' Scriviamo nel "Puntatore" mediante lo "Stream":
  Write #st, 99 As Integer
   
' Leggiamo nell'indirizzo di memoria del vettore: 
  For j = 0 To  v.Count * SizeOf(gb.Integer) Step 4
    Seek #st, j
    Read #st, i
    Print i
  Next
 
' Sostituiamo (scriviamo) un valore nel 3° elemento del vettore:
  Seek #st, 2 * SizeOf(gb.Integer)
  Write #st, 88 As Integer
   
' Leggiamo nell'indirizzo di memoria del vettore come definitivamente modificato: 
  For j = 0 To v.Count * SizeOf(gb.Integer) Step 4
    Seek #st, j
    Read #st, i
    Print i
  Next

  st.Close
 
End


...e così via con gli altri tipi di variabili.


Leggere e scrivere in una Matrice

Nel caso di lettura o scrittura con una matrice, dichiarata con la parola New

Dim matrice As New Byte[n, n]

o sia incorporata

Private matrice[n, n] As Byte

i dati iniziano dall'indice zero seguendo l'ordine delle colonne.

Esempio:

Public Sub Main()

 Dim bb As New Byte[3, 3]
 Dim p As Pointer
 Dim st As Stream
 Dim j, b As Byte

  bb[0, 0] = 99
  bb[0, 1] = 99
  bb[0, 2] = 99

  bb[1, 0] = 111
  bb[1, 1] = 111
  bb[1, 2] = 111

' Assegnamo ad un "Puntatore" l'area di memoria del vettore:
  p = bb.Data
  st = Memory p For Read

  For j = 0 To 5
    Read #st, b
    Print j, b
  Next

  st.Close()

End


Leggere e scrivere in un vettore di vettore

Nel caso di lettura o scrittura con un vettore di vettore di secondo livello

Dim bb As New Byte[][]

i dati del primo vettore hanno inizio dall'indice 256. I dati da un vettore all'atro si distanziano di 144 byte. Pertanto, in un tipo di vettore di questo genere, formato da tre vettori, il primo dato del primo vettore si troverà all'indice 256; il primo dato del secondo vettore si troverà all'indice 400; il primo dato del terzo vettore si troverà all'indice 544.

Esempio:

Public Sub Main()

 Dim bb As New Byte[][]
 Dim p As Pointer
 Dim st As Stream
 Dim j, b As Byte

  bb = [[99, 99], [100, 100], [101, 101]]

' Assegnamo ad un "Puntatore" l'area di memoria del vettore:
  p = bb.Data
  
  st = Memory p For Read
  For i = 0 To 569
    Read #st, b
    Print i, b
    If (b = 99) Or (b = 100) Or (b = 101) Then Stop
  Next

  st.Close()

End


Nelle variabili vettori di vettori di terzo livello i dati hanno inizio all'indice 2596, con una distanza dei primi byte fra un vettore e l'altro del medesimo livello pari a 144 byte. La distanza del primo dato di un nuovo livello dal primo dato del precedente livello è pari a 400 byte. Esempio:

Public Sub Main()

 Dim bb As New Byte[][][]
 Dim p As Pointer
 Dim st As Stream
 Dim j, b As Byte
 Dim i As Integer

  bb = [[[111, 112, 113, 114], [155, 166, 177, 188]], [[99, 8, 7, 6], [195, 4, 3, 2]]]

' Assegnamo ad un "Puntatore" l'area di memoria del vettore:
  p = bb.Data
 
  st = Memory p For Read

  For i = 0 To 3199
    Read #st, b
    Print i, b
    If (b = 111) Or (b = 155) Or (b = 99) Or (b = 195) Then Stop
  Next

  st.Close()

End



Note

[1] Vedasi anche la seguente pagina della WIKI: Assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un Puntatore