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

Auteur Sujet: Tableau de sf::Text = crash  (Lu 2255 fois)

0 Membres et 1 Invité sur ce sujet

Polpopolitan

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
Tableau de sf::Text = crash
« le: Avril 01, 2013, 01:56:31 pm »
Bonjour à tous.

Je programme en ce moment un petit moteur de jeu qui couple la SFML et le moteur physique Box2D. Depuis quelques temps je suis confronté à un problème : mon application fonctionne correctement mais plante lorsqu'elle reçoit l'évenement Closed. Voilà un extrait du code :

/*
 * filename : MainMenuContext.cpp
 * author : Roch Dionnet
 * creation date : 03/24/2013
 * additional details :
 */


#include "MainMenuContext.hpp"
#include "globals.hpp"

void MainMenuContext::init(void) {

    _font.loadFromFile(FONTS_PATH + std::string("HFF Fire Dancer.ttf"));

    _texts[0].setString("Main Menu");
    _texts[1].setString("Play");
    _texts[2].setString("Settings");
    _texts[3].setString("Quit");
    _texts[4].setString("Breakout");

    for(unsigned int i = 0; i < 5; i++) {

        _texts[i].setFont(_font);
        _texts[i].setCharacterSize(50);
        _texts[i].setColor(sf::Color::Yellow);
    }

    _texts[0].setCharacterSize(70);
    _texts[4].setCharacterSize(130);

    _texts[4].setColor(sf::Color(255, 122, 0));

    _texts[0].setPosition(100.f, 220.f);
    _texts[1].setPosition(150.f, 355.f);
    _texts[2].setPosition(150.f, 455.f);
    _texts[3].setPosition(150.f, 555.f);

    _texts[4].setPosition(WW/2 - _texts[4].getGlobalBounds().width/2, 15.f);

    _backgroundSprite.setTexture(*_tm.getTexture(SPRITES_PATH + std::string("menu_background.png")));
    _backgroundSprite.setPosition(0.f, 0.f);
}

int MainMenuContext::update(void) {

    _rw.clear(sf::Color::White);
    _rw.draw(_backgroundSprite);
    for(unsigned int i = 0; i < 5; i++)
        _rw.draw(_texts[i]);

    _rw.display();
    return 0;
}

Je sais que cet extrait est coupable du crash. _texts est un attribut de MainMenuContext de type sf::Text[5].
Si je met les appels à setString() en commentaire, mon application ne plante plus mais évidemment les textes ne s'affichent pas.
Après le crash, Visual Studio m'affiche une boite de dialogue qui dit : "Exception non gérée à 0x5d2f6d34 dans GameEngine3.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000008."
La pile des appels m'indique que la dernière fonction appellée est __tmainCRTStartup()  Ligne 572. La ligne est la suivante :

__except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) ) { /* [snip] */ }

Et voici la pile des appels complète :
atioglxx.dll!5d2f6d34()
  [Les frames ci-dessous sont peut-être incorrects et/ou manquants, aucun symbole chargé pour atioglxx.dll]
  atioglxx.dll!5ca7c913()
  atioglxx.dll!5d930f5e()
  atioglxx.dll!5d2e6b40()
  atioglxx.dll!5d309fa4()
  atioglxx.dll!5d2eee1c()
  sfml-window-2.dll!5fee4dce()
  sfml-window-2.dll!5fee4e88()
> sfml-window-2.dll!5fee1de5()
  sfml-window-2.dll!5fee2375()
  sfml-graphics-2.dll!5de1a482()
  sfml-graphics-2.dll!5de038b3()
  sfml-graphics-2.dll!5de04059()
  sfml-graphics-2.dll!5de047e7()
  sfml-graphics-2.dll!5de7eaf9()
  sfml-graphics-2.dll!5de7ec15()
  sfml-graphics-2.dll!5de7ec92()
  ntdll.dll!77de2846()
  ntdll.dll!77de2893()
  ntdll.dll!77df09c8()
  ntdll.dll!77df08ad()
  kernel32.dll!777b39f7()
  msvcr100.dll!72197997()
  msvcr100.dll!72197ab0()
  msvcr100.dll!72197b1d()
  GameEngine3.exe!__tmainCRTStartup()  Ligne 572 C
  kernel32.dll!777b8543()
  ntdll.dll!77deac69()
  ntdll.dll!77deac3c()

Comme vous pouvez le voir, je ne peux pas remonter plus haut dans mon application puisque le crash a lieu lorsque exit() est appelée.
J'ai fais quelques recherches, et apparemment cela pourrait venir d'un mauvais déréférencement de références, ou de tableaux dont la taille limite est dépassée, mais je n'ai rien de tout cela dans mon application.

Merci d'avance de votre aide :)


Polpopolitan

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
Re : Tableau de sf::Text = crash
« Réponse #1 le: Avril 01, 2013, 02:57:44 pm »
J'ai finalement trouvé la solution par moi même.
Le fautif était le sf::Font. J'ai codé une classe FontManager qui stocke les sf::Font et qui permet de ne pas avoir à les copier, et l'erreur était résolue. J'imagine donc que quelque chose essayait d'accéder au sf::Font lorsqu'il n'existait plus.