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:31 di Vuott (Discussione | contributi)
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