Как транспонировать матрицу указателей - PullRequest
1 голос
/ 21 апреля 2020

У меня есть матрица макета

const int boatRect[MAX_BITMAP_SIZE][MAX_BITMAP_SIZE] = { // 5
        {0, 0, 1, 0, 0},
        {0, 0, 1, 0, 0},
        {0, 0, 1, 0, 0},
        {0, 0, 1, 0, 0},
        {0, 0, 1, 0, 0}
};

и структура с указателем на нее (матрица):

typedef struct bitmap {
    Shape shape;
    const int (*matrix)[MAX_BITMAP_SIZE];
    int orientation;
    int size;
} Bitmap;

Затем я хочу транспонировать (часть вращения процесс) матрица в структуре:

void transpose(const int (*shape)[MAX_BITMAP_SIZE]) {
    const int *temp;
    for(int i = 0; i < MAX_BITMAP_SIZE; i++) {
        for(int j = 0; j < i; j++) {
            temp = (const int *) shape[i][j]; //Cast to 'const int *' from smaller integer type 'int'
            shape[i][j] = shape[j][i];        //Read-only variable is not assignable
            shape[j][i] = temp;               //Read-only variable is not assignable
        }
    }
}

но я получаю эти ошибки, я не уверен в том, что я делаю неправильно!

Я пытаюсь сделать это так способ иметь только одну матрицу в коде и иметь указатели на нее и поворачивать эти указатели так, чтобы они передавали повернутую матрицу, не создавая другую.

Итак, как мне в своей структуре Bitmap создать матрицу указатели, которые указывают на матрицу const int, а затем вращают эту матрицу указателей (а не матрицу int)?

1 Ответ

2 голосов
/ 21 апреля 2020

Ваша матрица не является "матрицей указателей", которая была бы матрицей, элементами которой являются указатели. Это матрица целых чисел. Вы определяете его как массив массивов int.

const int boatRect[MAX_BITMAP_SIZE][MAX_BITMAP_SIZE] = { ... };

Как и другие массивы, он может быть представлен как указатель на свой первый элемент, который в вашем случае является массивом MAX_BITMAP_SIZE целых ,

const int (*matrix)[MAX_BITMAP_SIZE];

Разыменование его дважды даст вам int, а именно целочисленное значение в данной строке и столбце. Следовательно, ваша переменная temp для обмена должна быть int:

int temp = shape[i][j];

Нет необходимости в приведении! (Предупреждение означает, что int s "уже", чем указатель в вашей системе, и что вы потеряете информацию в назначении.)

С этим изменением вторая ошибка все еще будет сохраняться: вы сделали матрица const: элементы const T* не могут быть изменены. Если вы хотите изменить матрицу на месте, не устанавливайте ее const. (Вы можете сделать это локально const в функциях, которые обращаются к нему, но не изменяйте его.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...