Передача многомерных массивов в качестве аргументов функции вызывает некоторые головные боли. Помните, что в большинстве случаев выражение типа массива будет неявно преобразовано в тип указателя, а его значением будет адрес первого элемента массива. Так, например, массив int 10x20 будет преобразован в указатель на массив из 20 элементов int:
void swap(int (*surface)[20], size_t rows, size_t x1, size_t x2,
size_t y1, size_t y2)
{
int temp;
assert(x1 < rows && x2 < rows);
temp = surface[x1][y1];
surface[x1][y1] = surface[x2][y2];
surface[x2][y2] = temp;
}
int main(void)
{
int surface[10][20];
...
swap(surface, 10, 1, 1, 2, 2);
...
}
Здесь возникает большая проблема. Основываясь на своем прототипе, swap () может работать только с массивами Nx20 из int; количество строк может варьироваться, но количество столбцов не может, потому что T (*)[N]
отличается от типа T (*)[M]
, где N! = M. В идеале вам нужна функция, которая может иметь дело с произвольным числом строк и столбцы. Один из способов сделать это - обработать массив как одномерный массив T и вычислить смещения строк и столбцов вручную:
void swap(int *surface, size_t rows, size_t cols, size_t x1,
size_t x2, size_t y1, size_t y2)
{
int temp;
assert(x1 < rows && x2 < rows && y1 < cols && y2 < cols);
temp = surface[x1*cols+y1];
surface[x1*cols+y1] = surface[x2*cols+y2];
surface[x2*cols+y2] = temp;
}
int main(void)
{
int surface[10][20];
...
swap(&surface[0][0], 10, 20, 1, 1, 2, 2);
}
Здесь мы передаем адрес первого элемента (& surface [0] [0]) и обрабатываем его как простой указатель на int. Таким образом, мы можем иметь дело с любым количеством строк и столбцов. Обратите внимание, что это будет работать только для реальных двумерных массивов (не массивов указателей), так как в swap предполагается, что элементы массива расположены последовательно.