Differenze tra le versioni di "Memmove ()"

Da Gambas-it.org - Wikipedia.
 
(2 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()
+
  Public Sub Main()
 
   
 
   
   Dim s As String
+
   Dim s1, s2 As String
 
   Dim p1, p2 As Pointer
 
   Dim p1, p2 As Pointer
 
   
 
   
   s = "abcdef"
+
   s1 = "abcdef"
 +
  s2 = "xxx"
 
   
 
   
   p1 = Alloc(s)
+
   p1 = Alloc(s1)
   p2 = Alloc(SizeOf(gb.Byte), s.Len)
+
   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=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>
Riga 33: Riga 32:
 
   Print String@(p2)
 
   Print String@(p2)
 
   
 
   
  '''End'''
+
  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