Assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un Puntatore

Da Gambas-it.org - Wikipedia.
Versione del 24 feb 2016 alle 19:29 di Vuott (Discussione | contributi) (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...")

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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
   
' Effetuiamo in console la verifica dell'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)
   
' Effetuiamo in console la verifica dell'assegnamento:
  For Each b In bb
    Print b
  Next
   
  Free(p)
  
End