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.
(Creata pagina con "Per assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un ''Puntatore'', è possibile adottare almeno due modalità. ===Uso delle funzioni di Gambas...")
 
Riga 28: Riga 28:
 
   Next
 
   Next
 
      
 
      
  <FONT Color=gray>' ''Effetuiamo in console la verifica dell'assegnamento:''</font>
+
  <FONT Color=gray>' ''Verifichiamo in console l'assegnamento:''</font>
 
   For Each b In bb
 
   For Each b In bb
 
     Print b
 
     Print b
Riga 69: Riga 69:
 
   memcpy(bb.Data, p, 8)
 
   memcpy(bb.Data, p, 8)
 
      
 
      
  <FONT Color=gray>' ''Effetuiamo in console la verifica dell'assegnamento:''</font>
+
  <FONT Color=gray>' ''Verifichiamo in console l'assegnamento:''</font>
 
   For Each b In bb
 
   For Each b In bb
 
     Print b
 
     Print b

Versione delle 19:31, 24 feb 2016

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


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 p As Pointer
 Dim st As Stream
 Dim b As Byte
 Dim bb As New Byte[]
 
' Allochiamo un'area di memoria riservata pari ad 8 byte:
  p = Alloc(8)
  
' Ai fini di questo esempio scriviamo alcuni dati nell'area di memoria allocata:
  st = Memory p For Write
  For b = 1 To 8
    Write #st, b * 10 As Byte
  Next
  st.Close
   
' Assegnamo agli elementi del vettore i valori presenti nell'area di memoria allocata:
  For b = 0 To 7
    bb.Push(Byte@(p + CInt(b)))
  Next
   
' Verifichiamo in console l'assegnamento:
  For Each b In bb
    Print b
  Next
   
  Free(p)
  
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 p As Pointer
 Dim st As Stream
 Dim b As Byte
 Dim bb As New Byte[8]
 
' Allochiamo un'area di memoria riservata pari ad 8 byte:
  p = Alloc(8)
  
' Ai fini di questo esempio scriviamo alcuni dati nell'area di memoria allocata:
  st = Memory p For Write
  For b = 1 To 8
    Write #st, b * 10 As Byte
  Next
  st.Close
   
' Con la funzione esterna "memcpy()" copiamo nel vettore gli 8 valori presenti nell'area di memoria allocata:
  memcpy(bb.Data, p, 8)
   
' Verifichiamo in console l'assegnamento:
  For Each b In bb
    Print b
  Next
   
  Free(p)
  
End