首页 > 解决方案 > 如何转置指针矩阵

问题描述

我有一个布局矩阵

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 矩阵)?

标签: carrayspointersmatrixconstants

解决方案


您的矩阵不是“指针矩阵”,它是一个元素是指针的矩阵。它是一个整数矩阵。您将其定义为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];

无需铸造!(警告意味着ints 比系统上的指针“更窄”,并且您将丢失分配中的信息。)

通过该更改,第二个错误仍然存​​在:您已经制作了矩阵const:a 的元素const T*无法更改。如果你想就地修改矩阵,不要做它const。(您仍然可以const在可以访问的函数中本地创建它,但不要修改它。)


推荐阅读