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 :

[Débutant]Erreur de compilation inconprehensible


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut [Débutant]Erreur de compilation inconprehensible
    Bonjours à tous,

    Je suis entrain de créer quelque classes pour manipuler plus simplement la bibliothéque SDL.

    Mon premier objectif est de créer une petite image qui suivent la souris. Le clic fait sortir de l' application.

    J' ai crée une classe SDL::application, une classe SDL::surface et une classe SDL::Cpoint .

    J' ai une erreur bisarre lors que j' essaie de compiler ce code : http://iceteagreen.ifrance.com/main.cpp.htm

    Note : J' ai gardé la même arborescence. J' ai juste rajouté des .htm pour qu' il soit reconnu par le navigateur. La bibliothéque UserSDl se trouve donc dans http://iceteagreen.ifrance.com/inclu.../SDLmain.h.htm

    Dans le constructeur par copie de la classe surface, je calcule les dimensions pour l' allocations de la surfaces. Pour çela, j' utilise les deux points (couple x, y) CoinSupGauche et CoinInfDroit. Mais voilà : le compilateur m' indique que x et y ne sont pas des fonctions valide. Tout se passe comme si x et y n' avait été declaré .

    Merci de m'aider. C' est sans doute un truc tout bête (Dans ce cas, j' aurais l' air redicule(?) ). Mais ça fait deux jours que je cherche.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je n'arrive pas à visualiser Csurface.cpp, je ne sais pas si j'ai loupé quelque chose ou si tu ne l'as pas uploadé. Quoiqu'il en soit si l'erreur se trouve dans ce fichier eh bien... c'est lui qu'il faut voir

    A part ça, "#include "Csurface.cpp"
    Quelle idée saugrenue !!

    Et puis pour pinailler, le constructeur prenant en paramètre un surface* n'est pas le constructeur par copie. Ce qui veut dire que ce dernier sera toujours généré par le compilo, et pas forcément de la manière dont tu le souhaites. Si tu ne comptes jamais t'en servir tu devrais au moins le déclarer privé.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    A part ça, "#include "Csurface.cpp"
    Quelle idée saugrenue !!
    Csurface parce que C comme classe... Ca m' évite à confondre avec les .h où je met les fonctions que j' utilise.

    Et puis pour pinailler, le constructeur prenant en paramètre un surface* n'est pas le constructeur par copie. Ce qui veut dire que ce dernier sera toujours généré par le compilo, et pas forcément de la manière dont tu le souhaites. Si tu ne comptes jamais t'en servir tu devrais au moins le déclarer privé.
    Mais que prend comme paramétre un constructeurs par copie, alors? Un argument de type de la classe passé par valeurs?

    Je n'arrive pas à visualiser Csurface.cpp, je ne sais pas si j'ai loupé quelque chose ou si tu ne l'as pas uploadé. Quoiqu'il en soit si l'erreur se trouve dans ce fichier eh bien... c'est lui qu'il faut voir Smile
    Je confirme tu a loupé quelque chose :

    Le .H :
    http://iceteagreen.ifrance.com/inclu...Csurface.h.htm
    Le .CPP
    http://iceteagreen.ifrance.com/inclu...urface.cpp.htm

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par @r$£~%[
    A part ça, "#include "Csurface.cpp"
    Quelle idée saugrenue !!
    Csurface parce que C comme classe... Ca m' évite à confondre avec les .h où je met les fonctions que j' utilise.
    Je ne parlais pas du nom, mais de l'inclusion d'un .cpp...

    Citation Envoyé par @r$£~%[
    Mais que prend comme paramétre un constructeurs par copie, alors? Un argument de type de la classe passé par valeurs?
    Un constructeur par copie prend toujours comme paramètre une référence (constante ou non) sur le type de la classe. Car quand tu fais "surface a = b", ce n'est pas un pointeur (sur b) qui est passé en paramètre au constructeur . De plus, situ prenais le paramètre par valeur, cela créerait une récursion sans fin (puisque le passage par valeur appel justement le constructeur par copie).

    Citation Envoyé par @r$£~%[
    Je confirme tu a loupé quelque chose
    Comment on est censé savoir que le fichier s'appelle cpp/surface.cpp.htm, et non Csurface.cpp.htm ?

    Enfin pour ton problème... Et bien où sont déclarés x et y :

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    @r$£~%[ a écrit:
    Je confirme tu a loupé quelque chose Wink

    Comment on est censé savoir que le fichier s'appelle cpp/surface.cpp.htm, et non Csurface.cpp.htm ? Pleure
    Ben, oui, puisque le CPP est inclus dans le .H :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
     
    };
     
    [b]#include "cpp/surface.cpp"[/b]
     
    /* Fin d' utilisation du namespace SDL */}
    @r$£~%[ a écrit:
    Mais que prend comme paramétre un constructeurs par copie, alors? Un argument de type de la classe passé par valeurs?

    Un constructeur par copie prend toujours comme paramètre une référence (constante ou non) sur le type de la classe. Car quand tu fais "surface a = b", ce n'est pas un pointeur (sur b) qui est passé en paramètre au constructeur Smile. De plus, situ prenais le paramètre par valeur, cela créerait une récursion sans fin (puisque le passage par valeur appel justement le constructeur par copie).
    Là, je ne comprend plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    surface( const surface *Surface);                      //Constructeur par copie
    Ce n' est pas un constructeur qui prend une réference constante sur la classe?

    Et je ne voix pas pourquoi c' est saugrenu : on définit la classes, puis on inclus les implémentations? Ce n' est pas comme ça qu' il faut faire?

    Et x et y sont définit dans le fichier Cpoint.h qui est inclus dans Csurface.h :


    http://iceteagreen.ifrance.com/inclu...t/Cpoint.h.htm

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Ton constructeur par copie doit être déclaré comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    surface( const surface& Surface);
    Et pour ton problème d'inclusion, c'est l'inverse, ton fichier .h doit être inclus dans le .cpp

    Et rajoute des include guards dans tes .h sinon tu risques d'avoir des erreurs de définitions multiples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef _CSURFACE_H
    #define _CSURFACE_H
     
    class structure {
      // Le reste de la déclaration
    };
     
    #endif

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ben, oui, puisque le CPP est inclus dans le .H :
    Autant pour moi

    Ce n' est pas un constructeur qui prend une réference constante sur la classe?
    Euh... non, il s'agit d'un pointeur. La référence constante c'est const surface &.

    Et je ne voix pas pourquoi c' est saugrenu : on définit la classes, puis on inclus les implémentations? Ce n' est pas comme ça qu' il faut faire?
    Surtout pas. On inclut la définition (le .h) partout où l'on a besoin de la classe, et l'éditeur de lien fait le reste tout seul. Mais surtout, ne jamais inclure de .cpp en C++, et de manière générale ne jamais inclure de code !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Donc pour finir, je doit mettre mon *.H dans mon *.CPP et non le contraire.

    J' ai édité le précedent message.

    Ils faudrat que je revoie les pointeurs, les réferences et tout ça

    Merci à vous deux

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et tu as résolu le problème concernant x et y ?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Non.
    Et x et y sont définit dans le fichier Cpoint.h qui est inclus dans Csurface.h :


    http://iceteagreen.ifrance.com/inclu...t/Cpoint.h.htm

    Mais je ne comprend pas :

    J' inclus le .H dans mon main.cpp...
    J' inclus le .H dans mon .CPP

    Mais le .CPP ne serat pas inclus dans mon main.cpp

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    x et y sont membres de ta classe point, ce ne sont pas des variables globales. Donc à moins qu'il s'agisse des (x, y) d'un point particulier, il faudra les déclarer (comme tu l'as d'ailleurs fait dans le premier constructeur).

    Mais le .CPP ne serat pas inclus dans mon main.cpp
    Non, en aucun cas il ne doit l'être. C'est l'éditeur de lien qui va savoir quel code se trouve dans quel fichier compilé, et réussir à créer comme un grand le binaire final.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    Mon pseudo-constructeur par copie acceuile un pointeur vers une surface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    surface::surface( const surface* Surface)
    {
    ...
    La surface deux variables membres de type Cpoint nommé CoinSupGauche et CoinInfDroit, qui représente les deux coins opposé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class surface
    {
     
       protected : 
            //L' image
            string imageBMP;
     
            //L' emplacement
            Cpoint CoinSupGauche;
            Cpoint CoinInfDroit;
     
    ...
    La classe Cpoint comporte deux entier membre : x et y...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Cpoint
    {
        public : 
          int x;
          int y;
    Alors, où est l' erreur ? :

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    UP

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est CoinSupGauche.x ou CoinSupDroit.y ou que sais-je, mais pas juste x ou y... Ce sont des membres de la class Cpoint, il faut donc bien leur coller une instance de Cpoint derrière non ?

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 28
    Points
    28
    Par défaut
    C'est CoinSupGauche.x ou CoinSupDroit.y ou que sais-je, mais pas juste x ou y... Ce sont des membres de la class Cpoint, il faut donc bien leur coller une instance de Cpoint derrière non?
    Je ne comprend pas trop ce que tu veux dire :

    CoinSupGauche et CoinInfDroit sont des points... Les deux doivent donc avoir des membres nommés x et y...

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ben oui... C'est justement ce que je voulais dire. Toi tu écris juste "x = ..." et "y = ...". Ce sont les x et y de quel Cpoint ?

Discussions similaires

  1. [débutant] Erreur de compilation inconnue
    Par jimay dans le forum Débuter
    Réponses: 3
    Dernier message: 14/05/2007, 11h55
  2. [VBA-E]{Débutant} Erreurs de compilation
    Par kenny49 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/04/2007, 08h15
  3. Réponses: 15
    Dernier message: 01/11/2005, 13h32
  4. [MASM32][Débutant] Erreur de compilation
    Par Priest dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 02/10/2005, 02h06
  5. Réponses: 12
    Dernier message: 26/08/2005, 10h02

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