Przekazywanie C-Style tablic dwuwymiarowych jako argument funkcji jest dość uciążliwe (polecam std::vector / std::array) ale oczywiście wykonalne ;)
Dlaczego ? Ponieważ do stworzenia tablic na stosie
static int array[X][Y] =
{
{1, 0, 2},
{1, 0, 2}
};
Kompilator musi znać jej rozmiar, i funkcje które będą z tej tablicy korzystać również muszą znać ten rozmiar (no chyba, że się napisze funkcję szablonową)
void doStuff(int (&ptr)[X][Y]);
Ta funkcja przyjmuje tablicę, ale jeśli z jej prototypu lub definicji zamienię
int (&ptr)[X][Y] na
int (&ptr)[][]
To kompilator zgłosi mi błąd, twierdząc że nie może on przyjmować tablic tworzonych lokalnie bez znajomości jej rozmiaru.
#include <iostream>
const std::size_t X = 2;
const std::size_t Y = 3;
void doStuff(int (&ptr)[X][Y]);
static int array[X][Y] =
{
{1, 0, 2},
{1, 0, 2}
};
int main()
{
doStuff(array);
}
void doStuff(int (&ptr)[X][Y])
{
for(int y = 0; y < Y; y++)
{
for(int x = 0; x < X; x++)
{
std::cout << "array[" << x << "][" << y << "] = " << ptr[x][y] << std::endl;
}
}
}
Tutaj taka mała pokazówka tego zagadnienia.
I więcej informacji na ten temat - http://stackoverflow.com/questions/8767166/passing-a-2d-array-to-a-c-function
Edit:
Można też zrobić takie cuda :
#include <stdio.h>
// Same as "void print(int **arr, int m, int n)"
void print(int *arr[], int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", *((arr+i*n) + j));
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3;
int n = 3;
print((int **)arr, m, n);
return 0;
}
ale przy przekazywaniu argumentów, należy użyć rzutowania na typ int** dla tablicy...