Violation d'accès lors de la lecture [Résolu]

Messages postés
1051
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
- - Dernière réponse : cs_vaz
Messages postés
3
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
13 février 2010
- 7 sept. 2009 à 00:39
Voici un petit bout que j'ai commencé ce projet en c++ avec SDL pour développer un jeu. Pour l'instant je veux simplement m'occuper de la gestion des interfaces et changement d'écran. Présentement, il y a bogue sur lequel je me casse la tête depuis quelques jours à savoir pourquoi.

Extrait du code :

SDL_Surface* ZoneDialogue::display()
{
    SDL_Surface *cDraw = NULL;
    SDL_Surface *tDraw = NULL;
    SDL_Rect zPos;
   
    cDraw = SDL_CreateRGBSurface(SDL_HWSURFACE, _width, _height, 32,0 ,0, 0, 0);
   
    if (_elements.size() == 0)
        return cDraw;

    for (unsigned int i=0; i < _elements.size(); i++)
    {
        zPos.x = _elements[i]->getPositionX();
        zPos.y = _elements[i]->getPositionY();
        zPos.h = _elements[i]->getHeight();
        zPos.w = _elements[i]->getWidth();
       
        tDraw = _elements[i]->display(); // Exception non gérée à 0x00417662 dans Interface.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xccccccd0
        SDL_BlitSurface(tDraw, NULL, cDraw, &zPos);
        //SDL_FreeSurface(tDraw);
    }

    return cDraw;
}

J'ai débugger un peu ce problème sans grand succès. Tout ce que j'ai pu en tirer c'est que c'est l'appel de la fonction display qui sort la violation d'accès d'écriture, pourtant cette fonction existe et _elements[i] n'est pas un pointeur avec comme valeur 0x000000, sinon les 4 autres appels avant aurait planté bien avant de ce rendre à cette ligne.

Pour reproduire le bogue, simplement compiler le projet & quand la fenêtre ouvre clicker sur le bouton "Test". Il y a alors la deuxième interface qui s'affiche et l'affichage plante à cause du bogue.

Le projet est assez gros et surtout en plusieurs fichiers, et je trouve ça un peu inutile de tout mettre ça sur pastebin, alors j'ai fait un rar.
http://www.megaupload.com/fr/?d=T7ZDRT1U

L'extrait ce trouve dans le fichier Zones/zonedialogue.class.cpp lignes 74 à 98.
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
1051
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
5
1
Merci
J'ai eu beaucoup de chance aujourd'hui, en cherchant sur le web à propos de cette emplacement "0xccccccd0" et en lisant le dernier message d'un forum un peu perdu, j'ai lu que l'emplacement 0xcccccccc veut dire que c'est quelque chose de non-initialisé. Ceci m'a mis sur la piste que peut-être l'élément n'était pas initialisé, ce qui me semblait totalement impossible puisque les quatre autres fonctions avant fonctionnait. Je suis quand même retourner voir où les éléments était ajouté à mon vecteur. Tout est fait normalement, sauf que j'ai compris que à la fin de la fonction l'élément était "flushé" même s'il y avait toujours un pointeur dessus qui était gardé. Pour les quatre autres fonctions, c'était des fonctions qui était hérité d'un autre classe et que même si l'élément était "flushé", il restait défini.

En résumé, à la fin de chaque fonction tout ce qui a été déclaré dedans est "flushé" et ce peu importe ce que vous avez fait avec. "0xcccccccc " ou tout ce qui peut ressembler à cela veut dire que c'est une variable non-initialisé.

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 122 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Arto_8000
Messages postés
3
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
13 février 2010
0
Merci
Personne ne t'a répondu ... mais merci pour ton dernier post car, confronté à un problème analogue, il devrait m'aider à trouver la solution


avoir du temps libre et créer ... vaste programme
Commenter la réponse de cs_vaz