IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

g_signal_connect et data


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Par défaut g_signal_connect et data
    bonjour, je débute avec gtk et je ne comprend vraiment pas comment la fonction g_signal_connect fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK( affiche_lettre ), s);
    En effet je souhaite utiliser le troisième argument "s" dans ma fonction callback mais impossible.

    En faisant deux printf ( je sais c pas bien faut utiliser le débugger ), l'un dans ma fonction appellante et un autre dans la fonction appellée par g_signal_connect(), je me rend compte que le pointeur transmit en troisieme argument à g_signl_connect et celui que je récupère dans ma callback ne sont pas les mêmes, je vien de me faire les 4 première pages de google et je comprend pas pourquoi ca marche pas chez moi.
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void
    affiche_lettre(GtkWidget * widget, gpointer data)
    {
     
        printf("callback : %p %s\n",data,(char *)data);
     
        gtk_main();
    }
     
    int main(int argc, char **argv)
    {
        /* Variables */
        GtkWidget * MainWindow = NULL;
     
        /* Initialisation de GTK+ */
        gtk_init(&argc, &argv);
     
        /* Création de la fenêtre */
        MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
        char * s="toto";
        printf("main :  %p %s\n",s,s);
     
        g_signal_connect_(G_OBJECT(MainWindow), "delete-event", G_CALLBACK( affiche_lettre ),s );
     
        /* Affichage et boucle événementielle */
        gtk_widget_show_all(MainWindow);
        gtk_main();
     
        /* Fermeture de GTK+ */
        gtk_exit(EXIT_SUCCESS);
        return EXIT_SUCCESS;
    }
    des idées ?

  2. #2
    Nouveau candidat au Club
    Inscrit en
    Mai 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 2
    Par défaut g_signal_connect, quelqu'un comprend ?
    apres avoir longtemps cherché, je me rend compte que la fonction g_signal_connect me fait des truc bizarres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(pWindow), "delete-event", G_CALLBACK(on_copier_button), pLabel);
    pWindow est un GtkWidget *, si pLabel n'est pas une variable static j'ai une erreur de conversion, GTK_IS_LABEL provoque un assert.
    si pLabel est une variable static, pas de problemes, ca contourne le probleme mais c'est pas tres propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(pWindow), "focus-in-event", G_CALLBACK(on_copier_button), pLabel);
    me donne un core dumped.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(pButton), "clicked", G_CALLBACK(on_copier_button), pLabel);
    avec pLabel en variable locale et pButton un GtkButton * fonctionne.

    Quelqu'un a-t-il une idée du pourquoi du comment ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Essaye d'allouer de la mémoire avec un malloc avant d'y mettre une chaine.
    Je suis plus très sûr mais je crois que quand tu initialises une chaine comme tu le fais, la mémoire est allouée dans la pile.
    Et généralement les arguments des callbacks passent mieux quand ils sont alloués dans le tas.
    Enfin, il vaut mieux caster ton argument avec (gpointer) dans ton appel à g_signal_connect, là encore ça aide à faire passer la pilule

    Aucune garantie que c'que j'te dis va résoudre le problème, mais si j'avais ce bug, j'commencerais par là

Discussions similaires

  1. Import data d'Excel ds 2 table lié par clé primaire
    Par lord_paco dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 10/05/2005, 09h31
  2. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46
  3. import de bd access 97 => sqlserveur : Data overf
    Par neo.51 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2003, 15h17
  4. Query data set
    Par Sandra dans le forum JBuilder
    Réponses: 3
    Dernier message: 20/01/2003, 10h08
  5. [Pointer]Treeview.Data
    Par rbag dans le forum Composants VCL
    Réponses: 7
    Dernier message: 31/08/2002, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo