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 et par valeur(C++)


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut Passage par reference et par valeur(C++)
    Bonjour a toutes et a tous ,
    J'ai passé pas mal de temps sur ce petit code sans savoir quoi faire pour que ca compile . Mes yeux ont dit stop donc je sollicite votre aide une nouvelle fois .
    Merci de votre aide .

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <iostream>
    #include <cmath>
    using namespace std;
     
    string nom();
    int racine(int &c);
    int puissance(int &a,int &b);
    int multi(int &a, int &b);
    double multi(double &a,double &b);
     
    int main()
    {
     cout << "Bonjour " << nom() << endl;
     
     int nb;
     do {
      cout << "Faites un choix parmis les operations :" << endl;
      cout << " 1 . calcul racine carré" << endl;
      cout << " 2 . calcul de puissance " << endl;
      cin >> nb;
      }while(nb !=1 && nb != 2 );
     
     if(nb==1)
     {
      int c(0);
      cout << "Entrez votre valeur :" << endl;
      cin >> c;
      cin.ignore();
      cout << " La racine carré est de :" << racine(c) << endl;
     }
     else
     {
      int a,b(0);
      cout << "Entrez valeur de a :" << endl;
      cin >> a;
      cin.ignore();
      cout << "Entrez valeur de b :" << endl;
      cin >> b;
      cin.ignore(); 
      cout <<"La puissance des 2 nombres est :" << puissance(a,b)<< endl;
     }
     
     cout <<"Le resultat est :" << multi(2,4) << endl;
     
     cout <<"Le resultat est :" << multi(2.4,3.5) << endl;
     
     return 0;
    }
     
    string nom()
    {
     string name("");
     cout << "Entrez votre nom et prenom" << endl;
     getline(cin,name);
     return name;
    }
     
    int racine(int &c)
    {
     int result1=sqrt(c); 
     return result1;
    }
     
    int puissance(int &a,int &b)
    { 
     int result2=pow(a,b);
     return result2;
    }
     
    int multi(int &a,int &b){int result3=a*b;return result3;}
    double multi(double &a,double &b){double result4=a*b;return result4;}

  2. #2
    Membre expérimenté Avatar de Trehinos
    Homme Profil pro
    Analyste développeur PHP
    Inscrit en
    Novembre 2012
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyste développeur PHP
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2012
    Messages : 100
    Par défaut
    J'ai pas l'impression que ce soit le passage par référence le problème... Le compilateur dit quoi ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    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
    chris@chris:~/Bureau/Essai$ g++ -std=c++17 essai8.cpp -o essai8C
    essai8.cpp: In function ‘int main()’:
    essai8.cpp:43:41: error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
      cout <<"Le resultat est :" << multi(2,4) << endl;
                                             ^
    essai8.cpp:8:5: note:   initializing argument 1 of ‘int multi(int&, int&)int multi(int &a, int &b);
         ^~~~~
    essai8.cpp:45:45: error: cannot bind non-const lvalue reference of type ‘double&’ to an rvalue of type ‘double’
      cout <<"Le resultat est :" << multi(2.4,3.5) << endl;
                                                 ^
    essai8.cpp:9:8: note:   initializing argument 1 of ‘double multi(double&, double&)double multi(double &a,double &b);
            ^~~~~
    chris@chris:~/Bureau/Essai$

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 446
    Par défaut
    Ok, là, il va se prendre une bonne grosse barre à mine cognitive si on lui explique vraiment le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    essai8.cpp:43:41: error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int


    Si on simplifie et qu'on ne commence pas à parler de r-value et de l-value, hein ?

    Dans les grandes lignes, faire un passage par référence, c'est passé à la fonction de quoi lire (si le passage est const) ou "lire et écrire" (si le passage est "non-const") les valeurs d'une variable passée en paramètre.
    Hors, dans le code multi(2,4) 2 et 4 n'ont pas de variables associées, c'est des valeurs directement dans le code binaire, le compilateur n'est pas en mesure de passer de quoi "lire et écrire les valeurs d'une variable".
    On dit que 2 et 4 sont des r-values parce que tu ne peux pas écrire:
    Elles ne peuvent apparaitre qu'à droite (d'où le r) d'une affectation.

    Je te laisse deviner ce qu'est une l-value.

    Si tu réfléchis un peu tu verras que tu ne peux passer que des l-value comme argument d'une fonction faisant des passages par référence "non-const".

    P.S.: le passage par référence pour une fonction multi qui ne modifie pas les valeurs de ces paramètres, c'est pas très logique, et le passage par "référence const" coût plus cher qu'un simple passage par valeur.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 750
    Par défaut
    C'est normal tu n'as rien compris aux références

    Déjà, tes références ne servent à rien parce que tu ne modifies pas tes paramètres (ce sont seulement des paramètres entrée)
    Ensuite, mettre des références sur des entiers (des POD - plain old datas) c'est juste inutile (tu ne gagnes pas de place sur la pile)
    Et enfin comme tes références ne sont pas constantes, tu ne peux pas passer des valeurs concrètes.

    Donc, soit tu supprimes tes références soit tu rends tes références constantes.

  6. #6
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    Merci a tous les deux de vos commentaires précieux . J'ai bien compris ce qui a été dit , il me reste encore énormément de chose a apprendre , c'est indéniable .
    Pas facile d'apprendre tout seul dans son coin , mais ca va le faire avec un peu de persévérence .
    Merci de votre aide et bonne soirée !

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

Discussions similaires

  1. Passage par valeur
    Par NairodDorian dans le forum Fortran
    Réponses: 3
    Dernier message: 22/04/2008, 17h00
  2. Réponses: 12
    Dernier message: 26/01/2008, 20h23
  3. [Débutant] Passage par valeur d'un objet Corba
    Par peaceinpal dans le forum CORBA
    Réponses: 1
    Dernier message: 29/05/2006, 20h15
  4. Passage par Valeur
    Par xc78370 dans le forum Langage
    Réponses: 8
    Dernier message: 20/03/2006, 23h21
  5. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29

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