2017-10-12 688 views
0

我写一个简单的程序来计算函数的导数,但我送花儿给人得到的错误:C++错误collect2:错误:LD返回1退出状态

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

“正确的定义”取决于你想要达到的目标。就你的代码而言,'derivative2()'[在main()']之后出现的定义就是你的意图。该函数接受一个(指向)函数作为第一个参数。然而,'using namespace std'后面的'derivative2()'声明接受一个'double'作为第一个参数。在'main()'中使用'derivative2()'也会将'double'(调用'fun(x)')的结果传递给'derivative2()' - 与前面的derivative1()但不包括随后的定义。 – Peter

回答

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

而且

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

是不同的东西。在第一个声明fundouble,第二个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. 
相关问题