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

Auteur Sujet: Draw() sprite puis shape --> segfault  (Lu 2241 fois)

0 Membres et 1 Invité sur ce sujet

Pepito

  • Invité
Draw() sprite puis shape --> segfault
« le: Juillet 16, 2017, 09:37:57 am »
Introduction
Bonjour, je suis actuellement sur un projet utilisant la SFML, mais en voulant dessiner un sprite puis une shape, le programme renvoie un segmentation faut dès que je ferme la fenêtre.

Détails

Voici le code minimal qui plante :
sf::Texture texture;
sf::Sprite sprite;
sf::CircleShape shape;
sf::RenderWindow window(sf::VideoMode(225, 225), "Window");

if(!texture.loadFromFile("textures/texture.png", sf::IntRect(0, 0, 225, 225)))
{
        std::cerr << "Unable to load texture.png" << std::endl;
        return -1;
}


sprite.setTexture(texture);
shape.setRadius(200);
shape.setFillColor(sf::Color::Green);

while(window.isOpen())
{
        sf::Event event;
        while(window.pollEvent(event))
        {
                switch(event.type)
                {
                        case sf::Event::Closed:
                                window.close(); //C'est à ce moment là que ça à l'air de planter.
                                return 0;
                                break;

                        case sf::Event::KeyPressed:
                                break;

                        default:
                                break;
                }
        }

        window.clear();
        window.draw(sprite);
        window.draw(shape); //si je le dessine avant ou pas du tout, ça ne plante pas.
        window.display();
}

Sinon je suis sous Windows 7, j'utilise g++ que j'ai téléchargé via le lien directement dans la page de téléchargement de la SFML (MinGW Builds 6.1.0 (64-bit)), et la SFML j'ai pris GCC 6.1.0 MinGW (SEH) - 64-bit.
Le code de la compilation ressemble à ça :

g++ -std=c++17 -Wall -Wextra -pedantic -c src/*.cpp -I include/ -I C:/SFML-2.4.2/include
g++ *.o -o tmp.exe -L C:/SFML-2.4.2/lib -lsfml-system -lsfml-graphics -lsfml-window -lsfml-main

Je vous remercie de votre aide.

Guillaume__

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
Re: Draw() sprite puis shape --> segfault
« Réponse #1 le: Juillet 16, 2017, 10:20:06 am »
Salut Pepito,

Pourquoi fais-tu un return dans un switch-case ? Pour ma part ce code source minimal fortement inspiré du tien fonctionnement parfaitement, je te laisse comparer pour déceler de toi-même tes erreurs ;)

Voici un code source minimal fonctionnel :
#include <SFML/Graphics.hpp>

int main(){
    sf::RenderWindow window({225, 255}, "Window");

    sf::Sprite sprite;
    sf::CircleShape shape;

    sf::Texture texture;
    if(!texture.loadFromFile("texture/texture.png", sf::IntRect(0, 0, 225, 225)))
        return 0;

    sprite.setTexture(texture);
    shape.setRadius(200);
    shape.setFillColor(sf::Color::Green);

    sf::Event event;
    while(window.isOpen()){
        while(window.pollEvent(event)){
            switch(event.type){
                case sf::Event::Closed :
                    window.close();
                break;
            }
        }

        window.clear();
        window.draw(sprite);
        window.draw(shape);
        window.display();
    }

    return 0;
}
 

Cordialement G
Rejoignez-nous sur le serveur
Discord SFML

Pepito

  • Invité
Re: Draw() sprite puis shape --> segfault
« Réponse #2 le: Juillet 16, 2017, 10:43:20 am »
Salut Pepito,

Pourquoi fais-tu un return dans un switch-case ? Pour ma part ce code source minimal fortement inspiré du tien fonctionnement parfaitement, je te laisse comparer pour déceler de toi-même tes erreurs ;)

Voici un code source minimal fonctionnel :
#include <SFML/Graphics.hpp>

int main(){
    sf::RenderWindow window({225, 255}, "Window");

    sf::Sprite sprite;
    sf::CircleShape shape;

    sf::Texture texture;
    if(!texture.loadFromFile("texture/texture.png", sf::IntRect(0, 0, 225, 225)))
        return 0;

    sprite.setTexture(texture);
    shape.setRadius(200);
    shape.setFillColor(sf::Color::Green);

    sf::Event event;
    while(window.isOpen()){
        while(window.pollEvent(event)){
            switch(event.type){
                case sf::Event::Closed :
                    window.close();
                break;
            }
        }

        window.clear();
        window.draw(sprite);
        window.draw(shape);
        window.display();
    }

    return 0;
}
 

Cordialement G

Bonjour Guillaume__,
j'avoue que mon return n'est pas très utile. Le code que tu m'as donné fonctionne pas non plus. Donc ce serait soit à cause de ma version de la SFML, de mon OS ?
Aussi, je sais pas si tu actives les warning quand tu compiles, mais il est conseillé d'utiliser "default: break;" à la fin d'un switch car sans ça, il t'affiche une dizaine d'erreurs (tout les events possibles) :
src/main.cpp:28:19: warning: enumeration value 'LostFocus' not handled in switch
 [-Wswitch]
src/main.cpp:28:19: warning: enumeration value 'GainedFocus' not handled in swit
ch [-Wswitch]
src/main.cpp:28:19: warning: enumeration value 'TextEntered' not handled in swit
ch [-Wswitch]
src/main.cpp:28:19: warning: enumeration value 'KeyPressed' not handled in switc
h [-Wswitch]
src/main.cpp:28:19: warning: enumeration value 'KeyReleased' not handled in swit
ch [-Wswitch]
src/main.cpp:28:19: warning: enumeration value 'MouseWheelMoved' not handled in
switch [-Wswitch]
src/main.cpp:28:19: warning: enumeration value 'MouseWheelScrolled' not handled
in switch [-Wswitch]

etc...

Guillaume__

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
Re: Draw() sprite puis shape --> segfault
« Réponse #3 le: Juillet 17, 2017, 10:41:10 am »
Oui le compilateur gueule un peu car tu n'as pas géré tous les cas qu'il t'énumère mais on est en aucun cas obligé de les traiter, de plus ne pas les traiter n'entraine aucune erreur.
Le soucis exact que tu rencontres se produit à la fermeture de la fenêtre, c'est bien ça ?

Je peux te conseiller de compiler toi-même SFML (Psst, si tu ne sais pas comment faire voici un tutoriel pour voir si ça résout le problème sinon essaye de faire plus de tests afin qu'ont aient plus d'éléments pour t'aider au mieux :)

Cordialement G
Rejoignez-nous sur le serveur
Discord SFML