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

Auteur Sujet: [SFML 2.0] Segmentation fault à l'arrêt de mon programme [Résolu]  (Lu 2569 fois)

0 Membres et 1 Invité sur ce sujet

3ck0

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Bonjour à tous  :D !
Je vous écris parce que je rencontre un problème de SEG FAULT à l'arrêt de mon programme. (Tout marche bien, jusqu'à ce que je clique sur la croix)

Voici le rapport du debugger :

#0 02B30713     ??() (C:\Windows\SysWOW64\nvoglv32.dll:??)
#1 00000000     0x0054bfc0 in ??() (??:??)
#2 00000000     0x0028fc50 in ??() (??:??)
#3 02B30812     ??() (C:\Windows\SysWOW64\nvoglv32.dll:??)
#4 00000000     0x0054bfc0 in ??() (??:??)
#5 00000000     0x0054bfc0 in ??() (??:??)
#6 00000000     0x0028fc6c in ??() (??:??)
#7 02B30219     ??() (C:\Windows\SysWOW64\nvoglv32.dll:??)
#8 00000000     0x0054bfc0 in ??() (??:??)
#9 00000000     0x00000010 in ??() (??:??)
#10 024D15BE    ??() (C:\Windows\SysWOW64\nvoglv32.dll:??)
#11 00000000    0x00000001 in ??() (??:??)
#12 00000000    0x66980000 in ??() (??:??)
#13 00000000    0x0028fcdc in ??() (??:??)
#14 669A1AEA    sf::Texture::~Texture() (C:\Users\*******\Documents\Projets C++\******\sfml-graphics-2.dll:??)
 

Je me suis rendu compte qu'en enlevant cette ligne :
texteBouton.setString(sf::String("Bouton"));

Du constructeur de ma classe suivante :

bouton.h
class bouton
{
    public:
    bouton();
    ~bouton();
    sf::RectangleShape* getSprite();
    sf::Text* getText();
    void setSize(sf::Vector2f taille);
    void setText(std::string texte);
    void setColor(sf::Color couleur);
    void setTextColor(sf::Color couleur);
    void setColorHover(sf::Color couleur);
    void setTextColorHover(sf::Color couleur);
    void setPosition(sf::Vector2f pos);
    void setFont(sf::Font *font);


    private:
    void refresh();
    sf::Vector2f tailleBouton;
    sf::Font *fontBouton;
    sf::Color couleurBouton;
    sf::Color couleurTexte;
    sf::Color couleurBoutonHover;
    sf::Color couleurTexteHover;
    sf::RectangleShape rectBouton;
    sf::Text texteBouton;
};
 

bouton.cpp :
bouton::bouton()
{
    rectBouton.setPosition(sf::Vector2f(0,0));
    tailleBouton = sf::Vector2f(200,30);
    couleurBouton = sf::Color(40,40,40);
    couleurTexte = sf::Color(0,162,232);
    couleurBoutonHover = sf::Color(60,60,60);
    couleurTexteHover = sf::Color(220,220,220);
    texteBouton.setString(sf::String("Bouton"));
    texteBouton.setCharacterSize(14);
    fontBouton=NULL;
    refresh();
}

bouton::~bouton()
{

}

void bouton::refresh()
{
    if(fontBouton!=NULL)
        texteBouton.setFont(*fontBouton);
    rectBouton.setSize(tailleBouton);
    rectBouton.setFillColor(couleurBouton);
    texteBouton.setColor(couleurTexte);
    sf::FloatRect textRect = texteBouton.getLocalBounds();
    sf::Vector2f dimT = sf::Vector2f(textRect.width,textRect.height);
    sf::Vector2f newpos = rectBouton.getPosition();
    std::cout << "x : " << rectBouton.getSize().x << " - y : " << rectBouton.getSize().y << std::endl;
    newpos = newpos + sf::Vector2f(round(rectBouton.getSize().x/2 - dimT.x/2), round(rectBouton.getSize().y/2 - dimT.y/2));
    texteBouton.setPosition(newpos);
}

void bouton::setPosition(sf::Vector2f pos)
{
    rectBouton.setPosition(pos);
    refresh();
}

sf::RectangleShape* bouton::getSprite()
{
    return &rectBouton;
}

sf::Text* bouton::getText()
{
    return &texteBouton;
}

void bouton::setSize(sf::Vector2f taille)
{
    rectBouton.setSize(taille);
    tailleBouton=taille;
    bouton::refresh();
}

void bouton::setText(std::string texte)
{
    texteBouton.setString(texte);
    bouton::refresh();
}

void bouton::setColor(sf::Color couleur)
{
    couleurBouton = couleur;
    bouton::refresh();
}

void bouton::setTextColor(sf::Color couleur)
{
    couleurTexte = couleur;
    bouton::refresh();
}

void bouton::setColorHover(sf::Color couleur)
{
    couleurBoutonHover = couleur;
    bouton::refresh();
}

void bouton::setTextColorHover(sf::Color couleur)
{
    couleurTexteHover = couleur;
    bouton::refresh();
}

void bouton::setFont(sf::Font *font)
{
    fontBouton=font;
    bouton::refresh();
}
 

Je n'obtenais plus d'erreur ...

Si quelqu'un avait la solution à mon problème, je lui serait extrêmement reconnaissant. Par ailleurs, si mon code est dégueulasse, merci de me le signaler, car je débute avec la SFML et en POO en général.
Merci encore !

EDIT : Après plusieurs essais, je me suis rendu compte que dès que j'enlevais tout ce qui était en rapport avec :
xxxxxx.setString(sf::String("ma string"));
ainsi que le window.draw() de mon Text, je n'ai plus de segfault. (Mais ça m'arrange pas, je dois afficher du texte  8))
En revanche, même si je ne dessine pas mon Text, mais que je décide de lui appliquer setString, je retrouve ma segfault à la fermeture du programme ...

EDIT 2 :
Configuration :
- Windows 7 x64 Pro
- GTX560Ti (Drivers à jour)
- DirectX11
« Modifié: Mars 15, 2013, 07:55:01 pm par 3ck0 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Segmentation fault à l'arrêt de mon programme
« Réponse #1 le: Mars 14, 2013, 07:54:19 am »
Quel compilo ? Quelle version de SFML 2 (compilée par toi ? téléchargée ?) ? Est-ce que tu as des variables globales ?
Laurent Gomila - SFML developer

3ck0

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : [SFML 2.0] Segmentation fault à l'arrêt de mon programme
« Réponse #2 le: Mars 14, 2013, 09:38:35 am »
Alors, dans l'ordre :
- Je travaille sous code::Blocks(v10.5) avec GCC.
- J'ai téléchargé C++ | SFML 2.0 RC : Windows 32 bits - GCC SJLJ (Code::Blocks)
- Je n'ai pas de variables globales.  :)

EDIT : Ça marche si je compile sur un autre PC ... J'y comprends rien
« Modifié: Mars 14, 2013, 12:20:30 pm par 3ck0 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Segmentation fault à l'arrêt de mon programme
« Réponse #3 le: Mars 14, 2013, 01:28:50 pm »
Les versions récentes de gcc sont en générales incompatibles entre elles. Du coup si tu n'as pas exactement la bonne version, tu ne pourras pas faire tourner les packages pré-compilés. Pour être sûr, il vaudrait mieux que tu recompiles SFML avec ton compilo.
Laurent Gomila - SFML developer

3ck0

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : [SFML 2.0] Segmentation fault à l'arrêt de mon programme
« Réponse #4 le: Mars 14, 2013, 05:06:26 pm »
Merci beaucoup pour ta réponse. Je teste ça dès que j'ai un peu de temps.

3ck0

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : [SFML 2.0] Segmentation fault à l'arrêt de mon programme
« Réponse #5 le: Mars 15, 2013, 07:53:32 pm »
Je confirme, le souci venait de là ! Si quelqu'un rencontre le même problème que moi, recompilez la SFML ;)
Merci encore  :D