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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 698
    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 698
    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 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 584
    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 698
    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 698
    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?

+ 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