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

Langage C++ Discussion :

Erreur redéfinition fonction


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Erreur redéfinition fonction
    Bonjour,
    Je travaille actuellement sur un projet en c++ et je souhaite utiliser des fichiers autre que le principal, j'ai donc un fichier .h et un fichier .cpp. Mais le problème c'est quand je compile le tout j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    error: redefinition of `int clavier()'
    error: `int clavier()' previously defined here
    or les numéros de lignes sont les mêmes et correspondent à une accolade ????
    Le moteur.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
     
    #pragma once
    #ifndef MOTEUR_H
    #define MOTEUR_H
     
     
    #include <GL/gl.h>
    #include <SDL/SDL.h>
     
    double anglez = 0;
    double anglex = 0;
    double posx = 0.5;
    double posy = 0.5;
    double posz = -1;
     
    bool tourner = true;
    bool deplac = true;
        SDL_Event event;
    int camera=1;
     
    int clavier();
     
    #include "moteur.cpp"
     
    #endif //MOTEUR_H
    Le moteur .cpp
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    #include "moteur.h"
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <cstdlib>
    int clavier()
    {
        while (SDL_PollEvent(&event))
            {
     
                switch(event.type)
                {
                    case SDL_QUIT:
                    break;
                    case SDL_KEYDOWN:
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                        exit(0);
                        break;
                        case SDLK_1:
                        camera=1;
                        break;
                        case SDLK_2:
                        camera=2;
                        break;
                        case SDLK_3:
                        camera=3;
                        break;
                        case SDLK_t:
                        if (!tourner)
                        {
                        tourner = true;
                        break;
                        }
                        if(tourner)
                        {
                        tourner = false;
                        anglez = 0;
                        anglex = 0;
                        break;
                        }
                        case SDLK_UP:
                        if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                        {
                            posx--;
                            if (posx<-19)
                            posx=-19;
                        }
                        break;
                        case SDLK_DOWN:
                        if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                        {
                            posx++;
                            if (posx>19)
                            posx=19;
                        }
                        break;
                        case SDLK_LEFT:
                        if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                        {
                            posy--;
                            if (posy<-19)
                            posy=-19;
                        }
                        else
                        {
                            anglez++;
                        }
                        break;
                        case SDLK_RIGHT:
                        if ((event.key.keysym.mod & KMOD_LSHIFT) == KMOD_LSHIFT)
                        {
                            posy++;
                            if (posy>19)
                            posy=19;
                        }
                        else
                        {
                            anglez--;
                        }
                        break;
                    }
                    break;
                }
            }
            return 0;
    }
    et le main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <cstdlib>
    #include <string> //Permet de créer des chaines de caracteres
    #include <fstream> //Permet la manipulation des fichiers
    #include <conio.h>
    #include "sdlglutils.h"
    #include "moteur.h"
     
    void Dessiner();
    void importobjmodif(const char * coordfile, const char * ordrefile);
    void repere();
    tout du moins car le code est trop important

    C'est pas la première fois que j'ai cette erreur, donc si vous avez des idées merci de bien vouloir m'aider.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu as sûrement à un autre endroit de ton code déclaré une fonction "int clavier();" En C, ce n'est pas possible, en C++ pour surcharger une fonction il faut qu'elles aient une signature différente.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le problème c'est que je l'ai déclaré nul part ailleurs
    De plus la ligne 7 où sont signalés les deux erreurs c'est une accolade
    Merci pour votre reponse

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pourquoi y-a-t-il
    dans le fichier d'entête?
    D'abord, on ne met pas de fichier .cpp en include, et puis, un include veut dit au compilateur "J'ai la flemme de recopier des tas de déclarations, alors t'as qu'à aller les chercher toi-même".
    Alors, regardez bien ce qui se passe et vous comprendrez pourquoi le compilateur n'est pas content.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour votre réponse
    J'ai retiré le :
    Mais maintenant quand je compile je recoit un message d'erreur :
    It seems that this project has not been buit yet. Do you want to built it now ?
    Je répond oui, et il ne se passe rien à part cela dans le build log :
    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
     
    -------------- Build: default in SDL GL Intro ---------------
     
    Linking executable: sdlgl.exe
    .objs\main.o:main.cpp:(.bss+0x0): multiple definition of `_anglez'
    .objs\moteur.o:moteur.cpp:(.bss+0x0): first defined here
    .objs\main.o:main.cpp:(.bss+0x8): multiple definition of `_anglex'
    .objs\moteur.o:moteur.cpp:(.bss+0x8): first defined here
    .objs\main.o:main.cpp:(.data+0x0): multiple definition of `_posx'
    .objs\moteur.o:moteur.cpp:(.data+0x0): first defined here
    .objs\main.o:main.cpp:(.data+0x8): multiple definition of `_posy'
    .objs\moteur.o:moteur.cpp:(.data+0x8): first defined here
    .objs\main.o:main.cpp:(.data+0x10): multiple definition of `_posz'
    .objs\moteur.o:moteur.cpp:(.data+0x10): first defined here
    .objs\main.o:main.cpp:(.data+0x18): multiple definition of `_tourner'
    .objs\moteur.o:moteur.cpp:(.data+0x18): first defined here
    .objs\main.o:main.cpp:(.data+0x19): multiple definition of `_deplac'
    .objs\moteur.o:moteur.cpp:(.data+0x19): first defined here
    .objs\main.o:main.cpp:(.bss+0x10): multiple definition of `_event'
    .objs\moteur.o:moteur.cpp:(.bss+0x10): first defined here
    .objs\main.o:main.cpp:(.data+0x1c): multiple definition of `_camera'
    .objs\moteur.o:moteur.cpp:(.data+0x1c): first defined here
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Je me trouve sous code blocks

  6. #6
    Invité
    Invité(e)
    Par défaut
    A première vue, les variables indiquées sont des variables globales (présence du suffixe '_').
    Si j'ai bien vu, cela correspond à ces déclarations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    double anglez = 0;
    double anglex = 0;
    double posx = 0.5;
    double posy = 0.5;
    double posz = -1;
     
    bool tourner = true;
    bool deplac = true;
        SDL_Event event;
    int camera=1;
    De la même façon qu'on ne doit pas mettre d'include de .cpp, on ne doit pas initialise des variables dans un .h.
    Si on les déclare hors d'une structure ou d'une classe, elle sont globales. Dans ce cas, elle doivent être déclarées dans la main, et dans le .cpp où elles sont utilisées, elles sont re-déclatées, mais précédées du mot-clé extern.
    Il ne faut pas confondre déclaration et initialisation.
    Une déclaration de variable doit être faite une fois et une seule, l'initialisation peut être faite n'importe où.
    Mais naturellement rien n'interdit de faire les 2 choses sur la même ligne.

    Un fichier d'entête comporte normalement :
    - des include de fichiers entête
    - des déclarations de structures
    - des déclarations de classes
    - des prototypes de fonction
    On y trouve aussi des défine, et d'autres paramètres de compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                            if (posy<-19)
                            posy=-19;
    // ce genre de chose s'écrit habituellement
       posy = max(-19, posy);
    // min et max sont des macro de cette façon c'est plus clair à relire.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Lord Nazdar Voir le message
    Merci pour votre réponse
    J'ai retiré le :
    Mais maintenant quand je compile je recoit un message d'erreur :
    It seems that this project has not been buit yet. Do you want to built it now ?
    Je répond oui, et il ne se passe rien à part cela dans le build log :
    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
     
    -------------- Build: default in SDL GL Intro ---------------
     
    Linking executable: sdlgl.exe
    .objs\main.o:main.cpp:(.bss+0x0): multiple definition of `_anglez'
    .objs\moteur.o:moteur.cpp:(.bss+0x0): first defined here
    .objs\main.o:main.cpp:(.bss+0x8): multiple definition of `_anglex'
    .objs\moteur.o:moteur.cpp:(.bss+0x8): first defined here
    .objs\main.o:main.cpp:(.data+0x0): multiple definition of `_posx'
    .objs\moteur.o:moteur.cpp:(.data+0x0): first defined here
    .objs\main.o:main.cpp:(.data+0x8): multiple definition of `_posy'
    .objs\moteur.o:moteur.cpp:(.data+0x8): first defined here
    .objs\main.o:main.cpp:(.data+0x10): multiple definition of `_posz'
    .objs\moteur.o:moteur.cpp:(.data+0x10): first defined here
    .objs\main.o:main.cpp:(.data+0x18): multiple definition of `_tourner'
    .objs\moteur.o:moteur.cpp:(.data+0x18): first defined here
    .objs\main.o:main.cpp:(.data+0x19): multiple definition of `_deplac'
    .objs\moteur.o:moteur.cpp:(.data+0x19): first defined here
    .objs\main.o:main.cpp:(.bss+0x10): multiple definition of `_event'
    .objs\moteur.o:moteur.cpp:(.bss+0x10): first defined here
    .objs\main.o:main.cpp:(.data+0x1c): multiple definition of `_camera'
    .objs\moteur.o:moteur.cpp:(.data+0x1c): first defined here
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Je me trouve sous code blocks
    Et pour cause...

    Quand on lit le code de moteur.h, on se rend compte que tu défini les variables en question aux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    double anglez = 0;
    double anglex = 0;
    double posx = 0.5;
    double posy = 0.5;
    double posz = -1;
     
    bool tourner = true;
    bool deplac = true;
        SDL_Event event;
    int camera=1;
    Le problème, c'est que le préprocesseur est quelque chose de "bête et méchant" qui fait exactement ce que tu lui demande, et que tous les fichiers d'implémentations sont évalués un à un.

    Entre le moment où ton compilateur s'attaque à (par exemple) moteur.cpp et celui où il s'attaque à main.cpp, il a "oublié" tout ce qu'il a fait pour moteur.cpp, et tous les symboles qu'il y a rencontrés.


    Les gardes anti inclusion multiple (#ifndef MACHIN_CHOSE #define MACHIN_CHOSE ... #endif) ne peuvent fonctionner que lorsque tu essaye d'inclure, par le jeu des inclusions en cascade, plusieurs fois le même fichier dans un seul et unique fichier d'implémentation

    Pour créer des variables globales, il faut:
    1- déclarer (sans les définir) les variables en les spécifiant extern (ou static selon le cas)
    2- les définir (leur donner la valeur qui t'intéresse) dans un seul fichier d'implémentatin (*.cpp).

    Au final, le code correct serait donc proche de
    moteur.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    extern double anglez;
    extern double anglex;
    extern double posx;
    extern double posy;
    extern double posz ;
     
    extern bool tourner;
    extern bool deplac ;
    extern SDL_Event event;
    extern int camera;
    moteur.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    double anglez = 0;
    double anglex = 0;
    double posx = 0.5;
    double posy = 0.5;
    double posz = -1;
     
    bool tourner = true;
    bool deplac = true;
        SDL_Event event;
    int camera=1;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [VBA] Erreur avec fonction Dcount
    Par Virgile59 dans le forum Access
    Réponses: 6
    Dernier message: 15/06/2006, 09h56
  2. Erreur 3388: fonction inconnue
    Par flukie dans le forum Access
    Réponses: 1
    Dernier message: 09/05/2006, 10h51
  3. Erreur appel fonction java d'une jsp
    Par itachi38 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 29/04/2006, 16h51
  4. Erreur de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/11/2005, 20h56
  5. Erreur de fonction
    Par Anduriel dans le forum Langage
    Réponses: 15
    Dernier message: 26/11/2005, 14h49

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