IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Passage d'argument entier


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut Passage d'argument entier
    Bonjour,

    Je ne me rapelle plus quelle est la raison (théorique) du non fonctionnement du code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    protected TreeMap<Double,Integer> t;
    protected int nbL = 0 ;
     
    public void initialiser(){
    t = new TreeMap<Double,Integer>();
    incrementer(t,nbL);
    System.out.println(nbL) ; // = 0 ; et non 1 pourtant l'incrémentation a été faite
    }
     
    public void incrementer(TreeMap<Double,Integer> x, int n){
    x.add(0.0,1) // -> cela marche qd on fai t.get(0.0) : on ajoute bien ds la treemap t
     
    par contre 
    n++;
    }
     
    }
    Merci d'avance, je ne sais plus pourquoi on incrémente pas nbL (raison static, emploi de setNbL.. autres?)

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Tout simplement car au moment de l'appel : incrementer(t,nbL) l’exécution saute dans la méthode incrementer. Tes argument t et nbl sont recopiés dans les paramètres x et nbl. C'est ce que l'on appelle le passage de paramètre par recopie.

    La méthode appelée travaille sur ces variables recopiées qui sont perdues quand elle se termine.

  3. #3
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Il y a passage par référence en java : si tu passe en paramètre une instance d'un objet à une méthode. Et dans cette méthodes si tu modifie l'objet, l'objet seras bien modifié à sa sortie.

    MAIS, les types primitifs(int, float, double, boolean, ...) sont passé par copie.
    Donc dans ta méthodes tu modifie juste une copie .

    Mais comment faire alors?
    Utiliser Integer au lieu de int peut-être une solution

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    Utiliser Integer au lieu de int peut-être une solution
    Hmmm. C'est un gros piège ça. Integer étant immutable il va rien changer à ça.
    L'idée c'était un exercice, genre "c'est peut-être une solution sauf que si tu essaies tu verras que non" ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    L'idée c'était un exercice?
    Oui, exactement

    Maintenant je me fais tout petit, et j'attends que ça se tasse

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    Il y a passage par référence en java : si tu passe en paramètre une instance d'un objet à une méthode. Et dans cette méthodes si tu modifie l'objet, l'objet seras bien modifié à sa sortie.
    Non , ce n'est pas un passage par référence au sens ou on l'entend habituellement. Si tu passe un objet en paramètre il y a copie de la référence de l'objet. Mais si tu modifie la référence dans la méthode, cela restera sans effet a l'extérieur de la méthode.

  7. #7
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Mais si tu modifie la référence dans la méthode, cela restera sans effet a l'extérieur de la méthode.
    On ne modifie pas la référence mais l'objet pointé par la référence.
    Donc si tu modifies l'objet pointé par la référence, l'objet restera modifié à l'extérieur de la méthode et la référence (copié) de la méthode sera supprimé.

    En faite je pense qu'on veux dire la même chose , j'ai du m'emmêler dans mes mots.

    Récapitulons, dans tous les cas tu passes la copie de quelque chose.
    -> Soit la copie de la référence d'un objet
    -> Soit la copie d'un type primitif

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut
    Ok, je vois (mes cours me sont revenus à l'esprit). Je ne me rapellais plus l'exception pour les types primitifs.

    Il y a donc deux solutions pour pallier à ce problème concernant l'incrémentation de la valeur nbL (la treemap n'étant pas effectué, car la référence pointe toujours sur le bon objet).

    soit j'effectue un setNbL à la fin de incrémenter.
    soit je renvoie la valeur : this.nbL = incrementer(t,nbL)

    Est-ce bien là toutes les solutions?

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    ... Soit tu enlèves le paramètre n de ta méthode incrémenter puisqu'il n'a rien à faire là, et tu te sers de la variable membre nbL à la place.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Par défaut
    En effet, je n'ai pas parlé de cette solution car en réalité il y a deux variables t_1 et t_2 puis nbL_1 et nbL_2 qui scanne un fichier, et si on scanne pour ajouter dans t_1 on incrémente nbL_1 sinon on incrémente nbL_2. Du coup, il faut que je sache quelle valeur incrémentée, je pouvais ajouter un booléen et utiliser la méthode avec set. Mais je préfère l'emploi de la méthode où je retourne la valeur.

    Merci pour votre aide, je marque la discussion !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage d'argument sur l'imprimante
    Par linux dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 07/10/2005, 16h25
  2. [JAVASCRIPT] passage d'argument à une fonction
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/06/2005, 18h17
  3. [TASM] Passage d'argument à une macro
    Par sorry60 dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/04/2005, 18h22
  4. [web] passage d'arguments à un CGI
    Par ma2th dans le forum Web
    Réponses: 4
    Dernier message: 20/08/2004, 12h18
  5. passage d'argument à la procédure main ()
    Par Zazeglu dans le forum C
    Réponses: 5
    Dernier message: 01/09/2003, 19h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo