В дополнение к ответу @ serb ie, решающему проблему индексации, вы можете упростить алгоритм обращения самого массива - на месте без использования второго массива. С вашим текущим алгоритмом вы не столько переворачиваете массив, сколько просто заполняете второй массив элементами первого в обратном порядке. Если бы вы попытались на самом деле обратить array
на место, вы бы просто поменяли местами каждый элемент дважды и получили бы тот же массив, с которого начали. Кроме того, нечетное или четное количество строк может дать разные результаты.
Для аннотированного вывода вам все равно потребуется вывести массив с нужными вам заголовками и номерами строк, но для самого обращения в место может быть уменьшено до, например:
#define ROW 3
#define COL ROW
void rev2d (int (*a)[COL])
{
/* loop rows increment from 0 while row < end row decrementing from ROW-1 */
for (int i = 0, j = ROW-1; i <= j; i++, j--) {
/* loop cols 0->COL-1 and COL-1->0 while i != j or col < endcol */
for (int k = 0, l = COL-1; i != j ? k < COL : k < l; k++, l--) {
/* swap element */
int n = a[i][k];
a[i][k] = a[j][l];
a[j][l] = n;
}
}
}
( примечание: вы можете изменить функцию, чтобы принимать значения row
и col
, если вы не используете константы)
Алгоритм будет работать для значений row
и col
, больших или равных 2
(вы можете добавить проверку для массива размером 1x1
и при необходимости выдать предупреждение, или просто позвольте вещам остаться неизменными, как это было бы в настоящее время).
Обработка нечетного / четного количества строк выполняется через троицу, используемую в условном выражении inner-l oop, например i != j ? k < COL : k < l
, который инвертирует полные строки, если не существует нечетного числа строк, а затем, когда i = j
, он просто обращается к среднему элементу
. Он обеспечивает полное обращение массива, например:
102 * Пример 8 *
$ ./bin/revarr2da
original array:
1 2 3
4 5 6
7 8 9
reversed array:
9 8 7
6 5 4
3 2 1
С вашим алгоритмом все в порядке, если вы хотите заполнить отдельный массив, если вы хотите поменять местами значения, это просто дополнительный способ приблизиться к нему с помощью