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!