gtkmm SIGSEGV mit TextView - neues Problem



  • Ich verwende einen Gtk::SpinButton um durch die einzlnen Missionen zu schalten. dazu habe ich folgende Methode mit signal_value_changed() verbunden:

    void WD::on_ch_sb_missions()
    	{
    		static int altidx;
    		int idx;
    		try
    		{
    			missions.at(altidx).title = Glib::locale_from_utf8(en_mis_title->get_text());
    			//missions.at(altidx).deskription = Glib::locale_from_utf8(tv_mis_desk->get_buffer()->get_text());
    			missions.at(altidx).playership = Glib::locale_from_utf8(en_mis_ship->get_text());
    			missions.at(altidx).playlist = Glib::locale_from_utf8(en_mis_plist->get_text());
    			missions.at(altidx).ki.wave = Glib::locale_from_utf8(en_mis_wave->get_text());
    			missions.at(altidx).ki.parameter = Glib::locale_from_utf8(en_mis_param->get_text());
    		}
    		catch (std::out_of_range)
    		{
    			std::cerr << "Fehlerhafter Bereich!" << std::endl;
    			std::cerr << "Änderungen gehen verlohren!" << std::endl;
    		}
    
    		try
    		{
    			idx = sb_missions->get_value() - 1;
    			en_mis_title->set_text(Glib::locale_to_utf8(missions.at(idx).title));
    			//tv_mis_desk->get_buffer()->set_text(Glib::locale_to_utf8(missions.at(idx).deskription));
    			en_mis_ship->set_text(Glib::locale_to_utf8(missions.at(idx).playership));
    			en_mis_plist->set_text(Glib::locale_to_utf8(missions.at(idx).playlist));
    			en_mis_wave->set_text(Glib::locale_to_utf8(missions.at(idx).ki.wave));
    			en_mis_param->set_text(Glib::locale_to_utf8(missions.at(idx).ki.parameter));			
    		}
    		catch (std::out_of_range)
    		{
    			std::cerr << "Fehlerhafter Wert im SpinButton!" << std::endl;
    			sb_missions->set_value(missions.size());	
    		}
    		altidx = idx;
    	}
    

    wobei missions ein std::vector<Mission> ist:

    struct Mission
    	{
    		std::string title;
    		std::string deskription;
    		std::string playership;
    		std::string playlist;
    		struct KI
    		{
    			std::string parameter;
    			std::string wave;
    		} ki;
    	};
    

    solange ich den TextView auskommentiert lasse geht das ganze auch wunderbar, Wenn ich das Mitkompiliere bekomme ich hier ein SIGSEGV.

    en_* sind meine Gtk::Entry
    tv_* ist der(?) Gtk::TextView


  • Mod

    Ist das denn ein gültiger Pointer?
    Offensichtlich scheint er da ja ins Leere zu greifen.



  • Ups tatsache -.-
    Hab ich vergessen den tv aus der Glade-Datei zu laden.

    Nächstes Problem:

    Bei meinem Menü meldet er (auf der Konsole) dass er das ichontheme von freedesktop.org nicht finden kann. Ich hab schon gesucht aber konnte nicht entdecken wie ich das unter Win32 zum laufen bekomme

    EDIT://
    Und beim Beenden bekomme ich immer noch SIGSEGV und folgende Meldung auf der Konsole

    (Editor.exe:4908): GLib-GObject-WARNING **: instance of invalid non-instantiatab
    le type `<invalid>'
    
    (Editor.exe:4908): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matche
    d: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
    
    (Editor.exe:4908): Gtk-CRITICAL **: gtk_accel_group_disconnect: assertion `GTK_I
    S_ACCEL_GROUP (accel_group)' failed
    
    (Editor.exe:4908): GLib-GObject-WARNING **: instance of invalid non-instantiatab
    le type `<invalid>'
    
    (Editor.exe:4908): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matche
    d: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
    
    (Editor.exe:4908): Gtk-CRITICAL **: gtk_accel_group_disconnect: assertion `GTK_I
    S_ACCEL_GROUP (accel_group)' failed
    
    (Editor.exe:4908): GLib-GObject-WARNING **: instance of invalid non-instantiatab
    le type `<invalid>'
    
    (Editor.exe:4908): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matche
    d: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
    
    (Editor.exe:4908): Gtk-CRITICAL **: gtk_accel_group_disconnect: assertion `GTK_I
    S_ACCEL_GROUP (accel_group)' failed
    
    (Editor.exe:4908): GLib-GObject-WARNING **: instance of invalid non-instantiatab
    le type `<invalid>'
    
    (Editor.exe:4908): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matche
    d: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
    
    (Editor.exe:4908): Gtk-CRITICAL **: gtk_accel_group_disconnect: assertion `GTK_I
    S_ACCEL_GROUP (accel_group)' failed
    
    (Editor.exe:4908): GLib-GObject-WARNING **: instance of invalid non-instantiatab
    le type `<invalid>'
    
    (Editor.exe:4908): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matche
    d: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
    
    (Editor.exe:4908): Gtk-CRITICAL **: gtk_accel_group_disconnect: assertion `GTK_I
    S_ACCEL_GROUP (accel_group)' failed
    
    (Editor.exe:4908): GLib-GObject-WARNING **: instance of invalid non-instantiatab
    le type `<invalid>'
    
    (Editor.exe:4908): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matche
    d: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
    
    (Editor.exe:4908): Gtk-CRITICAL **: gtk_accel_group_disconnect: assertion `GTK_I
    S_ACCEL_GROUP (accel_group)' failed
    
    (Editor.exe:4908): GLib-GObject-WARNING **: instance of invalid non-instantiatab
    le type `<invalid>'
    
    (Editor.exe:4908): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matche
    d: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed
    
    (Editor.exe:4908): Gtk-CRITICAL **: gtk_accel_group_disconnect: assertion `GTK_I
    S_ACCEL_GROUP (accel_group)' failed
    
    #include "gtk-header.h"
    
    #include "ed_wave.h"
    #include "ed_kamp.h"
    
    int main(int argc, char *argv[])
    {
    	Gtk::Main kit(argc, argv);
    
        wave::WD window1;
        kampagne::WD window2;
    
        kit.run(window2);
    
        kit.run(window1);
        std::cout << "TEST" << std::endl;
    }
    

    TEST wird noch ausgegeben


  • Mod

    Hm, keine Ahnung wo das jetzt dran liegen könnte.
    GTK war mir deshalb schon immer was suspekt, gerade wenn z.b. beim
    GIMP ne warnung in dieser DOS Box aufgeht, dann ist das sowas von unnütz,
    und wenn man die schliesst, ist das ganze Programm weg.



  • Ich hab sowieso das Konsolenfenster offen, hab ich mich zum debuggen schon so daran gewöhnt, unser Spiel ässt sich immer noch nur im Release-Modus ohne Debug-Symbole kompilieren 😉

    Das Problem liegt ziemlich eindeutig im Dtor der von Gtk::Window abgeleiteten Klassen (wave::WD und kampagne::WD):

    #include "gtk-header.h"
    #include "ed_wave.h"
    #include "ed_kamp.h"
    int main(int argc, char *argv[])
    {
        Gtk::Main kit(argc, argv);
        {
            wave::WD window1;
            {
                kampagne::WD window2;
                kit.run(window2);
            }//Hier stürzt es ab
            kit.run(window1);
        }
        std::cout << "TEST" << std::endl;
    }
    

  • Mod

    Tjo, wie sieht der Destruktor denn aus?



  • in der abgeleiteten Klasse steht de virtual ~WD(){} im Header - denkbar einfach

    EDIT://
    Fehler:
    Ich hatte aus der Glade-Datei manuell den obersten Container dem Fenster hinzugefügt (Gtk::Container::add() )
    Wenn ich diesen wieder per Gtk::Container::remove() entferne gehts wunderbar - wollten sich 2 Programmteile um die automatische freigabe kümmern


Anmelden zum Antworten