Autore Topic: [RISOLTO] L'array che modifica un proprio elemento per "simpatia"  (Letto 555 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Ho due array aventi medesima lunghezza.
Assegno dei valori agli elementi di un solo array, e poi effettuo un mero assegnamento da un array all'altro.
Modifico un elemento di uno solo dei due array.... mi ritrovo modificato anche l'elemento dell'altro array con il medesimo nuovo valore.  :rolleyes:
Provate:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim a As Byte
 Dim alibaba As New Byte[2]
 Dim simbad As New Byte[2]

  For a = 0 To 1
    alibaba[a] = 100 + a
  Next

  simbad = alibaba

  simbad[1] = 50

  Print alibaba[1]   '...stranamente darà 50 !

End


Questo strano fenomeno non avviene se uso il metodo .Copy previsto per gli array.... ma al di là di ciò, quel fenomeno lo ritenete normale ?
« Ultima modifica: 05 Luglio 2012, 14:15:30 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 fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: L'array che modifica un proprio elemento per "simpatia"
« Risposta #1 il: 04 Luglio 2012, 21:34:06 »
in gambas devi usare .copy per copiare un array altrimenti ottieni una copia variabile, c'è anche scritto nella documentazione da qualche parte mi pare :)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: L'array che modifica un proprio elemento per "simpatia"
« Risposta #2 il: 05 Luglio 2012, 13:06:00 »
Esatto!

Per gli oggetti, una copia equivale a copiare l'indirizzo in memoria dell'oggetto, e quindi il suo riferimento. Ogni modifica apportata su qualsiasi variabile che contenga il solo indirizzo, modifica di conseguenza l'oggetto.
Come suggerito da fsurfing, per avere un duplicato dell'oggetto, è necessario usare un Copy(), che crea un clone, ma in altra zona di memoria, dell'oggetto.
Non tutti gli oggetti base hanno un metodo Copy(), per cui nel caso tocca implementarlo, creando un nuovo oggetto e copiando le proprietà dell'originale sul nuovo.

Quello di avere un riferimento all'oggetto è molto utile in fase di passaggio tramite parametri tra un metodo e l'altro. La modifica dell'oggetto fà sì che venga mantenuta in uscita dal metodo, eliminando così l'obbligo del ritorno di un valore.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: L'array che modifica un proprio elemento per "simpatia"
« Risposta #3 il: 05 Luglio 2012, 14:14:58 »
Dunque, il fenomeno è in Gambas è normale.
Va bene. Ne prendiamo atto.


Grazie ad entrambi per gli inteventi.   :ciao:
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO] L'array che modifica un proprio elemento per "simpatia"
« Risposta #4 il: 05 Luglio 2012, 15:51:16 »
Il discorso e la logica non è valida solo per Gambas...  :D