elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 2016
-
21 juin 2007 à 12:00
the_wwt
Messages postés177Date d'inscriptionjeudi 5 octobre 2006StatutMembreDernière intervention16 janvier 2009
-
21 juin 2007 à 16:01
Bonjour tout le monde,
Je suis débutant en Java, et j'ai un problème dont je n'arrive pas à me depatouiller ...
J'ai une fonction recursive (qui s'appelle donc elle meme), et j'ai en paramètre un ( Integer i ) .
Chaque fois que la fonction s'appelle j'incremente i, mais quand la fonction appellée est terminée, et que je remonte d'un niveau, je reviens à la valeur de i precedente (celle qu'avait i avant l'appel recursif).
Pourtant en passant un objet (Integer) en paramètre, je suis cencé passer une reference, et donc si j'incremente la variable à l'interieure d'une methode, meme en sortant de cette methode, i devrait garder sa nouvelle valeur.
Et en fait... non ? pourquoi à votre avis ?
PS : Vous allez surement me demander le code, mais c'est assez long et dans un système proprietaire.
S'il vous le faut vraiment je le posterai.
Ce n'est pas réelement çà, mais schématiquement :
public boolean Methode( Integer i )
{
// Code ..
i++;
dvoraky
Messages postés744Date d'inscriptiondimanche 1 avril 2007StatutMembreDernière intervention 9 mai 20108 21 juin 2007 à 12:03
Je en pense pas qu'en Jave on passe des références.
En C, cela aurait été facile à voir mais bon, en Java, je ne pense pas qu'on puisse passer une référence.
Il faut quelqu'un qui valide ou critique ma pensée ^^
c'est mieux pour toi [auteurdetail.aspx?ID=21762 elguevel]<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 21 juin 2007 à 12:52
Ba quand on passe un objet en parametre il me semble que c'est la reference de cet objet et non une copie. Par contre si l'on passe un type de base (int, boolean, ..) là effectivement on passe une valeur. Est ce que qqn du monde Java peut confirmer et est capable de repondre à mon probleme :-( ?
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 21 juin 2007 à 13:13
C'est delicat car c'est une application professionelle, donc j'ai enlevé une bonne partie du code non-necessaire et les commentaires. Je color en bleu les parties concernées, et un commentaire en rouge situe le probleme.
// C'est ici qu'est le probleme, j'incremente le paramètre, mais quand je sort de la fonction, le i du parent (donc ligneParent ici) revient à çà valeur d'origine.
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 201017 21 juin 2007 à 13:54
ta essaye de metre ligne parent en static
je doit avouer que ton code est un peu gros lol ...
j'ai du mal a voir ... normalement en java on bosse par reference ... au pire essai de faire une miniclass de test de ce genre :
public classe monint {
int i ;
public monint(int i){
this.i = i;
}
public int geti(){return i;}
public void increment(){ ++i;}
}
ou alors je sais pas trop ...
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 21 juin 2007 à 14:39
Je n'ai pas mis le reste du code car bcp seraient etonnné, déja c'est plein de classes proprietaires et les classes ont toutes comme prototype :
public class ${CLASSNAME} extends ${CLASS:emxDomainObject}
Donc je ne peut ecrire mon code que dans 1 seule classe.
> C'est en fait des scripts d'un PLM nommé Matrix. ( de chez Matrix One ).
Mais en gros à partir de l'arborescence de ce logiciel je genere un fichier excel qui comprend 1 onglet par niveau d'arborescence. Tout fonctionne mais on m'a demandé recement d'adapter le programme pour remonter des infos d'un certain niveau de 2 niveaux au dessus. D'où mon soucis de pouvoir interagir avec une variable d'une autre instance de ma fonction.
J'ai appris le Java y'a 2 mois sur le tas avec 1 bouquin en main, et si j'apprend vite, des concepts m'echappes comme cette histoire de reference qui n'en ai pas une à prioris !!?
the_wwt
Messages postés177Date d'inscriptionjeudi 5 octobre 2006StatutMembreDernière intervention16 janvier 20091 21 juin 2007 à 14:54
Bonjour,
je viens de tester un truc simple:
public class Test {
private Integer i;
public Test() {
super();
rec(0);
}
public static void main(String[] args){
new Test();
}
public int rec( Integer i){
i++;
System.out.println("Valeur avant l'appel: " + i);
if( i < 10)
rec(i);
System.out.println("Valeur après l'appel: " + i);
return 0;
}
}
Et en effet après l'appel, i a garde la valeur de avant l'appel:
Voici la Console:
Valeur avant l'appel: 1
Valeur avant l'appel: 2
Valeur avant l'appel: 3
Valeur avant l'appel: 4
Valeur avant l'appel: 5
Valeur avant l'appel: 6
Valeur avant l'appel: 7
Valeur avant l'appel: 8
Valeur avant l'appel: 9
Valeur avant l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 9
Valeur après l'appel: 8
Valeur après l'appel: 7
Valeur après l'appel: 6
Valeur après l'appel: 5
Valeur après l'appel: 4
Valeur après l'appel: 3
Valeur après l'appel: 2
Valeur après l'appel: 1
Donc on peut en déduire, que java gère les classes enveloppes(Integer->int, Float->float) comme les types primitifs... ie
en passant la valeur...
Cordialement,
Pierrick
the_wwt
Messages postés177Date d'inscriptionjeudi 5 octobre 2006StatutMembreDernière intervention16 janvier 20091 21 juin 2007 à 14:58
Vous allez me dire comment faire alors ? -> Avec une variable globale...
public class Test {
private Integer i;
public Test() {
super();
i = 0;
rec( );
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args){
new Test();
}
public int rec(){
i++;
System.out.println("Valeur avant l'appel: " + i);
if( i < 10)
rec();
System.out.println("Valeur après l'appel: " + i);
return 0;
}
}
Resultat:
Valeur avant l'appel: 1
Valeur avant l'appel: 2
Valeur avant l'appel: 3
Valeur avant l'appel: 4
Valeur avant l'appel: 5
Valeur avant l'appel: 6
Valeur avant l'appel: 7
Valeur avant l'appel: 8
Valeur avant l'appel: 9
Valeur avant l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
J'espère que ça peut t'aider...
Cordialement,
Pierrick
the_wwt
Messages postés177Date d'inscriptionjeudi 5 octobre 2006StatutMembreDernière intervention16 janvier 20091 21 juin 2007 à 15:28
Re,
ce que tu dis n'est possible dans aucun langage....
Soit la fonction peut être accéder par toutes les fonctions --> IE elle est globale,
soit chaque fonction en possède une copie dans ses variables locales...
Je ne comprend pas clairement ce qui ne va pas... Des deux solutions, il y en a forcément une qui t'iras...
Cdlt,
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 21 juin 2007 à 15:43
Faut que je reflechisse et que je fasse un exemple concret, j'arrive pas a m'exprimer je crois. Ou alors c'est moi qui me plante complétement ... comme je dit : "je debute".
Bon j'y reflechie, et je vous refait signe.
Sinon merci encore à tous pour vos nombreuses idées.
the_wwt
Messages postés177Date d'inscriptionjeudi 5 octobre 2006StatutMembreDernière intervention16 janvier 20091 21 juin 2007 à 16:01
Re salut,
Je pense t'avoir trouvé une solution, il te faut doubler le paramètre et que ce soit un objet(ie pas un type natif)
Ainsi au démarage les deux variables ont la même valeur, mais à la sortie de l'appel récursif tu récupère seulement la valeur modifiée par le premier appel:
public class Test {
private class MyInteger{
int i = 0;
public MyInteger(int i) {
super();
this.i = i;
}
public MyInteger(MyInteger mi) {
super();
this.i = mi.getI();
}
public void inc(){
i++;
}
public void dec(){
i--;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
@Override
public String toString() {
return String.valueOf(i);
}
}
public Test() {
super();
rec( new MyInteger(0), new MyInteger(0) );
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args){
new Test();
}
public void rec( MyInteger i, MyInteger j){
i.inc();
j.inc();
System.out.println("Valeur avant l'appel: " + i);
if( i.getI() < 10){
rec( j, new MyInteger(j) );
}
System.out.println("Valeur après l'appel: " + j);
}
}
Et cela donne enfin:
Valeur avant l'appel: 1
Valeur avant l'appel: 2
Valeur avant l'appel: 3
Valeur avant l'appel: 4
Valeur avant l'appel: 5
Valeur avant l'appel: 6
Valeur avant l'appel: 7
Valeur avant l'appel: 8
Valeur avant l'appel: 9
Valeur avant l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 10
Valeur après l'appel: 9
Valeur après l'appel: 8
Valeur après l'appel: 7
Valeur après l'appel: 6
Valeur après l'appel: 5
Valeur après l'appel: 4
Valeur après l'appel: 3
Valeur après l'appel: 2