Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以2d数组作为参数的函数调用_C++_Arrays_Multidimensional Array_Function Calls_Function Call - Fatal编程技术网

C++ 以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 }

我必须调用一个传递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;
    }
我已经尝试过函数声明的变体: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]
    被有效地评估为
    foo[i*m+j]
    ,2D数组的所有行在内存中都是连续的,并且没有索引结构

  • 对于双指针,
    foo[i][j]
    首先从
    foo[i]
    处的内存加载指针,然后从加载的指针后面加载
    int
    。也就是说,
    foo
    必须指向指针数组,指针数组索引到不同的行数组中。线阵列可以彼此独立,它们通过索引阵列连接

因此,您不能将2D数组作为
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);