Emulare la funzione memcpy() di C
La funzione di memcpy( ) del linguaggio C copia un numero di dati (byte), specificato dal suo 3° argomento, da un'area di memoria riservata ad un'altra.
Per emulare in Gambas il comportamento di questa funzione, si possono adottare varie modalità.
Indice
Uso di due vettori di tipo Byte[ ]
La più semplice è quella di utilizzare - se possibile - due vettori di tipo Byte[ ], giacché i vettori sono in buona sostanza delle aree di memoria riservate.
In particolare si utilizzerà il Metodo .Copy( ) del vettore contenente i dati da copiare nell'altro vettore.
Dim bb1, bb2 As Byte[] ...... bb2 = bb1.Copy(0, bb1.Count)
L'uso del Metodo .Copy( ) copierà i dati di un vettore nell'altro, mantenedo però tali vettori come oggetti distinti, o meglio vettori che puntano ciascuno ad aree di memoria riservata diverse.
Uso dei Memory Stream e di un vettore di tipo Byte[ ]
Qualora si abbia una variabile di tipo Puntatore, che punta a un'area di memoria riservata contenente dati da copiare in un'altra area di memoria riservata (e dunque non sia abbia per qualche motivo la disponibilità di due vettori di tipo Byte[ ]), il modo più semplice di copiatura è quello di utilizzare la risorsa dei Memory Stream e di un vettore di tipo Byte[ ].
Più in particolare si utilizzeranno i Memory Stream per leggere i dati presenti nell'area di memoria puntata dal Puntatore. In tal caso è assolutamente necessario conoscere la quantità di dati contenuti dalla predetta area di memoria puntata dal Puntatore.
Public Sub Main() Dim p As Pointer Dim bb1 As Byte[] Dim st As Stream p = Funzione_che_restituisce_un_Puntatore() bb1 = New Byte[numero_conosciuto] st = Memory p For Read bb1.Read(st, 0, bb1.Count) st.Close End
Leggendo e scrivendo dato per dato con un ciclo
Una terza modalità, meno veloce rispetto alla precedente, è quella di leggere dato per dato da una variabile di tipo Puntatore e di scriverlo nell'area di memoria riservata attraverso un ciclo. Ciò può essere compiuto sia con un secondo Puntatore o di nuovo con un vettore di tipo Byte[ ].
Anche in questa modalità è necessario conoscere la quantità di dati da copiare.
Nel caso si utilizzino due Puntatori (uno dal quale leggere i dati, l'altro dove scriverli), la scrittura dei dati nella seconda variabile di tipo Puntatore ovviamente potrà avvenire in modo esclusivo attraverso i Memory Stream.
Riferimenti
- Si suggerisce la lettura di questa pagina della Wiki: Assegnare ad un vettore i valori contenuti da un'area di memoria puntata da un Puntatore
- http://www.cplusplus.com/reference/cstring/memcpy/
- https://www.tutorialspoint.com/c_standard_library/c_function_memcpy.htm
- http://www.qnx.com/developers/docs/6.5.0SP1.update/com.qnx.doc.neutrino_lib_ref/m/memcpy.html