C und GTK g_signal_connect



  • Hi,

    ich arbeite mich gerade etwas in C ein und versuche mir mit GTK+ eine GUI zu bauen. Das klappt auch schon so weit ganz gut, nur leider habe ich ein Problem mit dem g_signal_connect und den Übergabparametern.

    Ich habe schon hier im Forum gesucht, aber keine passende Antwort gefunden.

    Mein Programm ich habe hier ein kleines Fenster auf dem 3 Buttons sind.
    Dieses Fenster wird in meiner main-Prozedur aufgebaut.
    Beim Klick auf den Button btnConvert soll ein der Inhalt eines char-Array in der Konsole ausgegeben werden.

    Leider schaffe ich es nicht das char-Array an die Methode die durch das g_signal_connect beim Klicken auf den Button ausgelöst wird zu übergeben.

    Folgender Code:
    main() (gekürzt)

    //Fenster
    	GtkWidget *window;
    
    	//Buttons
    	GtkWidget *btnEnde;
    	GtkWidget *btnOpen;
    	GtkWidget *btnConvert;
    	GtkWidget *fraDown;
    	GtkWidget *lblPath;
    	GtkWidget *entPath;
    
    	//Pfad Variable
    	char picPath[] = "Die Uebergabe klappt...\n";
    	g_print("%s",picPath);
    
    	gtk_init(&argc, &argv);
    
        //Button umbenennen mit Funktion versehen
        g_signal_connect(G_OBJECT (btnConvert), "clicked", G_CALLBACK (button_btnConvert_press), &picPath);
    
        gtk_main();
    
        return (EXIT_SUCCESS);
    

    Methode button_btnConvert_press:

    int button_btnConvert_press( GtkWidget *widget, GdkEventButton *event, char *data[])
    {
    	char tmp[] = "Das ist ein Test";
    	int tmpLength = sizeof(tmp);
    	int dataLength = sizeof(*data);
    
    	g_print("Hallo Welt!\n");
            g_print("%s\n",tmp);
            g_print("%s\n",*data);
    	g_print("Leange des tmp-Arrays: %d\n",tmpLength);
    	g_print("Leange des data-Arrays: %d\n",dataLength);
        return 0;
    }
    

    Die Ausgabe von Data ist leer, und die Länge ist immer gleich acht.
    Ich versuche gerade noch die Sache mit den Pointern zu verstehen 😉 .
    Wie kann ich hier den Inhalt von data der Variable tmp zuweisen?

    Ich habe auch schon versucht das data als normales char-Array und nicht als Pointer zu übergeben, aber dabei hatte ich den selben Effekt (der Aufruf der Methode erfolgte dann nicht als Speicheradresse, sonder als normale Variable).

    Hoffe ich habe mich verständlich ausgedrückt.

    Vielen Dank für eure Hilfe und schönen Abend noch.

    lg,
    Fabi++



  • Dein Problem ist nicht GTK+, sondern dass du Pointer und Arrays in C noch nicht gut genug verstehst. `

    sizeof(*data)` ist immer 8, weil *data ein Pointer auf einen Pointer ist. Und der ist auf deinem Rechner immer 8 Byte. Übrigens lässt sich im Nachhinein die Länge eines Array nicht mehr feststellen. Die musst du irgendwo speichern.

    Versuch mal:

    g_signal_connect(G_OBJECT (btnConvert), "clicked", G_CALLBACK (button_btnConvert_press), picPath);
    

    (ohne den Adress-Operator)

    int button_btnConvert_press( GtkWidget *widget, GdkEventButton *event, char *data)
    {
        g_print("%s\n", data);
        return 0;
    }
    


  • @ProgChild: Vielen Dank für deine Hilfe, das werde ich morgen gleich ausprobieren und mich dann nochmal melden.

    lg,
    Fabi++


Anmelden zum Antworten