crash in gtk::main::run() nach aufruf von gtk::main-ctor in anderer funktion als main()



  • mein programm crasht immer, wenn dieser aufruf nicht in main() stattfindet. ich dachte erst es würde daran liegen, dass ich argc und argv nicht als referenzen übergebe, aber es crasht trotzdem, beim aufruf von Gtk::Main::run().

    hier der code:

    #include <gtkmm.h>
    
    class Wnd;
    
    class Window
    {
    public:
    	virtual ~Window() = 0;
    
    	static Window& instance(int& argc, char**& argv);
    
    	virtual void run() = 0;
    
    private:
    	static Window* window_;
    };
    
    Window::~Window() {}
    Window* Window::window_(NULL);
    
    class Wnd : public Window, public Gtk::Window
    {
    	// nach dem aufruf von run() crasht das programm
    	virtual void run() { Gtk::Main::run(*this); }
    };
    
    Window& Window::instance(int& argc, char**& argv)
    {
    	if(!window_)
    	{
    		// wird das hier auskommentiert und findet stattdessen der
    		// aufruf in main() statt, funktioniert das programm.
    		Gtk::Main kit(argc, argv);
    		window_ = new Wnd;
    	}
    	return *window_;
    }
    
    int main(int argc, char** argv)
    {
    	//Gtk::Main kit(argc, argv);
    	Window::instance(argc, argv).run();
    }
    

    ich hab keine ahnung, wieso dieses verhalten auftritt! ich wäre für hilfe sehr dankbar.



  • void init(int argc, char** argv)
    {
    	Gtk::Main kit(argc, argv);
    }
    
    int main(int argc, char** argv)
    {
    	init(argc, argv);
    
    	Gtk::Window w;
    	Gtk::Main::run(w);
    }
    

    <vereinfacht>



  • Hallo,

    in der Doku steht nichts von "muss unbedingt in die main", sondern nur "wird gewöhnlich in der main aufgerufen": http://www.gtkmm.org/docs/gtkmm-2.4/docs/reference/html/classGtk_1_1Main.html

    Was passiert, wenn du anstatt Gtk::Main::run(w); mal kit.run(w); schreibst (lass es dir von init zurückgeben)? Wieso magst du überhaupt den Teil ausgliedern?

    MfG

    GPC



  • ja danke, das funzt!

    in der doku steht übrigens noch so ein komischer satz:

    It may not be global and must be the first Gtk object created.

    "it may not be global"? 😕 wie soll ich denn das verstehen?

    It is a singleton so declaring more than one will simply access the first created.

    aha! und wieso darf es dann nicht global sein? imo ein sehr ungewöhnliches verhalten.

    int main(int argc, char** argv)
    {
        // ... (wie bei letztem posting)
        Gtk::Main::instance()->run(w); // crasht auch
    }
    

    komisches singleton.

    Wieso magst du überhaupt den Teil ausgliedern?

    Weil es prinzipiell unabhängig bleiben soll vom gui-toolkit. deshalb muss es raus aus main.



  • gtkmm-user schrieb:

    ja danke, das funzt!

    in der doku steht übrigens noch so ein komischer satz:

    It may not be global and must be the first Gtk object created.

    "it may not be global"? 😕 wie soll ich denn das verstehen?

    Muss nicht global sein, kann auch lokal angelegt werden.
    "Darf nicht global sein" würde "mustn't be global" bedeuten.

    MfG

    GPC





  • oops, da hab ich mich wohl vertan *schäm*
    Na ja, in dem Fall ist das wirklich ein komisches Verhalten, dass Gtk::Main da an den Tag left 😕
    Vllt. mal in den Quellcode reinschauen, um das genauer zu inspizieren...



  • hab ich schon. da steht nicht viel drin (eigentlich gar nix).

    btw hast du dich nicht vertan, sondern wir haben beide das falsche reinterpretiert:
    http://www.englisch-lehrbuch.de/grammatik/kapitel6/6_2_3_verneinung_mit_may.htm
    http://www.englisch-lehrbuch.de/grammatik/kapitel6/6_2_4_verneinung_mit_must.htm

    merke: interpretieren ist böse!



  • Ja, mustn't war ja klar, das ist ja der berühmte Stolperstein in der englischen Verneinung. Nur bei may sind wir irgendwie auf'm Holzweg gewesen 😃

    merke: interpretieren ist böse!

    Deshalb verwenden wir ja auch C++ 😉


Anmelden zum Antworten