我想要传递给一个函数的3个2D数组。目前,我使用if-else语句来决定发送哪个数组,然后复制所选数组的内容并传递新数组。
新阵列:
char board[100][100]={}
这些是数组(内容未显示):
char mazeEasy[19][38], mazeMed[41][81], mazeHard[72][98];
如何在不使用board[100][100]
的情况下将这三个中的任何一个传递给一个函数?
答案 0 :(得分: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的演示。请注意,这将实例化函数模板的三个不同实例(每个不同维度组合的一个实例)。
建议改为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上的演示。
答案 1 :(得分: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;
}
}
答案 2 :(得分: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;
}