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 :

Erreur de compilation, lvalue required as left operand


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Points : 27
    Points
    27
    Par défaut Erreur de compilation, lvalue required as left operand
    je travail sur un exercice en c++, quand je compile je trouve l'erreur suivante:
    in function 'int coincide(vector3d, vector3d)':
    error: lvalue required as left operand of assignement

    mon code.h est :
    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
    #ifndef VECTOR3D_H
    #define VECTOR3D_H
     
     
    class vector3d
    {
        float x,y,z;
        public:
            vector3d(float c1,float c2,float c3);
            ~vector3d();
            friend int coincide(vector3d v1,vector3d v2);
        private:
    };
     
    #endif // VECTOR3D_H
    mon code.cpp est comme suit:
    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
    #include "vector3d.h"
    #include <iostream>
     
     
    using namespace std;
     
    vector3d::vector3d(float c1=0,float c2=0,float c3=0)
    {
        x=c1;
        y=c2;
        z=c3;
    }
     
    vector3d::~vector3d()
    {
        //dtor
    }
     
    int coincide(vector3d v1,vector3d v2)
    {
        if(v1.x=v2.x && v1.y=v2.y && v1.z=v2.z)
            return 1;
        else
            return 0;
    }
    le main.cpp est comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    #include "vector3d.h"
     
    using namespace std;
     
    int main()
    {
        vector3d v1(1,3,6);
     
        return 0;
    }

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 439
    Points
    2 439
    Par défaut
    Bonsoir.

    Je ne sais pas d'où vient précisément le problème, mais il y a plusieurs petites erreurs dans ton code :

    Les =0 sont dans la déclaration du constructeur, pas dans son implémentation. Il faut les déplacer.
    Il manque le vecteur3d devant coincide() dans le .cpp.
    Dans cette fonction coincide() je suppose que tu dois comparer les vecteurs. C'est donc v1.x==v2.x et non v1.x=v2.x. Pareil pour y et z.
    Pourquoi ne pas retourner un bool dans la fonction coincide() ? C'est plus approprié et ça permet de raccourcir la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool coincide(vector3d v1,vector3d v2)
    {
        return (v1.x==v2.x && v1.y==v2.y && v1.z==v2.z);
    }
    Je pense que c'est le = à la place du == qui cause l'erreur.

    Cordialement.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Points : 27
    Points
    27
    Par défaut vous avez raison
    merci beaucoup, l'erreur a été corrigée, juste pour la fonction coincide() elle est une fonction amie
    friend
    donc ce n'est pas nécessaire de citer le type ou la class...

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 439
    Points
    2 439
    Par défaut
    Bonsoir.

    Citation Envoyé par monsrhf Voir le message
    la fonction coincide() elle est une fonction amie donc ce n'est pas nécessaire de citer le type ou la class...
    En effet, c'est un erreur de ma part, je l'ai corrigé

    Si tout est bon, je t'invite à passer le post en

    Cordialement.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour monsrhf,

    tu aurais gagné du temps si tu avais travaillé avec des objets ou références constants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool coincide(vector3d const& v1,vector3d const& v2)
    {
        return (v1.x==v2.x && v1.y==v2.y && v1.z==v2.z);
    }
    Compile et fait ce qui est attendu (sans copie de v1 et v2) d'une part et assure d'autre part à l'utilisateur de la fonction que coincide ne fait que lire (et pas modifier) les arguments. De plus, le code qui suit ne compile pas en te disant clairement pourquoi. On gagne du temps au débogage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool coincide(vector3d const& v1,vector3d const& v2)
    {
        return (v1.x=v2.x && v1.y=v2.y && v1.z=v2.z);
    }
    Cordialement,


    EDIT :
    Attention aux tests d'égalité avec les flottants. Démonstration :
    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
    #include <iostream>
     
    template<typename F>
    F transform(const F f)
    {
        F result = f;
        /* ((f + 1) * 2 - 2 ) / 2 == f */
        result += 1.0f;
        result *= 2.0f;
        result -= 2.0f;
        result /= 2.0f;
     
        return result;
    }
     
    int main(void)
    {
        float f = 3.14f;
        double d = 1.618;
        std::cout << "f: " << std::boolalpha << (f == transform<float>(f)) << std::endl;
        std::cout << "d: " << std::boolalpha << (d == transform<double>(d)) << std::endl;
        return 0;
    }
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ g++ -Wall -Wextra main.cpp -o feq && ./feq
    f: false
    d: false

    f et transform<>(f) sont très proches, mais pas égaux. Il est donc coutume de comparer les flottants à un epsilon près.
    -- Yankel Scialom

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/05/2011, 11h03
  2. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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