Leggere e scrivere in un vettore mediante i Memory Stream
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]
Indice
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