2009-07-14 3 views
2

彼らは私が前に行って見たことがないものを使用して、簡単に情報を見つけることができませんでした:私は推測しているC++で関数の引数として '関数ポインタ'または '関数への参照'は何が起こっていますか? <a href="http://www.nr.com/" rel="nofollow noreferrer">Numerical Recipes</a>で

void fun(std::vector<double> derivatives(const double, const std::vector<double> &)) { ...; derivatives(...); ...; } 

は(これが正しい)を参照して、関数を渡していますか?なぜこれは関数ポインタを使うほうが好都合でしょうか?どのような状況でそれぞれの方法が優先されますか?

私は第2号を持っています: 初めてこの関数を呼び出すと、プログラムは数秒間ハングします。今、私は、自分自身を渡す引数の関数は、関数ポインタとは異なる機能を呼び出すすなわち

vector<double>(*pfI)(const double) = NULL; 
    ... 
    pfI = pointedToFun; 
    void argFun() { ...; deRefPointedFun = (*Theta::pfI)(t); deRefPointedFun(); } 

参照/ポインタ機能の2つのレベルを処理するための良い方法は何ですか?

答えて

9

これは

void fun(std::vector (*derivatives)(const double, const std::vector &)) { 
    ...; derivatives(...); ...; 
} 

ので、パラメータが関数ポインタである次

void f(int *derivatives) { ... } 

と等価であるか

void f(int derivatives[]) { ... } 

に類似と同等です。パラメータとしての関数は関数ポインタです。パラメータとしての配列は、その要素型へのポインタです。関数ポインタパラメータは機能、機能の参照と関数ポインタのために使用することができますが、それは関数ポインタを引数に使用することはできません:それは、関数への参照ですが、稀にしか使われない

void fun(std::vector (&derivatives)(const double, const std::vector &)) { 
    ...; derivatives(...); ...; 
} 

と類似していません議論

+1

追加:問題の構文は、* -syntaxを使用してより明確に見えます。私はそれが彼らがそれを使った理由だと思う。 –

+0

申し訳ありません - それは理にかなっています。最初の呼び出しが機能することを指摘する前にプログラムがハングする理由を知っていますか(私はトレースを行いました。 – bias

+2

私はそれが関数へのポインタの問題だとは思わない。問題を示す最小限のコードをここに掲示しておかなければなりません。 –

関連する問題