Differenze tra le versioni di "Memmove ()"
Da Gambas-it.org - Wikipedia.
Riga 19: | Riga 19: | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | + | ||
Dim s As String | Dim s As String | ||
− | Dim | + | Dim p1, p2 As Pointer |
− | + | ||
− | + | s = "abcdef" | |
− | + | ||
− | + | p1 = Alloc(s) | |
− | + | p2 = Alloc(SizeOf(gb.Byte), s.Len) | |
− | <FONT Color=gray>' ''Copia nel Puntatore del 1° argomento, i primi 4 byte dell'area di memoria puntata dal Puntatore del 2° argomento, | + | |
− | + | <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) | |
− | + | ||
'''End''' | '''End''' | ||
− | |||
Versione delle 07:25, 4 set 2022
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 s As String Dim p1, p2 As Pointer s = "abcdef" p1 = Alloc(s) p2 = Alloc(SizeOf(gb.Byte), s.Len) ' 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) 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