使用分治法求数组最大最小元素时函数原型&符号相关报错如何解决
问题原因
- 核心问题:C语言原生不支持引用传递(
int &min这种写法是C++专属语法),使用C编译器编译包含C++引用语法的代码会直接抛出该语法错误。 - 额外问题:你的函数声明存在笔误,声明写法为
void MinMaxDac(int arr[], int i, int j, int &min, int &min);,最后两个参数名重复,也是不符合语法规范的。
解决方法
将函数参数改成C语言支持的指针传递,即可实现修改外部变量的效果,对应修改函数声明、函数定义、函数调用三处写法即可。修改后的完整可运行代码如下:
#include <stdio.h> #include <limits.h> // 修改1:函数声明改为指针参数,同时修正参数名重复的问题 void MinMaxDac(int arr[], int i, int j, int *max, int *min); int main() { int len, max = INT_MIN, min = INT_MAX; printf("Enter the length of the array = "); scanf("%d", &len); int arr[len]; for (int i = 0; i < len; i++) { scanf("%d", &arr[i]); } // 修改2:调用时传入max和min的内存地址 MinMaxDac(arr, 0, len - 1, &max, &min); printf("Maximum element in the array = %d\n", max); printf("Minimum element in the array = %d\n", min); return 0; } // 修改3:函数定义改为指针参数,内部操作变量前需要解引用 void MinMaxDac(int arr[], int i, int j, int *max, int *min) { //数组仅包含1个元素 if (i == j) { if (*max < arr[i]) { *max = arr[i]; } if (*min > arr[i]) { *min = arr[i]; } return; } //数组包含2个元素 if (j - i == 1) { if (arr[i] > arr[j]) { if (*max < arr[i]) { *max = arr[i]; } if (*min > arr[j]) { *min = arr[j]; } } else { if (*max < arr[j]) { *max = arr[j]; } if (*min > arr[i]) { *min = arr[i]; } } return; } int mid = (i + j) / 2; //递归处理左子数组 MinMaxDac(arr, i, mid, max, min); //递归处理右子数组 MinMaxDac(arr, mid + 1, j, max, min); }
如果你本身的开发目标是C++程序,不需要修改为指针写法,只要把源文件后缀改为.cpp,同时把函数声明里重复的min参数名改为max即可正常编译运行。
内容的提问来源于stack exchange,提问作者soma
相关产品推荐
相关产品推荐

