Differenze tra le versioni di "Leggere e scrivere in un vettore mediante i Memory Stream"
Da Gambas-it.org - Wikipedia.
Riga 50: | Riga 50: | ||
Dim st As Stream | Dim st As Stream | ||
Dim j As Byte | Dim j As Byte | ||
+ | Dim sh As Short | ||
p = lista1.Data | p = lista1.Data | ||
Riga 81: | Riga 82: | ||
'''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 | ||
+ | |||
+ | p = lista1.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 2 | ||
+ | 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. |
Versione delle 08:51, 25 set 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 si ottiene mediante la proprietà .Data, la quale ritorna un Puntatore ai dati contenuti dal 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 = lista1.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 = lista1.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 + 4 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 + 4 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 = lista1.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 2 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.