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

Langage C++ Discussion :

Problème de pointeurs sur méthode


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Problème de pointeurs sur méthode
    Bonjour à tous

    Tout d'abord je vous explique mon architecture de code :

    J'ai crée une classe, et celle-ci utilise les fonctions d'une dll qui a été développé par quelqu'un d'autre, j'ai donc accès au code source mais ne doit pas le modifier.

    Dans ma classe, j'ai développé une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Test_Comm_Event(int event, void * param);
    Dans une autre méthode, j'appelle une fonction de la dll :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Initialize(Comm_Event_Fct* pFct)
    Sachant que la déclaration de Comm_Event_Fct est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void Com_Event_Fct(int event, void * param);
    L'argument passée à ma fonction Initialize est donc un pointeur sur une méthode ayant la même déclaration que la méthode évoquée au début que j'ai développé.

    Or, ce que j'essaye donc est de passer un pointeur sur ma fonction Test_Comm_Event en argument pour réaliser un appel ressemblant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = Initialize(Test_Comm_Event)
    J'ai essayé pas mal de chose qui me paraissait logique, malheureusement rien n'a fonctionné...

    Si quelqu'un c'est comment réaliser ce passage d'argument, ou aurait une idée je suis preneuse

    Merci !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Tu dois passer un pointeur de fonction, l'opérateur pour récupérer un pointeur/une adresse est &, y compris pour les fonctions. n = Initialize(&Test_Comm_Event)
    Fournir l'erreur ne serait pas superflu cela dit, pour les prochaines fois.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Déjà merci pour ta réponse

    Mais... du coup j'ai déjà essayé avec '&'

    Et mon erreur est la suivante : int Initiale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C2664	'int Initialize(Comm_Event_Fct (__cdecl *))'*: impossible de convertir l'argument 1 de 'void (__cdecl * )(int,void *)' en 'Comm_Event_Fct (__cdecl *)'

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je pense que le problème est la déclaration du typedef.
    Généralement, les typedefs de pointeurs de fonction, on les déclares comme ça:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (*Com_Event_Fct)(int event, void * param);
    D'un autre côté, en C++ moderne, on déclarerait plutôt comme ça:
    Code C++11 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <functional>
    typedef std::function<void(int, void*)> Com_Event_Fct;
    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.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Ok je note merci !

    Pour l'instant, j'ai trouvé la solution en déclarant ma fonction en static, là il accepte une conversion du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comm_Event_Fct* Test_Comm_Event_Ptr = (Comm_Event_Fct*) Test_Comm_Event;
    Et donc après je peux passer Test_Comm_Event_Ptr en paramètre de ma fonction Initialize


  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Anais.serguier Voir le message
    en déclarant ma fonction en static, là il accepte une conversion du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comm_Event_Fct* Test_Comm_Event_Ptr = (Comm_Event_Fct*) Test_Comm_Event;
    Je pense que ta conversion est un peu cavalière.
    Mais les fonctions membres ont une signature qui n'a rien à voir avec avec les fonctions libres ou static.
    https://cpp.developpez.com/faq/cpp/?...ur-de-fonction
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Attention, un cast C-style de pointeur de fonction, ça montre TOUJOURS une erreur quelque part.
    cf les deux liens dans ma signature: What can go wrong when you mismatch the calling convention? et A function pointer cast is a bug waiting to happen
    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
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    D'un autre côté, en C++ moderne, on déclarerait plutôt comme ça:
    Code C++11 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <functional>
    typedef std::function<void(int, void*)> Com_Event_Fct;
    Ça, ce serait le coup en C++ moderne où on a besoin de dynamicité, mais pas de performances. Ici, je n'ai pas l'impression que la dynamicité soit requise, et on écrirait alors plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<class Fct>
    int Initialize(Fct fct) {/*...*/}
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Problème de pointeur sur une fonction
    Par CodeurNé dans le forum C
    Réponses: 4
    Dernier message: 03/10/2007, 22h45
  2. Probléme de pointeur sur fonction
    Par TSalm dans le forum C++/CLI
    Réponses: 11
    Dernier message: 25/07/2007, 22h53
  3. Problème de pointeur sur une table de hashage
    Par nicdesf dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2006, 19h23
  4. Problème de pointeurs sur classe
    Par fabiin dans le forum Delphi
    Réponses: 1
    Dernier message: 05/08/2006, 18h13
  5. Problème de *pointeur sur des char
    Par Spartan03 dans le forum C++
    Réponses: 2
    Dernier message: 18/09/2005, 14h20

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