我必须调用一个传递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
}
}
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;
}
但是,它会显示错误与呼叫无匹配的功能 这是我的功能评估声明:
int evaluate(int n,bool** b,int x,int y){
//body
}
我在函数声明中尝试过各种变体:evaluate(int n,bool b [n] [n],int x,int y); 但它给出了同样的错误。此外,在删除2d数组参数时,该函数也可以工作。 请提出我的错误。
答案 0 :(得分:3)
当传递给函数时,数组名称转换为指向数组的第一个元素的指针。 2D阵列是1D阵列,其所有元素都是1D阵列,即它是阵列。
当2D数组名称传递给函数时,它会衰减到指向数组第一个元素的指针。如上所述,元素本身是一维数组,因此数组名称的类型变为指向数组的指针。 指向数组的指针和指向指针的指针都属于不同的类型(彼此不兼容)。要将指针传递给数组类型,您需要将函数声明为
int evaluate(int n, bool (*b)[n], int x, int y);
或只是
int evaluate(int n, bool b[][n], int x, int y);
答案 1 :(得分:1)
您需要了解的是,2D数组(声明为int foo[m][n];
的变量)与双指针(类型int **foo;
的变量)非常不同。即使您在两种情况下都可以使用foo[i][j]
,但发生的情况却截然不同:
在2D数组的情况下,foo[i][j]
被有效地评估为foo[i*m + j]
,2D数组的所有行在内存中是连续的,并且没有索引结构。
在双指针的情况下,foo[i][j]
首先从foo[i]
的内存加载指针,然后从加载的指针后面加载int
。也就是说,foo
必须指向一个指针数组,这些指针指向不同的行数组。线阵列可以彼此独立,它们通过索引阵列连接。
因此,您不能将2D数组作为int**
传递给函数,因为2D数组中没有索引数组。
但是,您可以将指针传递给数组(伪代码,我省略了声明一些变量):
const int width = ...;
void foo(int (*twoDArray)[width], int x, int y) {
//do something with twoDArray[x][y]
}
int main() {
int myArray[height][width];
foo(myArray, x, y);
}
不幸的是,width
必须是C ++中的编译时常量。 C可以处理动态数组大小,C ++不能。这严重限制了这种方法的可用性。
答案 2 :(得分:-2)
你是否在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
}