You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:15:07