« il: 20 Dicembre 2016, 01:07:57 »
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:
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[ ]:
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 »
Registrato
« 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. »