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

Da Gambas-it.org - Wikipedia.
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
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.
+
#REDIRECT [[Emulare in Gambas la funzione memcpy() di C]]
 
 
Per emulare in Gambas il comportamento di questa funzione, si possono adottare viarie 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.
 
<BR>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[<FONT Color=gray>''numero_conosciuto''</font>]
 
 
 
  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[ ]''.
 
<BR>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 <SPAN Style="text-decoration:underline">scrittura</span> 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|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
 

Versione attuale delle 19:43, 18 ago 2022