Partage
  • Partager sur Facebook
  • Partager sur Twitter

std::vector<MaClass> & push_back

plante quand j'ajoute un élément.

Sujet résolu
Anonyme
    31 juillet 2007 à 12:47:23

    Bonjour!

    Mon problème est que quand j'ajoute un élément à mon vector le programme plante, mais la compilation ne me dis rien. J'ai essayé avec le débuggeur, mais les infos qu'il me donne ne m'aide pas, au contraire je ne comprends pas où est l'erreur.

    Je vous montre la partie du code qui plante.


    // partie du main.
    MenuSDL menu(200, 500);
    menu.set_backgroundColor(150, 20, 255);
    SDL_Surface *cb = SDL_LoadBMP("cb.bmp");
    menu.add_actionMenuSDL(50, 0, 150, 220, cb, &fct); // on peut aussi directement mettre SDL_LoadBMP à la place de cb.
    // c'est dans cette dernière ligne que l'erreur "est appelée".

    // la méthode appelée :
    void MenuSDL::add_actionMenuSDL(int x, int y, int w, int h,
                                         SDL_Surface *surf, void (*fctToCall)(void))
    {
        c_VActMenu.push_back(ActionMenuSDL(x, y, w, h, surf, fctToCall));            /// PLANTE ICI!!
        SDL_FillRect(c_menu, 0, c_couleur);
        blitActMenus();
    }

    // Le constructeur de ActionMenuSDL :
    ActionMenuSDL::ActionMenuSDL(int x, int y, int w, int h, SDL_Surface *surf,
                     void (*fctToCall)(void)) : c_surf(surf), c_fctToCall(fctToCall)
    {
        c_rect.x = x;
        c_rect.y = y;
        c_rect.w = w;
        c_rect.h = h;
    }
     


    Le débuggeur me donne ce-ci :
    #0 10026180 SDL_LowerBlit() (J:\hiura\PROGRAMMATION!\C++\Exercices\MenuSDL\sdl.dll:??)


    J'en ai déduis que ça plantais à l'ajout d'un élément en mettant successivement des partie de code en commentaire, mais le débuggeur me donne l'impréssion que ce n'est pas ça. Que ça viendrait de la méthode blitActMenus.

    En voici le code :

    void MenuSDL::blitActMenus(void)
    {
        for (unsigned int i = 0; i < c_VActMenu.size(); i++)
            SDL_BlitSurface(c_VActMenu[i].get_surf(), 0, c_menu,
                                                         c_VActMenu[i].get_pRect());
        SDL_Flip(c_menu);
    }


    Voilà je vous ai tout dis :) Merci de m'aider.

    Hiura

    PS : je pense pas que les définition des class puissent vous aider à m'aider, mais si vous en avez besoin demandez moi ;) .
    • Partager sur Facebook
    • Partager sur Twitter
      31 juillet 2007 à 16:52:48

      Citation : hiura

      Le débuggeur me donne ce-ci :

      #0 10026180 SDL_LowerBlit() (J:\hiura\PROGRAMMATION!\C++\Exercices\MenuSDL\sdl.dll:??)

      tu n'as que cette erreur ? si non, mets toute la liste de backtrace
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        31 juillet 2007 à 19:52:12

        je n'ai que ça avec ce code.
        • Partager sur Facebook
        • Partager sur Twitter
          31 juillet 2007 à 22:31:28

          Ca pue le dandling pointer.

          Penser à toujours chercher avant de poser une question. D'autant plus quand le même problème a été soulevé la veille et se trouve TOUJOURS sur la même page du forum ....
          http://www.siteduzero.com/forum-83-172263-p1-un-resize-d-un-vector-crash.html

          (Et si ce n'est pas ça, le préciser)
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          Anonyme
            1 août 2007 à 9:19:43

            Je crois pas que ce soit le même prolème, ma classe possède un constructeur.

            (ps : j'ai utiliser la recherche avant de poster, comme toujours, mais mon cas ne m'a pas senblé être traité.)
            • Partager sur Facebook
            • Partager sur Twitter
              1 août 2007 à 9:34:58

              Que fait ton destructeur ? Que fait ton constructeur de copie ?

              Si le premier libère quelque chose et que le second ne duplique rien (ou n'est pas explicité, ce qui revient au même), il ne faut pas chercher plus loin, c'est alors exactement le même problème.


              Sinon le second grand classique : tu corromps ta mémoire ailleurs et avant, pour observer tout et n'mporte quoi de façon pas exactement déterministe plus tard. Si c'est ça, bonne chance, ce genre d'erreur est pénible à tracker.
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
              Anonyme
                1 août 2007 à 11:10:17

                Effectivement le constructeur de copie de base ne marche pas (enfin je pense).
                J'en ai créer un mais j'ai le même problème que lui.

                Le voici :

                ActionMenuSDL::ActionMenuSDL(const ActionMenuSDL &actionMenu)
                {
                    c_rect.x = actionMenu.c_rect.x;
                    c_rect.y = actionMenu.c_rect.y;
                    c_rect.w = actionMenu.c_rect.w;
                    c_rect.h = actionMenu.c_rect.h;

                    c_surf = actionMenu.c_surf;

                    c_fctToCall = actionMenu.c_fctToCall;
                }


                Je pense que le problème est au niveau de la surface SDL_Surface* c_surf.
                Je ne connais pas du tout le management de la mémoire, alors je ne peux qu'émettre des hypothèses :
                Comme je ne prends que l'adresse de la variable, peut-être cette dernière est supprimée de la mémoire.

                Si c'est le cas, est-ce que je peux copier directement une variable SDL_Surface (qui est une structure qui en contient d'autre) directement? Comme ce-ci :
                SDL_Surface* surf1 = fctpourcréerunesurf(param,..);
                SDL_Surface surf = *surf1;


                Ou dois-je faire une fonction qui s'occupe de copier chacun de ses attributs? C'est pas compliqué à faire, je pense, mais c'est long, alors si je peux éviter ;)

                Ou est-ce que je me troupe et que l'erreur ne vient pas de là?

                Merci
                Hiura
                • Partager sur Facebook
                • Partager sur Twitter
                  1 août 2007 à 13:50:51

                  Au lieu de copier juste le pointeur sur la surface ce qui est tres mauvais car du coup du doit faire un double SDL_Freesurface sur la meme, il te faut copier la surface en meme temps que tu cree un objet:

                  c_surf=SDL_DisplayFormat(actionMenu.c_surf);
                   
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    1 août 2007 à 14:16:20

                    Merci, effectivement copier la surface était une très bonne idée.

                    J'étais partis pour faire une fonction de convertissage de SDL_Surface* à SDL_Surface, en copiant attribut par attribut, mais comme pas tout les attributs ne sont donnés dans la doc je n'aurai jamais pu y arriver. :(

                    Donc je te remercie infiniment ainsi que toutes les autre personnes qui m'ont aidée. :)

                    Hiura
                    • Partager sur Facebook
                    • Partager sur Twitter

                    std::vector<MaClass> & push_back

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown