Повернуть матрицу без [] - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно повернуть матрицу и вызвать функцию без использования [], Я даже не могу думать о решении.

void _90DegClockwise(int *pS, int row, int col) {
    for (int i = 0; i < row; ++i)
    {
        for (int j = i + 1; j < col; j++) {
            int temp;
            temp = (int)(pS);
            *((int*)((pS + i) + j)) = (int*)((pS + j) + i);
           (int*)((pS + j) + i) = temp;
        }
    }
}

Я не знаю, как вставить значение в матрицу или как поменять местами

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вы смешиваете указатель и разыменованное значение в 3 строках

В первой строке temp = (int)(pS); вы присваиваете значение указателя для temp вместо значения, на которое указывает указатель . Точно так же вы также назначаете значение указателя для ячейки памяти , как это *((int*)((pS + i) + j)) = (int*)((pS + j) + i);, что не имеет смысла.

Тогда в последней строке (int*)((pS + j) + i) = temp; не работает, потому что вы значение для адреса, а не ячейки памяти

Не забудьте использовать * для разыменования указателя , чтобы получить переменную, то есть ячейку памяти, на которую указывает указатель. В C a[b] эквивалентно *(a + b), поэтому просто замените все эти вхождения. Я не знаю, почему вы делаете это "правильно" с *((int*)((pS + i) + j)), но не применяете это к другим

Даже тогда вы неправильно вычисляете индекс. *((int*)((pS + i) + j)) это просто pS [i + j], который не является тем элементом, который вам нужен. Если вы передаете 2D-массив в виде 1D-массива, вам нужно рассчитать реальный индекс следующим образом: pS[i + j*width]

Так делать

temp = pS[i + j*width];
pS[i + j*width] = pS[j + i*width];
pS[j + i*width] = temp;

просто измените его на

temp = *(pS + i + j*width);
*(pS + i + j*width) = *(pS + j + i*width);
*(pS + j + i*width) = temp;

Вы должны включить все предупреждения компилятора. Они очень полезны и помогают решить большую часть вышеуказанной проблемы

0 голосов
/ 10 ноября 2018

Чтобы решить эту проблему, вам нужно понять, как работают массивы в C.

Допустим, у вас есть матрица 3 * 3, которая объявлена ​​так:

int matrix[3][3];

Пока вы представляете, что это квадрат вроде этого:

+---+---+---+
| 0 | 1 | 2 |
+---+---+---+
| 3 | 4 | 5 |
+---+---+---+
| 6 | 7 | 8 |
+---+---+---+

Для компьютера это последовательная «строчка» в памяти, которая выглядит следующим образом:

+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+
^
|____matrix

А переменная matrix содержит адрес первой ячейки

Итак, если вы хотите получить доступ к любой ячейке без использования оператора [], вам необходимо вычислить адрес этой ячейки.

Давайте сделаем это для средней ячейки:

matrix[1][1];

Это вторая ячейка второй строки, поэтому вам нужно добавить ширину первой строки в начало матрицы, а затем добавить еще одну ячейку в начале второй строки. И вы хотите разыменовать адрес, чтобы получить значение следующим образом:

*(matrix + (3 * 1) + 1);

Что если нам нужна средняя клетка третьего ряда? То же самое, но добавьте ширину двух строк:

*(matrix + (3 * 2) + 1);

Подводя итог: если вы хотите получить доступ к ячейке x в строке y матрицы, вы бы рассчитали ее адрес следующим образом:

*(matrix + (with * y) + x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...