C++中void函数调用二维数组报“数组不能包含该类型元素”错误求助
问题分析与解决方案
错误原因
- 二维数组函数参数声明非法:C++中传递二维数组作为函数参数时,必须明确指定除第一维外的所有维度大小。
int mat[][]的写法会让编译器无法计算数组元素的内存偏移,因此触发“an array may not have elements of this type”错误。 - 未声明变量:
main函数中的dim变量缺少类型声明,编译时会出现未定义标识符错误。
修正方案(贴合原代码的静态数组实现)
将create和print函数的二维数组参数改为int mat[][100](对应main中定义的mat[100][100]),同时补全main中dim的类型声明:
#include <iostream> #include <fstream> #include <cmath> void read(int& dim, int vect[]) { std::ifstream fin("fisier.in"); fin >> dim; for (int i = 0; i < dim; i++) { fin >> vect[i]; } } // 修改二维数组参数为int mat[][100] void create(int Va[], int Ca[], int La[], int dimV, int dimC, int dimL, int mat[][100]) { int k = 0; for (int i = 0; i < dimL; i++) for (int j = 0; j < dimC; j++) { mat[La[i]][Ca[j]] = Va[k]; k++; } } // 修改二维数组参数为int mat[][100] void print(int dim, int mat[][100]) { std::ofstream fout("fisier.out"); for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) fout << mat[i][j] << " "; fout << "\n"; } } int main() { int Va[10001], Ca[100], La[100], dimV, dimC, dimL, mat[100][100] = { 0 }; read(dimV, Va); read(dimC, Ca); read(dimL, La); // 补全dim的int类型声明 int dim = sqrt(dimV); create(Va, Ca, La, dimV, dimC, dimL, mat); print(dim, mat); }
更灵活的动态数组方案(推荐)
如果不想固定二维数组的大小,推荐使用C++标准库的std::vector实现动态数组,安全且易于维护:
#include <iostream> #include <fstream> #include <cmath> #include <vector> void read(int& dim, std::vector<int>& vect) { std::ifstream fin("fisier.in"); fin >> dim; vect.resize(dim); for (int i = 0; i < dim; i++) { fin >> vect[i]; } } void create(const std::vector<int>& Va, const std::vector<int>& Ca, const std::vector<int>& La, std::vector<std::vector<int>>& mat) { int k = 0; for (int i = 0; i < La.size(); i++) for (int j = 0; j < Ca.size(); j++) { mat[La[i]][Ca[j]] = Va[k]; k++; } } void print(int dim, const std::vector<std::vector<int>>& mat) { std::ofstream fout("fisier.out"); for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) fout << mat[i][j] << " "; fout << "\n"; } } int main() { std::vector<int> Va, Ca, La; int dimV, dimC, dimL; read(dimV, Va); read(dimC, Ca); read(dimL, La); int dim = sqrt(dimV); // 初始化dim×dim的二维vector,所有元素为0 std::vector<std::vector<int>> mat(dim, std::vector<int>(dim, 0)); create(Va, Ca, La, mat); print(dim, mat); }
内容的提问来源于stack exchange,提问作者Roxana Sultan
相关产品推荐
相关产品推荐

