1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2013
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2013
    Messages : 67
    Points : 50
    Points
    50

    Par défaut Envoi d'une adresse de structure à une fonction callback

    Bonjour tout le monde :
    J'ai besoin d'envoyer plusieurs argument à travers la fonction callback, c'est ainsi que j'ai pensé de faire un test pour vérifier cette manipulation.
    J'ai fait ce programme :
    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
    34
    35
    #include <stdio.h>
    #include <gtk/gtk.h>
    typedef struct dat dat;
    struct dat 
    {
    		int i;
    		int j;
    };
    void func_callback (dat *number)
    {
    		printf ("%d %d\n", number->i, number->j);
    }
    void func_normal (dat *number)
    {
    		printf ("%d %d\n", number->i, number->j);
    }
    int main (int argc, char **argv)
    {
    		GtkWidget *window;
    		GtkWidget *button;
    		dat data;
    		gtk_init (&argc, &argv);
    		window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    		gtk_window_set_title (GTK_WINDOW(window), "struct_test");
    		gtk_window_set_default_size (GTK_WINDOW(window), 700, 700);
    		button = gtk_button_new_with_label ("button");
    		data.i = 10;
    		data.j = 20;
    		func_normal (&data);
    		g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(func_callback), &data);
    		gtk_container_add (GTK_CONTAINER(window), button);
    		gtk_widget_show_all (window);
    		gtk_main();
    		return 0;
    }
    dans le terminal je vois des résultats différents, la fonction callback reçoit le pointeur de structure d'une manière différente qu'une autre fonction normale !
    la fonction normale donne le résultat attendu, 10 et 20, alors que la première fonction donne des nombres aléatoires.
    Pourquoi ?
    Quelle est la solution pour envoyer plusieurs argument à une fonction callback ?
    Merci pour votre réponse.
    Merci pour votre temps que vous avez accordé à mon sujet.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 315
    Points : 1 979
    Points
    1 979

    Par défaut

    Bonjour,

    le problème vient du fait que tu ne respectes pas la signature de la callback.
    Regarde la documentation: chaque signal a une signature bien particulière. La signature d'une fonction, ce sont les paramètres d'entrée et de sortie. Pour le signal GtkButton::clicked, la signature est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void user_function (GtkButton *button, gpointer user_data)
    Or, tu as défini ta callback ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void func_callback (dat *number)
    Ce que tu reçois dans number est donc en fait le pointeur vers le widget boutton sur lequel tu as cliqué. Le pointeur vers ta structure de donnée est lui dans le gpointer user_data. Un gpointeur est juste un void *, c'est à dire un pointeur vers un objet dont on ne connaît pas le type.

    Respecte donc cette règle de base: lis la documentation du signal auquel tu te connectes pour savoir comment GTK+ va appeler ta fonction. Vous devez respecter les mêmes conventions, c'est à dire les mêmes nombres et type de paramètres d'entrée et de sortie.

    Il te faut donc écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void func_callback (GtkButton *button, gpointer user_data)
    {
       dat *number = user_data;
       printf ("%d %d\n", number->i, number->j);
    }
    Pour ce qui est de passer plusieurs arguments, tu as effectivement trouvé la solution tout seul, il suffit de les regrouper dans une structure.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

Discussions similaires

  1. Port fowarding depuis une adresse publique vers une adresse privée
    Par MrPchoun dans le forum Shell et commandes POSIX
    Réponses: 4
    Dernier message: 04/03/2017, 16h19
  2. Accéder à une adresse contenu dans une adresse
    Par Qooort dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 22/06/2013, 01h33
  3. Réponses: 7
    Dernier message: 06/05/2009, 13h05
  4. Réponses: 18
    Dernier message: 26/06/2008, 11h10
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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