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++

Vue hybride

sorry60 Fonction callback avec... 06/11/2005, 12h46
Emmanuel Delahaye Re: [GTK] Fonction callback... 06/11/2005, 13h25
Trap D C'est peut-être aussi... 06/11/2005, 13h37
Emmanuel Delahaye Quelle horreur ! C'est pas... 06/11/2005, 13h38
Trap D Ah bon :?: :!: Dans quel... 06/11/2005, 13h41
Nasky Tu ne peux utiliser que des... 06/11/2005, 13h43
Emmanuel Delahaye Le langage C ne garantit pas... 06/11/2005, 13h44
Trap D Merci de l'info, je ne le... 06/11/2005, 13h52
sorry60 Merci pour votre aide, j'ai... 06/11/2005, 14h13
Médinoc Par contre, certaines API... 06/11/2005, 14h28
Emmanuel Delahaye Evidemment, tu ne peux pas... 06/11/2005, 14h30
sorry60 Je ne suis pas sur d'avoir... 06/11/2005, 14h52
sorry60 L'erreur doit etre ailleurs... 06/11/2005, 15h03
Emmanuel Delahaye Quel est le type attendu par... 06/11/2005, 15h04
sorry60 En effet gtk_entry_get_text... 06/11/2005, 15h22
Emmanuel Delahaye alors il fait lui passer ce... 06/11/2005, 15h25
sorry60 Je lui ai passé ce qu'il... 06/11/2005, 15h32
sorry60 J'ai testé en mettant dans le... 06/11/2005, 15h38
sorry60 Ca marche aussi parfaitement... 06/11/2005, 15h56
Emmanuel Delahaye C'est un tableau de pointeurs... 06/11/2005, 15h58
sorry60 Oui c'est bien un tableau de... 06/11/2005, 16h02
Emmanuel Delahaye cast inutile. void... 06/11/2005, 16h10
sorry60 La ligne du printf. 06/11/2005, 16h13
Emmanuel Delahaye La conversion n'est peut être... 06/11/2005, 16h56
sorry60 Bon je vais laisser tomber... 06/11/2005, 16h58
sorry60 Voici ce que ça donne avec... 06/11/2005, 17h48
Emmanuel Delahaye Ben oui. Encore une fois, il... 06/11/2005, 17h56
sorry60 Impossible de déclarer un... 06/11/2005, 17h57
sorry60 J'ai mis la structure dans le... 06/11/2005, 18h09
Emmanuel Delahaye Et ? Quel est le problème ? 06/11/2005, 18h10
sorry60 Eh bien quand je fais : ... 06/11/2005, 18h11
Emmanuel Delahaye Mais non. Tu as passé... 06/11/2005, 18h12
Emmanuel Delahaye Il faut évidemment que la... 06/11/2005, 18h13
sorry60 Oui en effet je ne m'en suis... 06/11/2005, 18h15
David.Schris Moi je dirais : tu essayes de... 07/11/2005, 02h38
gege2061 La glib propose aussi cette... 07/11/2005, 09h05
Médinoc mais là, INT_PTR est un type,... 07/11/2005, 09h38
Emmanuel Delahaye ... pour une plateforme... 07/11/2005, 09h47
Médinoc En effet ce n'est pas... 07/11/2005, 09h54
sorry60 T'inquiete pas c'est ce que... 07/11/2005, 10h41
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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. #2
    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. #3
    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. #4
    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. #5
    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. #6
    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. #7
    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. #8
    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. #9
    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. #10
    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. #11
    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. #12
    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. #13
    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. #14
    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. #15
    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. #16
    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. #17
    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. #18
    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. #19
    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. #20
    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