Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: maju93160 le Août 14, 2012, 01:55:06 pm

Titre: Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 14, 2012, 01:55:06 pm
Bonjours,
Débutant en SFML ainsi que en C++, j'ai décidé de me faire un petit jeu en 2d mais lorsque j'appuie sur Echap ou sur " Lancer le jeu " j'ai une erreur de Segmentation.
J'aimerais donc avoir un peu d'aide  ;D

voici le code source :
#include <iostream>
#include <SFML/Graphics.hpp>


using namespace sf;
using namespace std;


unsigned int const LONGUEUR(1008);
unsigned int const LARGEUR(567);

int main(int argc,char** argv)
{
    /**
     * page de titre
    */



    RenderWindow app(VideoMode(LONGUEUR,LARGEUR,32),"Tower Defence : Ecran Titre", Style::None);

    /**
    * ouverture de la page de titre ainsi que de la police
    *
    */


    Image imageTitre;
    Sprite titre;
    Font font;
    String text;

    // test ouverture de la page de titre et de la police

    if(!imageTitre.LoadFromFile("titre.png"))
    {
        return EXIT_FAILURE;
    }
    if(!font.LoadFromFile("Decibel_2.ttf"))
    {
        return EXIT_FAILURE;
    }
     // Le projet c'est lancé correctement :

    else
   {
    titre.SetImage(imageTitre);
   }

    // parametre du text et de l'arrier plan

    text.SetText("Lancer le jeu !");
    text.SetFont(font);
    text.SetSize(36);
    text.SetPosition(LONGUEUR/1.5,LARGEUR/1.2);
    text.SetStyle(String::Regular);
    titre.SetPosition(Vector2f(0,0));


    // taille du texte

    unsigned int largeurTexte = text.GetRect().GetWidth(); // Largeur du texte
    unsigned int hauteurTexte = text.GetRect().GetHeight(); // Hauteur du texte

   /**
    * boucle principal de l'écran de Titre
    */


   while(app.IsOpened())
   {
       Event event;

       while(app.GetEvent(event))
       {
           if((event.Type == Event::MouseButtonPressed) && (event.MouseButton.Button == sf::Mouse::Left))
           {
               if ((event.MouseButton.X >= LONGUEUR/1.5) && (event.MouseButton.X <= (LONGUEUR/1.5 + largeurTexte)))
                {
                    if ((event.MouseButton.Y >= LARGEUR/1.2) && (event.MouseButton.Y <= (LARGEUR/1.2 + hauteurTexte)))
                    {
                        app.Close();
                    }
                }

           }

            if((event.Type == Event::KeyReleased) && (event.Key.Code == sf::Key::Escape))
            {
                app.Close();
            }

        app.Draw(titre);
        app.Draw(text);
        app.Display();
        }
   }

    return EXIT_SUCCESS;
}
 



Merci  ;)
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 14, 2012, 02:13:41 pm
C'est un bug connu lié à l'utilisation de sf::String. Tu n'y peux rien. Ou plutôt si : passer tout de suite à SFML 2. SFML 1.6 est déjà obsolète, ne commence pas ton apprentissage avec cette version.
Titre: Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 14, 2012, 02:39:07 pm
A je pensais que c'étais de ma faute :-[
merci :)
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 15, 2012, 07:54:49 pm
re bonjours,

Je suis passé à la 2.0, mais j'aimerais savoir si il est encore  possible de Récupérer la taille d'un texte (largeur, hauteur) comme on pouvais le faire avec la 1.6.
Comme je suis débutant j'ai encore du mal à me retrouver dans la documentation   :-[

Merci
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 15, 2012, 08:49:49 pm
Bah, y a pas tant de fonctions que ça dans les classes, t'as vite fait le tour dans la doc... :P

sf::FloatRect rect = text.getGlobalBounds();
float width = rect.width;
float height = rect.height;
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 15, 2012, 09:17:41 pm
Merci,
Je refaire un tour dans la doc ^^.
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 15, 2012, 09:41:26 pm
Re,

J'ai fait les modifications et j'ai toujours le même problème que en 1.6  ???
est-ce que j'ai fait une erreur ?
 
Voici le code source :

       
       
#include <iostream>
#include <SFML/Graphics.hpp>

using namespace sf;
using namespace std;

unsigned int const LONGUEUR(1008);
unsigned int const LARGEUR(567);

int main(int argc,char** argv)
{
     /**
     * page de titre
    */


    RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);

    /**
    * ouverture de la page de titre ainsi que de la police
    *
    */


    Texture imageTitre;
    Font font;
    Text text("Lancer le jeu !");

    // test ouverture de la page de titre et de la police

    if(!imageTitre.loadFromFile("titre.png"))
        return EXIT_FAILURE;

     Sprite titre(imageTitre);

    if(!font.loadFromFile("Decibel_2.ttf"))
        return EXIT_FAILURE;
   


    // parametre du text et de l'arrier plan

    text.setFont(font);
    text.setCharacterSize(36);
    text.setPosition(LONGUEUR/1.5,LARGEUR/1.2);
    titre.setPosition(Vector2f(0,0));


    // taille du texte

    FloatRect rect = text.getGlobalBounds();
    float  largeurTexte = rect.width;
    float  hauteurTexte = rect.height;

   /**
    * boucle principal de l'écran de Titre
    */


   while(app.isOpen())
   {
       Event event;

       while(app.pollEvent(event))
       {
           if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
           {
               if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + largeurTexte)))
                {
                    if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + hauteurTexte)))
                    {
                        app.close();
                    }
                }
           }

            if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
            {
                app.close();
            }

        app.draw(titre);
        app.draw(text);
        app.display();
        }
   }

    return EXIT_SUCCESS;
}
 

Merci de bien vouloir m'aider encore une fois  ;)

PS : merci de l'aide apporter ainsi que de la vitesse de cette dernière :-*
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 15, 2012, 10:42:40 pm
Ce problème n'a été reglé que très récemment sur SFML 2, après la RC (que tu as dû prendre).

Deux solutions : soit télécharger et compiler les dernières sources de SFML, soit modifier ton code de la sorte :
Text text("Lancer le jeu !", font);
(en gros il faut toujours passer une police au constructeur de tes sf::Text)
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 01:35:05 pm
Re bonjours,
J'ai fait les modifications et toujours le même problème :
La fenêtre s'ouvre mais lorsque on arrive sur :

app.close();
 


Le programme marque une Segmentation fault, j'ai essayer de passer en mode console et de remplacer
app.close();
 


par :
 std::cout << "fonctionne ! " << std::endl;


Et tout à coups je n'ais plus l'erreur mais lorsque je remet app.close(); j'ai à nouveau l'erreur.
est-ce que je dois remplacer quelque chose?

Merci
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 16, 2012, 01:43:18 pm
Bon il faut savoir si oui ou non on parle bien du même bug. Lance ton debugger et montre moi la pile d'appels après le crash.
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 01:56:33 pm
Re,
Je sais pas si c'est cela mais normalement ça doit être ça:
Citer
Building to ensure sources are up-to-date
Build succeeded
Selecting target:
Debug
Adding source dir: D:\TowerDefence\
Adding source dir: D:\TowerDefence\
Adding file: bin\Debug\TowerDefence.exe
Starting debugger:
done
Registered new type: wxString
Registered new type: STL String
Registered new type: STL Vector
Setting breakpoints
Debugger name and version: GNU gdb (GDB) 7.4
Child process PID: 3516
Program received signal SIGSEGV, Segmentation fault.
In ?? () ()
Debugger finished with status 0

Le programme se lance mais après ça beug je sais pas d'où ça peut venir

Merci encore  :)
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 16, 2012, 02:34:00 pm
Non ce n'est pas ça. Le debugger peut donner des informations beaucoup plus approfondies, et très facilement. Je te recommande un peu de lecture sur le sujet, connaître les bases du debugger c'est crucial pour tout bon programmeur. C'est comme ça qu'on évite les "ça beug je sais pas d'où ça peut venir". Le debugger le sait, lui.

Tu devrais trouver comment afficher la pile d'appels en 2 secondes avec l'aide de Google ;)
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 04:27:04 pm
Re,
Tout d'abord merci de m'avoir appris à mieux utiliser le debugger, mais ici la pile d'appels n'affiche pas la ligne où se situe le problème...

Voici la pile d'appels:
(http://nsa30.casimages.com/img/2012/08/16/120816043300324335.png) (http://www.casimages.com/img.php?i=120816043300324335.png)

J'ai aussi réussi à afficher Watches :

(http://nsa29.casimages.com/img/2012/08/16/120816044037328963.png) (http://www.casimages.com/img.php?i=120816044037328963.png)

Merci d'avance  ;)
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 16, 2012, 04:34:18 pm
Bizarre. Tu compiles bien en mode Debug ?

Peux-tu nous montrer ton projet (fichier .cbp) ?
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 05:11:16 pm
Re,

On peux le télécharger sur ce lien ci-dessous :
http://1ct2m6.1fichier.com/ (http://1ct2m6.1fichier.com/)

Merci
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 05:13:32 pm
Je compile bien en mode débug
j'ai oublier de l'annoncé   ;D
j'ai revérifier donc pas d'erreur  8)
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 16, 2012, 06:27:08 pm
Tu as des paramètres pour le mode Debug, des paramètres pour le mode Release (jusque là tout va bien), mais aussi des paramètres pour les deux, qui du coup s'ajoutent à ce que tu as déjà défini pour chaque mode. Il faut virer ces paramètres communs.
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 07:05:43 pm
J'ai pas trop bien compris ce qu'il fallait faire je dois enlever les paramètre comme cela :

(http://nsa30.casimages.com/img/2012/08/16/120816071827552254.png) (http://www.casimages.com/img.php?i=120816071827552254.png)

J'ai enlever ici :

-lsfml-graphics
-lsfml-window
-lsfml-system

ainsi que SFML_DYNAMIC

mais sans resultat :'(

Merci
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 16, 2012, 07:18:16 pm
Je dirais que c'est ça oui. Par contre je m'attendrais à voir un "Debug" et un "Release" sous "TowerDefence" dans la colonne de gauche. Bref, je ne suis pas un utilisateur de Code::Blocks donc je m'arrête là dans les supositions :)

Après ces changements, toujours pas de pile d'appels en Debug ?

Vérifie aussi que tu n'as pas mélangé les deux versions de SFML, que tu n'as pas des vieux trucs qui traînent, etc. Et ce serait bien de voir la toute dernière version de ton code.

Sinon, rien à voir mais :
- pense à utiliser rect.contains et window.convertCoords (je te laisse le soin de trouver où et comment)
- tu devrais dessiner en dehors de ta boucle d'évènements
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 08:08:02 pm
Re,
J'ai fait ce que tu m'as dit mais sans grand résultat mais j'ai decouvert que c'est la partie texte qui fait planter mon programme, en faite j'ai supprimer tout ce qui est en rapport avec mon texte et mon programme fonctionne mais lorsque que j'ouvre seulement le texte de cette maniere :

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace sf;

 int const LONGUEUR(1008);
 int const LARGEUR(567);

int main(int argc,char** argv)
{
     /**
     * page de titre
    */


      RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);
        Font font;

if(!font.loadFromFile("Decibel_2.ttf"))
    {
        return EXIT_FAILURE;
    }

    Text text("Lancer le jeu !",font);
    text.setCharacterSize(36);
   text.setPosition(672,472);

    FloatRect rect = text.getGlobalBounds();
    float  largeurTexte = rect.width;
    float  hauteurTexte = rect.height;

    while(app.isOpen())
   {
       Event event;

       while(app.pollEvent(event))
       {
           if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
           {
               if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + 1000)))
                {
                    if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + largeurTexte)))
                    {
                        app.close();

                    }
                }
           }

            if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
            {
                 app.close();
            }

        }
       app.draw(text);
       app.display();
   }

    return EXIT_SUCCESS;
}
 

alors le programme plante au moment de app.close();

est-ce que j'ai loupé quelque chose avec sf::Text ainsi que sf::Font ?

Merci
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 08:26:52 pm
J'ai remarquer aussi que lorsque je remplace app.close(); par autre chose comme un message sur console alors le programme ne plante pas comme cela :
#include <SFML/Graphics.hpp>
#include <iostream>

using namespace sf;

 int const LONGUEUR(1008);
 int const LARGEUR(567);

int main(int argc,char** argv)
{
     /**
     * page de titre
    */


      RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);
        Font font;

if(!font.loadFromFile("Decibel_2.ttf"))
    {
        return EXIT_FAILURE;
    }

    Text text("Lancer le jeu !",font);
    text.setCharacterSize(36);
   text.setPosition(672,472);

    FloatRect rect = text.getGlobalBounds();
    float  largeurTexte = rect.width;
    float  hauteurTexte = rect.height;

    while(app.isOpen())
   {
       Event event;

       while(app.pollEvent(event))
       {
           if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
           {
               if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + hauteurTexte)))
                {
                    if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + largeurTexte)))
                    {
                        std::cout << "message" << std::endl;

                    }
                }
           }

            if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
            {
                 app.close();
            }

        }
       app.draw(text);
       app.display();
   }

    return EXIT_SUCCESS;
}
 

et même étrangement il fonctionne très bien
alors est-ce un problème avec app.close(); et l'affichage d'un texte ?

de plus bizarrement ce programme fonctionne aussi parfaitement :
        /**
         *
         * @author Majurian
         */


#include <iostream>
#include <SFML/Graphics.hpp>

using namespace sf;

 int const LONGUEUR(1008);
 int const LARGEUR(567);

int main(int argc,char** argv)
{
     /**
     * page de titre
    */

    RenderWindow app(VideoMode(LONGUEUR,LARGEUR),"Tower Defence : Ecran Titre", Style::None);

    /**
    * ouverture de la page de titre ainsi que de la police
    *
    */


    Texture imageTitre;
    Font font;


    // test ouverture de la page de titre et de la police

    if(!imageTitre.loadFromFile("titre.png"))
        return EXIT_FAILURE;

     Sprite titre(imageTitre);

    if(!font.loadFromFile("Decibel_2.ttf"))
    {
        return EXIT_FAILURE;
    }


    // parametre du text et de l'arrier plan
    Text text("Lancer le jeu !",font);
    text.setCharacterSize(36);
    text.setPosition(LONGUEUR/1.5,LARGEUR/1.2);
    titre.setPosition(0,0);


    // taille du texte

    FloatRect rect = text.getGlobalBounds();
    float  largeurTexte = rect.width;
    float  hauteurTexte = rect.height;

   /**
    * boucle principal de l'écran de Titre
    */


   while(app.isOpen())
   {
       Event event;

       while(app.pollEvent(event))
       {
           if((event.type == Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
           {
               if ((event.mouseButton.x >= LONGUEUR/1.5) && (event.mouseButton.x <= (LONGUEUR/1.5 + largeurTexte)))
                {
                    if ((event.mouseButton.y >= LARGEUR/1.2) && (event.mouseButton.y <= (LARGEUR/1.2 + hauteurTexte)))
                    {
                       std::cout << "run" << std::endl;

                    }
                }
           }

            if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
            {
                std::cout << "fermer" << std::endl;

            }

       app.draw(titre);
       app.draw(text);
       app.display();
       }

    }
    return EXIT_SUCCESS;
}
 


j'ai enlever app.close(); et modifier par un texte afficher...

Merci
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 16, 2012, 08:39:22 pm
Ca n'a rien de bizarre, le bug survient lorsque ton application se termine (rien à voir avec app.close(), ça plante après). Donc quand tu affiches quelque chose au lieu de fermer la fenêtre, ton programme ne quitte plus, donc plus de bug.

Bon, mes souvenirs doivent être un peu embrouillés (il y a eu plusieurs variantes de ce bug sur plusieurs versions de SFML). Peut-être qu'il faut aussi lier SFML statiquement pour que ça ne crash plus.

Sinon, choppe les dernières sources de SFML et recompile la.
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 16, 2012, 09:29:01 pm
Re,

Oui tu a raison en faite lorsque on sort de la boucle principale alors le programme plante  :'(
J'ai télécharger la dernière version de SFML 2.0, je n'ais pas encore compiler SFML 2.0 je vais le faire et je te dit si cela fonctionne  ;)

j'ai essayer de lier SFML statiquement mais pas de changement...

Merci
Titre: Re : Segmentation fault avec Code::blocks
Posté par: maju93160 le Août 17, 2012, 02:43:15 pm
Re bonjours,
Pardon pour le retard de ma réponse.
J'ai compiler les derniere sources comme tu me l'as dit et surprise :
J'ai réussi à faire fonctionner le programme  :D
mais il y a encore un problème, il plante lorsque j'utilise le debugger  :o mais lorsque je compile en mode normale  il ne plante pas  ???
Est-ce que je dois négliger le problème ?

Merci  en tous cas ;D
 
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Inglebard le Août 30, 2012, 01:43:45 pm
Bonjour,
je tiens à signaler un problème similaire sous Codelite. Le SIGSEGV se lance au moment du "return 0".

voici le code utilisé :
#include <SFML/Window.hpp>

int main()
{
    sf::Window window(sf::VideoMode(800, 600), "My window");

    // run the program as long as the window is open
    while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: we close the window
            if (event.type == sf::Event::Closed)
                window.close();
        }
    }

    return 0;
       
}



voici la pile d'appel :
0  0x76e6a334  lstrlenA    
1  0x28af45f6  ??    
2  0x00000100  ??    
3  0x3508060f  ??    
4  0x74f679df  wvsprintfW    
5  0x0028f8d8  ??    
6  0x74f67a36  wvsprintfW    
7  0x3508060f  ??    
8  0x286981d0  ??    
9  0x0028fd64  ??    
10  0x1000d676  HydraDMH!HookMessages    
11  0x000104cc  ??    
12  0x00000000  ??    
 

Logiciels et OS :

Windows 7 x64
Codelite 4.1.5770
GDB 7.4
MinGW,gcc,g++ 4.7

En espérant que ceci puisse vous aidez à identifier le problème.

Cordialement.
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Laurent le Août 30, 2012, 01:45:55 pm
Ca n'a rien à voir, puisque le problème précédent est lié à sf::Text.

As-tu recompilé SFML ?
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Inglebard le Août 30, 2012, 02:42:53 pm
Je croyais que ça venait de app.close(), je n'avais pas vu le lien avec sf::Text, autant pour moi.

Citer
Re bonjours,
Pardon pour le retard de ma réponse.
J'ai compiler les derniere sources comme tu me l'as dit et surprise :
J'ai réussi à faire fonctionner le programme  :D
mais il y a encore un problème, il plante lorsque j'utilise le debugger :o mais lorsque je compile en mode normale  il ne plante pas  ???
Est-ce que je dois négliger le problème ?

Merci  en tous cas ;D

Cependant, un problème semble toujours exister au niveau du debug.

Citer
As-tu recompilé SFML ?
Oui, avec les sources du GIT.

Je tiens également à préciser que j'utilise Codelite de la même façon que ce soit sous windows 7 ou Ubuntu 12.04 mais que le problème survient uniquement sous windaube.

Cordialement.
Titre: Re : Segmentation fault avec Code::blocks
Posté par: Samuel Proulx le Août 31, 2012, 02:36:35 am
Bon, ça n'a peut-être plus trop rapport, mais je tiens à préciser qu'on doit effectivement avoir un dossier Debug et Release sous « TowerDefence ».

J'ignore pourquoi ces dossiers n'apparaissent pas chez lui. Selon moi, ça doit être lié à son projet en tant que tel ou une mauvaise installation/corruption des fichiers SFML.

ps. Je travaille en permanence avec Code::Blocks