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

Da Gambas-it.org - Wikipedia.
(Creata pagina con '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 vettor...')
 
 
(22 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per poter leggere i dati da un vettore e/o scrivere dati in un vettore mediante i ''[[Memory_Stream|Memory Stream]]'', è necessario ottenere l'indirizzo di memoria del vettore medesimo. Tale risultato con i vettori si ottiene mediante la proprietà ''.Data'', la quale ritorna un ''Puntatore'' ai dati contenuti dal vettore.
+
Per poter leggere i dati da un vettore e/o scrivere dati in un vettore mediante i ''[[Definizione_ed_uso_dei_Memory_Stream|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.   <SUP>&#91;[[#Note|nota 1]]&#93;</sup>
  
  
Mostriamo dunque un esempio, nel quale si legge e si scrive in un vettore mediante i ''[[Memory_Stream|Memory Stream]]'' ed usando la proprietà ''.Data'' dei vettori:
+
==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 ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' ed usando la proprietà ''.Data'' dei vettori:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
  Dim v As Byte[] = [10, 20, 30, 40]
+
  Dim v As Byte[] = [10, 20, 30, 40]
  Dim p As Pointer
+
  Dim p As Pointer
  Dim st As Stream
+
  Dim st As Stream
  Dim b, j As Byte
+
  Dim b, j As Byte
 
   
 
   
   p = lista1.Data
+
<FONT Color=gray>' ''Assegnamo ad un "Puntatore" l'area di memoria del vettore:''</font>
 +
   p = v.Data
 
      
 
      
 
   st = Memory p For Read Write
 
   st = Memory p For Read Write
Riga 23: Riga 25:
 
     Seek #st, j
 
     Seek #st, j
 
     Read #st, b
 
     Read #st, b
     Print b, j
+
     Print b
 
   Next
 
   Next
 
    
 
    
Riga 34: Riga 36:
 
     Seek #st, j
 
     Seek #st, j
 
     Read #st, b
 
     Read #st, b
     Print b, j
+
     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
 +
 +
<FONT Color=gray>' ''Assegnamo ad un "Puntatore" l'area di memoria del vettore:''</font>
 +
  p = v.Data
 +
   
 +
  st = Memory p For Read Write
 +
 
 +
<FONT Color=gray>' ''Aggiungiamo (scriviamo) subito un valore alla fine del vettore:''</font>
 +
  Seek #st,  4 * SizeOf(gb.Short)
 +
<FONT Color=gray>' ''Scriviamo nel "Puntatore" mediante lo "Stream":''</font>
 +
  Write #st, 99 As Byte
 +
   
 +
<FONT Color=gray>' ''Leggiamo nell'indirizzo di memoria del vettore:''</font>
 +
  For j = 0 To  v.Count * SizeOf(gb.Short) Step 2
 +
    Seek #st, j
 +
    Read #st, sh
 +
    Print sh
 +
  Next
 +
 
 +
<FONT Color=gray>' ''Sostituiamo (scriviamo) un valore nel 3° elemento del vettore:''</font>
 +
  Seek #st, 2 * SizeOf(gb.Short)
 +
  Write #st, 88 As Byte
 +
   
 +
<FONT Color=gray>' ''Leggiamo nell'indirizzo di memoria del vettore come definitivamente modificato:''</font>
 +
  For j = 0 To v.Count * SizeOf(gb.Short) Step 2
 +
    Seek #st, j
 +
    Read #st, sh
 +
    Print sh
 
   Next
 
   Next
 +
 +
  st.Close
 
    
 
    
 
  '''End'''
 
  '''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
 +
 +
<FONT Color=gray>' ''Assegnamo ad un "Puntatore" l'area di memoria del vettore:''</font>
 +
  p = v.Data
 +
   
 +
  st = Memory p For Read Write
 +
 
 +
<FONT Color=gray>' ''Aggiungiamo (scriviamo) subito un valore alla fine del vettore:''</font>
 +
  Seek #st, 4 * SizeOf(gb.Integer)
 +
<FONT Color=gray>' ''Scriviamo nel "Puntatore" mediante lo "Stream":''</font>
 +
  Write #st, 99 As Integer
 +
   
 +
<FONT Color=gray>' ''Leggiamo nell'indirizzo di memoria del vettore:''</font>
 +
  For j = 0 To  v.Count * SizeOf(gb.Integer) Step 4
 +
    Seek #st, j
 +
    Read #st, i
 +
    Print i
 +
  Next
 +
 
 +
<FONT Color=gray>' ''Sostituiamo (scriviamo) un valore nel 3° elemento del vettore:''</font>
 +
  Seek #st, 2 * SizeOf(gb.Integer)
 +
  Write #st, 88 As Integer
 +
   
 +
<FONT Color=gray>' ''Leggiamo nell'indirizzo di memoria del vettore come definitivamente modificato:''</font>
 +
  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
 +
 +
<FONT Color=gray>' ''Assegnamo ad un "Puntatore" l'area di memoria del vettore:''</font>
 +
  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
 +
      <FONT Color=#B22222>Read</font> #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 una distanza dei byte fra un elemento-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.
 +
<BR>Mostriamo come pura curiosità un codice adattato all'esempio di vettore a tre dimensioni ivi riportato:
 +
Private LIVELLI As Integer
 +
Private Const SALTO_NEL_LIVELLO As Byte = 144
 +
Private Const SALTO_LIVELLI As Short = 400
 +
 +
 +
'''Public''' Sub Main()
 +
 +
  Dim bb As New Byte[][][]
 +
  Dim st As Stream
 +
  Dim c, d As Short
 +
  Dim t, b As Byte
 +
 +
  bb = [[[9, 8, 7, 66], [11, 12, 13, 14]], [[111, 102, 103, 104], [200, 210, 220, 230]]]
 +
 +
<FONT Color=gray>' ''Individua il byte del primo valore contenuto dal primo elemento-vettore del terzo livello:''</font>
 +
  Repeat
 +
    Inc LIVELLI
 +
  Until (Byte@(bb.Data + LIVELLI) == 9) And (Byte@((bb.Data + LIVELLI) + 1) == 8) And (Byte@((bb.Data + LIVELLI) + 2) == 7) And (Byte@((bb.Data + LIVELLI) + 3) == 66)
 +
 +
  st = Memory bb.Data For Read
 +
  Seek #st, LIVELLI
 +
  Write "\e[34m[\e[0m"
 +
  Repeat
 +
    Write "\e[33m[\e[0m"
 +
    Repeat
 +
      LIVELLI += d
 +
      Seek #st, LIVELLI
 +
      Write "\e[32m[\e[0m"
 +
      For t = 0 To bb[0][0].Max
 +
        <FONT Color=#B22222>Read</font> #st, b
 +
        Print b;;
 +
      Next
 +
      d += SALTO_NEL_LIVELLO
 +
      Write "\e[32m]\e[0m"
 +
    Until d == SALTO_NEL_LIVELLO * bb[0].Count
 +
    LIVELLI += SALTO_LIVELLI
 +
    d = 0
 +
    Inc c
 +
    Write "\e[33m]\e[0m"
 +
  Until c == bb.Count
 +
  Write "\e[34m]\e[0m"
 +
  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]]

Versione attuale delle 15:26, 21 ago 2022

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 una distanza dei byte fra un elemento-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.
Mostriamo come pura curiosità un codice adattato all'esempio di vettore a tre dimensioni ivi riportato:

Private LIVELLI As Integer
Private Const SALTO_NEL_LIVELLO As Byte = 144
Private Const SALTO_LIVELLI As Short = 400


Public Sub Main()

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

 bb = [[[9, 8, 7, 66], [11, 12, 13, 14]], [[111, 102, 103, 104], [200, 210, 220, 230]]]

' Individua il byte del primo valore contenuto dal primo elemento-vettore del terzo livello:
 Repeat 
   Inc LIVELLI
 Until (Byte@(bb.Data + LIVELLI) == 9) And (Byte@((bb.Data + LIVELLI) + 1) == 8) And (Byte@((bb.Data + LIVELLI) + 2) == 7) And (Byte@((bb.Data + LIVELLI) + 3) == 66)

 st = Memory bb.Data For Read
 Seek #st, LIVELLI
 Write "\e[34m[\e[0m"
 Repeat 
   Write "\e[33m[\e[0m"
   Repeat 
     LIVELLI += d
     Seek #st, LIVELLI
     Write "\e[32m[\e[0m"
     For t = 0 To bb[0][0].Max
       Read #st, b
       Print b;;
     Next 
     d += SALTO_NEL_LIVELLO
     Write "\e[32m]\e[0m"
   Until d == SALTO_NEL_LIVELLO * bb[0].Count
   LIVELLI += SALTO_LIVELLI
   d = 0
   Inc c
   Write "\e[33m]\e[0m"
 Until c == bb.Count
 Write "\e[34m]\e[0m"
 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