3

我有 3 个二维数组,我想传递给一个函数。目前,我使用 if-else 语句来决定要发送哪个数组,然后复制所选数组的内容并传递新数组。

新数组:

char board[100][100]={}

这些是数组(内容未显示):

char mazeEasy[19][38], mazeMed[41][81], mazeHard[72][98];

如何在不使用的情况下将这三个函数中的任何一个传递给一个函数board[100][100]

4

3 回答 3

7

一种可能性是一个template函数:

template <typename T, std::size_t Dim1, std::size_t Dim2>
void f(T(&)[Dim1][Dim2])
{
    std::cout << Dim1 << ", " << Dim2 << "\n";
}

请参阅http://ideone.com/b60h1e上的演示。请注意,这将实例化函数模板的三个不同实例(每个不同维度组合的实例化)。

建议改为a std::vector<std::vector<char>>。这避免了多个实例化,并且函数可以查询std::vector其大小或迭代:

void f(std::vector<std::vector<char>>& a_maze)
{
    std::cout << a_maze.size() << ", " << a_maze[0].size() << "\n";
}

请参阅http://ideone.com/nHL8Hj上的演示。

于 2013-04-23T10:50:24.490 回答
3

不是同一个函数,但你可以通过使用模板和相对未知的“如果你想要显式维度,通过引用传递数组”方法来获得每对维度的函数:

template<size_t i, size_t j>
void stuff(char (&arr)[i][j])
{
    for (size_t x = 0; x < i; x++)
    {
        for (size_t y = 0; y < j; y++)
        {
            std::cout << arr[x][y] << " ";
        }
        std::cout << std::endl;
    }
}
于 2013-04-23T10:54:41.070 回答
1

/从评论中移出/

如果我错了,请纠正我,但我相信 C 中 2D 数组的内存布局是标准的一部分,你不能期待任何东西

 An object of array type contains a contiguously allocated non-empty 
 set of N sub-objects of type T.

同样适用于 2D。

所以我会提出简化的 C 风格的解决方案。现代 C++ 编译器的生命还没有结束,有时您需要针对轻量级嵌入式系统和编译器的类似解决方案。

void dumpArray( int * array, int w, int h) 
{ 
    for (int i=0;i<h;i++) 
      for (int j=0;j<w;j++) 
        { 
          printf("[%i,%i] = %i\n", i,j,array[i*w+j]); 
        } 
} 

int main(int argc, char * argv[]) 
{ 
     int a[2][3] = { {1,2,3}, {4,5,6} }; 
     int a1[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} }; 

     dumpArray( (int*)a, 3, 2); 
     dumpArray( (int*)a1, 3, 3); 
     return 0; 
}
于 2013-04-23T12:05:33.477 回答