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 appelant un pointeur vers une fonction


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Points : 232
    Points
    232
    Par défaut Fonction appelant un pointeur vers une fonction
    Bonsoir à tous,

    Voici mon problème :

    J'ai une classe A dont une fonction utilise la classe B, en instanciant un objet b qui utilise la fonction truc.
    Cette fonction truc utilise un pointeur vers une fonction définie dans la classe B.

    A la compilation, j'obtiens une erreur du style :
    void to void (__cdecl*)

    Est-ce un problème d'appel de fonction membre ?
    J'avoue que je sèche de manière sérieuse.

    Voici pour expliquer le code que j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CAffichage::fonction() 
    {
      CPolynome polynome, poly2;
      polynome.mrqmin(date, value, sig , date.size(), factors, ia, 2, covar, alpha, chisq, poly2.Exponentielle, alambda);
    }
    et dans la classe CPolynome :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void mrqmin(std::vector<float>x, std::vector<float>y, std::vector<float> sig, int ndata, std::vector<float> a, std::vector<int>ia,int ma, float **covar, float **alpha, float *chisq,void (*funcs)(float, float [], float *, float [], int), float *alamda);
     
    void Exponentielle(float x, float a[], float *y, float dyda[], int na);
    J'ai essayé, vainement, d'utiliser des pointeurs du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*func)(); func=poly2.Exponentielle;
    puis d'appeler cette fonction dans ma fonction mrqmin...

    Merci d'avance pour votre aide qui, je le sais, sera précieuse.

  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
    Pour utiliser des pointeurs de fonctions membres,voici un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    struct X
    {
    void foo(void){/*...*/}
    };
     
    int main (void)
    {
    void (X::* ptr)(void) ;
     
    ptr=&X::foo;
    X x;
     
    (x.*ptr)();
     
    return 0;
    }
    HS:Si tu tient vraiment à utiliser des pointeurs de fonctions, utilise boost::function.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051

  4. #4
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Points : 232
    Points
    232
    Par défaut
    Ahhh, la FAQ !
    Certes, une petite recherche sur Google m'a mené à la FAQ, mais je ne savais pas, au moment où j'ai posté le message, d'où venait exactement le problème...

    Il se trouve donc que oui, le problème était que la fonction appelée est une fonction membre, MAIS :

    Cette fonction qui est en paramètre n'est pas une fonction membre de la classe CAffichage (qui va utiliser la fonction de la classe CPolynome), mais de la classe CPolynome (qui est appelée).

    La classe CAffichage n'appelle donc pas une fonction propre à elle-même, mais appelle une fonction de la classe CPolynome qui elle-même va utiliser une fonction de sa propre classe.

    Je ne sais pas si ce que je dis est bien clair ... (si déjà cela l'était dans ma tête,... )

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    C'est clair, mais ça se résoud facilement à partir de ce que tu as déjà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CAffichage::fonction() 
    {
      CPolynome polynome, poly2;
      polynome.mrqmin(date, value, sig , date.size(), factors, ia, 2, covar, alpha, chisq, poly2, CPolynome::Exponentielle, alambda);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void mrqmin(std::vector<float>x, std::vector<float>y, std::vector<float> sig, int ndata, std::vector<float> a, std::vector<int>ia,int ma, float **covar, float **alpha, float *chisq, CPolynome& poly,void (CPolynome::*f)(float, float [], float *, float [], int), float *alamda)
    {
      // appel
      (poly.*f)( 12.f, /*...*/ );
    }

  6. #6
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Points : 232
    Points
    232
    Par défaut Mouarf
    Effecivement, la réponse était sous mes yeux...

    Merci beaucoup, et à plus tard pour de nouvelles aventures

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CAffichage::fonction() 
    {
      CPolynome polynome, poly2;
      polynome.mrqmin(date, value, sig , date.size(), factors, ia, 2, covar, alpha, chisq, poly2, &CPolynome::Exponentielle, alambda);
    }
    La syntaxe correcte pour un pointeur sur fonction/méthode est avec un &.

    Sinon plus simplement, avec un template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template< typename M >
    void mrqmin(std::vector<float>x, std::vector<float>y, std::vector<float> sig, int ndata, std::vector<float> a, std::vector<int>ia,int ma, float **covar, float **alpha, float *chisq, CPolynome& poly, M m, float *alamda)
    {
      // appel
      (poly.*m)( 12.f, /*...*/ );
    }
    Pour faire le faignant et laisser le compilateur résoudre le type exact...

    MAT.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Bien vu Mat

  9. #9
    Membre actif
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Points : 232
    Points
    232
    Par défaut
    Pour le coup de l'esperluette, je l'avais mis dans mon code en fait , sans faire attention que le code donné était faux

    Il est vrai que faire le faingnant est agréable, merci Mat.

    Merci à vous deux pour votre aide

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/05/2011, 12h48
  2. Réponses: 2
    Dernier message: 15/02/2011, 10h34
  3. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  4. pointeur vers une fonction membre
    Par salseropom dans le forum C++
    Réponses: 2
    Dernier message: 03/02/2010, 14h51
  5. appel d'une fonction vb a partir d'une fonction javascript!
    Par labib23dz dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 03/07/2009, 11h04

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