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

C++ Discussion :

Fonction qui renvoie un pointeur de fonction


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 164
    Par défaut Fonction qui renvoie un pointeur de fonction
    Bonjour,

    J'ai un pépin de pointeur de fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class CheckGUI {
    	public:
    		void(*)(ObjetGUI*, int, int, int, int) getCallback (); // La ligne 20
    	private:
    		void(*callback)(ObjetGUI*, int, int, int, int);
    };
     
    void(*)(ObjetGUI*, int, int, int, int) CheckGUI::getCallback () {
    	return callback;
    }
    getCallback() doit normalement donner la valeur de callback mais seulement voila ce qu'il me dit :

    gui_check.h:20: erreur: expected unqualified-id before «)» token
    gui_check.h:20: erreur: abstract declarator «void (*)(ObjetGUI*, int, int, int, int)» used as declaration
    gui_check.h:20: erreur: expected «;» before «getCallback»
    :: === Build finished: 3 errors, 0 warnings ===
    Même" void(*)() getCallback ();" il en veut pas.
    Je ne sais plus quoi faire

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Essaye (void*)().
    Au fait, vive les typedef

    Mais je sais pas tout simplement si c'est possible :s
    Ca devrait l'etre en principe.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 164
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (void*)(ObjetGUI*, int, int, int, int) getCallback ();
    gui_check.h:20: erreur: expected unqualified-id before «void»
    gui_check.h:20: erreur: expected `)' before «void»
    :: === Build finished: 2 errors, 0 warnings ===


    Sinon t'inquiète pas les typedef vont venir.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Question bête, mais pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void(*callback)(ObjetGUI*, int, int, int, int);
    et pas tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* callback (ObjetGUI*, int, int, int, int);
    ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,

    Je pense que tu n'as pas le choix, il faut que tu passes pas les typedef dès le début.
    Il me semble que la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void (*)(ObjectGUI*, int, int, int, int)
    est illégale en C++, pour déclarer un pointeur de fonction il te faut spécifier un nom après le * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void (*un_nom)(ObjectGUI*, int, int, int, int)
    Le problème est que même avec cette déclaration, ton code ne marchera pas (dans le cas contraire faudra qu'on me réexplique la syntaxe des pointeurs de fonctions) car cette ligne déclare un POINTEUR de fonction, et non pas un TYPE pointeur de fonction. C'est un peu comme si tu écrivais
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int get_callback();
    Seule solution à mon avis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef void (*CALLBACK)(ObjectGUI*, int, int, int, int);
     
    CALLBACK get_call_back();

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En effet je crois aussi que c'est la solution.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Normalement, on peut toujours faire sans typedef. La fonction signal() est déclarée ainsi. Mais pour la lisibilité, ben... Y'a qu'à regarder la déclaration de signal() pour se dire que sans typedef, c'est pas top.
    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.

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Dans ce cas là Médinoc, comment le compilo fait pour savoir qu'il s'agit d'un type pointeur de fonction et non pas d'une variable de fonction ? Je pensais que pour les pointeurs de fonctions la seule solution était le typedef.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Répétons le, typedef n'est ni plus ni moins qu'un alias, il ne définit rien de nouveau en terme de type. Donc mettre un typedef dans une déclaration ou l'expression "typedefée" littérale est strictement la même chose.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    En fait, ceci déclare une variable nommée "un_nom" et de type "pointeur de fonction" :
    Code C/C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*un_nom)(ObjectGUI*, int, int, int, int);

    Pour une fonction qui prend un pointeur de fonction en paramètre et retourne un pointeur de fonction, voici l'infâme prototype de la fonction signal() :
    Code imbitable : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*signal(int sig, void (*func)(int)))(int);

    Et la version lisible :
    Code C/C++ correct : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef void (*sig_t)(int);
    
    sig_t signal(int sig, sig_t func);
    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.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 164
    Par défaut
    typedef void (*GUI_CALLBACK)(ObjetGUI*, int, int, int, int);
    Merci, ca marche

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    OKi Médinoc, merci pour l'éclaircissement

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/01/2011, 15h33
  2. Réponses: 4
    Dernier message: 27/04/2008, 15h36
  3. fonction qui retourne un pointeur
    Par sorari dans le forum C++
    Réponses: 6
    Dernier message: 16/03/2005, 21h23
  4. [bioinfo] fonction qui renvoie chaîne à autre fonction
    Par perlaud dans le forum Bioinformatique
    Réponses: 11
    Dernier message: 16/07/2004, 15h06
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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