• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto [Java] Funzione che però non funziona

gedamial

Utente Senior
Autore del topic
9 Giugno 2010
1.937
69
Miglior risposta
0
Salve.

Avevo creato questa funzione che però non funziona :emoji_relieved:

Main file
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Classe secondaria
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Il mio intento non è far funzionare l'input da tastiera. Il mio problema è che alla fine quando stampo la variabile anni essa è uguale a 0. Ma 0 è il suo valore iniziare che SAREBBE dovuto cambiare durante la funzione Int(anni).

:|

Grazie in anticipo!

- - - Aggiornato - - -

Salve.

Avevo creato questa funzione che però non funziona :emoji_relieved:

Main file
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Classe secondaria
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Il mio intento non è far funzionare l'input da tastiera. Il mio problema è che alla fine quando stampo la variabile anni essa è uguale a 0. Ma 0 è il suo valore iniziare che SAREBBE dovuto cambiare durante la funzione Int(anni).

:|

Grazie in anticipo!

*//* Edit: *//* Risolto!
@TBH


Edit: aspettate, ho un dubbio.

Avendo la classe secondaria:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

E la classe principale
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Perché quando vado a stampare la variabile anni me lo da sempre 0? Il valore nella funzione sarebbe dovuto cambiare...
 
Ultima modifica:
@HabboFanNumero1 che in pratica il valore passato , viene ricreato in memoria e una volta fuori dalla funzione non esiste. Invece il passaggio per riferimento gli viene passato l'indirizzo di memoria e le modifiche effettuati risulteranno effettive anche al chiamante. In Java i tipi primitivi vengono sempre passati per valore
 
@HabboFanNumero1 che in pratica il valore passato , viene ricreato in memoria e una volta fuori dalla funzione non esiste. Invece il passaggio per riferimento gli viene passato l'indirizzo di memoria e le modifiche effettuati risulteranno effettive anche al chiamante. In Java i tipi primitivi vengono sempre passati per valore

Ah ecco, quindi in pratica la variabile non cambia effettivamente di valore? E allora perché se faccio:

Main class
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Classe secondaria
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Tutto funziona? Da notare che nella funzione ho usato il return.
 
Ah ecco, quindi in pratica la variabile non cambia effettivamente di valore? E allora perché se faccio:

Main class
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Classe secondaria
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Tutto funziona? Da notare che nella funzione ho usato il return.

il passaggio avviene sempre per valore , la differenza sta nel fatto che ritorni al chiamante quel valore , che come concetto è completamente differente dal passaggio per riferimento. Comunque a ,al di fuori di quella funzione non esiste. Tra l'altro quell'argomento non ha senso di esistere se lo usi così...
 
il passaggio avviene sempre per valore , la differenza sta nel fatto che ritorni al chiamante quel valore , che come concetto è completamente differente dal passaggio per riferimento. Comunque a ,al di fuori di quella funzione non esiste. Tra l'altro quell'argomento non ha senso di esistere se lo usi così...

Non guardare cosa fa la funzione perché la uso per capire un po' come funzionano su Java. Quindi se non ritorno un valore in una funzione void, queste a cosa potrebbero servire? Insomma, a tutto tranne a modificare il valore delle variabili
 
@HabboFanNumero1 ho detto i tipi primitivi vengono passati per valore , ma non gli oggetti ti scrivo il codice alternativo di come poteva essere fatto.

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Main

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Ah ecco! Quindi furbamente dovrei passare un oggetto anzi che un valore. Capito ^^

Ma perchè Java, a differenza DI TUTTI fa questa cosa? Perché non modifica il valore delle variabili nelle funzioni void?
 
@HabboFanNumero1 mmm se parliamo di C e C++ possiamo usare i puntatori altrimenti anche là è passaggio per valore. Nel caso del Net viene eseguita una forzatura con ref o byRef.
 
Ultima modifica:
@HabboFanNumero1 mi sa che dovresti rivederti il concetto di oggetto e classe.
Presumiamo in C++ di voler istanziare una classe facciamo così :

Tip *a=new Tip();

quando chiamiamo il costruttore di Tip , quest'ultimo restituisce un riferimento di tip quindi effettivamente restituisce un indirizzo di memoria. In java ugualmente restituisce un riferimento di tipo Tip , ma sorge spontanea la domanda come faccio a gestire questo riferimento di Tip se non esistono i puntatori? semplice se ne occupa direttamente la JVM così come si occupa di eliminare gli oggetti inutilizzati
 
@HabboFanNumero1 mi sa che dovresti rivederti il concetto di oggetto e classe.
Presumiamo in C++ di voler istanziare una classe facciamo così :

Tip *a=new Tip();

Eh no. TU fai così. Io faccio:
Tip a = new Tip();

Tip a crea in automatico (chiamando il costruttore di default) l'oggetto sullo stack: prestazioni leggermente migliori, restituzione automatica della memoria ma, appunto come dici tu, impossibilità di condividere con altre funzioni in modo efficiente.
Tip a* invece serve ad allocare/distruggere in maniera esplicita con new e delete.
 
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

ma se restituisce un *tip come fa a compilare :emoji_relieved:, al massimo fai così : Tip a;.
Comunque tra l'altro ora non stiamo parlando di gestione di memoria . La differenza tra stack e heap l'ho trattata quì : http://www.sciax2.it/forum/c-c/gestione-memoria-c-667430.html

Tornando al discorso java,hai capito la differenza tra passaggio per valore e riferimento? @HabboFanNumero1

impossibilità di condividere con altre funzioni in modo efficiente.

che intendi ?
 
Ultima modifica:
@HabboFanNumero1

quella & indica che avviene un passaggio per riferimento. Se non la usi avviene un passaggio per valore . Il codice così com'è ,indifferentemente se passi per riferimento o valore la situazione non cambia.

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


in questo caso se passi per valore il risultato sarà 5.
 
quella & indica che avviene un passaggio per riferimento.

Dire per riferimento o dire per indirizzo è la stessa cosa vero?

Inoltre, vorrei farti vedere questi due codici:

1
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

2
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

La differenza sta nella chiamata della funzione e nella definizione della funzione. La differenza sta tutta nei & e nei *

Qual è la differenza vera tra i due codici?
 
Dire per riferimento o dire per indirizzo è la stessa cosa vero?

Non è proprio la stessa cosa , anche se il risultato sarà identico.Genericamente non si da molto importanza.
Nel caso della & viene comunque ottenuta l' area di memoria del parametro. In questo caso x è di Reference , il tipo reference ha una limitazione fondamentale quello che deve puntare obbligatoriamente ad un area di memoria. Come detto sopra nel caso di passaggi per riferimento tale differenza non viene nemmeno presa in considerazione.
 
Non è proprio la stessa cosa , anche se il risultato sarà identico.Genericamente non si da molto importanza.
Nel caso della & viene comunque ottenuta l' area di memoria del parametro. In questo caso x è di Reference , il tipo reference ha una limitazione fondamentale quello che deve puntare obbligatoriamente ad un area di memoria. Come detto sopra nel caso di passaggi per riferimento tale differenza non viene nemmeno presa in considerazione.
In Java non esiste il passaggio per riferimento -.-
 
Se posso permettermi...
Riguardo all'input...

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Prova questa libreria che avevo fatto anni fa per necessità usando BufferedReader e InputStreamReader piuttosto che scanner...

Ciauz