Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur bizzare

    4 août 2007 à 12:47:13

    Salut, je suis en train de faire un jeu en C++, mais me voilà confronté à une erreur à la compilation :

    Citation : Code::Blocks

    .objs\personnage.o:personnage.cpp:(.data+0x0): multiple definition of `camera'
    .objs\main.o:main.cpp:(.data+0x0): first defined here
    .objs\graphisme.o:graphisme.cpp:(.data+0x0): multiple definition of `camera'
    .objs\main.o:main.cpp:(.data+0x0): first defined here



    Je vois pas bien ce que ça veut dire, car en regardant mon code source, je vois pas deux définition de 'camera'.

    Merci de m'aider.
    • Partager sur Facebook
    • Partager sur Twitter
      4 août 2007 à 12:58:34

      Cela est peut etre du à une multi inclusion. Peux tu poster le code source des fichiers header que tu utilises (s'ils sont trop, ceux qui inclus "camera") et celui de camera
      • Partager sur Facebook
      • Partager sur Twitter
        4 août 2007 à 13:05:16

        Voilà le header où je définis camera :

        #ifndef DEF_GRAPH
        #define DEF_GRAPH

        class Carte
        {
            public:
            Carte();
            void setClip();
            bool setMap();
            ~Carte();


            void afficher(SDL_Surface* ecran);

            private:
            int m_carte[40][15];

            SDL_Surface *m_sprite;
            SDL_Rect m_clip[TOTAL_CARTE];
        };
        SDL_Rect camera = {0, 0, LARGEUR_ECRAN, HAUTEUR_ECRAN};

        void appliquer_surface( int x, int y, SDL_Surface* sprite, SDL_Surface* ecran, SDL_Rect* partie);
        bool check_collision( SDL_Rect &A, SDL_Rect &B );


        #endif
         
        • Partager sur Facebook
        • Partager sur Twitter
          4 août 2007 à 13:16:30

          Bon on va faire plus simple, poste tous les headers (qui inclus le fichier ou est déclaré Camera).

          De plus, si tu code en C++ pourquoi tu te retrouve avec des fonctions/variables globales ? :/
          • Partager sur Facebook
          • Partager sur Twitter
            4 août 2007 à 13:23:26

            C'est pas vraiment du C++, c'est un mix entre ce que je sais faire en C, et ce que je sais faire en C++ ^^'

            Sinon, voilà les autres headers :

            #ifndef DEF_CONSTANTES
            #define DEF_CONSTANTES

                #define LARGEUR_ECRAN   640
                #define HAUTEUR_ECRAN   480

                #define VITESSE_PERSO   300.0
                #define HAUTEUR_SAUT    100.0
                #define TEMPS_SAUT      500.0
                #define DELAI_FRAME     120.0

                #define TAILLE_BLOC     32
                #define LARGEUR_NIVEAU  40 * TAILLE_BLOC
                #define HAUTEUR_NIVEAU  15 * TAILLE_BLOC

                #define FPS             50


                enum{GAUCHE, DROITE};
                enum{VIDE, RANGEE, SORTIE};
                enum{COURRIR, COURRIR_RANGEE, COURRIR_SORTIE, DEGATS, DEGATS_RANGEE, DEGATS_SORTIE, ATTAQUE2, AERIENNE, ATTAQUE1, TIRER, TIRER_RANGEE, POSE, POSE_RANGEE, POSE_SORTIE, COMBAT, COMBAT_RANGEE, COMBAT_SORTIE, SAUT, SAUT_RANGEE, SAUT_SORTIE, TOTAL_POSES};
                enum{RUN = -1, JUMP = -2, ATTACK = -3, DAMAGE = -4, SHOOT = -5, WAIT = -6};
                enum{EMPTY, HERBE_HAUT_GAUCHE, HERBE_HAUT_MILIEU, HERBE_HAUT_DROITE, TERRE_GAUCHE, TERRE_MILIEU, TERRE_DROITE, HERBE_BAS_GAUCHE, HERBE_BAS_MILIEU, HERBE_BAS_DROITE, TOTAL_CARTE};



            #endif
             


            #ifndef DEF_PERSONNAGE
            #define DEF_PERSONNAGE

            class Heros
            {
                public:
                Heros();
                void initialiseClip();
                ~Heros();

                void recupEvent(SDL_Event event);
                void afficher(SDL_Surface* ecran);
                void attaquer();
                void changeStance(int stance);
                void jump();
                void chute();
                int getStance();
                void set_camera();


                private:
                Timer anim;
                Timer saut;
                Timer fall;

                bool m_sens;
                int m_arme;
                int m_stance;
                int m_frame;

                int m_largeur;
                int m_hauteur;

                int m_taille;
                int m_gros;

                bool m_sol;
                bool m_invincible;
                bool m_attaque;

                int m_numAttaque;
                int m_vitesse;


                SDL_Surface *m_sprite;
                SDL_Rect m_clip[2][TOTAL_POSES][4];

                SDL_Rect m_position;
            };


            #endif
             


            #ifndef DEF_TIMER
            #define DEF_TIMER

            class Timer
            {
                private:
                //Le temps quand le timer est lancé
                int startTicks;

                //Les "ticks" enregistré quand le Timer a été mit en pause
                int pausedTicks;

                //Le status du Timer
                bool paused;
                bool started;

                public:
                //Initialise les variables (le constructeur)
                Timer();

                //Les différentes actions du timer
                void start();
                void stop();
                void pause();
                void unpause();

                //recupére le nombre de ticks depuis que le timer a été lancé
                //ou récupére le nombre de ticks depuis que le timer a été mis en pause
                int get_ticks();

                //Fonctions de vérification du status du timer
                bool is_started();
                bool is_paused();
            };

            #endif
             
            • Partager sur Facebook
            • Partager sur Twitter
              4 août 2007 à 13:44:12

              Tu peux essaier de mettre:

              SDL_Rect camera;

              et dans le fichier .cpp:

              camera.x = 0;
              camera.y = 0;
              camera.w = 800;
              camera.h = 0;

              et recompile pour voir.
              • Partager sur Facebook
              • Partager sur Twitter
                4 août 2007 à 13:47:04

                Raté, ça me mets cette erreur :

                Citation : Pas de titre

                graphisme.cpp:12: error: expected `,' or `;' before '.' token
                graphisme.cpp:13: error: expected constructor, destructor, or type conversion before '.' token
                graphisme.cpp:13: error: expected `,' or `;' before '.' token
                graphisme.cpp:14: error: expected constructor, destructor, or type conversion before '.' token
                graphisme.cpp:14: error: expected `,' or `;' before '.' token

                • Partager sur Facebook
                • Partager sur Twitter
                  4 août 2007 à 14:13:48

                  je pense savoir pourquoi :) :

                  met static SDL_Rect camera = {0, 0, 800, 600};

                  normalement ca devrait marcher ;) (j'espère ^^ )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 août 2007 à 14:17:23

                    En effet ça marche. Mais concrètement, ça sert à quoi static?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 août 2007 à 14:24:33

                      Bon alors je suis pas un pro (mais un va surement passer pour nous engueler :p ), le problème étant que tu définissais un objet Camera dans le fichier header dans ton main par exemple tu faisais:

                      #include "Carte.h", il definissait Camera, mais dans ton Carte.cpp tu faisais aussi #include "carte.h" et donc redéfinition de l'objet. Avec static le problème est résolu car tu as la meme instance tout au long de ton programme, avec un exemple tu vas mieux comprendre:

                      void fonc1()
                      {
                          static int a = 0;
                          a++;
                      }

                      void main()
                      {
                          fonc1(); // a = 1
                          fonc1(); // a = 2
                          fonc1(); // a = 3
                      }


                      Comme tu peux le voir quand tu rappel ta fonction, la variable n'est pas réinitialisé, le mot clef static change la porté de la variable concrètement (elle sera pas local mais global)

                      Enfin je suis pas un pro des explications comme tu peux le voir o_O
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 août 2007 à 14:26:47

                        Merci, c'ets très clair maintenant ;)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Erreur bizzare

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown