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 seinIch 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