2011-11-28 3 views
1

J'ai eu des problèmes avec this avant mais maintenant ça marche.Utiliser boost :: bind pour lier la fonction membre à boost :: bisect?

Maintenant j'ai le problème suivant. J'ai besoin de lier les valeurs dans la fonction membre avant d'appeler boost :: bisect avec la même fonction. J'ai trouvé assez bon tutorial et je l'ai suivi mais il semble que je fasse encore quelque chose de mal.

Au début, je crée la classe de test où je suis arrivé de travail suivant:

std::pair<double, double> result = bisect(&Func, 0.0, 1.0, TerminationCondition()); 
      double root = (result.first + result.second)/2; 

Après que j'ai ajouté la liaison « à la volée que je pensais que cela pourrait fonctionner »

std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition()); 

Résultat de c'était une erreur. error: terminate appelée après avoir lancé une instance de 'boost :: exception_detail :: clone_impl>' what(): erreur dans la fonction boost :: math :: tools :: bisect: Pas de changement de connexion boost :: math :: tools: : bisect, soit il n'y a pas de racine à trouver, soit il y a plusieurs racines dans l'intervalle (f (min) = -0.0032916729090909091).

Quoi qu'il en soit, voici class :: function qui ne fonctionne pas en tant que fonction membre avec liaison pour une raison quelconque. Je l'ai testé en tant que non-membre et il fonctionne

double CLASS::Function(double c) 
{ 
/* values: m_a, m_b, m_c, m_d, and m_minus are located in .h file */ 

normal norm; 
double temp = m_d*sqrt(c); 

double total = ((1-boost::math::pdf(norm,(m_a*c+m_b)/temp))-(1 - m_c)+boost::math::pdf(norm,(m_a*c+m_b)/temp)); 

return (total - m_minus); 
} 

Répondre

1

Si je lis correctement le tutoriel, il devrait être:

std::pair<double, double> result = 
    bisect(boost::bind(&CLASS::Function, this, _1, _2, _3), 
     0.0, 1.000000, TerminationCondition()); 

à savoir les paramètres à boost::bind() sont:

  1. Le nom de la fonction (objet) pour se lier à
  2. les arguments à passer à cela, comme la fonction les attend

Pour votre cas, un CLASS::memberFunc(), ce serait un CLASS * (éventuellement this mais tout CLASS * est ok) en tant que premier, que vous déclarez littéralement comme tel, suivi par les paramètres passés plus tard à l'objet lié . Ces "futures" sont désignés par _1, _2 et ainsi de suite, en fonction de leur position au moment de l'appel.

Exemple:

class addthree { 
private: 
    int second; 
public: 
    addthree(int term2nd = 0) : second(term2nd) {} 
    void addto(int &term1st, const int constval) { 
     term1st += (term2nd + constval); 
    } 
} 

int a; 
addthree aa; 
boost::function<void(int)> add_to_a = boost::bind(&addthree::addto, &aa, a, _1); 
boost::function<void(void)> inc_a = boost::bind(&addthree::addto, &aa, a, 1); 

a = 0 ; add_to_a(2); std::cout << a << std::endl; 
a = 10; add_to_a(a); std::cout << a << std::endl; 
a = 0 ; inc_a(); std::cout << a << std::endl; 
[ ... ] 
1

Ce code:

std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition()); 

est correcte. L'erreur que vous obtenez signifie que ce que CLASS :: Function renvoie n'est pas valide. bisect se plaint de racines multiples (ou peut-être pas de racines) dans l'intervalle donné [0; 1]. À quoi ressemble CLASS::Function?

+0

Pouvez-vous simplement définir un point d'arrêt dans CLASS :: Function et voir s'il obtient les bons nombres d'entrée? –

+0

S'il vous plaît poster votre véritable CLASS :: Fonction. Celui que vous avez posté ci-dessus a des parenthèses non appariées, des blancs (...) et utilise une variable indéfinie var3. C'est vraiment difficile de deviner ce qui ne va pas. Vous pouvez éditer votre réponse pour que le code soit bien formaté. –

+0

Ajout du code de fonction.La fonction obtient donc des valeurs correctes et calcule le total comme il se doit, mais elle dit toujours qu'elle ne peut pas trouver max ou qu'elle trouve plusieurs racines. Alors, est-ce que le problème avec la liaison? J'espère que je n'ai pas besoin de lier des éléments à l'intérieur de dist normale? – Mare

Questions connexes