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

 C++ Discussion :

passage par reference


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 25
    Points : 17
    Points
    17
    Par défaut passage par reference
    Bonjour
    j'ai un petit prog qui fait un échange de valeurs. Le 1er avec un passage par référence et l'autre (le même) sans.
    Le 1er je comprend le résultat :
    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
    19
    #include <iostream>
     
    using namespace std;
     
    void echange(double& a, double& b)
    {
        double temporaire(a); 
        a = b;                
        b = temporaire; 
    }
     
    int main()
    {
    double a(1.2), b(4.5);
    cout << "a vaut " << a << " et b vaut " << b << endl;
    echange(a,b);   //On utilise la fonction
    cout << "a vaut " << a << " et b vaut " << b << endl;
    return 0;
    }
    resultat :
    a=1.2 b=4.5
    a=4.5 b=1.2
    ensuite sans le passage par reference :
    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
    void echange(double a, double b)
    {
        double temporaire(a);
        a = b;
        b = temporaire;
    }
     
    int main()
    {
    double a(1.2), b(4.5);
    cout << "a vaut " << a << " et b vaut " << b << endl;
    echange(a,b);   //On utilise la fonction
    cout << "a vaut " << a << " et b vaut " << b << endl;
    return 0;
    }
    el là le resultat est :
    a=1.2 b=4.5
    a=1.2 b=4.5
    ??????

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Je pige pas... Pourquoi, alors que les codes sont différents, tu t'attends à un comportement identique ? Une référence plutôt qu'une copie n'est pas quelque de trivial, la portée n'est pas la même.

    Je vais te poser une question, qu'affiche le programme suivant ? Et pourquoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void foo(int n);
     
    int main() {
      int n = 3;
      int x = n;
      ++x;
      std::cout << x << ' ' << n << std::endl;
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bonjour
    La je n'est pas le temps d'essayer le prog, mais en fait, je crois que
    je me suis mal exprimé. Dans mon 2ème prog c'est le résultat que je n'arrive
    pas a retrouver. Le passage par référence reste flou.
    Ceci dit je test ton code se soir...

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En avant propos, je précise mon vocabulaire:
    • le paramètre est la variable utilisée dans la déclaration/définition de la fonction (on parle parfois de paramètre formel).
    • l'argument est la valeur qui lui est donné à l'appel (on parle parfois de paramètre effectif)


    Tout paramètre est une variable locale de la fonction.
    Tout argument est passé par valeur: le paramètre est initialisé avec la valeur donnée en argument.

    Toute modification, dans la fonction, du paramètre est locale, puisque c'est une variable locale.

    Si le paramètre est une référence, la variable locale est donc une référence initialisée sur la variable donnée en argument.
    Comme toute référence, faire une affectation dessus modifie son référé, c'est à dire la variable proposée en argument.
    C'est pour ça que la première version fait bien l'échange.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Sans référence, ça s'appelle un passage par copie.
    Et comme son nom l'indique, il s'agit de copies de variables.
    Partant de là, il est à peu près impossible et très logique que les variables initiales ne soient pas modifiées puisque... ce sont des copies que tu modifies dans ta fonction.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Je pige pas... Pourquoi, alors que les codes sont différents, tu t'attends à un comportement identique ? Une référence plutôt qu'une copie n'est pas quelque de trivial, la portée n'est pas la même.

    Je vais te poser une question, qu'affiche le programme suivant ? Et pourquoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void foo(int n);
     
    int main() {
      int n = 3;
      int x = n;
      ++x;
      std::cout << x << ' ' << n << std::endl;
    }
    cela affiche
    4 3
    3 est placé dans n
    n est placé dans x
    on incremente x donc = 4
    donc x=4
    est n=3

    je fais la même démarche pour mon exemple du haut mais sans les
    &
    et je trouve le même résultat que le premier code avec les
    &
    , je pense que ma démarche n'est pas bonne..

    Lorsqu'il y a l'appel de la fonction, dans mon 1er exemple
    echange(a,b); //On utilise la fonction
    le calcul est bien le même ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Faudrait être plus clair sur ce que tu comprends pas et/ou trouver un cours ou tutoriel C++ qui en parle, parce qu'on vient de t'expliquer 3 fois de manière différente la même chose, et tu reviens encore avec un "je comprends pas".
    Tu sembles toujours confondre le paramètre de la fonction et la variable passée en paramètre. Tu veux toujours pas comprendre que quand tu passes une référence, tu passes la variable, alors que sans référence il s'agit d'une copie.
    Et que le nom d'une variable n'a aucune signification en soi. Le nom d'une variable du programme et d'un paramètre de fonction n'ont absolument rien à voir. (et heureusement, sinon on serait dans la m****)

    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
    void inc(int& x) {++x;}
    void inc2(int x) {++x;}
    int main()
    {
      int x = 3;
      int n = 4;
      cout<<"x="<<x<<";n="<<n<<endl;
      inc(x);
      cout<<"x="<<x<<";n="<<n<<endl;
      inc2(x);
      cout<<"x="<<x<<";n="<<n<<endl;
      inc(n);
      cout<<"x="<<x<<";n="<<n<<endl;
      inc2(n);
      cout<<"x="<<x<<";n="<<n<<endl;
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    J'ai enfin compris...eu du mal.
    Merci Bousk pour ta patience ainsi que les autres pour vôtres aide.
    A bientot pour d'autres questions.

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

Discussions similaires

  1. Passage par reference
    Par Seth77 dans le forum Langage
    Réponses: 38
    Dernier message: 03/09/2008, 17h38
  2. [debutant(e)]passage par reference
    Par kass28 dans le forum Débuter
    Réponses: 4
    Dernier message: 27/07/2007, 17h56
  3. Probleme d'un passage par reference.
    Par mego dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2007, 16h41
  4. Probleme sur le passage par reference
    Par schnito dans le forum Langage
    Réponses: 10
    Dernier message: 02/02/2006, 16h50
  5. [VB6]Passage par référence d'une prop. d'objet à une fct
    Par -gYs- dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 02/09/2002, 08h55

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