Differenze tra le versioni di "Memmove ()"
Da Gambas-it.org - Wikipedia.
(Creata pagina con "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 d...") |
|||
Riga 4: | Riga 4: | ||
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. | 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 <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: | ||
+ | Library "libc:6" | ||
+ | |||
+ | <FONT Color=gray>' ''void *memmove (void *__dest, const void *__src, size_t __n)'' | ||
+ | ' ''Copy N bytes of SRC to DEST, guaranteeing correct behavior for overlapping strings.''</font> | ||
+ | Private Extern <FONT color=#B22222>memmove</font>(__dest As Pointer, __src As Pointer, __n As Long) | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim s As String | ||
+ | Dim p1 As Pointer | ||
+ | |||
+ | s = "abcdef" | ||
+ | |||
+ | p1 = VarPtr(s) | ||
+ | |||
+ | <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>(p1 + 2, p1, 4) | ||
+ | |||
+ | Print String@(p1) | ||
+ | |||
+ | '''End''' | ||
Riga 14: | Riga 44: | ||
* http://stackoverflow.com/questions/9041787/how-to-use-and-when-is-good-use-memmove-in-c | * 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 | * http://www.tutorialspoint.com/c_standard_library/c_function_memmove.htm | ||
− | |||
− | |||
− | |||
− |
Versione delle 18:26, 20 lug 2016
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 As Pointer s = "abcdef" p1 = VarPtr(s) ' 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(p1 + 2, p1, 4) Print String@(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