[GTK] Problem bei übergabe von Parameter (Pointer auf eine Liste) bei g_signal_connect (drücken eines Buttons)



  • Hallo!

    Beim drücken eines Buttons soll etwas an die Funktion, die aufgerufen wird, übergeben werden. Leider funktioniert das bei mir nicht, beim drücken werden Zeile 52 und 53 ausgeführt. Immer wenn ich den Button drücke bekomme ich einen Segmentation Fault. Ohne Parameterübergabe bekomme ich das Segmentation fault nicht. Hab hier ein Programm gefunden wo eine Stringübergabe gezeigt wird - funktioniert auch. Nur leider kann ich das nicht auf mein Problem umlegen. Ich will ja einen Pointer auf eine Liste übergeben.

    MFG THE_ONE

    /*run with:  gcc filename.c -o filname `pkg-config --cflags --libs gtk+-2.0` */
    #include <stdio.h>
    #include <gtk/gtk.h>
    
    /* This is a callback function. The data arguments are ignored
     * in this example. More on callbacks below. */
    static void add_data_to_list( GtkWidget *widget, gpointer data)
    {  static int i=122;
        GtkTreeIter iter;
        GtkListStore *list = (GtkListStore *) data;
        gtk_list_store_append (GTK_LIST_STORE (list), &iter);
        gchar *msg = g_strdup_printf ("Message #%d", i++);
        gtk_list_store_set (GTK_LIST_STORE (list), 
    	                    &iter,
                                0, msg,
    	                    -1);
        g_free (msg);
        g_print ("Hello World\n");
    }
    ...
    int main( int   argc,
              char *argv[] )
    {
        GtkWidget *window;
        GtkWidget *list;
        GtkWidget *box1h;
        GtkWidget *box2h;
        GtkWidget *box1v;
        GtkWidget *button;
        GtkWidget *separator;
        GtkWidget *layout1;
    
        GtkListStore *liste;
    
        gtk_init (&argc, &argv);
    
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (window), "Scanner");
        g_signal_connect (G_OBJECT (window), "destroy",
    	              G_CALLBACK (gtk_main_quit), NULL);
        gtk_container_set_border_width (GTK_CONTAINER (window), 10);
        gtk_widget_set_size_request (GTK_WIDGET (window), 450, 400);
    ....
    .... 
    
        /* Connect button. */
        button = gtk_button_new_with_label ("Connect");
    
        /* When the button receives the "clicked" signal, it will call the
         * function hello() passing it NULL as its argument.  The hello()
         * function is defined above. */
        g_signal_connect (G_OBJECT (button), "clicked",
    		      G_CALLBACK (add_data_to_list),  liste);
    
        list = create_list (liste);
    .....
    ....
    
        gtk_widget_show (window);
    
        gtk_main ();
    
        return 0;
    }
    


  • Habe den fehler gefunden! -> Habe im Main zwar einen Pointer auf die Liste erstellt nicht aber die Liste selbst. Daher hat der Pointer ins Leere gezeigt. Was beim Aufruf einer Funktion auf die Liste in einem Segmentation Fault endete.
    Lösung (einfach das hier ins Main einfügen-einfach eine Liste erstellen):

    liste = gtk_list_store_new (1, G_TYPE_STRING);
    

Anmelden zum Antworten