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 :

Pointeurs sur fonctions membres/Pointeurs sur fonctions


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 3
    Points
    3
    Par défaut Pointeurs sur fonctions membres/Pointeurs sur fonctions
    Voila, c'est peut etre un probleme classique mais j'ai pas vraiment trouve de solution correspondant a mon probleme precis . Si qq'un pouvait m'aider ce serait fortement apprecier

    J ai une fonction generale nomme BRENT (ne faisant pas partie d'une classe) qui prent en argument un pointeur sur une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void BRENT(double (*f) (double), ......, double& res)
    C'est une fction qui resoud f(x)=0 et met le resultat ds res .

    J'ai maintenant une classe nomme BETA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Class Beta
    {
        double a,b;
        double FDR(double x);
        double Tirage();
        ...
    }
    FDR est une fonction membre renvoyant un double dependant de x, mais aussi des membres a et b .
    Volia le PB : Dans la fction Tirage je voudrais utiliser la methode BRENT en l'appliquant a la fonction FDR.
    Le novice que je suis s'est qd meme apercu a un moment que je pouvais faire passer FDR en argument de BRENT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double BETA::Tirage()
    {
      ......
      BRENT(FDR,...);
      .....
    }
    car pointeur sur fonction != pointeur sur fonction membre et tout le toutim .

    Comment pourrais je contourner le probleme?(desole pour la longueur du message,merci d'avoir tenu jusque la).

    PS:Je pourrais faire de BENT une fction membre de la classe, dans quel cas il n'y aurait plus de fonction a passer en argument mais cette sol me convient pas vraiment.


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  2. #2
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 55
    Points : 54
    Points
    54
    Par défaut
    tu peux pas faire un pointeur sur une methode SAUF si elle est statique (ensuite ta fonction statique peut recevoir en parametre l'instance de l'objet en question, sur laquelle tu peux appeler la methode d'instance tant desiree)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static double FDR_static(Beta & b, double x) {
       return b.FDR(x);
    }

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Mais je pourrais toujours pas applique la methode BRENT a cette nouvelle fonction (statique) , car BRENT prend comme argument une fonction f du type : double f(double) .

  4. #4
    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
    Pour pouvoir te répondre, il faudrait savoir quel morceau de code tu as la possibilité de changer. Si tu ne peux pas changer BRENT, il n'y a guère que des solutions basées sur des variables globales. Si tu peux le modifier, alors non seulement, il y a des soltions propres, mais en plus, elles ont des chances d'être plus rapides.
    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.

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    OK.
    J'ai la possibilite de changer BRENT mais dans l'ideal je voudrais que ca reste une fonction generale , c'est a dire qu'elle puisse etre ulterieurement utilisable par d'autres classes ou juste par d'autres routines (ne faisant pas specialement partie d une classe) .
    Juste pour rappel : Brent est une methode pour rechercher la racine d'une fonction quelconque f .
    Merci pour tout aide qui viendra .

  6. #6
    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
    D'accord, dans ce cas, je propose de définir ta fonction BRENT ainsi :

    1/ Si la fonction en argument est toujours choisie à la compilation (performances optimale) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename Func> double BRENT&#40;Func f&#41;
    &#123;
      // ...
      // Quand on a besoin d'évaluer la fonction &#58; 
      result = f&#40;42&#41;;
      // ..
    &#125;
    Tu peux alors utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    double a = BRENT&#40;sin&#41;; 
    // Le plus simple est de modifier aussi Beta, mais on peut
    // aussi créer une classe qui encapsule Beta
    class Beta
    &#123;
      double a, b;
      double operator&#40;&#41;; // remplace FDR
    &#125;;
    Beta myBeta;
    // On initialise a et b
    double  b = BRENT&#40;myBeta&#41;;
    2/ Si la fonction est modifiable au run-time, l'aide de boost::function et boost::bind est très pratique (voir www.boost.org):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double BRENT&#40;boost&#58;&#58;function<double&#40;double&#41;> f&#41;
    &#123;
      // idem
    &#125;
    Dans ce cas, on peut utiliser BRENT ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double a = BRENT&#40;sin&#41;;
    Beta myBeta;
    // init a et b...
    double b = BRENT&#40;boost&#58;&#58;bind&#40;&Beta&#58;&#58;FDR, myBeta&#41;&#41;;
    double c = BRENT&#40;boost&#58;&#58;bind&#40;&plus, _1, 42&#41;&#41;; // f&#40;x&#41; = x+42
    ...
    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.

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Merci bien pour la reponse , je vais tester ça .

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Je viens de faire un petit test en prenant la solution 1 ,et j'ai des problemes de compilation . J'ai donc une fonction BRENT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <typename Func> int BRENT &#40;Func f,.....,double& Sol&#41;
    &#123;
      ....
      double z=f&#40;3&#41; ; //quand je dois faire appel a f 
      ....
    &#125;
    Une classe Test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Class Test
    &#123;
      double a,b;
      Test &#40;double a,double b&#41;; // Constructeur
      double operator&#40;&#41; &#40;double x&#41; &#123; return a*x+b;&#125;
    &#125;
    Et disons que dans mon Main j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int Main&#40;&#41;
    &#123;
      double sol;
      Test A&#40;2,5&#41;;
      int k = BRENT&#40;A,......,sol&#41;;
    &#125;
    J'ai alors a la compil :
    undefined reference to 'int BRENT<Test>(Test,......,double&) '
    et je capte pas bien pourquoi ...

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 47
    Points : 58
    Points
    58
    Par défaut
    Quand tu fais du code avec des templates assures toi qu'il est dans un header.

    Typiquement le code de BRENT doit être entièrement dans un header et tu ne dois pas avoir de .c.

    Si c'est déjà le cas,... Ben je sais pas

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  11. #11
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Desole de ne me manifester que maintenant , mais tout a l'air en ordre ds mon code . Merci a JolyLoic (et Croust Ryu)

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

Discussions similaires

  1. [Free Pascal] Enregistrer une fonction callback depuis une fonction membre
    Par EpiTouille dans le forum Free Pascal
    Réponses: 3
    Dernier message: 11/03/2015, 12h11
  2. Fonction qui fonctionne sur VBA mais pas sur excel
    Par bol45 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/03/2014, 13h33
  3. Thread d'une fonction membre dans une fonction membre
    Par virtual_bug dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 19/03/2014, 22h49
  4. [GD] Est-ce que c'est possible qu'une fonction tourne mieux sur Win et pas sur Linux
    Par nkki_nkki dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/07/2007, 18h34
  5. Réponses: 1
    Dernier message: 28/03/2007, 20h20

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