使用2d数组作为参数调用函数

时间:2014-06-28 07:25:36

标签: 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
        }
    }
    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数组参数时,该函数也可以工作。 请提出我的错误。

3 个答案:

答案 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
}