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 :

Problème de #define


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Par défaut Problème de #define
    Bonjour,
    j'ai un problème de compilation avec g++. J'inclus le fichier Bernstein.h dans deux fichiers Bezier3.cc et RQBC.cc.

    Lors de la compilation, j'ai le message suivant :

    RQBC.o: dans la fonction « B1(double)»:
    RQBC.cc.text+0x0): définitions multiples de « B1(double)»
    Bezier3.o:Bezier3.cc.text+0x0): défini pour la première fois ici
    RQBC.o: dans la fonction « B33(double)»:
    RQBC.cc.text+0x210): définitions multiples de « B33(double)»
    Bezier3.o:Bezier3.cc.text+0x90): défini pour la première fois ici
    RQBC.o: dans la fonction « B23(double)»:
    RQBC.cc.text+0x240): définitions multiples de « B23(double)»
    Bezier3.o:Bezier3.cc.text+0xc0): défini pour la première fois ici
    RQBC.o: dans la fonction « B13(double)»:
    RQBC.cc.text+0x260): définitions multiples de « B13(double)»
    Bezier3.o:Bezier3.cc.text+0xe0): défini pour la première fois ici
    RQBC.o: dans la fonction « B03(double)»:
    RQBC.cc.text+0x280): définitions multiples de « B03(double)»
    Bezier3.o:Bezier3.cc.text+0x100): défini pour la première fois ici
    RQBC.o: dans la fonction « B2(double)»:
    RQBC.cc.text+0x2b0): définitions multiples de « B2(double)»
    Bezier3.o:Bezier3.cc.text+0x130): défini pour la première fois ici
    RQBC.o: dans la fonction « B0(double)»:
    RQBC.cc.text+0x2c0): définitions multiples de « B0(double)»
    Bezier3.o:Bezier3.cc.text+0x140): défini pour la première fois ici
    collect2: ld returned 1 exit status
    make: *** [OpenGL] Erreur 1

    Voici le fichier Bernstein.h :
    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
     
    #ifndef _BERNSTEIN_
    #define _BERNSTEIN_
     
    double B0 (double t)
    { return pow(1-t,2);
    }
     
    double B1 (double t)
    { return (2*t*(1-t));
    }
     
    double B2 (double t)
    { return pow(t,2);
    }
     
    double B03 (double t)
    { return pow(1-t,3);
    }
     
    double B13 (double t)
    { return (3*t*pow(1-t,2));
    }
     
    double B23 (double t)
    { return (3*(1-t)*pow(t,2));
    }
     
     
    double B33 (double t)
    { return pow(t,3);
    }
     
     
    #endif
    Merci d'avance à toute personne qui pourra me donner une solution.

    Lionel

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Ton . h as l'air correcte.
    Peut tu montrer les premières lignes de ton .cpp?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Par défaut
    Voici le début de RQBC.cc
    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
     
    #include "Point.h"
    #include "RQBC.h"
    #include "Bernstein.h"
     
     
     
    int RQBC::calcW1()
    {
      int re=0;
      if (fabs(P1.distanceCarre(P0)-P1.distanceCarre(P2))<0.0001) re=1;
      { double w=w0+w2;
        Point G;
        G.bar(P0,w0,P2,w2);
        Point O;
        O.centreCercle(P0,P1,P2);
        double R2=O.distanceCarre(P0);
        double alpha=4.0*(R2-O.distanceCarre(P1));
        double beta=pow(w,2)*(R2-O.distanceCarre(G));
        w1=sqrt(-beta/alpha);
      }
      return re;
    }
     
    int RQBC::calcW1n()
    {
      int re=calcW1();
      w1=-w1;
     return re;
    }
    Et voici le début de Bezier3.cc
    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
     
    #include "Point.h"
    #include "Bezier3.h"
    #include "Bernstein.h"
     
    double bez3::x(double t)
    { return (tab[0].getX0()*B03(t)+tab[1].getX0()*B13(t)+tab[2].getX0()*B23(t)+tab[3].getX0()*B33(t) );
    }
     
    double bez3::y(double t)
    { return (tab[0].getY0()*B03(t)+tab[1].getY0()*B13(t)+tab[2].getY0()*B23(t)+tab[3].getY0()*B33(t) );
    }
     
     
    void bez3::openGL(int nb)
    { for (int t=0;t<nb;t++)
      { Point M0,M1;
        double t0=double (t) / double (nb);
        M0.setX0(x(t0));
        M0.setY0(y(t0));
        t0=(double (t + 1)) / double (nb);
        M1.setX0(x(t0));
        M1.setY0(y(t0));
        M0.trace_segment(M1); //cout<<"M0 : "<<M0<<" t0 = "<<t0<<" et M1 :"<<M1<<endl;
      } 
      tab[0].trace_segment(tab[1],(1.0-tab[0].getR())/2.0,(1.0-tab[0].getG())/2.0,(1.0-tab[0].getB())/2.0, tab[0].getS()/3.0);
      tab[1].trace_segment(tab[2],(1.0-tab[1].getR())/2.0,(1.0-tab[1].getG())/2.0,(1.0-tab[1].getB())/2.0, tab[1].getS()/3.0);
      tab[3].trace_segment(tab[2],(1.0-tab[2].getR())/2.0,(1.0-tab[2].getG())/2.0,(1.0-tab[2].getB())/2.0, tab[2].getS()/3.0);
      tab[0].openGL();tab[1].openGL();tab[2].openGL();tab[3].openGL();
    }
    Ce qui me trouble aussi, c'est que j'inclus deux fois Point.h et là, il n'y a pas de problème.

    Lionel

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut

    Ton code semble correcte

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Par défaut
    J'ai skotché deux collègues enseignants-chercheurs en informatique. On ne comprend pas pourquoi ça ne marche pas.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Manque pas des include dans le .h ??

    #incude <math.h> par exemple?
    Essaye de faire un petit main qui utilise les fonctions du .h

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Quand tu fais clean et build ça résoud rien ?

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Ton entête contient des définitions pour tes fonctions. Donc tes fonctions sont définies dans chaque unité de compilation qui inclus l'entête, et par après l'éditeur de liens se plaint des définitions multiples.

    Solution 1: mettre des définitions inline dans l'entête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline double B0 (double t)
    {
      return pow(1-t,2);
    }
    Solution 2: mettre des déclarations dans l'entête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline double B0 (double t);
    et avoir une seule unité de compilation fournissant les définitions.

  9. #9
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Par défaut
    Merci, ça marche, voici mon nouveau Bernstein.h :
    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
     
    #include <math.h>
     
    #ifndef _BERNSTEIN_
    #define _BERNSTEIN_
     
    inline double B0 (double t)
    { return pow(1-t,2.0);
    }
     
    inline double B1 (double t)
    { return (2*t*(1-t));
    }
     
    inline double B2 (double t)
    { return pow(t,2.0);
    }
     
    inline double B03 (double t)
    { return pow(1-t,3.0);
    }
     
    inline double B13 (double t)
    { return (3*t*pow(1-t,2.0));
    }
     
    inline double B23 (double t)
    { return (3*(1-t)*pow(t,2.0));
    }
     
     
    inline double B33 (double t)
    { return pow(t,3.0);
    }
     
     
    #endif

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

Discussions similaires

  1. [Langage/Algorithme] [CodeGuard]Thread et DLL : problème de #define
    Par ShaiLeTroll dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/12/2011, 10h12
  2. problème macro #define
    Par Stobbyo dans le forum Débuter
    Réponses: 3
    Dernier message: 09/03/2011, 09h28
  3. Réponses: 2
    Dernier message: 23/07/2010, 20h40
  4. [XSL] Problème "Entity not defined"
    Par FreeCake dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 11/04/2006, 21h36
  5. D6: Problème de $DEFINE $IFDEF
    Par david_chardonnet dans le forum Langage
    Réponses: 6
    Dernier message: 22/02/2006, 16h27

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