Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    10

    [JAVA] Problema riferimento Array!

    Il programma deve creare, dato un array di numeri, un array con la sequenza dei numeri invertita.
    Es.
    1 2 3 4
    4 3 2 1


    codice:
    import java.util.Scanner;
    
    
    public class InversoNArray {
    	
    	public static void main (String [] args) {
    
    
    	Scanner tastiera = new Scanner(System.in);
    	System.out.println("Quanti numeri vuoi inserire?");
    	int d = tastiera.nextInt();
    	System.out.println("Inserisci una sequenza di numeri:");
    	
    	int numero = 0;
    	int indice = 0;
    	
    	int [] numeriArray = new int [d];
    	int tmpArray [] = new int [d];
    	for (int i=0; i<numeriArray.length; i++) {
    			numero = tastiera.nextInt();
    			InserisciNumeri(numero, numeriArray, indice);
    			indice++;
    		}
    		
    	InvertiArray(numeriArray, d, tmpArray);
    	
    	for (int k=0; k<numeriArray.length; k++)
    	System.out.print(tmpArray[k]+ "  ");
    	
    	}
    	
    	public static int [] InserisciNumeri (int numero, int [] numeriArray, int indice) {
    			numeriArray[indice] = numero;
    			return numeriArray;
    			}
    	
    	public static int [] InvertiArray (int [] numeriArray, int d, int [] tmpArray) {
    		//int tmpArray [] = new int [d];
    		int k = numeriArray.length-1;
    		for (int i=0; i< numeriArray.length; i++) {
    			tmpArray[k] = numeriArray[i];
    			k--;
    			}
    		//numeriArray = tmpArray;
    		//return numeriArray;
    		return tmpArray;
    		
    	}
    }

    allora, in questa versione del programma tutto funziona. Passo al metodo 2 array (uno vuoto e uno contenente i numeri) ecc. Nella versione (iniziale) avevo creato il secondo array (quello tmp) dentro il metodo, e poi avevo cambiato il riferimento dell'array principale, passando così quello al main. (sono le righe di codice contrassegnate come commenti).
    Ma una volta eseguito mi stampa l'identica sequenza, non inversa.
    Dove sbaglio?!?

  2. #2
    Se fai il return di qualcosa sarebbe bene che lo assegnassi a qualcosa.
    int [] numeriInvertiti = InvertiArray(.....

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    10
    non ho capito perché dovrei ri-assegnarlo a qualcosa...dal metodo mi ritorna l'array cambiato, che poi stampo a video no?
    se mi devo appoggiare ad un altro array, allora lascio come ho fatto...

  4. #4
    Il concetto che appoggiandoti all'array che viene creato all'interno del metodo non hai poi modo di riferirti a quell'array dall'esterno se non assegnandolo tramite return. Occhio questo non vuol dire avere 3 Array allocati in memoria ma solo 2 in quanto essendo in java tutto un puntatore quello che viene passato/assegnato è solo il riferimento di memoria.
    è vero che tu lo ritorni l'array ma non lo assegni a nulla come ti ho detto prima

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    10
    quindi i riferimenti rimangono nel metodo, e se voglio usarli nel main, devo assegnare il tutto ad un altro array?
    non penso di aver capito a fondo questo concetto..

  6. #6
    Come ti ho spiegato prima non è proprio un nuovo Array ma diciamo un modo diverso di chiamarlo, ti faccio un esempio in pseudo-codice
    codice:
    public int[] mioMetodo(....){
        int [] pippo = new int[]{1,2,3,4};
        return pippo;
    }
    
    int[] pluto= new int[]{5,6,7,8,9};
    ora diciamo che l'array pluto è allocato all'indirizzo di memoria M1, quindi pluto conterrà il valore M1 e non i valori dell'array (5,6...); mentre l'array pluto è allocato in M2. Ora se io eseguo il metodo in questo modo mioMetodo(...); gli indirizzi di memoria dei due Array non cambiano e quindi riamane tutto invariato, occhio dal contesto di pluto non ho modo di accedere a pippo perché dichiarato nel metodo.
    ma se invece richiamo il metodo in questo modo int [] paperino = mioMetodo(); paperino conterrà l'indirizzo di memoria di pippo quindi M2. E praticamente diciamo che il mio Array 1,2,3,4 dentro il metodo lo chiamo pippo e fuori paperino ma è sempre lo stesso oggetto di memoria.
    Ora prova a rispondere cosa succede se eseguo pluto=mioMetodo(); cosa succede all'array 5,6,7,8,9 c'è cosa conterrà pluto?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    10
    punterà all'indirizzo di memoria di pippo, e quindi conterrà 1,2,3,4?

    mi viene da chiedere perché io devo assegnare
    pluto = mioMetodo(); per poter "usare" l'array pippo.
    se io faccio return pippo; e poi nel main, lo stampo con il ciclo for funziona tutto no?

    il punto critico, che penso di non capire, sono i riferimenti all'interno dei metodi, che da quello che ho capito, per rimanere effettivi anche nel main, devo riassegnarli ad un'altra porzione di memoria ... quindi int [] nuovoArray = mioMetodo(); ... dove il return del metodo è un riferimento creato all'interno del metodo stesso....
    Ultima modifica di fedez_; 04-01-2015 a 21:31

  8. #8
    Solo che nel primo modo in memoria dopo l'invocazione del metodo ci saranno sia pluto che paperino mentre nel secondo caso ci sarà solo pluto e il vecchio riferimento di pluto e quindi i suoi valori saranno deallocati dal garbage collector

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2015
    Messaggi
    10
    non riesco a capire .. è solo una questione di allocazione della memoria? in questo caso dovrebbe funzionare anche la seconda versione del programma, solo che tengo allocati dei riferimenti "inutili"...
    nel metodo ho array con riferimento ad un altro array... quando faccio return, e torna nel main, cosa ritorna?!
    rimane il riferimento o va a pescare in memoria l'array del main, quindi senza il riferimento?


    il punto critico, che penso di non capire, sono i riferimenti all'interno dei metodi, che da quello che ho capito, per rimanere effettivi anche nel main, devo riassegnarli ad un'altra porzione di memoria ... quindi int [] nuovoArray = mioMetodo(); ... dove il return del metodo è un riferimento creato all'interno del metodo stesso....
    è corretto quanto scritto qui?

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.