Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Strano comportamento di clone()?

    Ciao a tutti!
    Io ho questo pezzo di codice:
    codice:
    	public void move(int iX, int iY) {
    		int[] newI = freeSpace(iX,iY);
    		int[][] oldField = field.clone();
    		
    		if(newI != null){
    			field[newI[1]][newI[0]] = oldField[iY][iX];
    			field[iY][iX] = oldField[newI[1]][newI[0]];
    		}
    		
    	}
    come noterete, faccio una copia dell'array multidimensione filed in oldField, in modo da poter effettuare cambiamenti in field senza perdere informazioni sul suo stato precedente, che nel mio caso servirà a scambiare gli elementi di due celle della matrice.
    (Se non tenessi una traccia dello stato precedente di field, una volta copiato un elemento nella sua nuova posizione, non saprei più cosa c'era prima in quel posto per poterlo spostare a sua volta).

    Ebbene... nonostante questo mio accorgimento... non va.
    Eseguendo il debug con eclipse noto che arrivato alla riga
    codice:
    field[iY][iX] = oldField[newI[1]][newI[0]];
    oldField è cambiato anch'esso (ed è precisamente uguale a field dopo la modifica) °___°

    Questo mi fa pensare: clone() mantiene un oggetto uguale all'altro durante tutta l'esecuzione del programma, modificando l'oggetto destinazione per farlo essere SEMPRE uguale a quello sorgente????? °_°

    Spero qualcuno mi delucidi su questa situazione perché bloccato a questo punto non posso andare avanti col mio programma ^^;;

    Grazie in anticipo!
    Flash Developer for Rich Media
    PHP, jQuery Developer

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68
    Il metodo clone() che tu invochi lo hai tu stesso implementato oppure ti affidi a quello della classe Object, perchè nel caso fosse così è naturale che tu debba sovrascriverlo adattandolo al tuo scopo. Nel caso invece lo abbia completamente implementato tu ti consiglio di postarne il codice, perchè a quanto pare sta proprio lì il probabile errore.

  3. #3
    io sto usando quello standard di Object, e in teoria mi va bene così com'è, perké mi crea un nuovo array multidimensionale perfettamente uguale alla sorgente.
    Il problema viene dopo, oldField prima dell'if è perfettamenete uguale a field... mi chiedo perché dopo cambi i valori al suo interno nonostante io non lo tocchi .___.

    Comunque ho voluto usare lo standard di clone() proprio per evitare di farmi un metodo per copiare l'array utilizzando magari cicli for innestati.

    Non ci sono alternative migliori (o meglio un modo per risolvere sta stranezza)?

    Arrays.copyOf() non posso usarlo per quelli multidimensionali =\
    Flash Developer for Rich Media
    PHP, jQuery Developer

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68
    Originariamente inviato da Miroku
    io sto usando quello standard di Object, e in teoria mi va bene così com'è, perké mi crea un nuovo array multidimensionale perfettamente uguale alla sorgente.
    Non è detto poichè se leggi la documentazione relativa al metodo clone() c'è scritto che effettua una "shallow copy" e oltretutto l'oggetto su cui viene invocato deve implementare l'interfaccia Cloneable, tuttavia per maggiori informazioni vedi tu stesso la documentazione.

    Quello che succede nel tuo codice, immagino sia una implicita conversione dell'array multidimensionale field di interi ("primitivi") in un array multidimensionali di oggetti Integer su cui poi viene invocata il metodo clone() e restituito un oggetto Object associato nuovamente senza esplicita conversione ad una variabile di interi. Capisci che nel caso veramente si verifichi tutto questo è probabile che non avvenga un opportuna copia ma si perda qualcosa per la strada.

    Io ti consiglierei pertanto di provare a implementare un tuo metodo di copia, alla fin fine dovrebbe trattarsi di due semplici cicli for annidati, niente di trascendentale e vedere cosa succede.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Strano comportamento di clone()?

    Originariamente inviato da Miroku
    faccio una copia dell'array multidimensione filed in oldField
    Il clone() su array multidimensione fa una "shallow" copy. Solo la struttura della prima dimensione è duplicata.
    La immagine sotto descrive chiaramente la questione.

    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68

    Re: Re: Strano comportamento di clone()?

    Originariamente inviato da andbin
    Il clone() su array multidimensione fa una "shallow" copy. Solo la struttura della prima dimensione è duplicata.
    Interessante questa cosa, ma nel caso invece chiamassi clone() su un semplice array di interi funziona oppure si verifica sempre qualcosa di strano?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Strano comportamento di clone()?

    Originariamente inviato da M@P
    Interessante questa cosa, ma nel caso invece chiamassi clone() su un semplice array di interi funziona oppure si verifica sempre qualcosa di strano?
    Se si ha un array a 1 dimensione di tipi primitivi il clone fa una vera e propria copia. E mi pare logico. Come ho detto prima, il clone() degli array clona solo la prima dimensione. Se la prima (e unica in questo caso) dimensione contiene direttamente valori primitivi (quindi non reference), la copia è proprio .... una copia!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Ecco... a un certo punto avevo immaginato che andasse a lavorare sui puntatori... vabbeh mi farò il mio metodo.

    Ero scettico nell'usare il classico for perché nel mio codice ne uso già diversi... ma se è inevitabile.... magari cerco di eliminare gli altri.

    Grazie mille a tutti =)
    Flash Developer for Rich Media
    PHP, jQuery Developer

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.