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 :

[POO] Constructeur devant être rendu explicite


Sujet :

C++

  1. #1
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut [POO] Constructeur devant être rendu explicite
    Des fois, on a beau chercher, on a beau logger, on a beau débugger, on ne trouve pas. On vient même à se demander si ce n'est pas le compilateur qui bugge. Vous est-ce déjà arrivé?


    --------

    Un exemple partiel de log:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Surface::colorkey debug 1
    Color::map debug 1
    Color:: map debug 2
    freeing 0x2955648 (refcount: 1)
    Surface::colorkey debug 2
    Ce log est créé par la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        /* Change le colorkey de la surface avec la nouvelle couleur */
        void Surface::colorkey(const Color &color)
        {
            fprintf(stderr,"Surface::colorkey debug 1\n");
     
            if (SDL_SetColorKey(s,SDL_SRCCOLORKEY|SDL_RLEACCEL, color.map(s)) < 0)
                throw InterfaceException("Surface::colorkey -- error");
     
            fprintf(stderr,"Surface::colorkey debug 2\n");
        }
    Je cherche où la ligne en rouge a pu être produite.

    La ligne rouge est lancée quand on fait un appel à SDL_FreeSurface():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SDL_FreeSurface(s) {fprintf(stderr, "freeing 0x%x (refcount: %d)\n", s, (s)?s->refcount:0); SDL_FreeSurface(s);}
    Je dois donc trouver où l'on fait appel à SDL_FreeSurface...

    D'après le log, c'est dans cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_SetColorKey(s,SDL_SRCCOLORKEY|SDL_RLEACCEL, color.map(s))
    Le code de la fonction color.map est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Uint32 Color::map(const Surface &s) const
        {
            fprintf (stderr, "Color::map debug 1\n");
     
            Uint32 res = SDL_MapRGB(s.s->format, r,g,b);
     
            fprintf (stderr, "Color:: map debug 2\n");
            return res;
        }
    Toujours d'après le log, la ligne rouge ne vient pas de la fonction Color::map...

    Donc la ligne rouge viendrait de la fonction SDL_SetColorKey, fonction éprouvée de la librairie SDL.

    Enfin, pour cela, encore faudrait-il qu'elle fasse appel à SDL_FreeSurface...

    Voici sa déclaration dans son header:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /*
     ...
     */
    extern DECLSPEC int SDLCALL SDL_SetColorKey
    			(SDL_Surface *surface, Uint32 flag, Uint32 key);
    Pas de SDL_FreeSurface en vue... En plus vu que j'ai redéfini SDL_FreeSurface par une macro après l'inclusion du header, même si SDL_FreeSurface était présent dans le header, ça changerait pas grand chose...

    Pourtant, la ligne en rouge dit qu'il y a un SDL_FreeSurface quelque part. Alors quoi? Erreur du compilateur? Il s'amuse à rajouter des lignes dans le programme?

    ----

    Si vous aussi vous avez des expériences à partager, n'hésitez pas!

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_SetColorKey(s,SDL_SRCCOLORKEY|SDL_RLEACCEL, color.map(s))
    Quel est le type de s ? Dans la définition de color.map, on dirait qu'il s'agit d'un Surface, et dans celle de SDL_SetColorKey, d'un SDL_Surface*. Quel est le lien entre ces deux types ? Y aurait-il des cast prévus ? Pourraient-ils faire des SDL_FreeSurface ?

    Autre hypothèse : Ton programme est-il multithread ? L'ordre d'affichage est-il le même d'une exécution à l'autre ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Quel est le type de s ? Dans la définition de color.map, on dirait qu'il s'agit d'un Surface, et dans celle de SDL_SetColorKey, d'un SDL_Surface*. Quel est le lien entre ces deux types ? Y aurait-il des cast prévus ? Pourraient-ils faire des SDL_FreeSurface ?

    Autre hypothèse : Ton programme est-il multithread ? L'ordre d'affichage est-il le même d'une exécution à l'autre ?
    ...

    Respect.

    En changeant le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        /* Change le colorkey de la surface avec la nouvelle couleur */
        void Surface::colorkey(const Color &color)
        {
            fprintf(stderr,"Surface::colorkey debug 1\n");
     
            if (SDL_SetColorKey(s,SDL_SRCCOLORKEY|SDL_RLEACCEL, color.map(*this)) < 0)
                throw InterfaceException("Surface::colorkey -- error");
     
            fprintf(stderr,"Surface::colorkey debug 2\n");
        }
    Je vais rajouter un explicit devant le constructeur Surface(SDL_Surface*). (je vois toute son utilité maintenant)

    Merci beaucoup!

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

Discussions similaires

  1. [POO] Constructeur ou methode d'initialisation?
    Par gids01 dans le forum Langage
    Réponses: 2
    Dernier message: 23/08/2006, 19h38
  2. Réponses: 9
    Dernier message: 31/07/2006, 22h19
  3. [POO] constructeur d'une class
    Par spirou dans le forum Langage
    Réponses: 13
    Dernier message: 05/07/2006, 17h11
  4. [POO] Constructeur et héritage
    Par LDDL dans le forum Langage
    Réponses: 3
    Dernier message: 23/05/2006, 22h44
  5. [POO] Constructeur de classe
    Par cescu dans le forum Langage
    Réponses: 7
    Dernier message: 14/02/2006, 22h50

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