|
|
(9 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 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.
| |
− | <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
| |