C++编译错误:无法将int*转换为int (*)[10000]的解决方法咨询
解决生成Prufer序列C++程序的编译错误
问题描述
我正在编写一个生成Prufer序列的C++程序,调用solution函数时出现编译错误,相关代码及错误信息如下:
原代码
#include<iostream> using namespace std; int checkLevel(int tree[], int range){ // check level of element i (tree[i]) int rank = 0; for (int i = 0; i <= range; i++) { rank += tree[i]; } return rank; } int prufer; void solution (int tree[][10000], int level[], int range){ int i,j; for ( i = 1; level[i] !=1; i++); if( i == range +1) return; for (int j = 0; tree[i][j] != 1; j++); prufer = j; cout << prufer<< " "; tree[i][j] = 0; tree[j][i] = 0; level[i]--; level[j]--; solution(tree,level,range); } int main(){ int quantityOfEdges; //create a tree cin >> quantityOfEdges; int level[quantityOfEdges+1]; int tree[quantityOfEdges+1][quantityOfEdges+1] ; for (int i = 0; i <= quantityOfEdges; i++) { for (int j = 0; j <= quantityOfEdges; j++) { tree[i][j] = 0; } } for (int i = 1; i <= quantityOfEdges; i++) { int firstElement, secondElement; cin >> firstElement ; cin >> secondElement; tree[firstElement][secondElement] =1; tree[secondElement][firstElement] =1; } for (int i = 0; i <= quantityOfEdges; i++) { level[i] = checkLevel(tree[i], quantityOfEdges); } for (int i = 0; i <= quantityOfEdges; i++) { cout<< level[i]<<" "; } solution(tree, level, quantityOfEdges);// here return 0; }
编译错误信息
error: cannot convert 'int*' to 'int (*)[10000]' solution(tree, level, quantityOfEdges); ^ note: initializing argument 1 of 'void solution(int (*)[10000], int*, int)' void solution (int tree[][10000], int level[], int range){ ~~~~^~~~~~~~~~~~~
错误原因
核心问题是数组类型不匹配:
solution函数声明的第一个参数是int tree[][10000],等价于int (*tree)[10000],即指向长度为10000的int数组的指针。main中定义的tree是变长数组(C++标准不支持,属于GNU编译器扩展),第二维度是quantityOfEdges+1,和函数要求的固定长度10000不兼容,无法完成类型转换。
解决方案
推荐使用C++标准容器vector<vector<int>>替代静态变长数组,既符合标准,又能动态调整大小,完美匹配参数需求。修改后的代码如下:
#include<iostream> #include<vector> using namespace std; int checkLevel(const vector<int>& tree) { int rank = 0; for (int val : tree) { rank += val; } return rank; } void solution(vector<vector<int>>& tree, vector<int>& level, int range) { int i; for (i = 1; i <= range; ++i) { if (level[i] == 1) break; } if (i == range + 1) return; int j; for (j = 0; j <= range; ++j) { if (tree[i][j] == 1) break; } cout << j << " "; tree[i][j] = 0; tree[j][i] = 0; level[i]--; level[j]--; solution(tree, level, range); } int main() { int quantityOfEdges; cin >> quantityOfEdges; vector<int> level(quantityOfEdges + 1); vector<vector<int>> tree(quantityOfEdges + 1, vector<int>(quantityOfEdges + 1, 0)); for (int i = 1; i <= quantityOfEdges; ++i) { int firstElement, secondElement; cin >> firstElement >> secondElement; tree[firstElement][secondElement] = 1; tree[secondElement][firstElement] = 1; } for (int i = 0; i <= quantityOfEdges; ++i) { level[i] = checkLevel(tree[i]); } for (int val : level) { cout << val << " "; } solution(tree, level, quantityOfEdges); return 0; }
修改要点
- 替换数组为vector:用
vector<vector<int>>存储邻接矩阵,vector<int>存储节点度数,避免变长数组的兼容性问题。 - 调整函数参数:将函数参数改为
vector引用,保证类型匹配同时避免值传递开销。 - 优化循环逻辑:把空循环改为清晰的条件判断循环,提升代码可读性。
- 移除全局变量:去掉全局变量
prufer,直接输出结果,减少全局状态副作用。
内容的提问来源于stack exchange,提问作者hansolo
相关产品推荐
相关产品推荐

