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

Da Gambas-it.org - Wikipedia.
Riga 134: Riga 134:
  
  
==Leggere e scrivere in una ''Matrice''==
+
==Leggere e scrivere in un vettore multidimensionale con numero determinato di elementi==
Nel caso di lettura o scrittura con una ''matrice'', dichiarata con la parola ''New''
+
Nel caso di lettura o scrittura con un vettore multidimensionale con numero determinato di elementi
 
  Dim matrice As New Byte[n, n]
 
  Dim matrice As New Byte[n, n]
o sia incorporata
+
o annidato
 
  Private matrice[n, n] As Byte
 
  Private matrice[n, n] As Byte
 
i dati iniziano dall'indice zero seguendo l'ordine delle colonne.
 
i dati iniziano dall'indice zero seguendo l'ordine delle colonne.
Riga 149: Riga 149:
 
   Dim j, b As Byte
 
   Dim j, b As Byte
 
   
 
   
  bb[0, 0] = 99
+
  bb[0, 0] = 99
  bb[0, 1] = 99
+
  bb[0, 1] = 99
  bb[0, 2] = 99
+
  bb[0, 2] = 99
 
   
 
   
  bb[1, 0] = 111
+
  bb[1, 0] = 111
  bb[1, 1] = 111
+
  bb[1, 1] = 111
  bb[1, 2] = 111
+
  bb[1, 2] = 111
 
   
 
   
 
  <FONT Color=gray>' ''Assegnamo ad un "Puntatore" l'area di memoria del vettore:''</font>
 
  <FONT Color=gray>' ''Assegnamo ad un "Puntatore" l'area di memoria del vettore:''</font>
  p = bb.Data
+
  p = bb.Data
  st = Memory p For Read
+
  st = Memory p For Read
 
   
 
   
  For j = 0 To 5
+
  For j = 0 To 5
    Read #st, b
+
    Read #st, b
    Print j, b
+
    Print j, b
  Next
+
  Next
 
   
 
   
  st.Close()
+
  st.Close()
 
   
 
   
 
  '''End'''
 
  '''End'''
  
  
 
+
==Leggere e scrivere in un vettore multidimensionale con numero ''non'' determinato di elementi==
==Leggere e scrivere in un ''vettore'' di ''vettore''==
+
Nel caso di lettura o scrittura in un vettore multidimensionale con numero ''non'' determinato di elementi
Nel caso di lettura o scrittura con un ''vettore'' di ''vettore'' di secondo livello
 
 
  Dim bb As New Byte[][]
 
  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.
+
i dati del primo vettore hanno inizio dall'indice 256. I dati da un vettore all'altro si distanziano di 144 byte. Pertanto, in un tipo di vettore di questo genere, formato ad esempio da tre elementi-vettori, il primo dato del primo elemento-vettore si troverà all'indice 256; il primo dato del secondo elemento-vettore si troverà all'indice 400; il primo dato del terzo elemento-vettore si troverà all'indice 544.
  
 
Esempio:
 
Esempio:
 +
Private Const PRIMO_VALORE As Short = 256
 +
Private Const INTERVALLO As Byte = 144
 +
 +
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
 
   Dim bb As New Byte[][]
 
   Dim bb As New Byte[][]
  Dim p As Pointer
 
 
   Dim st As Stream
 
   Dim st As Stream
   Dim j, b As Byte
+
   Dim c As Short
 +
  Dim n, b As Byte
 
   
 
   
  bb = [[99, 99], [100, 100], [101, 101]]
+
  bb = [[99, 99], [100, 100], [200, 200]]
 
<FONT Color=gray>' ''Assegnamo ad un "Puntatore" l'area di memoria del vettore:''</font>
 
  p = bb.Data
 
 
    
 
    
  st = Memory p For Read
+
  st = Memory bb.Data For Read
  For i = 0 To 569
+
  For c = PRIMO_VALORE To PRIMO_VALORE + (INTERVALLO * bb.Max) Step INTERVALLO
    Read #st, b
+
    Seek #st, c
    Print i, b
+
    For n = 0 To 1
    If (b = 99) Or (b = 100) Or (b = 101) Then Stop
+
      Read #st, b
  Next
+
      Print c, b
 +
    Next
 +
  Next
 
   
 
   
  st.Close()
+
  st.Close()
 
   
 
   
 
  '''End'''
 
  '''End'''
 
+
Nei vettori multidimensionali con numero ''non'' determinato di elementi'' 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.
 
 
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:
 
Esempio:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()

Versione delle 21:46, 1 dic 2021

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 un vettore multidimensionale con numero determinato di elementi

Nel caso di lettura o scrittura con un vettore multidimensionale con numero determinato di elementi

Dim matrice As New Byte[n, n]

o annidato

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 multidimensionale con numero non determinato di elementi

Nel caso di lettura o scrittura in un vettore multidimensionale con numero non determinato di elementi

Dim bb As New Byte[][]

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

Esempio:

Private Const PRIMO_VALORE As Short = 256
Private Const INTERVALLO As Byte = 144


Public Sub Main()

 Dim bb As New Byte[][]
 Dim st As Stream
 Dim c As Short
 Dim n, b As Byte

 bb = [[99, 99], [100, 100], [200, 200]]
  
 st = Memory bb.Data For Read
 For c = PRIMO_VALORE To PRIMO_VALORE + (INTERVALLO * bb.Max) Step INTERVALLO
   Seek #st, c
   For n = 0 To 1
     Read #st, b
     Print c, b
   Next
 Next

 st.Close()

End

Nei vettori multidimensionali con numero non determinato di elementi 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