【问题标题】:Passing 2d arrays into a function with variable as array size?将二维数组传递给一个变量为数组大小的函数?
【发布时间】:2015-03-27 00:01:39
【问题描述】:

所以我正在编写一个函数来将二维数组复制到另一个数组中,如下所示:

void copyTable(int val, char table[][16], char tableNew[][16]){
    for(int y = 0; y< val; y++){
        for(int x = 0; x<val; x++ ){
            table[x][y]=tableNew[x][y];
        }
    }    
}

这可以编译,但我真正需要做的是而不是 16 有一个变量,以便该函数可以与任何大小的数组一起使用,如下所示:

int num;

void copyTable(int val, char table[][num], char tableNew[][num]){
    for(int y = 0; y< val; y++){
        for(int x = 0; x<val; x++ ){
            table[x][y]=tableNew[x][y];
        }
    }    
}

我得到错误:

main.cpp:14:41: error: array bound is not an integer constant before ']' token
 void copyTable(int val, char table[][num], char tableNew[][num]){
                                         ^
main.cpp:14:42: error: expected ')' before ',' token
 void copyTable(int val, char table[][num], char tableNew[][num]){
                                          ^
main.cpp:14:44: error: expected unqualified-id before 'char'
 void copyTable(int val, char table[][num], char tableNew[][num]){

第 14 行是“void copyTable(...”

【问题讨论】:

  • 考虑动态内存分配new

标签: c++ arrays 2d parameter-passing


【解决方案1】:

C 编译器在使用数组时需要知道table[1][0] 的含义,因此它需要除第一个大小之外的所有大小都是指定的常量。

解决方案是传入一个额外的变量,给出数组的第二维。因为双数组表示法只能在第二维是已知常数时使用,所以您必须自己进行索引。 table[2][3] 变为 table[2 * num + 3]。还要注意,数组可以作为指针传入函数中,这个指针可以当作一维数组来对待。

void copyTable(int val, char *table, char *tableNew, int num){
    for(int y = 0; y < val; y++){
        for(int x = 0; x < val; x++){
            table[x * num + y] = tableNew[x * num + y];
        }
    }    
}

【讨论】:

    【解决方案2】:

    你可以这样做..

    void copyTo(int x, int y, int** destination, int** source)
    {
        for(int i = 0; i < x; i++)
            for(int j = 0; j < y; j++)
                destination[i][j] = source[i][j];
        return;
    }
    

    然后为您的表分配内存:

    int x,y;    
    
    //variable length tables
    int** A = new int*[x];
    int** B = new int*[x];
    
    for(int i = 0; i < x; i++)
    {
        A[i] = new int[y];
        B[i] = new int[y];
    }
    ...
    
    //call function as
    copyTo(x,y,B,A);
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 2015-08-23
      • 2011-05-24
      • 2020-11-01
      相关资源
      最近更新 更多