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

使用回调函数实现数组加减计算器的编译错误求助

问题修复方案

咱们把代码里的编译错误和逻辑问题逐一拆解修复:

核心错误点及修复

1. 函数声明与定义不匹配

  • add函数声明接收size_t值参数,但定义里写成了size_t*指针,直接导致类型冲突。把add的定义改成和声明一致的参数:double add(double numbers[], size_t start, size_t end)。
  • subtract函数的定义被误写成返回double*指针,和声明的double返回值冲突,改回double subtract(...)。

2. 函数指针误用 + 参数传递错误

  • main里的double(*operation)(...)完全多余,operation是你自己写的普通函数,直接调用就行,不用把它当成函数指针变量。
  • 调用operation时,你传了&start和&end(指针),但operation需要的是size_t值,直接传start和end就行,别加取地址符。

3. operation的回调参数类型错误

  • operation的第一个参数是函数指针,你写的double(*op)(double, size_t, size_t)不匹配add/subtract的签名,要改成double(*op)(double[], size_t, size_t),因为回调函数要接收double数组和两个size_t值。

4. 返回语句与逻辑错误

  • add和subtract里的return *result;是笔误,result是普通double变量,直接return result;就行,不用解引用。
  • 你要求subtract是“从第一个数里减去后面所有数”,但原代码初始result=0再减所有数,逻辑不对,应该把result初始化为numbers[start],然后从start+1开始循环减后续元素。

5. 循环变量类型隐患

  • 用int i遍历size_t类型的下标可能会有溢出问题,改成size_t i更安全。

修复后的完整代码

#include <iostream>

// 函数声明和定义保持一致
double add(double[], size_t, size_t);
double subtract(double[], size_t, size_t);

int main()
{
    double numbers[] { 1.3, 2.0, 3.5};
    size_t start = 0;
    size_t end = std::size(numbers);
    char choice = '0';
    double result;

    std::cin >> choice;

    if(choice == '+')
    {
        result = operation(add, numbers, start, end);
    }
    else if(choice == '-')
    {
        result = operation(subtract, numbers, start, end);
    }
    else
    {
        std::cout << "无效操作符,请输入+或-" << std::endl;
        return 1;
    }

    std::cout << "计算结果:" << result << std::endl;
    return 0;
}

double add(double numbers[], size_t start, size_t end)
{
    double result = 0;
    for(size_t i = start; i < end; i++)
    {
        result += numbers[i];
    }
    return result;
}

double subtract(double numbers[], size_t start, size_t end)
{
    // 初始化第一个元素,再减去后续所有元素
    double result = numbers[start];
    for(size_t i = start + 1; i < end; i++)
    {
        result -= numbers[i];
    }
    return result;
}

// 修正函数指针参数的签名,匹配回调函数
double operation(double(*op)(double[], size_t, size_t), double numbers[], size_t start, size_t end)
{
    return op(numbers, start, end);
}

测试效果

  • 输入+,输出6.8(1.3+2.0+3.5)
  • 输入-,输出-4.2(1.3-2.0-3.5)

内容的提问来源于stack exchange,提问作者MarvelousMishap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:40:55