Partage
  • Partager sur Facebook
  • Partager sur Twitter

STL : problème avec les map

en cours de jeu

Sujet résolu
    9 octobre 2007 à 12:09:54

    Bonjour à tous et merci d'avance pour votre aide!
    Etant en train de coder un petit jeu en C++, avec l'aide de la SFML, je suis tombé sur un gros problème de map (stl) : Cette map, appartenant au moteur graphique, fais le lien entre l'id d'une image (int), et son emplacement en mémoire (sf::Image). A là compilation, pas de problème, mais, lors du runtime, le programme s'arrête subitement, et me retourne :
    Process returned -1073741819 (0xC0000005)
    , sur cette ligne :
    1. // on charge l'image dans la map
    2.     m_liste_images[idImage] = sf::Image();

    La déclaration de la map dans le .h est la suivante :
    1. // liste des Images
    2.         std::map<int, sf::Image> m_liste_images;


    Merci d'avance pour votre aide! :)

    EDIT : Je peux préciser, que, pour cerner l'erreur, j'ai essayé les exceptions : rien, j'ai essayé de changer les type de la map : rien... je sui compplètement paumé... :euh:
    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2007 à 14:49:38

      Alors tout d'abord, vérifie que la map est bien initialisée.

      Ensuite, je soupçonne un probleme grave :
      Il est possible que tu utilises uen lib release, et que tu programmes en debug, ou vice versa
      Et si il y a une map dans un .h -> donc déja implémentée ET compilée dans la lib, et que tu peux y utiliser de l'extérieur, alors tu risques un crash.
      En effet, en debug et en release, sous certaines implémentations (visual C++ 2005 pour ne pas la citer), sizeof(std::map<>) est différente en debug et en release...

      Du coup, au boulot, on a eu des emmerdes monstres a cause de ça, (car on fait beaucoup de libs pour nos clients) et on a décidé de ne plus fournir de maps aux clients : on en utilise en interne, mais on ne les passe jamais au client.
      Je ne sais pas si SFML a ce bug, mais, a ce jour, si c'est bien celui ci, il n'y a pas d'autres solutions que de faire un projet release avec une lib release, et un projet debug avec une lib debug, le croisement provoquant des problemes graves.

      Cela dit, ça m'étonne que SFML aie fait cette erreur la, et surtout que tu sois le premier a en souffrir.
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        9 octobre 2007 à 18:19:23

        Merci pour ta réponse, mais je n'en suis pas si sûr : tout d'abord, je suis sous Code::Block, et de plus, je n'ai pas inversé debug/release (si j'ai bien compris ton avertissement...).
        J'ai tout de même essayé de recompilé en debug, puis en release, mais toujours le même problème de runtime...
        Là, je suis carrément perdu... :(

        Edit : Est-ce possible que celà vienne de la SFML?
        merci d'avance! :)
        • Partager sur Facebook
        • Partager sur Twitter
          10 octobre 2007 à 2:09:35

          Cela sent la corruption dans les trucs qui se passent avant.
          Sinon, contacte laurent sur la ML spécialisée de la bibliothèque.
          • 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.
            10 octobre 2007 à 9:54:33

            Oui, tu as peut etre fait un débordement avant : dans ce cas la, le programme fini par faire n'importe quoi, et plante a un endroit improbable.

            Essaie de réduire au maximum (en commentant) tout ton code, pour resserrer sur l'erreur.

            Moi ce qui m'intrigue, c'est l'adresse de plantage : c'est une adresse de plantage qu'on a habituellement quand on essaie d'écrire sur NULL. Es tu sur que ta map est créée ? Es tu sur qu'il n'y a pas un Init_SFML() ou Init_context() ou une fonction du genre que tu n'as pas appelé avant ?

            Essaie de trouver des tutos fiables sur le net qui se servent de cette map, et essaie de voir s'ils marchent chez toi, puis pars de ces tutos, et compare les avec ce que tu as.
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              10 octobre 2007 à 11:12:15

              vérifie la valeur de "idImage" aussi, et si tu pouvez poster tout ton code ça sera surement plus simple :) .
              • Partager sur Facebook
              • Partager sur Twitter
                10 octobre 2007 à 19:12:00

                J'ai remplacé la sf::Image par un int : même résultat, l'erreur ne vient donc pas de la SFML, non?
                Ma map, je crois, est créée, car je l'ai déclarée comme étant attribut du moteur graphique.
                Il n'y a pas de sfml_init(), ou de fonctions similaires.
                La valeur de idImage est normale avant l'erreur (soit 10012)
                Je vais essayer de resserer le code, merci de votre aide!

                Edit : j'ai placé ce code là au début du main, et il fonctionne sans erreur.
                1. std::map<int, int> maMap;
                2. maMap[10012] = 3;
                3. std::cout << maMap[10012];

                J'ai placé cet autre code dans le constructeur du moteur graphique : il n'y a pas d'erreur, c'est donc peut-être une fuite... comment faire pour la repérer dans un projet qui compte pas mal de fichiers et de lignes de codes?
                1. m_liste_images.clear();
                2.     m_liste_images[0] = sf::Image();
                • Partager sur Facebook
                • Partager sur Twitter
                  11 octobre 2007 à 18:05:29

                  salut,

                  Utilises tu un itérateur pour parcourir ta map ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 octobre 2007 à 18:09:26

                    Une erreur que j'ai vue (affreuse), je ne pense pas que ça aie de rapport, mais dans le doute :

                    Des gars fesaient des structures dans lesquelles ils mettaient des map.

                    Puis, il manipulaient des pointeurs sur les structures.
                    Et pour aller la structure --> malloc !!!! (et la c'est le drame, malloc n'appelle pas récursivement les constructeurs internes aux structures, contrairement a new)

                    D'ou des plantages sur map a la premiere utilisation de celle ci...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      11 octobre 2007 à 18:34:29

                      montre le .h au complet et les méthodes du .cpp qui touchent à la map
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 octobre 2007 à 20:19:19

                        EDIT : je suis vraiment désolé pour ceux qui ont pris le temps de lire le code que j'avais posté, mais le problème venait finalement de l'utilisation d'un pointeur qui n'existait pas...

                        Merci beaucoup pour votre aide!
                        • Partager sur Facebook
                        • Partager sur Twitter

                        STL : problème avec les map

                        × 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