Differenze tra le versioni di "Memmove ()"
Da Gambas-it.org - Wikipedia.
(3 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 8: | Riga 8: | ||
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta: | Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta: | ||
Private <FONT color=#B22222>Extern memmove</font>(__dest As Pointer, __src As Pointer, __n As Long) In "<FONT color=#B22222>libc:6</font>" | Private <FONT color=#B22222>Extern memmove</font>(__dest As Pointer, __src As Pointer, __n As Long) In "<FONT color=#B22222>libc:6</font>" | ||
− | |||
− | |||
Mostriamo un semplice esempio: | Mostriamo un semplice esempio: | ||
Library "libc:6" | Library "libc:6" | ||
Riga 18: | Riga 16: | ||
− | + | Public Sub Main() | |
− | + | ||
− | Dim | + | Dim s1, s2 As String |
− | Dim | + | Dim p1, p2 As Pointer |
− | + | ||
− | + | s1 = "abcdef" | |
− | + | s2 = "xxx" | |
− | + | ||
− | + | p1 = Alloc(s1) | |
− | <FONT Color=gray>' ''Copia nel Puntatore del 1° argomento, i primi 4 byte dell'area di memoria puntata dal Puntatore del 2° argomento, | + | p2 = Alloc(s2) |
− | + | ||
− | + | <FONT Color=gray>' ''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.''</font> | |
− | + | <FONT color=#B22222>memmove</font>(p2 + 2, p1, 4) | |
− | + | ||
− | + | Print String@(p2) | |
− | + | ||
− | + | Free(p2) | |
+ | Free(p1) | ||
+ | |||
+ | End | ||
Versione attuale delle 14:13, 13 giu 2024
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