Forum de la communauté SFML

Aide => Général => Discussion démarrée par: nicooomg le Juin 25, 2012, 05:16:38 pm

Titre: [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 25, 2012, 05:16:38 pm
Bonjour,

Je viens de reinstaller Code::Blocks, avec pour compilateur: MinGW ayant GCC 4.7.0 !
J'utilise SFML 2 !
De: http://freefr.dl.sourceforge.net/project/mingw/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe

Mon code compilait très bien avant cette mise à jour...
Maintenant...:

Citer
#0 6E182F29   sf::Window::Window(this=0x77af1bd1) (D:\developpement\sfml-master\src\SFML\Window\Window.cpp:47)
#1 00919519   sf::RenderWindow::RenderWindow(this=0x77af1bd1) (D:\developpement\sfml-master\src\SFML\Graphics\RenderWindow.cpp:35)
#2 00402BCC   ?? () (??:??)
#3 004010B9   ?? () (??:??)
#4 00401284   ?? () (??:??)
#5 7694339A   KERNEL32!BaseCleanupAppcompatCacheSupport() (C:\Windows\syswow64\kernel32.dll:??)
#6 7EFDE000   ?? () (??:??)
#7 77A59EF2   ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#8 7EFDE000   ?? () (??:??)
#9 77A59EC5   ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#10 0040126C   ?? () (??:??)
#11 ??   ?? () (??:??)

Dans mon projet (C::B) j'ai
Citer
link options:
-lsfml-graphics-d
-lsfml-window-d
-lsfml-system-d
-lsfgui
-lopengl32

compile define:
SFML_STATIC
SFGUI_STATIC

Que faut-il faire?

merci, nico
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 25, 2012, 06:50:56 pm
Que raconte "gcc -v" dans la console ?
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 25, 2012, 11:29:02 pm
gcc version 4.7.0 <GCC>
et pleins d'autres trucs... !
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 08:23:19 am
Citer
et pleins d'autres trucs... !
Sans déconner ;D
C'est justement ça qui m'intéresse.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 12:13:34 pm
(http://img32.imageshack.us/img32/1264/gcc.png)
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 12:19:19 pm
Quelle variante de SFML utilises-tu (il y a différentes versions pour MinGW sous Windows) ?
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 12:24:48 pm
LaurentGomila-SFML-2.0-rc-37-g5706111.zip :)
Ensuite, CMake 2.8 !
Et compilé avec GCC 4.7.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 12:38:06 pm
Ah, tu as donc compilé SFML toi-même. Si tu l'as bien fait avec le même compilo que celui que tu utilises pour ton programme, alors je ne vois pas ce qui peut merder. Ca paraît évident mais je le dis quand même : assure-toi bien qu'il n'y ait pas des restes de vieilles versions qui traînent, et que tu as bien recompilé complètement ton programme.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 12:43:14 pm
Meme compilo oui :)
Aucune version ne traine dans mes dossiers... :S Et j'ai egalement recompilé.
Bon je vais tester avec SFML 2 deja compilée
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 12:50:25 pm
Avec la version du site, toujours la meme erreur de segmentation... :(
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 01:12:11 pm
Bon j'ai recommencé le projet avec chaque petite etape du tuto, voici ce que j'obtient....


Citer
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget5clearERKNS_5ColorE':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|57|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|57|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|60|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|61|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|61|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget4drawEPKNS_6VertexEjNS_13PrimitiveTypeERKNS_12RenderStatesE':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|133|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|133|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|197|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|198|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|199|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|208|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|136|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget12pushGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|222|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|222|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|225|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|226|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|227|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|228|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|229|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj):D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|230|more undefined references to `__Unwind_SjLj_Resume' follow|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget12pushGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|235|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget11popGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|241|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|241|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|244|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|245|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|246|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|247|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|248|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj):D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|249|more undefined references to `__Unwind_SjLj_Resume' follow|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget11popGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|251|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget13resetGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|258|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|258|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|265|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|266|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|267|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|268|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|269|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj):D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|270|more undefined references to `__Unwind_SjLj_Resume' follow|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget13resetGLStatesEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|285|undefined reference to `__Unwind_SjLj_Unregister'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget16applyCurrentViewEv':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|304|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|304|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|308|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|311|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|312|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|317|undefined reference to `__Unwind_SjLj_Unregister'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|315|undefined reference to `__Unwind_SjLj_Resume'|
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\..\..\..\libsfml-graphics-s-d.a(RenderTarget.cpp.obj)||In function `_ZN2sf12RenderTarget14applyBlendModeENS_9BlendModeE':|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|323|undefined reference to `___gxx_personality_sj0'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|323|undefined reference to `__Unwind_SjLj_Register'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|332|undefined reference to `__Unwind_SjLj_Resume'|
D:\developpement\sfml-master\src\SFML\Graphics\RenderTarget.cpp|334|undefined reference to `__Unwind_SjLj_Resume'|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 0 warnings (0 minutes, 9 seconds) ===|

Il doit me manquer un .a... mais lequel ? :)
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 01:21:31 pm
Non. Là par contre t'as clairement une incompatibilité entre compilos, ce qui signifie que SFML n'a pas été compilée avec le compilo que tu utilises là.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 01:40:38 pm
J'ai avancé un petit peu.
J'ai ma fenetre, mais la sigsegv se trouve sur "sfml-graphics-2.dll"
Je vais recompiler cette dll egalement... !
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 01:49:35 pm
Wow.
Ca va etre long :/

Citer
#0 702D3474   glFlush() (C:\Windows\SysWOW64\opengl32.dll:??)
#1 7030C269   wglGetProcAddress() (C:\Windows\SysWOW64\opengl32.dll:??)
#2 64DCE1C5   __GLeeGetExtStrPlat() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#3 64DCE238   __GLeeGetExtensions() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#4 64DCE453   GLeeInit() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#5 64DE7CE5   GLee_Lazy_glGenBuffers@8() (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#6 64DADA89   sfg::Renderer::Renderer() () (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#7 64DADC99   sfg::Renderer::Create() () (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#8 64DBA403   sfg::SFGUI::SFGUI() () (D:\C__~1\projects\CLIENT~3\bin\Debug\sfgui.dll:??)
#9 00474D7B   ?? () (??:??)
#10 004010B9   ?? () (??:??)
#11 00401284   ?? () (??:??)
#12 7694339A   KERNEL32!BaseCleanupAppcompatCacheSupport() (C:\Windows\syswow64\kernel32.dll:??)
#13 7EFDE000   ?? () (??:??)
#14 77A59EF2   ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#15 7EFDE000   ?? () (??:??)
#16 77A59EC5   ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#17 0040126C   ?? () (??:??)
#18 ??   ?? () (??:??)

J'ai ceci apres avoir recompiler entirement la SFML. (Bravo, maintenant la segmentation se trouve dans openGL!!
Je dois recompiler quoi maintenant?
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 01:58:53 pm
Est-ce que tu pourrais commencer par un code simple (par exemple celui du tutoriel), de façon à être certain que tes bibliothèques compilées sont ok ? Parce que là ça pourrait très bien être ton code, SFGUI, SFML, etc. tu testes trop de choses en même temps.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 02:13:04 pm
Le truc c'est que mon code marchait parfaitement ! :)
Bon je viens de recompiler Sfgui. La compilation = niquel.
Et mon programme n'a plus de sigsegv. Mais bon, ecran noir :P. Sfgui...  >:(
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 02:26:29 pm
Si tu as changé de compilo il faut évidemment que tu recompiles absolument toutes les bibliothèques C++ que tu utilises.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 02:29:31 pm
Oui je savais pas ^_^

Bon eh bien maintenant passons a un truc plus simple ou tu pourras meclairer :)

int SplashScreen::Run()
{
    // Splash Screen loading
    sf::Texture splash;
    splash.loadFromFile("Data/gui/splash/splashscreen.jpg");
    sf::Sprite spr(splash);

    while(m_window->Running()) {
        // Clearing out the window
        m_window->Clear(); // RenderWindow::clear();

        m_window->Draw(spr); // RenderWindow::draw(...);

        m_window->Render(); // RenderWindow::display();
    }
    return -1;
}

Le fichier jpg est bien chargé.
Pourtant... ecran noir!
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 02:34:59 pm
Citer
Le fichier jpg est bien chargé.
Comment le sais-tu ? Tu ne gères pas la valeur de retour de loadFromFile.

Essaye aussi d'ajouter une boucle d'évènements (vide) dans ta boucle principale.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 02:41:49 pm
j'ai mis if(!splash.LoadFromFile...) { exit(0); } et mon programme ne se termine pas.
J'ai egalement ajouter une boucle d'evenements...


        while(m_window->GetEvent(event) ) {
            //desktop.HandleEvent( event );

            // If window is about to be closed, leave program.
            if(mWindow::Closing(event)) {
                exit(0);
            }
        }

Toujours ecran noir.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 02:48:11 pm
Dans ce cas essaye de mettre ce code (sans les fioritures, avec les appels SFML directement) dans un code complet minimal, et vois si ça reproduit le problème. Si c'est le cas je pourrai alors le tester chez moi.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 02:55:21 pm
Ca marche !
    sf::RenderWindow window;
    window.create(sf::VideoMode(800, 600, 32), "Game");
    window.setFramerateLimit(60);
    sf::Texture splash;
    if(!splash.loadFromFile("Data/gui/splash/splashscreen.jpg"))
    {
        exit(0);
    }
    sf::Sprite spr(splash);
    sf::Event event;
    while(window.isOpen()) {
        // Clearing out the window
        window.clear();
        // Event processing.
        while(window.pollEvent(event) ) {
        }
        window.draw(spr);
        window.display();
    }

Donc le probleme vient de ma classe mWindow.
class mWindow
{
    public:
        /** Default constructor */
        mWindow(Perennials* per);
        /** Default destructor */
        ~mWindow();

        inline void Render()
        {
            window.display();
        }
        inline void RenderGUI(sfg::SFGUI& gui)
        {
            gui.Display(window);
        }
        inline void Clear()
        {
            window.clear();
        }
        inline const sf::RenderWindow& GetRenderWindow()
        {
            return window;
        }
        inline bool Running() const
        {
            return running && window.isOpen();
        }
        inline bool GetEvent(sf::Event& e)
        {
            return window.pollEvent(e);
        }
        inline void resetGLStates()
        {
            window.resetGLStates();
        }
        inline void popGLStates()
        {
            window.popGLStates();
        }
        static inline bool Closing(const sf::Event& e)
        {
            return e.type == sf::Event::Closed;
        }
        template<typename T>
        inline void Draw(const T& obj)
        {
            window.draw(obj);
        }
        inline const sf::Vector2u GetScreenSize() const
        {
            return window.getSize();
        }

        Perennials* GetPerennials() const { return perennial; }

    protected:
    private:

        bool running;
        sf::RenderWindow window;

        Perennials* perennial;

};
 
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 03:08:25 pm
Je ne vois rien de bizarre dans cette classe.

Puisque le code minimal fonctionne, remet des éléments de ton code original au fur et à mesure et vois à quel moment ça ne fonctionne plus. Par exemple, dans un premier temps remets la class mWindow. Puis la classe SplashScreen.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 03:23:08 pm
Etrange.

    Perennials* perenial = new Perennials();
    // sfml window
    mWindow* w = new mWindow(perenial);

    sf::Texture splash;
    if(!splash.loadFromFile("Data/gui/splash/splashscreen.jpg"))
    {
        exit(0);
    }
    sf::Sprite spr(splash);
    sf::Event event;
    while(w->Running()) {
        // Clearing out the window
        w->Clear();
        // Event processing.
        while(w->GetEvent(event)) {
        }
        w->Draw(spr);
        w->Render();
    }
 

Ce code marche... donc c'est dans SplashScreen.
Tu as la fonction Run(), voici le header.

class mWindow;
class ClientSocket;
class SplashScreen: public Screen
{
    public:
        SplashScreen(mWindow* wd, ClientSocket* tcps)
        {
            m_window = wd;
            m_tcpsocket = tcps;
        }
        ~SplashScreen() {}
        int Run ();

        static const int ID = 1;

    private:
        // Common structure
        sfg::SFGUI m_sfgui;
        sfg::Desktop desktop;
        sf::Event event;
        sf::Clock clock;
};

// et voici Screen
class mWindow;
class ClientSocket;
class Screen
{
    public :
        virtual int Run () = 0;

        mWindow* m_window;
        ClientSocket* m_tcpsocket;
        ClientSocket* m_udpsocket;
};
 

edit:
De plus, avec ce code quand je ferme l'appli je n'ai aucun probleme, avec l'original, je crash.  Mais ca c'est du a sfgui il me semble.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 03:39:40 pm
Continue à mettre au fur et à mesure des éléments du code original, tu vas bien tomber sur un truc ;)
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 04:01:52 pm
J'ai supprimé ma classe mWindow, et dans la fonction Run je passe directement l'objet RenderWindow par reference.

int SplashScreen::Run(sf::RenderWindow& App)
{
    // Splash Screen loading
    sf::Texture splash;
    if(!splash.loadFromFile("Data/gui/splash/splashscreen.jpg"))
    {
        exit(0);
    }
    sf::Sprite spr(splash);
    while(App.isOpen()) {
        // Clearing out the window
        Ap.clear();
        // Event processing.
        while(App.pollEvent(event) ) {
            //desktop.HandleEvent( event );

            // If window is about to be closed, leave program.
            if(event.type == sf::Event::Closed) {
                exit(0);
            }
        }
        App.draw(spr);
        App.display();
    }
    return -1;
}

C'est donc une copie quasi egale à https://github.com/SFML/SFML/wiki/TutorialScreens

Toujours ecran noir.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 04:09:55 pm
Puisque ce code fonctionne lorsqu'il est tout seul dans main(), le problème vient forcément de la gestion externe de SplashScreen.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: kimci86 le Juin 26, 2012, 04:14:12 pm
Bonjour,

J'ai lu le sujet rapidement et il me semble qu'il y a un léger problème là :

Citer
link options:
-lsfml-graphics-d
-lsfml-window-d
-lsfml-system-d
-lsfgui
-lopengl32

compile define:
SFML_STATIC
SFGUI_STATIC

En effet, il y a les defines pour compiler en statique alors que les bibliothèques dynamiques sont liées. :o
Il faut soit enlever les defines, soit lier avec les bibliothèques statiques (contenant "-s" ).
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 04:16:10 pm
Non ceci est corrigé:
Citer
-lsfml-graphics-s-d
-lsfml-window-s-d
-lsfml-system-s-d
-lsfgui
-lopengl32

@LG:
Oui je m'en doute, mais je passe sf::RenderWindow directement. Qu'est-ce qui pourrait bien foirer le rendu ? :s
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 04:23:09 pm
Avec ça :
int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "test");
    SplashScreen sp;
    sp.Run(window);
    return 0;
}
... ça foire ?

Normalement non, donc il faut vraiment que tu te concentres sur la gestion du splash screen et non sur son code, qui lui est correct.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 04:31:14 pm
Ca marche :)
Mais du coup je n'herite pas de 'Screen', et je ne peux faire cette boucle:

    int iscreen = 0, temp;
    while(iscreen >= 0)
    {
        // On lance l'affichage
        temp = Screens[iscreen]->Run(App);
        // On vient de sortir de la boucle de Screen::Run()
        // Si temp est different, on met a jour les variables
        if(temp != iscreen)
        {
            delete Screens[iscreen];
            App.clear();
            iscreen = temp;
        }
    }

Cela me permet dans la fonction Run de retourner un int qui correspond a lecran suivant ou precedant, et passer dun ecran a un autre en liberant proprement la memoire.

C'est etrange, avec new SplashScreen, ou en utilisant quelquechose comme:
SplashScreen ss(...);
vector.push_back(&ss);

Cela ne marche pas non plus, ya vraiment un truc louche ici.
Mais bon, je vois pas du tout, j'utilise comme base le tutorial, cela devrait marcher :)
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 26, 2012, 04:47:06 pm
C'est ça le souci, c'est que tu essayes de faire tes tests dans ton code d'origine (avec son bug qui traîne là quelque part). Il faut se mettre dans un code vierge pour éviter toute interférence.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 26, 2012, 06:22:54 pm
Le bug se trouve dans l'heritage je suppose...!
Mais je suis pas assez bon pour trouver le probleme.

& pour le code vierge, eh bien cest ce qu'on a fait toute l'apres midi ! Donc j'aimerais retourner a mon systeme de plusieurs ecrans :)

nico
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 27, 2012, 03:08:51 am
Voici la solution !

En fait la SFML n'accepte pas de doublons sf::Event !
Donc avoir plusieurs classes qui servent d'écrans, avec chacune son propre membre sf::Event = aucun affichage.

Donc, pour avoir plusieurs ecrans, comme sur ce tutorial, avec gcc 4.7 (apparement !) https://github.com/SFML/SFML/wiki/TutorialScreens

Il faut utiliser une classe mere de ce type:


class Screen
{
    public :
        Screen() {};
        ~Screen() {};
        virtual int Run (sf::RenderWindow& App) {};

        static sfg::SFGUI m_sfgui;
        static sfg::Desktop desktop;
        static sf::Event event;
        static sf::Clock clock;
};

@LaurentGomila:
Merci de noter dans les tutoriels que plusieurs variables de type sf::Event fait foirer le code.
Est-ce un probleme interne ? Si oui, tu devrais mettre une protection sur les types qui ne doivent surtout pas exister plusieurs fois !

nico :)
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 27, 2012, 08:10:58 am
Citer
Merci de noter dans les tutoriels que plusieurs variables de type sf::Event fait foirer le code.
Est-ce un probleme interne ? Si oui, tu devrais mettre une protection sur les types qui ne doivent surtout pas exister plusieurs fois !
Tel que tu décris ça, ça n'a aucun sens. sf::Event n'est qu'une bête union, tu peux bien entendu en déclarer autant que tu veux. Je pense que le souci venait de ce que tu fais avec ces deux instances, tu peux me montrer ?

Au passage, avoir un sf::Event en membre d'une classe, ça ne sert strictement à rien ;)
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: gaulois94 le Juin 27, 2012, 02:17:12 pm
Personnellement je peux créer autant de sf::Event que je veux (j'en fait généralement une par Fenêtre).
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 27, 2012, 03:35:16 pm
Eh bien je pouvais egalement en creer plusieurs quand j'avais gcc 4.4.
Une fois passer a 4.7, et avoir recompiler sfml. J'avais un ecran noir avec le meme code.
Le passage de sf::Event unique pour chaque ecran resolvait le probleme.

Tu veux quoi exactement LG?
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 27, 2012, 03:42:06 pm
Citer
Tu veux quoi exactement LG?
Toutes les lignes de code (avec un peu de contexte pour comprendre) qui impliquaient les sf::Event dont tu parles.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 27, 2012, 05:35:02 pm
Le contexte:
- Avoir plusieurs ecrans differents dans une meme RenderWindow, tres utile pour un jeu ! (splash screen, menu, jeu, options, etc.)

int main()
{
    // sfml window
    sf::RenderWindow App(sf::VideoMode(800, 600), "Game");

    std::vector<Screen*> Screens;
    Screens.push_back(new SplashScreen());

    int current_screen = SplashScreen::ID;
    int temp_screen;

    while(current_screen >= 0)
    {
        // On lance l'affichage
        temp_screen = Screens[current_screen]->Run(App);
        if(temp_screen != current_screen)
        {
            current_screen = temp_screen;
        }
    }
    return EXIT_SUCCESS;
}


// SplashScreen
class SplashScreen: public Screen
{
    public:
        SplashScreen()
        {

        }
        ~SplashScreen() {}
        int Run (sf::RenderWindow& App);

        static const int ID = 0;
};




int SplashScreen::Run(sf::RenderWindow& App)
{
    // Splash Screen loading
    sf::Texture splash;
    if(!splash.loadFromFile("Data/gui/splash/splashscreen.jpg"))
    {
        exit(0);
    }
    sf::Sprite spr(splash);

    while(App.isOpen()) {
        // Clearing out the window
        App.clear();
        // Event processing.
        while(App.pollEvent(m_event) ) {
            // If window is about to be closed, leave program.
            if(m_event.type == sf::Event::Closed) {
                App.close();
            }
        }


        App.draw(spr);

        App.display();
    }
    return -1;
}


Et maintenant, Screen

class Screen
{
    public :
        Screen() {};
        ~Screen() {};
        virtual int Run (sf::RenderWindow& App) {};

        static sf::Event m_event;
        static sf::Clock m_clock;

};

Sans le static, j'ai un ecran noir. :)

J'ajoterais que c'est le meme probleme en ajoutant SFGUI pas en static, ecran noir :)

voila !

nico
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: Laurent le Juin 27, 2012, 06:14:06 pm
Je pense que c'est plutôt un effet de bord causé par un autre bug plus vicieux. Il n'y a aucune raison pour que ça produise des bugs, encore moins graphiques. Tu devrais creuser parce que ça risque de te retomber dessus plus vite que tu ne le penses.

Ensuite, déclarer un membre de type sf::Event, ça sert à quoi ? Les évènements sont typiquement très locaux, en dehors de la boucle d'évènements tu n'en as pas besoin. Du coup tu peux le déclarer juste avant.
sf::Event event;
while(App.pollEvent(event) )
   ...

Il manque aussi le fait que le destructeur de Screen devrait être virtuel. Ca pourrait avoir un lien avec tes problèmes, bien que d'après le code que tu montres ça n'en ait pas l'air.

Il manque aussi la destruction des screens, mais j'imagine que c'est fait dans le code original.
Titre: Re : [segfault] Appel de RenderWindow::create()
Posté par: nicooomg le Juin 27, 2012, 06:21:38 pm
Oui j'avais oublié de la rajouter, mais ce systeme etait justement fait pour egalement faire la destruction automatique !
Je vais voir par la suite si ca me retombe dessus, mais la j'avance doucement mais bien ^^

merci lg !

nico