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++

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Points : 12
    Points
    12
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Ton . h as l'air correcte.
    Peut tu montrer les premières lignes de ton .cpp?

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Points : 12
    Points
    12
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut

    Ton code semble correcte

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Points : 12
    Points
    12
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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
    Points : 1 051
    Points
    1 051
    Par défaut
    Quand tu fais clean et build ça résoud rien ?

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    En fait, le math.h est inclus dans le Point.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef _Point_
    #define _Point_
     
    #include <GL/glut.h>
    //#include <stdio.h>
    #include <math.h>
    #include <fstream.h>
    #include <iostream.h>
    //#include <string>
    #include "Vecteur.h"
    //#define pi 3.1415926
    Le make clean ne fait rien.

    Je mets mon makefile :
    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
    LIB_PATHS= -L/usr/X11R6/lib -L/usr/lib
    HDR_PATHS= -I/usr/X11R6/include
    LIBS=-lglut -lGLU -lGL -lm -L/usr/X11/lib -lXext -lXmu -lXi -lX11 -g-std=c++98
     
    CFLAGS=$(HDR_PATHS) -Wno-deprecated
    #CC=g++
    CC=gcc
     
    ok : OpenGL 
     
    .cc.o:
    	$(CC) -c -O3 $(CFLAGS) $<
     
    #OBJECTS_main = OpenGL.o RBBP.o RQBC3d.o  RQBC.o  Point3d.o Vecteur3d.o Vecteur.o Point.o 
    OBJECTS_main = OpenGL.o Bezier3.o RQBC.o  Vecteur.o Point.o 
     
    OpenGL: $(OBJECTS_main)
    	$(CC) $(OBJECTS_main) -o OpenGL $(LIB_PATHS) $(LIBS)
     
    indenter :
    	for i in *.h *.cpp do sed -i~ -f sed.sed  $i done
    	indent  *.h *.cpp
     
    clean :
    	rm -fr *.o
     
    delete :
    	rm -f *.h~
    	rm -f *.cc~
    Lionel

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par lionel50 Voir le message
    En fait, le math.h est inclus dans le Point.h
    Peut-être, mais d'après ce que tu nous a montré dans ton 1er post, Bernstein.h, lui, ne connait ni math.h ni Point.h. Et il utilise pourtant pow...

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Peut-être, mais d'après ce que tu nous a montré dans ton 1er post, Bernstein.h, lui, ne connait ni math.h ni Point.h. Et il utilise pourtant pow...
    c'est ce que je voulais dire

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    J'ai ajouté
    dans Bernstein.h et j'obtiens le même message après avoir fait un make clean.

    Lionel

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par lionel50 Voir le message
    J'ai ajouté
    dans Bernstein.h et j'obtiens le même message après avoir fait un make clean.

    Lionel
    Tu devrait avoir des erreurs de compilation, selon lequel il ne sait pas qu'elle fonction pow utilisé
    rajoute un "." aprés chaque chiffre que tu écrit


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double B13 (double t)
    { return (3.*t*pow(1.-t,2.));
    }
    [edit]
    ton makefile est complet?

  13. #13
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Revérifie les gardes d'inclusion.

  14. #14
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Je n'ai pas de nouveau problème de compilation avec :
    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
    #include <math.h>
     
    #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
    Je pense que mon makefile (mis en ligne plus haut) est bon.

    Je suis dubitatif

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ATTENTION
    ajoute un "." a tout les chiffre. La t'aura des erreurs de calcul. Une autre chose, n'utilise pas pow pour faire des carré et cube. Fait les à la main , se sera beaucoup plus rapide en execution. Je ne pense pas que le compilot le fasse.

    Je te met en rouge les erreurs de calcul qui vont surement apparaitre
    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
    #ifndef _BERNSTEIN_
    #define _BERNSTEIN_
    #include <math.h>
    
    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

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par lionel50 Voir le message
    Je pense que mon makefile (mis en ligne plus haut) est bon.
    il manque la partie linkage non??

  18. #18
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    ATTENTION
    ajoute un "." a tout les chiffre. La t'aura des erreurs de calcul.
    Je ne suis pas contre le fait d'employer des littéraux du type correct -- ça évite effectivement parfois des problèmes et ça n'en cause jamais -- mais dans les cas que tu as mis en évidence, les règles du C++ assurent un comportement correct.

  19. #19
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 24
    Points : 12
    Points
    12
    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

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Je ne suis pas contre le fait d'employer des littéraux du type correct -- ça évite effectivement parfois des problèmes et ça n'en cause jamais -- mais dans les cas que tu as mis en évidence, les règles du C++ assurent un comportement correct.
    ah ok....
    mais normalement le type du résultat d'un calcul ne dépend t'il pas du type du premier chiffre?
    int*double + float +... ne donne pas un résultat en int?
    double *int+flaot +... ne donne pas un résultat en double?

    [edit]
    pour les inline, l'optimsation ne le fera t'il pas tout seule?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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