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 :

petite question sur les gpointers et les cast


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut petite question sur les gpointers et les cast
    bonjour,

    je n' arrive pas à comprendre un point (sûrement simple mais ça m' échappe):
    Dans mon source j' ai une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonct (GtkWidget *menuitem, gpointer data);
    Le problème c' est que la manière de passer la variable data diffère selon que je la passe depuis un callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gboolean boo = TRUE;
    g_signal_connect (G_OBJECT (..), signal, G_CALLBACK (fonct), (gpointer) &boo);
    ou depuis un appel simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gboolean boo = TRUE;
    fonct (NULL, (gpointer) boo);
    Pourquoi ne puis-je pas aussi caster '(gpointer) boo' dans le callback ?
    Merci

    ah oui, dans la fonction je récupère la variable en castant simplement ainsi :
    gboolean boo = (gboolean) data;

  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 : 54
    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
    gpointer n'est autre qu'un void*. C'est une simple redéfinition de type.

    Pour passer une variable locale à une fonction en utilisant les pointeurs il suffit simplement d'utiliser l'argument "&".

    J'écrirais donc pour tes deux exemples ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gboolean boo = TRUE;
    g_signal_connect (G_OBJECT (..), signal, G_CALLBACK (fonct), &boo);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gboolean boo = TRUE;
    fonct (NULL, &boo);
    La fonction appelée pourra traiter l'argument de deux manières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fonct (GtkWidget *menuitem, gpointer data)
    {
      gboolean *boo = (gboolean*)data;
      ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fonct (GtkWidget *menuitem, gboolean *boo)
    {
      // boo est utilisable directement.
      ...
    }

    Remarque:
    Tout ceci est vrai en C. En C++ le casting directe n'est pas conseillé.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    Merci,

    c' est plus clair désormais, je ne sais pas pourquoi je me suis embrouillé.
    En revanche je n' aurais jamais osé faire un cast direct, je pensais que le C était plutôt rigide dans ce genre de cas.

  4. #4
    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
    Citation Envoyé par echantillon Voir le message
    En revanche je n' aurais jamais osé faire un cast direct, je pensais que le C était plutôt rigide dans ce genre de cas.
    En fait, tu peux caster du void* en n'importe quel type de pointeur. Le cast peut aussi se faire de manière implicite, et pas explicite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fonct (GtkWidget *menuitem, gpointer data)
    {
        gboolean *boo = data;
        ...
    }
    C'est d'ailleurs ce qui se passe quand tu altères directement le type dans le prototype de la fonction.

Discussions similaires

  1. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 00h48
  2. Réponses: 2
    Dernier message: 28/07/2007, 01h21
  3. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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