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 :

Fonction callback avec arguments ?


Sujet :

GTK+ avec C & C++

  1. #21
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Oui c'est bien un tableau de pointeurs.

    Voici la fonction corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void connection(GtkWidget* pBoutonConnection,gpointer data)
    {
      GtkWidget* tab = (GtkWidget*)data;
      printf("%s\n",gtk_entry_get_text(GTK_ENTRY(tab[0])));
    }
    Son appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(pBoutons[0]),"clicked",G_CALLBACK(connection),pZSaisies);
    Erreur à la compilation :
    client.c: In function ‘connection’:
    client.c:6: erreur: ne peut convertir en un type pointeur
    make: *** [client.o] Erreur 1
    Edit :
    La déclaration du tableau de pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkWidget* pZSaisies[3];

  2. #22
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    Oui c'est bien un tableau de pointeurs.

    Voici la fonction corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void connection(GtkWidget* pBoutonConnection,gpointer data)
    {
      GtkWidget* tab = (GtkWidget*)data;
      printf("%s\n",gtk_entry_get_text(GTK_ENTRY(tab[0])));
    }
    cast inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void connection(GtkWidget* pBoutonConnection,gpointer data)
    {
      GtkWidget* tab = data;
      printf("%s\n",gtk_entry_get_text(GTK_ENTRY(tab[0])));
    }
    Erreur à la compilation :
    client.c: In function ‘connection’:
    client.c:6: erreur: ne peut convertir en un type pointeur
    make: *** [client.o] Erreur 1
    A quel ligne de code correspond l'erreur ?

  3. #23
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Erreur à la compilation :
    client.c: In function ‘connection’:
    client.c:6: erreur: ne peut convertir en un type pointeur
    make: *** [client.o] Erreur 1
    A quel ligne de code correspond l'erreur ?
    La ligne du printf.

  4. #24
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    Citation Envoyé par Emmanuel Delahaye
    Erreur à la compilation :
    client.c: In function ‘connection’:
    client.c:6: erreur: ne peut convertir en un type pointeur
    make: *** [client.o] Erreur 1
    A quel ligne de code correspond l'erreur ?
    La ligne du printf.
    La conversion n'est peut être pas possible. Je ne sais pas ce que fait la macro, ni quelles sont ses précautions d'emploi.

  5. #25
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Bon je vais laisser tomber les tableaux et essayer en mettant tous mes objets dans une structure. J'espere que ça passera.

  6. #26
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Voici ce que ça donne avec une structure :

    La structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct
      {
        GtkWidget* pFenetrePrincipale;
        GtkWidget* pZSaisieIP;
        GtkWidget* pZSaisiePort;
        GtkWidget* pZSaisieMsg;
        GtkWidget* pBoutonConnection;
      } Fenetre;
      Fenetre maFenetre;
    L'appel de la fonction callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(maFenetre.pBoutonConnection),"clicked",G_CALLBACK(connection),&maFenetre);
    Le fonction callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void connection(GtkWidget* pBoutonConnection,gpointer data)
    {
      printf("%s\n",gtk_entry_get_text(GTK_ENTRY(data.pZSaisieIP)));
    }
    Ca ne passe pas la compil'
    client.c: In function ‘connection’:
    client.c:6: erreur: request for member ‘pZSaisieIP’ in something not a structure or union
    make: *** [client.o] Erreur 1

  7. #27
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    tion callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void connection(GtkWidget* pBoutonConnection,gpointer data)
    {
      printf("%s\n",gtk_entry_get_text(GTK_ENTRY(data.pZSaisieIP)));
    }
    Ca ne passe pas la compil'
    Ben oui. Encore une fois, il faut passer par un pointeur du bon type. Ensuite, ce sera '->' et non '.'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void connection(GtkWidget* pBoutonConnection,gpointer data)
    {
      Fenetre *p_fenetre = data;
      printf("%s\n",gtk_entry_get_text(GTK_ENTRY(p_fenetre->pZSaisieIP)));
    }
    Mais je ne sais toujours pas ce qu'attend la macro, donc AMA, on a rien changé...

  8. #28
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Impossible de déclarer un pointeur sur Fenetre dans la fonction car la structure est definit dans le main..

  9. #29
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    J'ai mis la structure dans le .h de mon projet.
    Maintenant cela fonctionne parfaitement.
    C'est bizarre qu'en passant par un tableau ça marchait pas
    J'aurais préféré par tableau car ma fonction n'utilise que 2 champs de la structure (qui en comporte en tout 11), donc lui passer une structure aussi grosse pour en exploiter que 2 champs c'est un peu du gachis, non ?

  10. #30
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    Impossible de déclarer un pointeur sur Fenetre dans la fonction car la structure est definit dans le main..
    Et ? Quel est le problème ?

  11. #31
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60
    Impossible de déclarer un pointeur sur Fenetre dans la fonction car la structure est definit dans le main..
    Et ? Quel est le problème ? Tout ce qui est dans le main() existe pendant l'exécution du programme.
    Eh bien quand je fais :
    dans ma fonction, j'ai le droit à :
    client.c:6: erreur: ‘Fenetre’ undeclared (first use in this function)

  12. #32
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    J'ai mis la structure dans le .h de mon projet.
    Maintenant cela fonctionne parfaitement.
    C'est bizarre qu'en passant par un tableau ça marchait pas
    J'aurais préféré par tableau car ma fonction n'utilise que 2 champs de la structure (qui en comporte en tout 11), donc lui passer une structure aussi grosse pour en exploiter que 2 champs c'est un peu du gachis, non ?
    Mais non. Tu as passé l'adresse de la structure. Il n'y a aucun gachis.

    Tout ça, ce sont des notions assez élémentaires, je me demande pourquoi tu butes là-dessus...

  13. #33
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60
    Impossible de déclarer un pointeur sur Fenetre dans la fonction car la structure est definit dans le main..
    Et ? Quel est le problème ? Tout ce qui est dans le main() existe pendant l'exécution du programme.
    Eh bien quand je fais :
    dans ma fonction, j'ai le droit à :
    client.c:6: erreur: ‘Fenetre’ undeclared (first use in this function)
    Il faut évidemment que la définition de la structure soit visible... Les headers, c'est fait pour ça...

  14. #34
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Oui en effet je ne m'en suis souvenu qu'apres que les definitions des structures avaient leur place dans les .h.

    Je met la tagg résolu ou on essaye de trouver pourquoi cela ne fonctionnait pas avec un tableau de pointeurs ?

  15. #35
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Moi je dirais : tu essayes de trouver pourquoi...

  16. #36
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Médinoc
    Citation Envoyé par Emmanuel Delahaye
    Le langage C ne garantit pas qu'un int tienne dans un pointeur et inversement. On pourrait très bien avoir un int 32-bit et un pointeur 16-bit.
    Par contre, certaines API utilises des types définis exprès pour cela (INT_PTR chez Microsoft, et il doit y avoir la même chose pour diverses APIs ou Libs utilisant des callbacks...
    La glib propose aussi cette fonctionnalité : GINT_TO_POINTER()
    Mais c'est bien précisé :
    YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE IN ANY WAY SHAPE OR FORM
    Pour repasser en entier : GPOINTER_TO_INT()

  17. #37
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    mais là, INT_PTR est un type, garanti assez grand pour contenir l'un ou l'autre, pas une macro de conversion hasardeuse...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #38
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc
    mais là, INT_PTR est un type, garanti assez grand pour contenir l'un ou l'autre, pas une macro de conversion hasardeuse...
    ... pour une plateforme particulière (Wintel). Ce n'est pas standard.

  19. #39
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    En effet ce n'est pas standard.
    Mais des libs portables peuvent très bien faire la même chose, par contre. Ensuite, la définition du type est platform-dependent, pas son utilisation (en règle général, c'est l'avantage des typedefs).

    Mais en l'absence de tels types pour une librarie/plate-forme, mieux vaut éviter de stocker des entiers dans des pointeurs et vice-versa, en effet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #40
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par David.Schris
    Moi je dirais : tu essayes de trouver pourquoi...
    T'inquiete pas c'est ce que je fais.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. fonction callback avec arguments
    Par YuGiOhJCJ dans le forum GTK+ avec C & C++
    Réponses: 12
    Dernier message: 12/04/2013, 08h42
  2. appel fonction javascript avec argument null
    Par cecile38 dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 12/01/2011, 10h54
  3. Réponses: 11
    Dernier message: 20/11/2010, 13h08
  4. libsigc++ : attaché une callback avec argument
    Par tinram dans le forum Linux
    Réponses: 0
    Dernier message: 16/01/2009, 18h30
  5. [Dates] fonction date avec argument timestamp
    Par nicoda dans le forum Langage
    Réponses: 3
    Dernier message: 31/01/2008, 16h55

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