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 :

Pb d'affectation d'un pointeur de fonction


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut Pb d'affectation d'un pointeur de fonction
    Bonjour,

    je développe une ptite appli MCF sous visual studio 2005
    et j'ai quelques ptits soucis pour affecter un pointeur de fonction

    le pointeur est déclaré dans un fichier .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (CALLBACK *MON_POINTEUR)(MA_STRUCT*)
    j'ai une méthode comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void MaClasse::MaMethode(MA_STRUCT* param)
    {
    <div style="margin-left:40px">//...</div>}
    et lorsque je veux affecter mon pointeur comme ça dans une autre méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MON_POINTEUR ptCallBack;
    ptCallBack = MaClasse::MaMethode;
    le compilateur me retourne cette erreur :
    error C2440 : '=' : cannot convert from 'void (__thiscall MaClasse::*)(MA_STRUCT*)' to 'MON_POINTEUR'
    ...

    je ne vois pas bien pourquoi...
    quelqu'un pourrait-il m'aider??

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    réponse dans la FAQ SDL (partie threads)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    merci, mais ça ne m'aide pas
    j'arrive pas à trouver le sujet de la FAQ; internet rame à mort ici, on se demande ce que font les autres sur le réseau entreprise ...

    je me suis inspirée de ça
    il me semble avoir fait ça correctement
    donc vraiment, je ne vois pas...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Salut, il faut affecter au pointeur l'adresse de ta méthode (tu as oublié une indirection) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    callback = &myMethod;
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Aussi mais c'est surtout qu'un pointeur de fonction membre N'EST PAS un pointeur de fonction. Dès lors, on ne peut pas utiliser des fonctions membres là où on attend des fonctions libres.
    L'entrée de la FAQ est celle ci
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Aussi mais c'est surtout qu'un pointeur de fonction membre N'EST PAS un pointeur de fonction. Dès lors, on ne peut pas utiliser des fonctions membres là où on attend des fonctions libres.
    ah, ok
    Merci beaucoup pour la précision
    je ne connaissais pas la distinction...

    en fait, au début j'avais essayé en déclarant la fonction MaMethode comme une fonction non membre,
    l'affectation du pointeur de fonction, ça allait

    mais le soucis c'était que,
    ce pointeur, je dois le passer en paramètre d'une méthode d'une dll pour permettre le rappel cyclique de la méthode affectée au pointeur...
    et je n'avais aucun rappel cyclique...

    un essai avait été fait d'implémenter ladite dll en c++/cli,
    le rappel cyclique fonctionnait mais on avait des soucis avec les variables ramenées dans la méthode...
    c'est pour ça qu'on voulait tester une implémentation en natif...

    mais comme je n'y connais pas grand chose en c++,
    je patauge un ptit peu...

    d'autres suggestions??...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    J'ai ré-essayé en déclarant ma méthode en non-membre

    là, lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptCallBack = &MaMethode;
    j'ai l'erreur :
    error C2276 : '&' : illegal operation

    quand j'enlève le '&', j'ai ça :
    error C2440 : '=' : cannot convert from 'void (__cdecl*)(MA_STRUCT*)' to 'MON_POINTEUR'. This conversion requires a reinterpret_cast, a C-style cast or a function-style cast.

    je suis donc obligée de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptCallBack = (ptCallBack)MaMethode;
    est-ce que c'est normal??

    là, ça compile
    mais comme je le mettais précédemment, le callback cyclique de cette méthode ne fonctionne pas...
    GGGGGGGGGggggggggggggrrrrrrrrrrrrrr

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Vu que tu as ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef void (CALLBACK *MON_POINTEUR)(MA_STRUCT*);
    Alors il faut que la fonction soit déclarée comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void CALLBACK MaFonction(MA_STRUCT* );
    C'est aussi simple que ça !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/02/2009, 16h08
  2. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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