2017-10-12 22 views
0

1つの終了ステータスを返し、私は関数の導関数を計算するための簡単なプログラムを書いていますが、私はなかれエラーが表示されます。ここではC++エラーcollect2は:エラー:ldは

collect2: error: ld returned 1 exit status

は私のプログラムは次のとおりです。

#include <iostream> 
#include <stdlib.h> 
#include <math.h> 

using namespace std; 

double derivative2(double (fun), double step, double x); 
double fun(double); 

int main(int argc, char* argv[]){ 
    double h = atof(argv[1]); 
    double x = sqrt(2); 
    cout << derivative2(fun(x),h,x) << endl; 
    return 0; 
} 


double derivative2(double fun(double),double step, double x){ 
    return ((fun(x+step)-fun(x))/step);} 


double fun(double x){ 
    return atan(x); 
} 

私はthisの投稿を見つけましたが、それは私の場合は役に立ちません。

+0

エラーがリンカーから少なくとも一つの(おそらくそれ以上)の他のエラーに追従する傾向があります。これらのエラーは、通常、問題の原因と関連しています。この場合、問題は、 'using namespace std'の直後に' derivative2() 'の宣言が定義と一致しないため、関数がオーバーロードされてしまうことです。 'main()'の 'derivative2()'の呼び出しは定義されていないものを呼び出します。定義されていない関数の呼び出しがあるため、リンカーは通常、「未定義参照」のようなものを報告します。 collect2エラーはそれに続きます。 – Peter

+0

@Peter正しい定義はどれですか?それらが等しい場合は、* funが関数として使用できないというエラーの束を得る*。 – mattiav27

+0

「正しい定義」は、達成しようとしていることによって異なります。あなたのコードに関しては、 'main()'の後ろにある 'deriv2()'の定義があなたの意図です。その関数は、最初の引数として関数へのポインタを受け取ります。しかし、 'using namespace std'の後の' derivative2() 'の宣言は、最初の引数として' double'を受け入れます。 'main()'で 'derivative2()'を使うと、前の 'derivative2()'宣言と矛盾しない 'double2'(' fun(x) 'を呼び出した結果)を' deriv2それ以降の定義ではありません。 – Peter

答えて

1
double derivative2(double (fun), double step, double x); 

そして

double derivative2(double fun(double),double step, double x) 

異なるものです。最初の宣言では、fundoubleであり、2番目のfundouble(*)(double)(関数へのポインタ)です。

この関数はあるポイントで導関数を計算するため、右の宣言は関数ポインタを持つ宣言です。

フィックス:

double derivative2(double fun(double), double step, double x); // fun is a function pointer. 
... 
cout << derivative2(fun, h, x) << endl; // Pass fun as a function pointer. 
関連する問題