Differenze tra le versioni di "Copie di variabili array"

Da Gambas-it.org - Wikipedia.
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per fare una o più copie di una variabile vettoriale, sono possibili almeno due modalità. A seconda della modalità adottata si avrà una situazione diversa.
+
Per fare una o più copie di una variabile vettoriale, sono possibili alcune modalità.  
  
 +
==Con assegnazione diretta fra due variabili array oppure con l'uso del Metodo ".Copy()" del vettore==
 +
A seconda della modalità adottata si avrà una situazione diversa.
  
 
La copia di un array può avvenire:
 
La copia di un array può avvenire:
  
* per assegnazione diretta di una variabile vettoriale ad un'altra variabile vettoriale
+
* per assegnazione diretta di una variabile vettoriale ad un'altra variabile vettoriale.
Si può fare una copia di un array, assegnando la variabile ad un'altra variabile:
+
Si può fare una copia di un array, assegnando la variabile array ad un'altra variabile array del medesimo tipo di dati:
 
  array_2 = array_1
 
  array_2 = array_1
In questo caso la variabile vettoriale ''array_2'' punta al <SPAN Stle="text-decoration:underline">medesimo</span> indirizzo di memoria della variabile ''array_1''. Hanno nome identificatore diverso, ma puntano alla medesima area di memoria della Struttura ''CARRAY'' definita nei sorgenti Gambas, e più precisamente nel file header "''gbx_c_array.h''".
+
In questo caso la variabile vettoriale ''array_2'' <SPAN Style="text-decoration:underline">punta al <SPAN Stle="text-decoration:underline">medesimo</span> indirizzo di memoria</span> della variabile ''array_1''. Hanno nome identificatore diverso, ma puntano alla medesima area di memoria della Struttura ''CARRAY'' definita nei sorgenti Gambas, e più precisamente nel file header "''gbx_c_array.h''".
<BR>Ciò significa che, avendo le due variabili array il medesimo indirizzo, qualunque variazione apportata ai dati contenuti da una delle due variabili, o apportata anche agli elementi di una <SPAN Stle="text-decoration:underline">qualsiasi</span> delle due variabili.
+
<BR>Ciò significa che, avendo le due variabili array il medesimo indirizzo, qualunque variazione apportata ai dati contenuti da una delle due variabili, o apportata anche agli elementi di una <SPAN Stle="text-decoration:underline">qualsiasi</span> delle due variabili, si rifletterà anche sui dati e/o sugli elementi contenuti nell'altra variabile.
 
 
 
 
* per attribuzione mediante il metodo ''.Copy()'' proprio delle varibili vettoriali.
 
In questo caso la variabile vettoriale ''array_2'' punta ad un indirizzo ''diverso'' da quello dela variabile ''array_1''. Pertanto, le due varibili vettoriali risultano essere indipendenti: le modifiche apportate ai valori o agli elementi di una variabile non inciderà anche sull'altra.
 
  
 +
* per attribuzione mediante il Metodo ".Copy()" proprio delle variabili vettoriali:
 +
array_2 = array_1.Copy()
 +
In questo caso la variabile vettoriale ''array_2'' <SPAN Style="text-decoration:underline">punta ad un indirizzo di memoria ''diverso''</span> da quello dela variabile ''array_1''. Pertanto, le due varibili vettoriali risultano essere indipendenti: le modifiche apportate ai valori o agli elementi di una variabile non incideranno, non avranno effetto anche sull'altra.
  
  
 
Mostriamo quanto sopra esposto con un semplice esempio pratico:
 
Mostriamo quanto sopra esposto con un semplice esempio pratico:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim bb, cc As Byte[]
 
   Dim bb, cc As Byte[]
    
+
    Print "Effettuiamo la prova con l'assegnazione diretta di un array ad un altro: "
+
   Print "Effettuiamo la prova con l'assegnazione diretta di un array ad un altro: "
 
      
 
      
    bb = [11, 22, 33, 44]
+
  bb = [11, 22, 33, 44]
 
          
 
          
 
  <FONT Color=gray>' ''Assegnamo una variabile array ad un'altra:''</font>
 
  <FONT Color=gray>' ''Assegnamo una variabile array ad un'altra:''</font>
    <FONT Color=#B22222>cc = bb</font>
+
  <FONT Color=#B22222>cc = bb</font>
 
    
 
    
 
  <FONT Color=gray>' ''Vediamo l'indirizzo di memoria di ciascuna variabile vettoriale:''</font>
 
  <FONT Color=gray>' ''Vediamo l'indirizzo di memoria di ciascuna variabile vettoriale:''</font>
    Print Object.Address(bb), Object.Address(cc)
+
  Print Object.Address(bb), Object.Address(cc)
 
    
 
    
 
  <FONT Color=gray>' ''Vediamo quanti elementi posseggono entrambe le variabili:''</font>
 
  <FONT Color=gray>' ''Vediamo quanti elementi posseggono entrambe le variabili:''</font>
    Print bb.Count, cc.Count
+
  Print bb.Count, cc.Count
 
      
 
      
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "bb":''</font>
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "bb":''</font>
    bb.Push(55)
+
  bb.Push(55)
 
      
 
      
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
    Print bb.Count, cc.Count
+
  Print bb.Count, cc.Count
 
      
 
      
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "cc":''</font>
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "cc":''</font>
    cc.Push(66)
+
  cc.Push(66)
 
    
 
    
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
    Print bb.Count, cc.Count
+
  Print bb.Count, cc.Count
    cc.Clear
+
  cc.Clear
 
      
 
      
    Print "---------------------------"
+
  Print "---------------------------"
 
      
 
      
    Print "\nEffettuiamo ora la prova con il metodo '.Copy()': "
+
  Print "\nEffettuiamo ora la prova con il metodo '.Copy()': "
 
      
 
      
    bb = [11, 22, 33, 44]
+
  bb = [11, 22, 33, 44]
 
      
 
      
 
  <FONT Color=gray>' ''Effettuiamo una copia della variabile "bb" mediante il suo metodo ".Copy()":''</font>
 
  <FONT Color=gray>' ''Effettuiamo una copia della variabile "bb" mediante il suo metodo ".Copy()":''</font>
    <FONT Color=#B22222>cc = bb.Copy(0, bb.Count)</font>
+
  <FONT Color=#B22222>cc = bb.Copy(0, bb.Count)</font>
 
      
 
      
 
  <FONT Color=gray>' ''Vediamo l'indirizzo di memoria di ciascuna variabile vettoriale:''</font>
 
  <FONT Color=gray>' ''Vediamo l'indirizzo di memoria di ciascuna variabile vettoriale:''</font>
    Print Object.Address(bb), Object.Address(cc)
+
  Print Object.Address(bb), Object.Address(cc)
 
      
 
      
 
  <FONT Color=gray>' ''Vediamo quanti elementi posseggono entrambe le variabili:''</font>
 
  <FONT Color=gray>' ''Vediamo quanti elementi posseggono entrambe le variabili:''</font>
    Print bb.Count, cc.Count
+
  Print bb.Count, cc.Count
 
      
 
      
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "bb":''</font>
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "bb":''</font>
    bb.Push(55)
+
  bb.Push(55)
 
      
 
      
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
    Print bb.Count, cc.Count, " !!!"
+
  Print bb.Count, cc.Count, " !!!"
 
      
 
      
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "cc":''</font>
 
  <FONT Color=gray>' ''Incrementiamo il numero di elementi della variabile "cc":''</font>
    cc.Push(66)
+
  cc.Push(66)
 
      
 
      
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
 
  <FONT Color=gray>' ''Vediamo ora quanti elementi posseggono entrambe le variabili:''</font>
    Print bb.Count, cc.Count
+
  Print bb.Count, cc.Count
 
      
 
      
  '''End'''
+
  End
 +
 
 +
 
 +
==Uso della risorsa ''Memory Stream''==
 +
L'assegnazione fra due vettori può avvenire anche mediante la risorsa ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' scrivendo i valori-byte  del primo vettore nell'area di memoria appartenente al secondo vettore, destinata a immagazzinare i valori-byte, puntata dalla Proprietà ".Data" di tale vettore.
 +
 
 +
Mostriamo un semplice esempio:
 +
Public Sub Main()
 +
 +
  Dim bb1 As Byte[] = [11, 22, 33, 44, 55, 66, 77, 88]
 +
  Dim bb2 As New Byte[bb1.Count]
 +
  Dim st As Stream
 +
 
 +
  st = Memory bb2<FONT Color=#B22222>.Data</font> For Write
 +
 
 +
  bb1.Write(st, 0, bb1.Count)
 +
 
 +
  st.Close
 +
 
 +
  Print bb2[6]
 +
 +
End
 +
 
 +
 
 +
==Uso della funzione esterna "memcpy()"==
 +
La funzione esterna, dichiarata nel file header "''/usr/include/string.h'' ", copia n byte di un'area di memoria, puntata da un ''Puntatore'', in un'altra area di memoria di destinazione, anch'essa puntata da una variabile di tipo ''Puntatore''.
 +
 
 +
Nel caso di specie utilizzeremo la Proprietà ".Data" di entrambe le variabili vettoriali, quella sorgernte e quella di destinazione dei dati, da passare alla predetta funzione esterna "strcpy()".
 +
 
 +
 
 +
Vediamo un semplice esempio:
 +
Library "libc:6"
 +
 +
<FONT Color=gray>' ''void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n)''
 +
' ''Copy N bytes of SRC to DEST.''</font>
 +
Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long) As Pointer
 +
 +
 +
Public Sub Main()
 +
 
 +
  Dim aa, bb As Byte[]
 +
  Dim b As Byte
 +
 +
  bb = [1, 2, 3, 4, 5, 6]
 +
  aa = New Byte[bb.Count]
 +
 
 +
  <FONT Color=#B22222>memcpy(aa.Data, bb.Data, bb.Count)</font>
 +
   
 +
<FONT Color=gray>' ''Vediamo in console il risultato leggendo nella variabile vettoriale "aa":''</font>
 +
  For Each b In aa
 +
    Print b
 +
  Next
 +
 
 +
End

Versione attuale delle 20:25, 24 ago 2023

Per fare una o più copie di una variabile vettoriale, sono possibili alcune modalità.

Con assegnazione diretta fra due variabili array oppure con l'uso del Metodo ".Copy()" del vettore

A seconda della modalità adottata si avrà una situazione diversa.

La copia di un array può avvenire:

  • per assegnazione diretta di una variabile vettoriale ad un'altra variabile vettoriale.

Si può fare una copia di un array, assegnando la variabile array ad un'altra variabile array del medesimo tipo di dati:

array_2 = array_1

In questo caso la variabile vettoriale array_2 punta al medesimo indirizzo di memoria della variabile array_1. Hanno nome identificatore diverso, ma puntano alla medesima area di memoria della Struttura CARRAY definita nei sorgenti Gambas, e più precisamente nel file header "gbx_c_array.h".
Ciò significa che, avendo le due variabili array il medesimo indirizzo, qualunque variazione apportata ai dati contenuti da una delle due variabili, o apportata anche agli elementi di una qualsiasi delle due variabili, si rifletterà anche sui dati e/o sugli elementi contenuti nell'altra variabile.

  • per attribuzione mediante il Metodo ".Copy()" proprio delle variabili vettoriali:
array_2 = array_1.Copy()

In questo caso la variabile vettoriale array_2 punta ad un indirizzo di memoria diverso da quello dela variabile array_1. Pertanto, le due varibili vettoriali risultano essere indipendenti: le modifiche apportate ai valori o agli elementi di una variabile non incideranno, non avranno effetto anche sull'altra.


Mostriamo quanto sopra esposto con un semplice esempio pratico:

Public Sub Main()
 
 Dim bb, cc As Byte[]

 Print "Effettuiamo la prova con l'assegnazione diretta di un array ad un altro: "
   
 bb = [11, 22, 33, 44]
       
' Assegnamo una variabile array ad un'altra:
 cc = bb
  
' Vediamo l'indirizzo di memoria di ciascuna variabile vettoriale:
 Print Object.Address(bb), Object.Address(cc)
  
' Vediamo quanti elementi posseggono entrambe le variabili:
 Print bb.Count, cc.Count
   
' Incrementiamo il numero di elementi della variabile "bb":
 bb.Push(55)
   
' Vediamo ora quanti elementi posseggono entrambe le variabili:
 Print bb.Count, cc.Count
   
' Incrementiamo il numero di elementi della variabile "cc":
 cc.Push(66)
  
' Vediamo ora quanti elementi posseggono entrambe le variabili:
 Print bb.Count, cc.Count
 cc.Clear
   
 Print "---------------------------"
   
 Print "\nEffettuiamo ora la prova con il metodo '.Copy()': "
   
 bb = [11, 22, 33, 44]
   
' Effettuiamo una copia della variabile "bb" mediante il suo metodo ".Copy()":
 cc = bb.Copy(0, bb.Count)
   
' Vediamo l'indirizzo di memoria di ciascuna variabile vettoriale:
 Print Object.Address(bb), Object.Address(cc)
   
' Vediamo quanti elementi posseggono entrambe le variabili:
 Print bb.Count, cc.Count
   
' Incrementiamo il numero di elementi della variabile "bb":
 bb.Push(55)
   
' Vediamo ora quanti elementi posseggono entrambe le variabili:
 Print bb.Count, cc.Count, " !!!"
   
' Incrementiamo il numero di elementi della variabile "cc":
 cc.Push(66)
   
' Vediamo ora quanti elementi posseggono entrambe le variabili:
 Print bb.Count, cc.Count
   
End


Uso della risorsa Memory Stream

L'assegnazione fra due vettori può avvenire anche mediante la risorsa Memory Stream scrivendo i valori-byte del primo vettore nell'area di memoria appartenente al secondo vettore, destinata a immagazzinare i valori-byte, puntata dalla Proprietà ".Data" di tale vettore.

Mostriamo un semplice esempio:

Public Sub Main()

 Dim bb1 As Byte[] = [11, 22, 33, 44, 55, 66, 77, 88]
 Dim bb2 As New Byte[bb1.Count]
 Dim st As Stream
 
 st = Memory bb2.Data For Write 
 
 bb1.Write(st, 0, bb1.Count)
 
 st.Close
 
 Print bb2[6]

End


Uso della funzione esterna "memcpy()"

La funzione esterna, dichiarata nel file header "/usr/include/string.h ", copia n byte di un'area di memoria, puntata da un Puntatore, in un'altra area di memoria di destinazione, anch'essa puntata da una variabile di tipo Puntatore.

Nel caso di specie utilizzeremo la Proprietà ".Data" di entrambe le variabili vettoriali, quella sorgernte e quella di destinazione dei dati, da passare alla predetta funzione esterna "strcpy()".


Vediamo un semplice esempio:

Library "libc:6"

' void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n)
' Copy N bytes of SRC to DEST.
Private Extern memcpy(__dest As Pointer, __src As Pointer, __n As Long) As Pointer


Public Sub Main()
 
 Dim aa, bb As Byte[]
 Dim b As Byte

 bb = [1, 2, 3, 4, 5, 6]
 aa = New Byte[bb.Count]
  
 memcpy(aa.Data, bb.Data, bb.Count)
   
' Vediamo in console il risultato leggendo nella variabile vettoriale "aa":
 For Each b In aa
   Print b
 Next
 
End