Differenze tra le versioni di "Emulare la funzione memcpy() di C"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
La funzione di ''[http://www.cplusplus.com/reference/cstring/memcpy/ memcpy( )]'' del linguaggio C copia un numero di dati (byte), specificato dal suo 3° argomento, da un'area di memoria riservata ad un'altra.
 
La funzione di ''[http://www.cplusplus.com/reference/cstring/memcpy/ 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 viarie modalità.
+
Per emulare in Gambas il comportamento di questa funzione, si possono adottare varie modalità.
  
 
==Uso di due vettori di tipo ''Byte[ ]''==
 
==Uso di due vettori di tipo ''Byte[ ]''==

Versione delle 09:15, 30 set 2018

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à.

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