Memmove ()
Da Gambas-it.org - Wikipedia.
La funzione memmove( ), dichiarata nel file header di sistema "/usr/include/string.h"
void *memmove (void *__dest, const void *__src, size_t __n)
copia N byte di SRC a DEST, garantendo un comportamento corretto in caso di sovrapposizione di stringhe.
In particolare, la memoria sorgente, puntata dal Puntatore __src, di dimensione specificata viene copiata nel buffer e poi si trasferisce all'area di memoria di destinazione, puntata dal Puntatore __dest. Quindi, se v'è sovrapposizione di memoria, non ci sono effetti collaterali.
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 memmove(__dest As Pointer, __src As Pointer, __n As Long) In "libc:6"
Mostriamo un semplice esempio:
Library "libc:6" ' void *memmove (void *__dest, const void *__src, size_t __n) ' Copy N bytes of SRC to DEST, guaranteeing correct behavior for overlapping strings. Private Extern memmove(__dest As Pointer, __src As Pointer, __n As Long) Public Sub Main() Dim s1, s2 As String Dim p1, p2 As Pointer s1 = "abcdef" s2 = "xxx" p1 = Alloc(s1) p2 = Alloc(s2) ' Copia nel Puntatore del 1° argomento, i primi 4 byte dell'area di memoria puntata dal Puntatore del 2° argomento, sovrapponendoli a partire dal dato di "indice" 2 dell'area di memoria puntata dal predetto Puntatore del 1° argomento. memmove(p2 + 2, p1, 4) Print String@(p2) Free(p2) Free(p1) End
Riferimenti
- http://man7.org/linux/man-pages/man3/memmove.3.html
- https://www.gnu.org/software/libc/manual/html_node/Copying-Strings-and-Arrays.html#Copying-Strings-and-Arrays
- http://stackoverflow.com/questions/4415910/memcpy-vs-memmove
- http://stackoverflow.com/questions/9041787/how-to-use-and-when-is-good-use-memmove-in-c
- http://www.tutorialspoint.com/c_standard_library/c_function_memmove.htm