Gambas-it

Gambas3 => Programmazione => Topic aperto da: akrobaticone - 25 Aprile 2020, 11:31:20

Titolo: Copia di array di oggetti
Inserito da: akrobaticone - 25 Aprile 2020, 11:31:20
Ciao supponiamo di avere due array di oggetti
Codice: [Seleziona]
Dim oggetti as new miaclasse[2]
Dim copia as new miaclasse[2]
ora eseguo la copia di uno sull'altro
Codice: [Seleziona]
copia=oggetti.copy()
ora se faccio
Codice: [Seleziona]
copia[0].proprietà=5
anche l'altro array si modifica allo stesso modo
Codice: [Seleziona]
oggetti[0].proprietà
darà lo stesso risultato cioè 5
questo perchè presumo che si copiano in un altro array i riferimenti agli stessi oggetti che sono le classi miaclasse precedentemente create
quindi sono solo gli array ad essere copiati e non le classi di cui conservano i riferimenti

Eiste un metodo che non sia complicato per fare la copia anche delle classi puntate dagli array?


Titolo: Re:Copia di array di oggetti
Inserito da: Gianluigi - 25 Aprile 2020, 12:32:13
Guarda se questo può esserti utile:
https://www.gambas-it.org/smf/index.php?topic=7592.msg47698#msg47698

 :ciao:
Titolo: Re:Copia di array di oggetti
Inserito da: vuott - 25 Aprile 2020, 15:23:20
Ciao supponiamo di avere due array di oggetti
....
darà lo stesso risultato cioè 5
Scusa, puoi mostrare il codice essenziale che hai scritto ?
Titolo: Re:Copia di array di oggetti
Inserito da: akrobaticone - 25 Aprile 2020, 19:38:36
Allego un esempio
Titolo: Re:Copia di array di oggetti
Inserito da: vuott - 25 Aprile 2020, 20:30:15
Con qualche leggera integrazione, a soli fini esplicativi, del tuo codice i problemi, da te posti, io li spiegherei così:

Codice: [Seleziona]
Public Sub Form_Open()

  Dim obj As New Class1

' Mostra l'indirizzo di memoria dell'Oggetto "obj" del tipo Class1:
  Print obj

  obj.valore = 5
  Module1.vettore.push(obj)

End


Public Sub Button1_Click()

  Dim copia As Class1[]

' Il Metodo ".Copy()" genera una copia esatta dell'array, ma allocando (e quindi usando) una diversa area di memoria.
  copia = Module1.vettore.Copy()
' Quindi avremo due array identici, ma posti in aree di memoria "distinte" e separate.
  Print Module1.vettore, copia
 
' Poiché nella subroutine "Form_Open()" si è provveduto anche ad assegnare all'array di tipo Class1, denominato "Module1.vettore",
' un Oggetto di tipo Class1, quando qui poco sopra si è effettuata la copia esatta del predetto array "Module1.vettore",
' sono stati copiati pedissequamente nell'array "copia" tutti i dati e riferimenti presenti nell'array "Module1.vettore".
' Infatti sia l'array "Module1.vettore" che l'array "copia" posseggono l'indirizzo di memoria dell'Oggetto "obj" del tipo Class1.
  Print Module1.vettore[0], copia[0]
 
' La qual cosa rende comprensibile perché la proprietà "valore" appartenente al primo Oggetto di tipo Class1 (che non è altri che: "obj"),
' contenuto - o meglio "puntato" - da entrambi gli array restituisca il medesimo valore:
  Print "Prima " & Module1.vettore[0].valore, copia[0].valore

' ...ed ugualmente ben si comprende perché cambiando il valore della proprietà "valore" del primo Oggetto di tipo Class1 contenuto (puntato)
' dall'array "copia" sia identico conseguentemente al valore restituito del primo Oggetto di tipo Class1 contenuto (puntato) dall'array "Module1.vettore".
  Print
  copia[0].valore = 0
  Print "Dopo " & Module1.vettore[0].valore
 
' Per salvare il valore "5" all'inizio posseduto dalla proprietà "valore" del primo Oggetto di tipo Class1 contenuto (puntato) dall'array "Module1.vettore",
' bisognerà creare nell'array "copia" un "nuovo" Oggetto di tipo Class1, ossia avente un'area di memoria diversa da quella dell'Oggetto contenuto
' (puntato) dall'array "Module1.vettore".
' Infatti, se commentiamo la precedente rida di comando "copia[0].valore = 0", e scriviamo le seguenti righe, abbiamo un risultato diverso
' restituito dalla proprietà "valore" dell'Oggetto contenuto (puntato) dall'array "Module1.vettore".
  Print
  copia[0] = New Class1
  copia[0].valore = 0
  Print "Dopo " & Module1.vettore[0].valore
 
End


:-X
Titolo: Re:Copia di array di oggetti
Inserito da: akrobaticone - 25 Aprile 2020, 20:59:38
Voutt, come al solito hai sempre la migliore spiegazione
il problema l'avevo individuato, mi mancava la soluzione
ma ti dirò di piu
Solo ora mi sembra di ricordare che tempo fa avevo posto una questione simile sugli array semplici e avevo ottenuto una soluzione che ricalcava questa solo che non ricordo piu dove sia la risposta
quella volta mi pare fosse Gianluigi ad avermi dato la soluzione
senilità.....
Grazie


Titolo: Re:Copia di array di oggetti
Inserito da: vuott - 25 Aprile 2020, 21:04:28
Bisogna ricordare sempre che si gioca tutto sulla memoria e sugli indirizzi di memoria...... sia riguardo agli oggetti della programmazione sia alla senilità !   ;D
Titolo: Re:Copia di array di oggetti
Inserito da: akrobaticone - 25 Aprile 2020, 21:23:43
Bisogna ricordare sempre che si gioca tutto sulla memoria e sugli indirizzi di memoria...... sia riguardo agli oggetti della programmazione sia alla senilità !   ;D
alla prima si trova sempre soluzione....... :-\