Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu]Crash du programme "Process terminated with status -1073741819"  (Lu 2354 fois)

0 Membres et 1 Invité sur ce sujet

slaanish

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Bonjour,

J'utilise SFML 2.1 avec CodeBlocks 12.11, et quand je lance mon programme (qui compile sans erreur), il crash et j'obtiens :
Process returned -1073741819 (0xC0000005)   execution time : 4.196 s

Contrairement aux sujets sur cette erreur que j'aipu trouver, le code de base proposé dans le tutoriel fonctionne très bien. Mais d'utiliser la POO, ça marchait, mais avec un certain code j'ai cette erreur, je ne sais vraiment pas d'où elle vient.

En gros, j'ai une classe EditMode, dont l'attribut m_window est un pointeur vers la sf::RenderWindow courante.
Elle utilise la méthode drawScreen, qui est appelée à chaque tour de la boucle principale.
Si j'implémente cette méthode de la façon suivante, tout marche bien :

void EditMode::drawScreen()
{
    sf::Sprite sprite ;
   sf::Texture texture ;


   if (texture.loadFromFile ("0.png"))
   {
      std::cout << "Texture chargee" << std::endl ;
      sprite.setTexture (texture) ;
      std::cout << "Texture appliquee" ;
      m_window->draw (sprite);
   }


}
(oui je sais c'est dégueu de recréer la texture à chaque tour de boucle, c'est juste pour l'exemple..)

Mais si je crée une classe Map, disposant d'une méthode draw() et d'un attribut m_window pointant vers la fenêtre principale, et que ma classe EditMode dispose d'un attribut m_map pointeur vers une instance de la classe Map, en définissant mes méthodes de la façon suivante, j'obtiens l'erreur :

void EditMode::drawScreen()
{
    m_map->draw();
}


void Map::draw()
{

   sf::Sprite sprite ;
   sf::Texture texture ;

   if (texture.loadFromFile ("0.png"))
   {
      std::cout << "Texture chargee" << std::endl ;
      sprite.setTexture (texture) ;
      std::cout << "Texture appliquee" ;
      m_window->draw (sprite);
   }


}


Petite précision, j'utilise MinGW fourni avec CodeBlocks 12.11, j'ai téléchargé la version "GCC 4.7 TDM (SJLJ) - 32 bits", j'utilise le compilateur en mode debug et j'ai configuré mon Linker settings de la manière suivante :

sfml-graphics-d
sfml-window-d
sfml-system-d


« Modifié: Novembre 15, 2013, 11:56:51 am par slaanish »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Crash du programme "Process terminated with status -1073741819"
« Réponse #1 le: Novembre 15, 2013, 10:20:47 am »
Et bien ça m'a l'air d'être le moment idéal pour apprendre à utiliser ton debugger ;)

Sinon il faudrait voir comment est créée / initialisée / gérée l'instance de Map.
Laurent Gomila - SFML developer

slaanish

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Crash du programme "Process terminated with status -1073741819"
« Réponse #2 le: Novembre 15, 2013, 11:17:02 am »
Alors mon debugger me sors:
Child process PID: 4816
Program received signal SIGSEGV, Segmentation fault.
In sf::RenderTarget::draw (this=0xbaadf035, vertices=0x28fb14, vertexCount=4, type=sf::Quads, states=...) at D:\developpement\sfml\sfml\src\SFML\Graphics\RenderTarget.cpp:159 ()
Debugger finished with status 0

Pour l'instance de Map, c'est géré comme ça :

La classe EditMode:
class EditMode : public GameMode
{
        public:

                EditMode (sf::RenderWindow * window);   //Constructeur
                void drawScreen() ;
                void processEvent (sf::Event event) ;

                sf::Texture m_text ;
                sf::Sprite m_sprite ;
                Map * m_map ;


};

#include "EditMode.h"

EditMode::EditMode (sf::RenderWindow * window) : GameMode (window)
{
        m_text.loadFromFile ("tilesheet.png", sf::IntRect (0, 0, 32, 32)) ;
        m_sprite.setTexture (m_text);
        m_map = new Map(m_window) ;
}

void EditMode::drawScreen()
{
    m_map->draw();

        //m_window->draw(m_sprite);
}

void EditMode::processEvent (sf::Event event)
{
        GameMode::processEvent (event) ;

        switch (event.type)
        {
                case sf::Event::MouseButtonPressed:
                        //m_map->m_layer[event.mouseButton.x/32][event.mouseButton.y/32] = 1 - m_map->m_layer[event.mouseButton.x/32][event.mouseButton.y/32];
                        break;

                default
                                :
                        break;
        }
}

La classe Map:
#include <SFML/Graphics.hpp>
#include <vector>
#include <map>
#include <iostream>
#include <fstream>
#include "functions.h"

class Map
{
        public:

                Map (sf::RenderWindow * window);

                void draw () ;
                void drawTile (unsigned int x, unsigned int y);
                void loadFromFile (std::string name);
                void loadTiles() ;

                std::vector<std::vector<std::string> > m_layer ;
                sf::Vector2i m_size ;
                sf::RenderWindow * m_window;
                std::map<std::string, std::vector<std::vector<sf::Sprite> > > m_tiles ;
                std::map<std::string, sf::Texture> m_tileTextures;
};
#include "Map.h"
using namespace std;

Map::Map (sf::RenderWindow * window)
{
        loadFromFile ("1");
        loadTiles();
}

void Map::loadFromFile (std::string name)
{

}

void Map::draw()
{
        sf::Sprite sprite ;
        sf::Texture texture ;

        if (texture.loadFromFile ("0.png"))
        {
                std::cout << "Texture chargee" << std::endl ;
                sprite.setTexture (texture) ;
                std::cout << "Texture appliquee" ;
                m_window->draw (sprite);
        }


}

void Map::drawTile (unsigned int x, unsigned int y)
{
}

void Map::loadTiles()
{
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Crash du programme "Process terminated with status -1073741819"
« Réponse #3 le: Novembre 15, 2013, 11:27:11 am »
Citer
this=0xbaadf035
Ca c'est 0xbaadf00d + 0x28. Or, 0xbaadf00d, même si tu ne connais pas les conventions de ton compilateur, tu vois de manière évidente que c'est une adresse spéciale qui veut dire que quelque chose de bad s'est passé ici. Tu en conclues donc que le "this" (l'instance de sf::RenderWindow) est choucrouté. En inspectant le code, on voit immédiatement que c'est parce que le membre Map::m_window n'est jamais initialisé.
Laurent Gomila - SFML developer

slaanish

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Crash du programme "Process terminated with status -1073741819"
« Réponse #4 le: Novembre 15, 2013, 11:56:01 am »
Effectivement c'était ça ...
Une erreur somme toute bien bête  >:( .

En tout cas merci beaucoup pour ces réponses rapides !