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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • 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: 22 Aprile 2022, 01:16:51 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. »