Autore Topic: Copiare due stringhe in un'area di memoria con la funzione esterna memcpy( )  (Letto 469 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.213
  • Ne mors quidem nos iunget
    • Mostra profilo
Di seguito un esempio per copiare in modo contiguo due stringhe all'interno di un'area di memoria riservata mediante la funzione esterna "memcpy()" contenuta nella libreria condivisa libc.so.6.


Utilizzando una variabile di tipo Puntatore:
Codice: [Seleziona]
Library "libc:6"

' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n)
' Copy N bytes of SRC to DEST.
Private Extern memcpy(__dest As Pointer, __src As String, __n As Long) As Pointer


Public Sub Main()

  Dim a, b As String
  Dim dest As Pointer
  Dim i As Integer
 
   a = "aaaa"
   b = "bbbb"
   
' Allochiamo una sufficiente area di memoria ove saranno memorizzati in successione i dati delle due variabili stringa:
   dest = Alloc(SizeOf(gb.Byte), 16)
   
   i = Len(a)
   
' Copiamo nell'area di memoria l'intero numero di dati contenuti dalla variabile stringa "a":
   memcpy(dest, a, i)
   
' Poiché dobbiamo memorizzare successivamente anche i dati presenti nella variabile stringa "b",
' è necessario spostarci all'interno dell'area di memoria allocata di un numero di byte pari alla dimensione della stringa:
   dest += i
   
   i = Len(b)
   
' Copiamo nell'area di memoria, dopo i dati già copiati dalla variabile stringa "a", l'intero numero di dati contenuti dalla variabile stringa "b":
   memcpy(dest, b, i)
   
' Poiché il puntatore interno dell'area di memoria riservata è spostato in avanti rispetto al primo byte dell'area medesima,
' è necessario riportare appunto all'inizio il puntatore:
   dest -= i
   
' Dereferenziamo il Puntatore all'area di memoria allocata per vederne il contenuto in console:
   Print String@(dest)
   
' Liberiamo l'area di memoria precedentemente allocata:
   Free(dest)

' Ci assicuriamo comunque che il Puntatore non punti ad alcuna cella di memoria importante:
   dest = 0

End


Ora utilizzando un vettore di tipo Byte[ ]:
Codice: [Seleziona]
Library "libc:6"

' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n)
' Copy N bytes of SRC to DEST.
Private Extern memcpy(__dest As Pointer, __src As String, __n As Long) As Pointer


Public Sub Main()

  Dim a, b As String
  Dim dest As Byte[]
  Dim ia, ib As Integer
 
   a = "aaaa"
   b = "bbbb"
   
' Attribuiamo un sufficiente numero di elementi al vettore, ossia allochiamo una sufficiente area di memoria per il vettore medesimo:
   dest = New Byte[16]
   
   ia = Len(a)
   
' Copiamo nell'area di memoria l'intero numero di dati contenuti dalla variabile stringa "a":
   memcpy(dest.Data, a, ia)
   
   ib = Len(b)
   
' Copiamo nell'area di memoria del vettore, destinata a memorizzare i propri dati, l'intero numero di dati contenuti dalla variabile stringa "b".
' L'area di memoria di memorizzazione dei dati del vettore è individuata dal suo indirizzo ritornato dalla proprietà ".Data" del vettore medesimo.
' Ci spostiamo di 4 byte avanti nell'area di memoria del vettore, al fine di non sovrascrivere i dati già copiati precedentemente della stringa "a":
   memcpy(dest.Data + ia, b, ib)

' Mostriamo in console i dati "utili" (ossia in questo caso quelli rappresentanti la copia delle due stringhe originarie) contenuti dal vettore:
   Print dest.ToString(0, ia + ib)

' ...o magari leggendo con la funzione di dereferenziazione di Gambas direttamente nell'area di memoria dei dati memorizzati dal vettore:
   Print String@(dest.Data)

End



« Ultima modifica: 16 Settembre 2025, 08:24:57 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »