Autore Topic: Copia di array di oggetti  (Letto 759 volte)

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Copia di array di oggetti
« il: 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?


« Ultima modifica: 25 Aprile 2020, 11:31:53 da Akrobaticone »
"e il naufragar m'è dolce in questo mar"

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Copia di array di oggetti
« Risposta #1 il: 25 Aprile 2020, 12:32:13 »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Copia di array di oggetti
« Risposta #2 il: 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 ?
« Ultima modifica: 25 Aprile 2020, 17:14:39 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re:Copia di array di oggetti
« Risposta #3 il: 25 Aprile 2020, 19:38:36 »
Allego un esempio
"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Copia di array di oggetti
« Risposta #4 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re:Copia di array di oggetti
« Risposta #5 il: 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


"e il naufragar m'è dolce in questo mar"

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Copia di array di oggetti
« Risposta #6 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re:Copia di array di oggetti
« Risposta #7 il: 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....... :-\
"e il naufragar m'è dolce in questo mar"