Moję pytanie, jak mogę przekazać tą tablicę do tej funkcji ? Wiem, że gdybym podał rozmiar drugiego wymiaru (lub po prostu liczbę większą) to by działało, ale jak to zrobić, przy założeniu, że nie znam wielkości tych wymiarów ?
Prosto się nie da, jest to związane z tym jak kompilator traktuje statyczne tablice dwuwymiarowe:
A B C
D E F
G H I
rozmiar tablicy nie jest nigdzie przechowywany, dlatego ta tablica w pamięci wygląda po prostu tak:
A B C D E F G H I
Kiedy piszesz z = tab[x, y], kompilator generuje coś w rodzaju:
z = *(tab + x*width + y)
Czyli mnoży x razy logiczną szerokość
tablicy, symulując jej dwuwymiarowość (na przykład dla powyższej - *(tab + 1*3 + 2) == *(tab + 5) == tab[5], czyli F - element w 3 kolumnie 2 wiersza.
Trick polega na tym, że szerokość jest hardcodowana w kodzie na podstawie typu tablicy. Czyli nie możesz przekazać tablicy dwuwymiarowej jako parametr, bo kompilator nie będzie wiedział przez co pomnożyć x.
Najprościej to obejść, przejmując na siebie obowiązki kompilatora:
int *tab = (int*)array;
z = *(tab + x*width + y); // z = tab[x, y]
Tak, to brzydkie rozwiązanie... Ładne rozwiązanie to przekazanie tablicy wskaźników, czyli int** - jak @Shalom proponuje.