C语言编写一元二次方程求解代码报函数声明不兼容错误如何解决
问题排查与修复方案
报错根因
你遇到的E0147、C22371报错完全由solutions.h的函数声明语法错误导致:头文件中solutions函数的声明缺失返回值类型,C语言会默认将无显式返回类型的函数推导为int类型,和solutions.c中定义的double返回类型冲突,因此触发声明不兼容、重定义类型不同的报错。
具体修复步骤
- 1 修正
solutions.h的函数声明,补全double返回值
修改后的完整solutions.h代码:
#if !defined SOLUTIONS_H #define SOLUTIONS_H // 补全返回值类型double,同时修正换行导致的参数列表断裂问题 extern double solutions(double a, double b, double c, double* x1, double* x2); #endif /* SOLUTIONS_H */
- 2 修复
delta.c的判别式计算逻辑错误
你当前计算b平方时误用了pow(b, b)(该函数会计算b的b次方,完全不符合判别式b²-4ac的要求),修改为:
// 写法1:用pow计算平方 double power = pow(b, 2); // 写法2(更推荐):直接用乘法,性能更高且无函数调用开销 double power = b * b;
- 3 补全
solutions.c的逻辑漏洞- 你当前求根公式漏乘了系数a,原代码
/2应该改为/(2*a),否则计算出的根完全错误 - 判别式大于0的分支没有添加返回值,会导致函数返回随机值,按照你的逻辑该分支应返回2(代表两个不同实根)
修改后的solutions函数代码:
- 你当前求根公式漏乘了系数a,原代码
double solutions (double a, double b, double c, double* x1, double* x2) { double checking_the_delta = delta(a, b, c); // 可选优化:用极小值判断浮点数是否为0,避免精度误差 const double EPS = 1e-9; if (fabs(checking_the_delta) < EPS) { *x1 = *x2 = (-b) / (2*a); // 重根场景也可以给x1x2赋值,更易用 return 1; } else if (checking_the_delta > EPS) { double square_root = sqrt(checking_the_delta); *x1 = (-b + square_root) / (2*a); *x2 = (-b - square_root) / (2*a); return 2; // 补充返回值 } else { return 0; } }
完成以上修改后重新编译即可解决报错,同时程序逻辑也能正确计算一元二次方程的实根。
内容的提问来源于stack exchange,提问作者Gabriel Burzacchini
相关产品推荐
相关产品推荐

