c - 如何转置指针矩阵
问题描述
我有一个布局矩阵
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 矩阵)?
解决方案
您的矩阵不是“指针矩阵”,它是一个元素是指针的矩阵。它是一个整数矩阵。您将其定义为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
:a 的元素const T*
无法更改。如果你想就地修改矩阵,不要做它const
。(您仍然可以const
在可以访问的函数中本地创建它,但不要修改它。)
推荐阅读
- c# - C# - 搜索dataGridView后保存按钮
- javascript - Discord.js 禁止命令中的无效表单正文
- youtube-livestreaming-api - 自 2020 年 10 月 1 日以来,Youtube liveStreams 插入出现错误
- angularjs - 已完成 500 INTERNAL_SERVER_ERROR SpringBoot Angular:OneToMany 问题
- node.js - 使用 sequelize 删除父级时如何软删除关联子行
- flutter - 构建我的应用程序时出现不推荐使用的错误
- r - 用 1-10 标记 10 年的数据,而不是 1955-1966
- api - clearMarkers() 和 addMarker() 不起作用
- ruby-on-rails - 在 Heroku 上部署 Rails 应用程序 - 图像在一段时间后消失
- intellij-idea - 是否可以在 JetBrains PhpStorm 中设置项目特定的外观设置?