GTK+ - Segmentation fault



  • Hallo!
    Ich versuche gerade, mit GTK einen grafischen Zufallszahlengenerator zu programmieren. Dazu verwende ich Code:Blocks. Das GUI hat schon funktioniert, jedoch hatte ich einige Probleme mit der Übergabe von Argumenten an die Callback-Funktion.
    (ich glaube, dass dabei immer noc das Problem liegt). Jetzt habe ich auch die Callback-Funktion für den Button geschrieben, aber immer wenn ich das Programm starte, zeigt mir GDB einen Segmentation fault in main an.
    Hier die komplette debugger-Meldung:

    #0 0x627626e7	g_type_check_instance_cast (??:??)
    #1 0x00401756	main (??:??)
    

    Ich habe dasselbe auch probiert, indem ich ein struct mi 3 GtkWidget*-Membern erstelle, aber leider tritt auch hier dasselbe Problem auf.
    Hier mein Code (tut mir leid, dass es so vel ist, aber ich befürchte, sonst ist
    es sinnlos:

    //#define _WIN32_WINNT
    #include <gtk/gtk.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sstream>
    #include <string>
    
    using namespace std;
    
    void processOkButtonClick(GtkWidget *button, gpointer data)
    {
    
        GtkWidget *fromEntry = (GtkWidget*) g_object_get_data(G_OBJECT(button), "fromEntry");
        GtkWidget *toEntry = (GtkWidget*) g_object_get_data(G_OBJECT(button), "toEntry");
        GtkWidget *resultEntry = (GtkWidget*) g_object_get_data(G_OBJECT(button), "resultEntry");
    
        unsigned int from = atoi(gtk_entry_get_text(GTK_ENTRY(fromEntry)));
        unsigned int to = atoi(gtk_entry_get_text(GTK_ENTRY(toEntry)));
        srand(time(0));
        unsigned int random = rand();
        random += from;
        random %= to;
        if(random < from) {random += from;}
        stringstream ss;
        ss << random;
        //Set resultEntrys value to random
        gtk_entry_set_text(GTK_ENTRY(resultEntry), ss.str().c_str());
    }
    
    int main(int argc, char *argv[])
    {
        //Windows, Sizers
        GtkWidget *window;
        GtkWidget *fixed;
        //Labels
        GtkWidget *fromLabel;
        GtkWidget *toLabel;
        //Entrys
        GtkWidget *fromEntry;
        GtkWidget *toEntry;
        GtkWidget *resultEntry;
        //Buttons
        GtkWidget *okButton;
    
        gtk_init(&argc, &argv);
    
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
        //set parameter data
        g_object_set_data(G_OBJECT(okButton), "fromEntry", fromEntry);
        g_object_set_data(G_OBJECT(okButton), "toEntry", toEntry);
        g_object_set_data(G_OBJECT(okButton), "resultEntry", resultEntry);
    
        g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (gtk_main_quit),  NULL);
        g_signal_connect(G_OBJECT(okButton), "clicked", G_CALLBACK (processOkButtonClick), okButton);
    
        //Container
        fixed = gtk_fixed_new ();
        gtk_container_add (GTK_CONTAINER (window), fixed);
        gtk_widget_show (fixed);
    
        //Init
        fromLabel = gtk_label_new("Von:");
        toLabel = gtk_label_new("Bis:");
        fromEntry = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(fromEntry), "1");
            gtk_entry_set_max_length(GTK_ENTRY(fromEntry), 5);
            gtk_entry_set_width_chars(GTK_ENTRY(fromEntry), 5);
        toEntry = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(toEntry), "100");
            gtk_entry_set_max_length(GTK_ENTRY(toEntry), 5);
            gtk_entry_set_width_chars(GTK_ENTRY(toEntry), 5);
        resultEntry = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(resultEntry), "100");
            gtk_entry_set_max_length(GTK_ENTRY(resultEntry), 10);
            gtk_entry_set_width_chars(GTK_ENTRY(resultEntry), 10);
            gtk_entry_set_editable(GTK_ENTRY(resultEntry), false);
        okButton = gtk_button_new_with_label("OK");
            gtk_widget_set_size_request(GTK_WIDGET(okButton), 200, 30);
    
        //Show Widgets in Container
        gtk_fixed_put(GTK_FIXED(fixed), fromLabel, 5, 5);
        gtk_fixed_put(GTK_FIXED(fixed), toLabel, 100, 5);
        gtk_fixed_put(GTK_FIXED(fixed), fromEntry, 40, 5);
        gtk_fixed_put(GTK_FIXED(fixed), toEntry, 135, 5);
        gtk_fixed_put(GTK_FIXED(fixed), okButton, 10, 40);
        gtk_fixed_put(GTK_FIXED(fixed), resultEntry, 50, 80);
    
        gtk_widget_show(fromLabel);
        gtk_widget_show(toLabel);
        gtk_widget_show(fromEntry);
        gtk_widget_show(toEntry);
        gtk_widget_show(okButton);
        gtk_widget_show(resultEntry);
    
        //Resize and Show Window
        gtk_window_set_default_size(GTK_WINDOW(window), 210, 200);
        gtk_widget_show(window);
        gtk_main();
        return 0;
    }
    

    Was ist mein Fehler?

    Danke im Voraus, Golem



  • Hi,

    du musst deine Widgets (in dem Fall u.a. okButton) schon instantiieren, bevor du sie nutzt...
    Es war zwar eine gute Idee, die Widgets so spät wie möglich zu instantiieren, aber spätestens vor dem ersten Zugriff sollte dies passiert sein 😉

    Ich hab' einfach mal alle Widgets an den Anfang gestellt hier:

    //#define _WIN32_WINNT
    #include <gtk/gtk.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sstream>
    #include <string>
    
    using namespace std;
    
    void processOkButtonClick(GtkWidget *button, gpointer data)
    {
    
    	GtkWidget *fromEntry = (GtkWidget*) g_object_get_data(G_OBJECT(button), "fromEntry");
    	GtkWidget *toEntry = (GtkWidget*) g_object_get_data(G_OBJECT(button), "toEntry");
    	GtkWidget *resultEntry = (GtkWidget*) g_object_get_data(G_OBJECT(button), "resultEntry");
    
    	unsigned int from = atoi(gtk_entry_get_text(GTK_ENTRY(fromEntry)));
    	unsigned int to = atoi(gtk_entry_get_text(GTK_ENTRY(toEntry)));
    	srand(time(0));
    	unsigned int random = rand();
    	random += from;
    	random %= to;
    	if(random < from) {random += from;}
    	stringstream ss;
    	ss << random;
    	//Set resultEntrys value to random
    	gtk_entry_set_text(GTK_ENTRY(resultEntry), ss.str().c_str());
    }
    
    int main(int argc, char *argv[])
    {
        gtk_init(&argc, &argv);  //Kommt immer als erstes!
    
    	//Windows, Sizers
    	GtkWidget *window;
    	GtkWidget *fixed;
    	//Labels
    	GtkWidget *fromLabel;
    	GtkWidget *toLabel;
    	//Entrys
    	GtkWidget *fromEntry;
    	GtkWidget *toEntry;
    	GtkWidget *resultEntry;
    	//Buttons
    	GtkWidget *okButton;	
    
    	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	okButton = gtk_button_new_with_label("OK");
    	fixed = gtk_fixed_new ();
    	fromEntry = gtk_entry_new();
    	toEntry = gtk_entry_new();
    	resultEntry = gtk_entry_new();
    
    	//set parameter data
    	g_object_set_data(G_OBJECT(okButton), "fromEntry", fromEntry);
    	g_object_set_data(G_OBJECT(okButton), "toEntry", toEntry);
    	g_object_set_data(G_OBJECT(okButton), "resultEntry", resultEntry);
    
    	g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (gtk_main_quit),  NULL);
    	g_signal_connect(G_OBJECT(okButton), "clicked", G_CALLBACK (processOkButtonClick), okButton);
    
    	//Container
    
    	gtk_container_add (GTK_CONTAINER (window), fixed);
    	gtk_widget_show (fixed);
    
    	//Init
    	fromLabel = gtk_label_new("Von:");
    	toLabel = gtk_label_new("Bis:");
    
    	gtk_entry_set_text(GTK_ENTRY(fromEntry), "1");
    	gtk_entry_set_max_length(GTK_ENTRY(fromEntry), 5);
    	gtk_entry_set_width_chars(GTK_ENTRY(fromEntry), 5);
    
    	gtk_entry_set_text(GTK_ENTRY(toEntry), "100");
    	gtk_entry_set_max_length(GTK_ENTRY(toEntry), 5);
    	gtk_entry_set_width_chars(GTK_ENTRY(toEntry), 5);
    
    	gtk_entry_set_text(GTK_ENTRY(resultEntry), "100");
    	gtk_entry_set_max_length(GTK_ENTRY(resultEntry), 10);
    	gtk_entry_set_width_chars(GTK_ENTRY(resultEntry), 10);
    	gtk_entry_set_editable(GTK_ENTRY(resultEntry), false);
    
    	gtk_widget_set_size_request(GTK_WIDGET(okButton), 200, 30);
    
    	//Show Widgets in Container
    	gtk_fixed_put(GTK_FIXED(fixed), fromLabel, 5, 5);
    	gtk_fixed_put(GTK_FIXED(fixed), toLabel, 100, 5);
    	gtk_fixed_put(GTK_FIXED(fixed), fromEntry, 40, 5);
    	gtk_fixed_put(GTK_FIXED(fixed), toEntry, 135, 5);
    	gtk_fixed_put(GTK_FIXED(fixed), okButton, 10, 40);
    	gtk_fixed_put(GTK_FIXED(fixed), resultEntry, 50, 80);
    
    	gtk_widget_show(fromLabel);
    	gtk_widget_show(toLabel);
    	gtk_widget_show(fromEntry);
    	gtk_widget_show(toEntry);
    	gtk_widget_show(okButton);
    	gtk_widget_show(resultEntry);
    
    	//Resize and Show Window
    	gtk_window_set_default_size(GTK_WINDOW(window), 210, 200);
    	gtk_widget_show(window);
    	gtk_main();
    	return 0;
    }
    

    Cheers

    GPC



  • Vielen Dank, das hilft mir enorm!

    mfg, Golem


Anmelden zum Antworten