使用回调函数实现数组加减计算器的编译错误求助
问题修复方案
咱们把代码里的编译错误和逻辑问题逐一拆解修复:
核心错误点及修复
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
相关产品推荐
相关产品推荐

