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 un int par g_signal_connect


Sujet :

GTK+ avec C & C++

  1. #1
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 165
    Par défaut passer un int par g_signal_connect
    Bonjour,

    Je précise que j'ai lu des FAQ, des tuto et regarder dans des forums.

    Je suis conscient que cette question est souvent posé. Mais, je n'arrive pas à comprendre et reproduire les solutions proposé.

    Je n'ai besoin que de passer un paramètre à ma fonction. Ce dernier me permet via un case de réaliser la bonne action.

    Il me suffirais de créer une fonction par type d'action pour que cela fonctionne. Mais, je voudrais comprendre comment fonctionne le passage de paramètre.

    Voici mon appel à ma fonction dans le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int val=0;
    g_signal_connect(G_OBJECT(cBoutonA), "clicked" , G_CALLBACK(fonction), &val);
    val=1;
    g_signal_connect(G_OBJECT(cBoutonB), "clicked" , G_CALLBACK(fonction), &val);
    Puis ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void fonction (GtkWidget *p_widget, gpointer user_data) {
              int * laValeur = user_data;
              cout << laValeur << endl ;
    }

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    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 395
    Par défaut
    Bonjour, pourrais tu préciser le comportement que tu attends, et le comportement que tu obtiens à la place ?
    Est-ce que tu t'attends à voir afficher
    val = 0
    val = 1
    Et à la place tu obtiens ceci, c'est bien ça ?
    val = 1
    val = 1

  3. #3
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 165
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Bonjour, pourrais tu préciser le comportement que tu attends, et le comportement que tu obtiens à la place ?
    Est-ce que tu t'attends à voir afficher
    Bonjour,

    Merci de ta réponse.

    Le mieux, comme toujours, et un petit ECM que voici:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <gtk/gtk.h>
    #include <fstream>
    #include <iostream>
     
    using namespace std;
     
    // Déclaration des fonctions
    void fonction (GtkWidget *p_widget, gpointer user_data);
     
    // Programme principal
    int main(int argc,char **argv)
    {
    	GtkWidget* pWindow;
    	GtkWidget* pVBox;
    	GtkWidget* pHBox;
    	GtkWidget* pLabel;
    	GtkWidget* pBoutonMenu[3];
    	int valA=0;
    	int valB=1;
     
    	gtk_init(&argc,&argv);
     
    	// Création de la fenetre principale "pWindow"//
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(pWindow), "Parammètres");
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 640, 480);
    	/* fermeture de la fenetre par la croix en haut Ã* droite */
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
    	// Création de la boîte verticale "pVBox" principale et insertion ds la fenetre
    	pVBox = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(pWindow), GTK_WIDGET(pVBox));
    	/* Creation du label */
    	pLabel=gtk_label_new("Passage de Parammètres!");
    	gtk_box_pack_start(GTK_BOX(pVBox), pLabel, TRUE, TRUE, 0);
     
    	// Création de la boîte horizontal "pHBox
    	pHBox = gtk_hbox_new(TRUE, 0);
    	gtk_box_pack_start(GTK_BOX(pVBox), pHBox, FALSE, TRUE, 0);
     
    	/*insertion des bouton*/
    	pBoutonMenu[0] = gtk_button_new_with_mnemonic("_Valeur 0");
    	gtk_box_pack_start(GTK_BOX(pHBox), pBoutonMenu[0], TRUE, FALSE, 0);
    	pBoutonMenu[1] = gtk_button_new_with_mnemonic("_Valeur 1");
    	gtk_box_pack_start(GTK_BOX(pHBox), pBoutonMenu[1], TRUE, FALSE, 0);
    	g_signal_connect(G_OBJECT(pBoutonMenu[0]), "clicked" , G_CALLBACK(fonction) , &valA);
    	g_signal_connect(G_OBJECT(pBoutonMenu[1]), "clicked" , G_CALLBACK(fonction) , &valB);
     
    	/* Affichage de la fenêtre et de tout ce qu'il contient */
    	gtk_widget_show_all(pWindow);
     
    	gtk_main();
     
    	return 0;
    }
     
     
    // Fonction
     
    void fonction (GtkWidget *p_widget, gpointer user_data) {
    	cout << "Bouton:" << user_data << endl ; // le remplacement de user_data par *user_data n'est pas fonctionnel et empèche la compilation
    	// Parametre inutilisé
    	(void)p_widget;
    }
    Sans surprise, le résultat du code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Bouton:0x7ffc4ffd888c  // Lorsque l'on appuie sur le bouton 1
    Bouton:0x7ffc4ffd8888  // Lorsque l'on appuie sur le bouton 2
    Mon souhait est d'afficher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bouton:0  // Lorsque l'on appuie sur le bouton 1
    Bouton:1  // Lorsque l'on appuie sur le bouton 2
    En espérant avoir été plus clair.

  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
    Bonjour.

    Je ne me rappelle plus l’utilisation de cout mais si c’est comme avec printf(); alors il faut afficher la valeur de la variable pointé par le pointeur en utilisant le *.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Bouton :" << *user_data << endl;

  5. #5
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 165
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Bonjour.

    Je ne me rappelle plus l’utilisation de cout mais si c’est comme avec printf(); alors il faut afficher la valeur de la variable pointé par le pointeur en utilisant le *.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Bouton :" << *user_data << endl;
    Tout a fait. Mais, j'ai une erreur lorsque je fais cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: 'gpointer {aka void*}' is not a pointer-to-object type

  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
    Il doit falloir caster le pointeur en int pour l'afficher.

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    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 395
    Par défaut
    Plus explicitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void fonction (G_GNUC_UNUSED GtkButton *button, gpointer user_data) {
            int *value = user_data;
    	cout << "Bouton:" << *value << endl ;
    }

  8. #8
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 165
    Par défaut
    Merci de votre aide

  9. #9
    Membre chevronné Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut
    Bonjour à tous,

    Je me permet de proposer une autre solution qui n'utilise pas le déréférencement.

    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
    void fonction (G_GNUC_UNUSED GtkButton *button, gpointer user_data) {
    	cout << "Bouton:" << GPOINTER_TO_INT(user_data) << endl ;
    }
    void setup_widget(....) {
      int local_val;
     
      local_val = 0;
      g_signal_connect(G_OBJECT(pBoutonMenu[0]), "clicked" , G_CALLBACK(fonction) , GINT_TO_POINTER(local_val));
      local_val = 1;
      g_signal_connect(G_OBJECT(cBoutonB), "clicked" , G_CALLBACK(fonction), GINT_TO_POINTER(local_val));
    }
     
    main() {
      //int valA;
      setup_widget(....);
    }
    On pourrait même écrire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void fonction (G_GNUC_UNUSED GtkButton *button, int user_data) {
    	cout << "Bouton:" << user_data << endl ;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g_signal_connect(G_OBJECT(buttons[0]), "clicked" , G_CALLBACK(fonction), 0);// user_data = 0
    g_signal_connect(G_OBJECT(buttons[1]), "clicked" , G_CALLBACK(fonction), 1);// user_data = 1

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Comment passer une string "par référence" dans une fonction ?
    Par Plageman dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 11/11/2010, 15h01
  2. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28
  3. Réponses: 2
    Dernier message: 15/03/2005, 15h40
  4. découper un string par rapport à un char
    Par yarf dans le forum C++
    Réponses: 4
    Dernier message: 09/12/2004, 17h52
  5. problème our passer des string dans tableau d'int
    Par Battosaiii dans le forum C++
    Réponses: 9
    Dernier message: 15/07/2004, 17h42

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