Memcpy ()
La funzione della libreria di C
void *memcpy(void *__restrict __dest, const void *__restrict __src, size_t __n)
copia n caratteri da un'area di memoria str2 ad un'altra area di memoria str1, entrambe puntate da due variabili di tipo Puntatore.
Va ricordato che per la variabile di tipo Puntatore del primo parametro (ossia: void *__restrict __dest) deve essere sempre allocata un'area di memoria di quantità adeguata.
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:
Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long) In "libc:6"
Indice
Semplice esempio di uso in Gambas con un valore numerico di tipo Intero
Library "libc:6" ' void *memcpy(void *__restrict __dest, const void *__restrict __src, size_t __n) ' Copy N bytes of SRC to DEST. Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long) Public Sub Main() Dim p1, p2 As Pointer Dim num As Integer num = 999 p1 = VarPtr(num) p2 = Alloc(SizeOf(gb.Integer), 1) memcpy(p2, p1, SizeOf(gb.Integer)) Print Int@(p2) Free(p2) End
Semplice esempio di uso in Gambas con un valore di tipo Stringa
In questo caso il secondo parametro della funzione esterna memcpy( ) sarà di tipo Stringa.
Library "libc:6" ' void *memcpy(void *__restrict __dest, const void *__restrict __src, size_t __n) ' Copy N bytes of SRC to DEST. Private Extern memcpy(__dest As Pointer, __src As String, __n As Long) Public Sub Main() Dim dest As Pointer Dim src As String = "Questa è una prova con la funzione 'memcpy()'." Dim i As Integer i = Len(src) dest = Alloc(SizeOf(gb.Byte), i) memcpy(dest, src, i) Print "Dopo memcpy, " & Quote("dest") & ":\n"; String@(dest) Free(dest) End
Copia di due stringhe
Di seguito un esempio per copiare in modo contiguo due stringhe all'interno di un'area di memoria riservata:
Library "libc:6" ' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n) ' Copy N bytes of SRC to DEST. Private Extern memcpy(__dest As Pointer, __src As String, __n As Long) As Pointer Public Sub Main() Dim a, b As String Dim dest As Pointer Dim i As Integer a = "aaaa" b = "bbbb" ' Allochiamo una sufficiente area di memoria ove saranno memorizzati in successione i dati delle due variabili stringa: dest = Alloc(SizeOf(gb.Byte), 16) i = Len(a) ' Copiamo nell'area di memoria l'intero numero di dati contenuti dalla variabile stringa "a": memcpy(dest, a, i) ' Poiché dobbiamo memorizzare successivamente anche i dati presenti nella variabile stringa "b", ' è necessario spostarci all'interno dell'area di memoria allocata di un numero di byte pari alla dimensione della stringa contenuta dalla variabile "a": dest += i i = Len(b) ' Copiamo nell'area di memoria, dopo i dati già copiati dalla variabile stringa "a", l'intero numero di dati contenuti dalla variabile stringa "b": memcpy(dest, b, i) ' Poiché il puntatore interno dell'area di memoria riservata è spostato in avanti rispetto al primo byte dell'area medesima, è necessario riportarlo dunque all'inizio: dest -= i ' Dereferenziamo il Puntatore all'area di memoria allocata per vederne il contenuto in console: Print String@(dest) ' Liberiamo l'area di memoria precedentemente allocata: Free(dest) ' Ci assicuriamo comunque che il Puntatore non punti ad alcuna cella di memoria: dest = 0 End
In quest'altro esempio, per effettuare la copia di due stringhe, si utilizzerà un vettore di tipo Byte[ ]:
Library "libc:6" ' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n) ' Copy N bytes of SRC to DEST. Private Extern memcpy(__dest As Pointer, __src As String, __n As Long) As Pointer Public Sub Main() Dim a, b As String Dim dest As Byte[] Dim ia, ib As Integer a = "aaaa" b = "bbbb" ' Attribuiamo un sufficiente numero di elementi al vettore, ossia allochiamo una sufficiente area di memoria per il vettore medesimo: dest = New Byte[16] ia = Len(a) ' Copiamo nell'area di memoria l'intero numero di dati contenuti dalla variabile stringa "a": memcpy(dest.Data, a, ia) ib = Len(b) ' Copiamo nell'area di memoria del vettore, destinata a memorizzare i propri dati, l'intero numero di dati contenuti dalla variabile stringa "b". ' L'area di memoria di memorizzazione dei dati del vettore è individuata dal suo indirizzo ritornato dalla proprietà ".Data" del vettore medesimo. ' Ci spostiamo di 4 byte avanti nell'area di memoria del vettore, al fine di non sovrascrivere i dati già copiati precedentemente della stringa "a": memcpy(bb.Data + ia, b, ib) ' Mostriamo in console i dati "utili" (ossia in questo caso quelli rappresentanti la copia delle due stringhe originarie) contenuti dal vettore: Print dest.ToString(0, ia + ib) ' ...o magari leggendo con la funzione di dereferenziazione di Gambas direttamente nell'area di memoria dei dati memorizzati dal vettore: Print String@(dest.Data) End