C++ 以2d数组作为参数的函数调用
我必须调用一个传递2d数组作为参数的函数。函数调用:C++ 以2d数组作为参数的函数调用,c++,arrays,multidimensional-array,function-calls,function-call,C++,Arrays,Multidimensional Array,Function Calls,Function Call,我必须调用一个传递2d数组作为参数的函数。函数调用: int n; char ch; cin>>n; bool b[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>ch; if(ch=='X'){b[i][j]=1;} //reads input from a file }
int n;
char ch;
cin>>n;
bool b[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>ch;
if(ch=='X'){b[i][j]=1;} //reads input from a file
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<evaluate(n,b, i, j); //shows error no matching function for call to evaluate
}
cout<<endl;
}
我已经尝试过函数声明的变体:evaluate(int n,bool b[n][n],int x,int y);
但它给出了同样的错误。同样在删除2d数组参数时,该函数也可以工作。
请说明我的错误是什么 您需要了解的是,2D数组(声明为
int-foo[m][n];
)与双指针(类型为int**foo;
)的变量)非常不同。即使您在这两种情况下都可以使用foo[i][j]
,但发生的情况完全不同:
- 在2D数组的情况下,
被有效地评估为foo[i][j]
,2D数组的所有行在内存中都是连续的,并且没有索引结构foo[i*m+j]
- 对于双指针,
首先从foo[i][j]
处的内存加载指针,然后从加载的指针后面加载foo[i]
。也就是说,int
必须指向指针数组,指针数组索引到不同的行数组中。线阵列可以彼此独立,它们通过索引阵列连接foo
int**
传递给函数,因为2D数组中没有索引数组
但是,您可以传递指向数组的指针(伪代码,我省略了声明一些变量):
<> >不幸的是,<代码>宽度>代码>必须是C++中的编译时常数。C可以处理动态数组大小,C++不能。这严重限制了这种方法的可用性。您是否在main(调用者)函数之前定义了您的函数(被调用者)? 你应该这样做:
int evaluate(int n,bool** b,int x,int y);
int main(){
//some code
evaluate(n, b, i, j);
//some code
}
int evaluate(int n,bool** b,int x,int y){
//body
}
或者这样:
int evaluate(int n,bool** b,int x,int y){
//body
}
int main(){
//some code
evaluate(n, b, i, j);
//some code
}
传递给函数时,数组名转换为指向数组第一个元素的指针。2D数组是一个1D数组,其所有元素均为1D数组类型,即它是一个数组数组 当2D数组名传递给函数时,它将衰减为指向数组第一个元素的指针。如上所述,元素本身是1D数组,因此数组名称的类型成为指向数组的指针。
指向数组的指针和指向指针的指针都是不同类型的(彼此不兼容)。要传递指向数组类型的指针,需要将函数声明为
int evaluate(int n, bool (*b)[n], int x, int y);
或者干脆
int evaluate(int n, bool b[][n], int x, int y);
可能重复感谢@user1781290的线程。我确实搜索过,但你早些时候建议我找不到这篇文章。还感谢所有其他答案。请查看其他答案,问题在于参数的类型,而不是声明的可用性抱歉,这有点误解!!
int evaluate(int n, bool (*b)[n], int x, int y);
int evaluate(int n, bool b[][n], int x, int y);