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 :

Passer une structure en paramètre d'un g_signal_connect


Sujet :

GTK+ avec C & C++

Vue hybride

drhouse87 Passer une structure en... 28/12/2011, 17h12
gerald3d Tu ne respectes pas le... 28/12/2011, 18h44
drhouse87 Ah oui mince =/ J'ai donc... 28/12/2011, 19h31
gerald3d histoire d'être très prcéis... 28/12/2011, 20h46
drhouse87 C'est une fonction qui... 28/12/2011, 21h47
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Par défaut Passer une structure en paramètre d'un g_signal_connect
    Bonjour, tout le monde !

    Voilà j'essaye de faire passer une structure personnalisée dans un g_signal_connect mais j'ai quelques soucis...
    Voilà ma structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct param {
    	gpointer builder;
    	char *str[MAXELEMENTS];
    	int nb_str;
    	int entiers[MAXELEMENTS];
    	int nb_entiers;
    	FILE *file;
    } Param;
    Le but c'est de passer en argument le builder, plusieurs chaines de caractères et même des nombres...

    Voilà 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
    char remove_admin_aux(GtkBuilder *a, Param *param/){
    	g_print("%d\n",(*param).entiers[0]);
    	return '1';
    }
     
    /*Supprime un admin d'un fichier *admin */
    void remove_admin(FILE *admin, gpointer builder){
    	char str[MAXNOM]="\0";
    	int nb_lignes;
    	GtkButton *valide_supr = (GtkButton *) gtk_builder_get_object(builder, "valide_supr");
    	Param *param;
    	Param parametres;
    	param = &parametres;
    	nb_lignes = compte_lignes(admin);
    	(*param).builder = builder;
    	(*param).nb_str = 2;
    	(*param).str[0] = str;	
    	(*param).entiers[0] = nb_lignes;
    	(*param).nb_entiers = 1;
    	(*param).file = admin;
    	printf("nb_lignes= %d\n",nb_lignes);
    	g_signal_connect(valide_supr, "clicked",
            G_CALLBACK(remove_admin_aux), param);
    Et voilà ce que j'obtiens dans un terminal :
    Je ne comprend pas pourquoi je n'obtiens pas "3"...

    Merci pour vos réponses
    Ludo

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Tu ne respectes pas le prototype du CallBack associé au signal "clicked". Regarde ici pour de plus amples détails.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Par défaut
    Ah oui mince =/

    J'ai donc changé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char remove_admin_aux(GtkButton *button, gpointer param){
    	g_print("%d\n",param.entiers[0]);
    	return '1';
    }
    Mais du coup je ne sais pas comment accéder à mes différents champs...

    J'avais vu ta précédente réponse :
    Citation Envoyé par gerald3d Voir le message
    Ton problème est très simple et bien sûr très classique. Chaque signal de chaque widget demande un prototype de CALLBACK approprié. Pour le signal "value-changed" d'un GtkRange le prototype est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void                user_function                      (GtkRange *range,
                                                            gpointer  user_data)
    Change ta fonction void fStatutGliss_1(DeuxPointeurs* data); en void fStatutGliss_1(GtkRange *range, DeuxPointeurs* data); et là tu pourras accéder à ton pointeur de structure.
    Du coup j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void remove_admin_aux(GtkButton *button, Param *param){
    g_print("%d\n",(*param).entiers[0]);
    }
    Mais j'obtiens toujours 32767

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    histoire d'être très prcéis le prototype du CallBack lié au signal "Clicked" ne renvoie rien. Donc ta fonction ne doit pas commencer par "char" mais par void.

    Ensuite commences par affecter une valeur fixe à entiers[0] pour voir si tu la récupères dans le CallBack. Ne sachant pas ce que doit retourner compte_lignes(admin); je suis toujours soupçonneux .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Par défaut
    C'est une fonction qui renvoie un entier, mais c'est vrai que j'aurai du la poster aussi, j'ai complètement oublié, désolé...

    Sinon, quelque soit la valeur choisit j'ai toujours 32767 comme réponse...
    (Je trouve ça bizarre car c'est même pas un nombre aléatoire, comme une adresse de pointeur ou quelque chose comme ça...)

    Update : Si je ne passe pas par la fonction "g_signal_connect" mais que je fais un appel direct à "remove_admin_aux" cela marche bien...

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Toutes mes excuses. En reprenant ton code je viens de voir le problème qui me crevait les yeux.

    Tu déclares un variable locale de type Param. Malheureusement pour toi cette variable est désallouée dés que la fonction void remove_admin(FILE *admin, gpointer builder); se termine. Tu obtiens donc des valeurs aléatoires même si certaines peuvent paraître justes.

    La seule solution qu'il te reste est d'allouer dynamiquement la variable parametres. Cette allocation va t'obliger à ne pas oublier de la libérer lorsque son utilisation sera devenue obsolète.

Discussions similaires

  1. Gtk: problème pour passer une structure en paramètres
    Par C_Chaou dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 19/04/2007, 19h29
  2. Comment passer une procédure en paramètre ?
    Par gudul dans le forum Langage
    Réponses: 4
    Dernier message: 30/09/2005, 13h57
  3. Réponses: 1
    Dernier message: 15/04/2005, 11h30
  4. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58
  5. Passer une procédure en paramètre ?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2003, 12h21

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