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

Da Gambas-it.org - Wikipedia.
Riga 38: Riga 38:
 
Qualora il numero di dati da copiare non sia conosciuto, allora si potrà assegnare il ''Puntatore'' (ossia l'indirizzo di memoria dell'area di memoria riservata contenente i dati da copiare) al membro data della Struttura ''CARRAY'' dei sorgenti di Gambas afferenti all'Oggetto ''Array''.
 
Qualora il numero di dati da copiare non sia conosciuto, allora si potrà assegnare il ''Puntatore'' (ossia l'indirizzo di memoria dell'area di memoria riservata contenente i dati da copiare) al membro data della Struttura ''CARRAY'' dei sorgenti di Gambas afferenti all'Oggetto ''Array''.
 
<BR>Per questo argomento vedere questo paragrafo della Wiki:
 
<BR>Per questo argomento vedere questo paragrafo della Wiki:
[[Assegnare_ad_un_vettore_i_valori_contenuti_da_un'area_di_memoria_puntata_da_un_Puntatore#Assegnando_il_Puntatore_al_membro_Data_della_Struttura_CARRAY_dei_sorgenti_di_Gambas Assegnando il Puntatore al membro Data della Struttura CARRAY dei sorgenti di Gambas]]
+
[[Assegnare_ad_un_vettore_i_valori_contenuti_da_un'area_di_memoria_puntata_da_un_Puntatore#Assegnando_il_Puntatore_al_membro_Data_della_Struttura_CARRAY_dei_sorgenti_di_Gambas|Assegnando il Puntatore al membro Data della Struttura CARRAY dei sorgenti di Gambas]]
  
  

Versione delle 09:21, 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


Caso in cui non si conosca la quantità di dati da copiare

Qualora il numero di dati da copiare non sia conosciuto, allora si potrà assegnare il Puntatore (ossia l'indirizzo di memoria dell'area di memoria riservata contenente i dati da copiare) al membro data della Struttura CARRAY dei sorgenti di Gambas afferenti all'Oggetto Array.
Per questo argomento vedere questo paragrafo della Wiki: Assegnando il Puntatore al membro Data della Struttura CARRAY dei sorgenti di Gambas


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