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 :

Compilateur ne sachant pas compiler


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par d�faut Compilateur ne sachant pas compiler
    Bonjour,

    J'ai un probl�me de compilation avec Dev-c++
    J'ai un fichier "Ma_Classe.cpp" qui a besion du fichier "Etat_De_Ma_Classe.cpp" et en particulier la classe 'Rect'.

    Etat_De_Ma_Classe.cpp :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    class Rect : public Etat_Possible//Pour mettre en place le DP par états.
    {
    ...
    };
    Ma_Classe.cpp :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    Ma_Classe::Ma_Classe( const int & a, const int & b)
    {//Constructeur 2 arguments.
    Mon_Etat = new Rect( a, b );
    }

    Le probl�me c'est que le compilateur me dit :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    'Rect' has not been declared
    Alors j'ai ajout� une d�claration de ma classe ( class Rect; ).
    Et j'obtient :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    invalid use of undefined type 'struct Rect' 
    forward declaration of 'struct Rect' 
    //Rect est un des états possible de 'Ma_Classe'.
    Je me suis demand� si l'inclusion du fichier se faisait correctement alors j'ai copier/coller le code source de 'Rect' dans le fichier 'Ma_Classe.cpp" et mon super compilo me regarde en souriant et me nargue...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    redefinition of 'class Rect' 
    previous definition of 'class Rect' //Définition de "Etat_De_Ma_Classe.cpp"
    confused by earlier errors, bailing out
    Donc l'inclusion se fait correctement, alors pourquoi mon compilo n'est pas capable de faire le linkage( si c'est le bon mot )?


    Est-ce quelqu'un sait pourquoi mon compilo est si m�chant avec moi?


    PS : Il n'y a pas d'erreur de syntaxe et je suis prot�g� de l'inclusion multiple.

  2. #2
    Membre confirm�
    Homme Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 48
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 153
    Par d�faut
    Salut

    Etat_De_Ma_Classe.cpp :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    class Rect : public Etat_Possible//Pour mettre en place le DP par états.
    {
    ...
    };
    J'aurai mis �a dans un .h plut�t.

    De plus, est ce une erreur de link ou de compilation (fournis ici la ligne complete de ton compilateur indiquant l'erreur).
    --
    J�r�mie

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par d�faut
    Oups, c'est d�j� dans un .hpp
    Mais �a ne change rien, si?

    Le ligne de l'erreur est celle qui est dans le constructeur de Ma_Classe, je l'ai mise dans le 1er message.
    Si c'est le rapport d'erreur que tu veux, � mon grand regret je n'ai rien d'autre que ce que j'ai d�j� ecrit

  4. #4
    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
    Salut,
    Citation Envoy� par hydrolyre Voir le message
    Oups, c'est d�j� dans un .hpp
    Mais �a ne change rien, si?
    Ca change tout
    En C++, il existe une r�gle absolue connue sous le nom de one definition rule qui peut s'exprimer en fran�ais sous les terme simple de "il ne peut y avoir qu'une seule d�finition de chaque chose"...

    C'est � cause de cette r�gle et du fonctionnement du complateur que nous faisons la distinction entre les fichiers d'en-t�te (utilisant souvent l'extension *.h, *.hpp, *.hxx , *.hh voir, rien du tout pour les fichiers fournis par le standard) et les fichiers d'impl�mentation (utilisant l'extensions *.cpp, *.cc,*.cxx ou C (majuscule, mais si le syst�me de fichier est sensible � la casse uniquement))

    Mais cela implique qu'il faille mettre la bonne chose au bon endroit...

    Ainsi, dans un fichier d'en-t�te, on peut trouver:
    1. des gardes anti inclusions multiples (#ifndef TRUC_HPP#define TRUC_HPP #endif // TRUC_HPP)
    2. #des directives pr�processeur d'inclusion de fichier d'en-t�te (#include <nom_fichier> ou #include "nom_fichier")
    3. les autres directives pr�processeur
    4. des d�claration anticip�es de classes ou de structure
    5. des d�clarations de fonctions libres
    6. des d�clarations de variables globales (m�me s'il vaut mieux les �viter)
    7. des d�finitions de types personnalis�s (classes, structures, �num�rations, unions, typedef)
    Le (3) permet juste au compilateur de savoir qu'il existe un type du nom de la classe ou de la structure et l'emp�che donc de se plaindre quand il croise le type en question, pour autant qu'il ne doive ni connaitre la taille que cela repr�sente en m�moire (c'est � dire que nous n'utilisons le nom du type que sous la forme de r�f�rence ou de pointeur) ni connaitre le contenu du type (c'est � dire que nous n'essayons pas d'acc�der � un membre ou � une fonction membre du type en question).

    D�s que le compilateur a besoin de connaitre la taille utilis�e en m�moire par un type (c'est � dire qu'il doit manipuler une instance de ce type) ou qu'il doit acc�der � son contenu (qu'on essaye d'invoquer une de ses fonctions membres ou d'acc�der � l'un de ses membres), il doit disposer de la d�finition du type en question.

    Le (6) se distingue du (3) par le fait qu'une d�finition de type fournit "le corps" de ce type: valeur �num�r�es pour les �num�ration, champs pour les unions, membres et fonctions membres pour les classes et les structure, �quivalence pour les typedefs...

    Il est obligatoire que le compilateur en dispose d�s qu'il doit connaitre la taille que le type utilise en m�moire ou d�s qu'il s'agit d'acc�der � son contenu

    Dans un fichier d'impl�mentation (*.cpp), on peut trouver
    1. des directives pr�processeurs (dont les directives d'inclusion)
    2. des initialisations de variables globales (le fait de leur donner une valeur initiale)
    3. des initialisation des membres statiques de classes ou de structures(le fait de leur donner une valeur initiale)
    4. des d�finitions (impl�mentation) de fonctions et de fonctions membres de classes ou de structures

    Il existe des exceptions pour
    1. les d�finitions de fonctions inline
    2. les d�finitions de fonction template
    3. les d�finition de fonctions membres de classes ou de structures template
    4. les initialisation de membres statiques de structures ou de classes template
    qui devront se retrouver, de mani�re directe ou indirecte, dans un fichier d'en-t�te afin que le compilateur soit en mesure de recr�er le code "binaire" correspondant � tout moment.

    Mais, en aucun cas, il ne faut essayer d'inclure un fichier d'impl�mentation
    , ni dans un autre fichier d'impl�mentation, ni (et encore moins) dans un fichier d'en-t�te...

    [EDIT]Au passage, le d�veloppement de DevC++ est arr�t� maintenant depuis plusieurs ann�es...

    Quelques irr�ductibles continuent bien � maintenir tant bien que mal les DevPacks, mais cela risque aussi de s'arr�ter progressivement

    Si ton souhait est d'avoir un EDI gratuit et l�ger, je te conseillerais fortement de te tourner vers Code::Blocks[/EDIT]
    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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par d�faut
    Finalement je suis retourn� � l'ancienne version ( qui est, paradoxalement, identique ) et �a compile masi je saurai jamais ce qui c'est pass�

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Je n'arrive pas � compiler
    Par nicorider dans le forum Dev-C++
    R�ponses: 3
    Dernier message: 15/11/2006, 17h07
  2. Je ne peux pas compiler
    Par Halobox dans le forum C
    R�ponses: 8
    Dernier message: 11/12/2005, 09h47
  3. [Compilation] Dev ne peut pas compiler mon programme
    Par R�maill dans le forum Dev-C++
    R�ponses: 9
    Dernier message: 01/11/2005, 00h41
  4. [compilateur cc] Options de compilation
    Par gangsoleil dans le forum Autres �diteurs
    R�ponses: 2
    Dernier message: 26/09/2005, 15h25
  5. Le compilateur ne trouve pas glut32.dll
    Par Vathal dans le forum GLUT
    R�ponses: 3
    Dernier message: 26/01/2004, 12h34

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