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 actif 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
    Points : 253
    Points
    253
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 actif 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
    Points : 253
    Points
    253
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 actif 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
    Points : 253
    Points
    253
    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 actif 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
    Points : 253
    Points
    253
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 actif 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
    Points : 253
    Points
    253
    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 actif 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
    Points : 253
    Points
    253
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 actif 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
    Points : 253
    Points
    253
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 actif 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
    Points : 253
    Points
    253
    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 éprouvé

    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
    Points : 1 067
    Points
    1 067
    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
    Points : 11 625
    Points
    11 625
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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.

  20. #40
    Membre actif 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
    Points : 253
    Points
    253
    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