Differenze tra le versioni di "Assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un Puntatore"

Da Gambas-it.org - Wikipedia.
 
(29 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un ''Puntatore'', è possibile adottare almeno due modalità.
+
Per assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un ''Puntatore'', è possibile adottare alcune modalità.
  
 +
==Uso dei Memory Stream aprendo in ''Scrittura'' la Proprietà ".Data" del vettore==
 +
Questa modalità usa i Memory Stream, prevedendo che la Proprietà ".Data" del vettore sia aperta in ''Scrittura''.
 +
<BR>L'istruzione "Write" sarà seguita dalla variabile di tipo ''Puntatore'', contenente i valori da assegnare al vettore, e dal terzo parametro che indica la quantità di byte da scrivere. <SUP>&#91;[[#Note|nota 1]]&#93;</sup>
 +
'''Public''' Sub Main()
 +
 +
  Dim testo As String = "testo qualsiasi"
 +
  Dim p As Pointer
 +
  Dim st As Stream
 +
  Dim bb As New Byte[8]
 +
 +
<FONT Color=gray>' ''Ai fini dell'esempio riempie l'area puntata dal Puntatore con dei valori ASCII:''</font>
 +
  p = Alloc(testo)
 +
 +
<FONT Color=gray>' ''Ritorna una variabile di tipo "Stream" con l'apertura in "Scrittura" della Proprietà ".Data" del vettore:''</font>
 +
  st = <FONT Color=#B22222>Memory</font> bb.Data For Write
 +
<FONT Color=gray>' ''Scrive nella variabile di tipo "Stream" una quantità di byte presenti nell'area di memoria puntata dal Puntatore, pari al numero di caratteri presenti nella stringa:''</font>
 +
  Write #st, p, Len(testo)
 +
<FONT Color=gray>' ''Chiude la scrittura nel flusso dei dati in memoria:''</font>
 +
  st.Close
 +
<FONT Color=gray>' ''Dealloca la porzione di memoria precedentemente allocata:''</font>
 +
  Free(p)
 +
<FONT Color=gray>' ''Si assicura che il "Puntatore" non punti a un'area rilevante della memoria, assegnandogli il valore di default:''</font>
 +
  p = 0
 +
 +
<FONT Color=gray>' ''Per mera verifica legge e stampa i valori presenti ora nel vettore:''</font>
 +
  For each b As Byte In bb
 +
    Print b;;
 +
  Next
 +
 +
'''End'''
  
===Uso delle funzioni di Gambas di dereferenziazione dei ''Puntatori''===
+
 
 +
==Uso delle funzioni di Gambas di dereferenziazione dei ''Puntatori''==
 
La prima modalità prevede di assegnare ad ogni elemento del vettore i valori dell'area di memoria riservata, puntata dal ''Puntatore'', dereferenziando man mano il ''Puntatore'' medesimo.
 
La prima modalità prevede di assegnare ad ogni elemento del vettore i valori dell'area di memoria riservata, puntata dal ''Puntatore'', dereferenziando man mano il ''Puntatore'' medesimo.
  
 
Mostriamo un semplice esempio pratico:
 
Mostriamo un semplice esempio pratico:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
+
  Dim p As Pointer
+
   Dim i as integer
   Dim st As Stream
+
   Dim vettore As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8]
   Dim b As Byte
 
 
   Dim bb As New Byte[]
 
   Dim bb As New Byte[]
 
+
     
  <FONT Color=gray>' ''Allochiamo un'area di memoria riservata pari ad 8 byte:''</font>
+
  <FONT Color=gray>' ''Dereferenziando con l'apposita funzione di dereferenziazione dei "Puntatori", che restituisce valori di tipo "Byte", assegna agli elementi del vettore "bb" i valori presenti nell'area di memoria del vettore principale contenente i dati. L'indirizzo di memoria di detta area di memoria è ritornato dalla Proprietà ".Data"''</font>
  p = Alloc(8)
+
  For i = 0 To vettore.Max
 
+
    bb.Push(<FONT Color=#B22222><B>Byte@</b></font>(vettore<FONT Color=#B22222>.Data</font> + i))
<FONT Color=gray>' ''Ai fini di questo esempio scriviamo alcuni dati nell'area di memoria allocata:''</font>
+
  Next
  st = Memory p For Write
 
  For b = 1 To 8
 
    Write #st, b * 10 As Byte
 
  Next
 
  st.Close
 
 
      
 
      
  <FONT Color=gray>' ''Assegnamo agli elementi del vettore i valori presenti nell'area di memoria allocata:''</font>
+
  <FONT Color=gray>' ''Verifica infine in console il risultato del precedente l'assegnamento:''</font>
  For b = 0 To 7
+
  For Each b As Byte In bb
    bb.Push(Byte@(p + CInt(b)))
+
    Print b;;
  Next
+
  Next
   
 
<FONT Color=gray>' ''Verifichiamo in console l'assegnamento:''</font>
 
  For Each b In bb
 
    Print b
 
  Next
 
   
 
  Free(p)
 
 
    
 
    
 
  '''End'''
 
  '''End'''
  
  
 +
==Leggendo con il Metodo ".Read()" del vettore i dati contenuti da un'area di memoria, puntata da un Puntatore aperto in lettura con i ''Memory Stream''==
 +
In questo caso si provvederà a gestire in lettura con il Metodo ".Read()" del vettore i dati contenuti nell'indirizzo dell'area di memoria, puntata da un Puntatore aperto in lettura con i "''Memory Stream''". <SUP>&#91;[[#Note|nota 2]]&#93;</sup>
 +
<BR>Questo è senz'altro la modalità più veloce.
  
===Uso della funzione esterna ''memcpy()'' di C===
+
Ne mostriamo un esempio:
Possiamo anche utilizzare la funzione esterna ''memcpy()'' di C, richiamando la libreria ''libc.so.6'' .
+
'''Public''' Sub Main()
 +
 +
  Dim bb As New Byte[]
 +
  Dim st As Stream
 +
 +
<FONT Color=gray>' ''Ai fini di questo esempio andiamo a riempire di valori un vettore di tipo "Byte[]":''</font>
 +
  Riempie_Puntatore(bb)
 +
 
 +
<FONT Color=gray>' ''Crea in lettura una variabile "Stream" dalla Proprietà di tipo "Puntatore" del vettore ritornato:''</font>
 +
  st = Memory bb.Data For Read
 +
 
 +
<FONT Color=gray>' ''Con il Metodo ".Read()" il vettore legge e memorizza i dati presenti nell'area di memoria puntata dal Puntatore sopra restituito:''</font>
 +
  bb.Read(st, 0, bb.Count)
 +
 
 +
  st.Close
 +
 +
<FONT Color=gray>' ''Verifichiamo infine in console il risultato:''</font>
 +
  For Each b As Byte In bb
 +
    Print b;;
 +
  Next
 +
 +
'''End'''
 +
 +
'''Private''' Function Riempie_Puntatore(vet As Byte[])
 +
 
 +
  vet.Insert([1, 2, 3, 4, 5, 6, 7, 8])
 +
 
 +
'''End'''
 +
 
 +
 
 +
==Uso della funzione esterna "memcpy()" di C==
 +
Possiamo anche utilizzare la funzione esterna "memcpy()" di C, richiamando la libreria ''libc.so.6'' .
 
Mostriamo un semplice esempio pratico:
 
Mostriamo un semplice esempio pratico:
 
  Library "libc:6"
 
  Library "libc:6"
Riga 46: Riga 98:
 
  <FONT Color=gray>' ''void *memcpy (void * __dest, const void * __src, size_t __n)''
 
  <FONT Color=gray>' ''void *memcpy (void * __dest, const void * __src, size_t __n)''
 
  ' ''Copy N bytes of SRC to DEST.''</font>
 
  ' ''Copy N bytes of SRC to DEST.''</font>
  Private Extern memcpy(dest As Pointer, __src As Pointer, n As Long) As Pointer
+
  Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long) As Pointer
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
   Dim p As Pointer
+
   Dim vettore As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8]
  Dim st As Stream
+
   Dim bb As New Byte[vettore.Count]
  Dim b As Byte
+
   Dim bb As New Byte[8]
+
  <FONT Color=gray>' ''Copiamo nel vettore "bb" gli 8 valori del vettore "vettore", passando alla funzione esterna "memcpy()" le Proprietà ".Data" di entrambi i vettori:''</font>
 
+
  <FONT Color=#B22222>memcpy</font>(bb.Data, vettore.Data, 8)
  <FONT Color=gray>' ''Allochiamo un'area di memoria riservata pari ad 8 byte:''</font>
+
  p = Alloc(8)
 
 
 
<FONT Color=gray>' ''Ai fini di questo esempio scriviamo alcuni dati nell'area di memoria allocata:''</font>
 
  st = Memory p For Write
 
  For b = 1 To 8
 
    Write #st, b * 10 As Byte
 
  Next
 
  st.Close
 
   
 
<FONT Color=gray>' ''Con la funzione esterna "memcpy()" copiamo nel vettore gli 8 valori presenti nell'area di memoria allocata:''</font>
 
  memcpy(bb.Data, p, 8)
 
   
 
 
  <FONT Color=gray>' ''Verifichiamo in console l'assegnamento:''</font>
 
  <FONT Color=gray>' ''Verifichiamo in console l'assegnamento:''</font>
  For Each b In bb
+
  For Each b As Byte In bb
    Print b
+
    Print b;;
  Next
+
  Next
   
 
  Free(p)
 
 
    
 
    
 
  '''End'''
 
  '''End'''
  
  
 
+
==Assegnando il ''Puntatore'' al membro ''Data'' della Struttura ''CARRAY'' dei sorgenti di Gambas==
===Assegnando il ''Puntatore'' al membro ''Data'' della Struttura ''CARRAY'' dei sorgenti di Gambas===
 
 
Un'altra modalità, più complessa, è quella di assegnare il ''Puntatore'' al membro ''data'' della Struttura ''CARRAY'' dei sorgenti di Gambas.
 
Un'altra modalità, più complessa, è quella di assegnare il ''Puntatore'' al membro ''data'' della Struttura ''CARRAY'' dei sorgenti di Gambas.
  
Riga 101: Riga 138:
  
 
Pertanto, nel codice che appronteremo, bisognerà:
 
Pertanto, nel codice che appronteremo, bisognerà:
<BR>1) cambiare, qualora il numero di elementi del vettore sia diverso dalla dimensione dell'area puntata dal Puntatore (tenuto conto ovviamente dal <SPAN Style="text-decoration:underline">tipo</span> di valori), il valore presente nel membro ''count'', assegnandogli il valore corrispondente al nuovo numero di elementi che il vettore dovrà possedere;
+
<BR>1) cambiare, qualora il numero di elementi del vettore sia diverso dalla dimensione dell'area puntata dal Puntatore (tenuto conto ovviamente dal <SPAN Style="text-decoration:underline">tipo</span> di valori), il valore presente nel membro "count", assegnandogli il valore corrispondente al nuovo numero di elementi che il vettore dovrà possedere;
<BR>2) cambiare il valore del ''Puntatore'' all'area di memoria dei dati presente nel membro ''data'', assegnando il nuovo ''Puntatore''.
+
<BR>2) cambiare il valore del ''Puntatore'' all'area di memoria dei dati presente nel membro "data", assegnando il nuovo ''Puntatore''.
  
Se si sta scrivendo un'applicazione in ambiente grafico (come nell'esempio che segue), è opportuno, al fine di evitare errori di memoria, chiudere il programma con la funzione esterna risolutiva di C: ''exit()'' .
+
Se si sta scrivendo un'applicazione in ambiente grafico, è opportuno, al fine di evitare errori di memoria, chiudere il programma con la funzione esterna risolutiva di C: ''exit()'' .
  
Mostriamo di seguito un esempio pratico:
+
Mostriamo di seguito un esempio pratico:  
<FONT Color=gray>' ''void exit(int status)ìì
+
  '''Public''' Sub Main()
' ''Terminates the calling process immediately. Any open file descriptors belonging to the process are closed.''</font>
+
 
Private Extern C_exit(status As Integer) In "libc:6" Exec "exit"
+
  Dim p, pbb As Pointer
+
   Dim bb As New Byte[8]
 
  '''Public''' Sub Form_Open()
 
 
   Dim bb As New Byte[]
 
  Dim pbb, count, dati, p As Pointer
 
 
   Dim st As Stream
 
   Dim st As Stream
   Dim b, n As Byte
+
   Dim b As Byte
 +
 
 +
<FONT Color=gray>' ''Invoca la funzione per creare e istanziare un'area riservata di memoria:''</font>
 +
  p = AllocaMemoria(8)
 
    
 
    
<FONT Color=gray>' ''Ipotizziamo una situazione iniziale con un vettore contenente 5 elementi, tutti aventi un dato valore:''</font>
 
  bb = [11, 222, 33, 44, 55]
 
 
<FONT Color=gray>' ''Allochiamo 64 byte di area di memoria riservata, e la puntiamo con un "Puntatore":''</font>
 
  p = Alloc(64)
 
   
 
<FONT Color=gray>' ''Azzeriamo i byte dell'area di memoria precedentemente allocata, ma salvaguardando i valori preesistenti del vettore:''</font>
 
  st = Memory p For Write
 
  For b = 0 To 63
 
    n = 0
 
    If b <= bb.Max Then n = bb[b]
 
    Write #st, n As Byte
 
  Next
 
  st.Close
 
 
 
<FONT Color=gray>' ''Verifichiamo semplicemente il numero iniziale del numero degli elementi del vettore:''</font>
 
  Print bb.Count
 
 
 
  Print "---------------------------------------------\n"
 
 
 
 
  <FONT Color=gray>' ''Accediamo alla "Struttura" interna dell'oggetto "array" (il vettore dichiarato "bb") di Gambas:''</font>
 
  <FONT Color=gray>' ''Accediamo alla "Struttura" interna dell'oggetto "array" (il vettore dichiarato "bb") di Gambas:''</font>
  pbb = Object.Address(bb)
+
  pbb = Object.Address(bb)
 
 
<FONT Color=gray>' ''Accediamo al membro "count" della predetta "Struttura" interna del vettore "bb":''</font>
 
  count = pbb + 20
 
 
 
<FONT Color=gray>' ''Accediamo al membro "data" della predetta "Struttura" interna del vettore "bb":''</font>
 
  dati = pbb + 32
 
 
 
<FONT Color=gray>' ''Impostiamo il nuovo numero di elementi che il vettore "bb" possiederà:''</font>
 
  st = Memory count For Write
 
  Write #st, 64 As Integer  <FONT Color=gray>' ''Scriviamo "As Integer", poiché il membro "count" è un intero a 32 bit''</font>
 
  st.Close
 
 
 
<FONT Color=gray>' ''Verifichiamo il numero degli elementi del vettore dopo l'assegnazione del nuovo valore al membro "count" della "Struttura" interna del vettore "bb":''</font>
 
  Print bb.Count
 
 
 
<FONT Color=gray>' ''Assegnamo il nuovo "Puntatore"al membro "data" della "Struttura" interna del vettore "bb":''</font>
 
  st = Memory dati For Write
 
  Write #st, p As Pointer
 
  st.Close
 
  Free(p)
 
 
 
<FONT Color=gray>' ''Usiamo dunque la nuova attribuzione di area di memoria e di elementi al vettore "bb":''</font>
 
  bb[10] = 21
 
  bb[27] = 8
 
  bb[39] = 19
 
  bb[54] = 69
 
 
    
 
    
 +
<FONT Color=gray>' ''Accediamo al membro "data" della predetta "Struttura" interna del vettore "bb", il cui indirizzo di memoria ha inizio dall'indice 32 dell'area di memoria della "Struttura" medesima:''</font>
 +
  st = Memory pbb + 32 For Write
 +
 
 +
<FONT Color=gray>' ''Assegnamo il nuovo "indirizzo di memoria" al membro "data" della "Struttura" interna del vettore "bb":''</font>
 +
  Write #st, p As Pointer
 +
<FONT Color=gray>' ''Chiude la scrittura nel flusso dei dati in memoria:''</font>
 +
  st.Close
 +
<FONT Color=gray>' ''Dealloca la porzione di memoria precedentemente allocata:''</font>
 +
  Free(p)
 +
<FONT Color=gray>' ''Si assicura che il "Puntatore" non punti a un'area rilevante della memoria, assegnandogli il valore di default:''</font>
 +
  p = 0
 +
 
 
  <FONT Color=gray>' ''Verifichiamo i valori presenti nel vettore "bb":''</font>
 
  <FONT Color=gray>' ''Verifichiamo i valori presenti nel vettore "bb":''</font>
  For b = 0 To bb.Max
+
  For each b As Byte in bb
    Print b, bb[b]
+
    Print b;;
  Next
+
  Next
 
    
 
    
  <FONT Color=gray>' ''Chiudiamo con sicurezza il programma, liberando tutta la memoria utilizzata per esso:''</font>
+
  '''End'''
  C_exit(0)
+
 +
'''Private''' Function AllocaMemoria(n As Integer) As Pointer
 +
 
 +
  Dim po As Pointer
 +
  Dim sr As Stream
 +
  Dim i As Integer
 +
 
 +
  po = Alloc(SizeOf(gb.Byte), n)
 +
 
 +
  sr = Memory po For Write
 +
  For i = 1 To 8
 +
    Write #sr, i * 11 As Byte
 +
  Next
 +
  sr.Close
 +
 
 +
  Return po
 
    
 
    
 
  '''End'''
 
  '''End'''
 +
 +
 +
 +
=Note=
 +
[1] Vedasi anche la seguente pagina della WIKI: [[Scrivere in un file solo alcuni dati presenti in un'area riservata di memoria]]
 +
 +
[2] Vedasi anche la seguente pagina della WIKI: [[Leggere e scrivere in un vettore mediante i Memory Stream]]

Versione attuale delle 15:16, 18 giu 2023

Per assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un Puntatore, è possibile adottare alcune modalità.

Uso dei Memory Stream aprendo in Scrittura la Proprietà ".Data" del vettore

Questa modalità usa i Memory Stream, prevedendo che la Proprietà ".Data" del vettore sia aperta in Scrittura.
L'istruzione "Write" sarà seguita dalla variabile di tipo Puntatore, contenente i valori da assegnare al vettore, e dal terzo parametro che indica la quantità di byte da scrivere. [nota 1]

Public Sub Main()

 Dim testo As String = "testo qualsiasi"
 Dim p As Pointer
 Dim st As Stream
 Dim bb As New Byte[8]

' Ai fini dell'esempio riempie l'area puntata dal Puntatore con dei valori ASCII:
 p = Alloc(testo)

' Ritorna una variabile di tipo "Stream" con l'apertura in "Scrittura" della Proprietà ".Data" del vettore:
 st = Memory bb.Data For Write
' Scrive nella variabile di tipo "Stream" una quantità di byte presenti nell'area di memoria puntata dal Puntatore, pari al numero di caratteri presenti nella stringa:
 Write #st, p, Len(testo)
' Chiude la scrittura nel flusso dei dati in memoria:
 st.Close
' Dealloca la porzione di memoria precedentemente allocata:
 Free(p)
' Si assicura che il "Puntatore" non punti a un'area rilevante della memoria, assegnandogli il valore di default:
 p = 0

' Per mera verifica legge e stampa i valori presenti ora nel vettore:
 For each b As Byte In bb
   Print b;;
 Next

End


Uso delle funzioni di Gambas di dereferenziazione dei Puntatori

La prima modalità prevede di assegnare ad ogni elemento del vettore i valori dell'area di memoria riservata, puntata dal Puntatore, dereferenziando man mano il Puntatore medesimo.

Mostriamo un semplice esempio pratico:

Public Sub Main()

 Dim i as integer
 Dim vettore As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8]
 Dim bb As New Byte[]
      
' Dereferenziando con l'apposita funzione di dereferenziazione dei "Puntatori", che restituisce valori di tipo "Byte", assegna agli elementi del vettore "bb" i valori presenti nell'area di memoria del vettore principale contenente i dati. L'indirizzo di memoria di detta area di memoria è ritornato dalla Proprietà ".Data"
 For i = 0 To vettore.Max
   bb.Push(Byte@(vettore.Data + i))
 Next
   
' Verifica infine in console il risultato del precedente l'assegnamento:
 For Each b As Byte In bb
   Print b;;
 Next
  
End


Leggendo con il Metodo ".Read()" del vettore i dati contenuti da un'area di memoria, puntata da un Puntatore aperto in lettura con i Memory Stream

In questo caso si provvederà a gestire in lettura con il Metodo ".Read()" del vettore i dati contenuti nell'indirizzo dell'area di memoria, puntata da un Puntatore aperto in lettura con i "Memory Stream". [nota 2]
Questo è senz'altro la modalità più veloce.

Ne mostriamo un esempio:

Public Sub Main()

 Dim bb As New Byte[]
 Dim st As Stream

' Ai fini di questo esempio andiamo a riempire di valori un vettore di tipo "Byte[]":
 Riempie_Puntatore(bb)
  
' Crea in lettura una variabile "Stream" dalla Proprietà di tipo "Puntatore" del vettore ritornato:
 st = Memory bb.Data For Read
  
' Con il Metodo ".Read()" il vettore legge e memorizza i dati presenti nell'area di memoria puntata dal Puntatore sopra restituito:
 bb.Read(st, 0, bb.Count)
  
 st.Close

' Verifichiamo infine in console il risultato:
 For Each b As Byte In bb
   Print b;;
 Next

End

Private Function Riempie_Puntatore(vet As Byte[])
 
 vet.Insert([1, 2, 3, 4, 5, 6, 7, 8])
 
End


Uso della funzione esterna "memcpy()" di C

Possiamo anche utilizzare la funzione esterna "memcpy()" di C, richiamando la libreria libc.so.6 . Mostriamo un semplice esempio pratico:

Library "libc:6"

' void *memcpy (void * __dest, const void * __src, size_t __n)
' Copy N bytes of SRC to DEST.
Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long) As Pointer


Public Sub Main()
 
 Dim vettore As Byte[] = [1, 2, 3, 4, 5, 6, 7, 8]
 Dim bb As New Byte[vettore.Count]

' Copiamo nel vettore "bb" gli 8 valori del vettore "vettore", passando alla funzione esterna "memcpy()" le Proprietà ".Data" di entrambi i vettori:
 memcpy(bb.Data, vettore.Data, 8)

' Verifichiamo in console l'assegnamento:
 For Each b As Byte In bb
   Print b;;
 Next
  
End


Assegnando il Puntatore al membro Data della Struttura CARRAY dei sorgenti di Gambas

Un'altra modalità, più complessa, è quella di assegnare il Puntatore al membro data della Struttura CARRAY dei sorgenti di Gambas.

La Struttura CARRAY presente nel file header gbx_c_array.h dei sorgenti di Gambas è così definita:

typedef
       Struct {
		OBJECT object;
		int size;
		int count;
		TYPE type;
		void * data;
		int * Dim ;
		void * ref;
		}
	CARRAY;

laddove in particolare il membro:

  • size è un intero che rappresenta la dimensione dei valori contenuti dal vettore (ossia è il tipo di valori del vettore);
  • count' è un intero che rappresenta il numero di elementi costituenti il vettore;
  • data è un Puntatore all'area di memoria riservata che contiene i dati contenuti dal vettore.

Pertanto, nel codice che appronteremo, bisognerà:
1) cambiare, qualora il numero di elementi del vettore sia diverso dalla dimensione dell'area puntata dal Puntatore (tenuto conto ovviamente dal tipo di valori), il valore presente nel membro "count", assegnandogli il valore corrispondente al nuovo numero di elementi che il vettore dovrà possedere;
2) cambiare il valore del Puntatore all'area di memoria dei dati presente nel membro "data", assegnando il nuovo Puntatore.

Se si sta scrivendo un'applicazione in ambiente grafico, è opportuno, al fine di evitare errori di memoria, chiudere il programma con la funzione esterna risolutiva di C: exit() .

Mostriamo di seguito un esempio pratico:

Public Sub Main()
 
 Dim p, pbb As Pointer
 Dim bb As New Byte[8]
 Dim st As Stream
 Dim b As Byte
 
' Invoca la funzione per creare e istanziare un'area riservata di memoria:
 p = AllocaMemoria(8)
 
' Accediamo alla "Struttura" interna dell'oggetto "array" (il vettore dichiarato "bb") di Gambas:
 pbb = Object.Address(bb)
  
' Accediamo al membro "data" della predetta "Struttura" interna del vettore "bb", il cui indirizzo di memoria ha inizio dall'indice 32 dell'area di memoria della "Struttura" medesima:
 st = Memory pbb + 32 For Write
 
' Assegnamo il nuovo "indirizzo di memoria" al membro "data" della "Struttura" interna del vettore "bb":
 Write #st, p As Pointer
' Chiude la scrittura nel flusso dei dati in memoria:
 st.Close
' Dealloca la porzione di memoria precedentemente allocata:
 Free(p)
' Si assicura che il "Puntatore" non punti a un'area rilevante della memoria, assegnandogli il valore di default:
 p = 0
 
' Verifichiamo i valori presenti nel vettore "bb":
 For each b As Byte in bb
   Print b;;
 Next
  
End

Private Function AllocaMemoria(n As Integer) As Pointer
 
 Dim po As Pointer
 Dim sr As Stream
 Dim i As Integer
 
 po = Alloc(SizeOf(gb.Byte), n)
 
 sr = Memory po For Write
 For i = 1 To 8
   Write #sr, i * 11 As Byte
 Next
 sr.Close
 
 Return po
  
End


Note

[1] Vedasi anche la seguente pagina della WIKI: Scrivere in un file solo alcuni dati presenti in un'area riservata di memoria

[2] Vedasi anche la seguente pagina della WIKI: Leggere e scrivere in un vettore mediante i Memory Stream