Differenze tra le versioni di "Leggere e scrivere in un vettore mediante i Memory Stream"

Da Gambas-it.org - Wikipedia.
Riga 194: Riga 194:
  
  
Nelle variabili vettoriali vettori di vettori di terzo livello i dati hanno inizio all'indice 2596, con una distanza dei primi byte fra un livello e l'altro è pari a 144 byte.
+
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.

Versione delle 09:52, 10 nov 2014

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.


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

  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

  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

  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, po 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

  p = bb.data
  st = Memory p For Read
  For i = 0 To 15
    Read #st, b
    Print i, 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, po As Pointer
 Dim st As Stream
 Dim j, b As Byte

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

  p = bb.data
  st = Memory p For Read
  For i = 0 To 569
    Read #st, b
    Print i, b
  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.