对于学校我正在开展一个项目,我必须使用指针保存地图。地图由“单元格”结构组成。初始化地图时,我想使用函数index_map返回单元格的地址,以便我可以更改它的属性。但是,当我尝试编译此代码时,会发生以下错误:
警告:从不兼容的指针类型分配[-Wincompatible-pointer-types] placeInMap =&(w-> map)+ stepx x + stepy y;
这是我的index_map函数:
`cell* index_map(worldmap* w, int x, int y)
{
cell* cellInMap;
size_t stepx = sizeof(cell)*w->cols;
size_t stepy = sizeof(cell);
cellInMap = &(w->map) + stepx*x + stepy*y;
return cellInMap;
}*`
Worldmap是一个定义为:
的结构`typedef struct worldmap
{
cell* map;
unsigned int rows;
unsigned int cols;
} worldmap;`
Cell是一个定义为:
的结构`typedef struct cell
{
celltype type;
unsigned int owner;
}cell;`
答案 0 :(得分:0)
w-> map有type cell *
&(w-> map)有类型单元格**(指向单元格的指针)
您正在添加单元格**指针,它会生成一个单元格**指针。然后,您尝试将其分配给cellInMap,这是一个单元格*指针。那些是不同的,你得到错误。
如果将X添加到指针,它将按指针指向的大小前进。所以,如果你直接添加到w-> map而不是尝试添加到&(w-> map),你似乎有额外的逻辑来获得你可能不需要的sizeof(cell)。我认为你是在思考这个问题!
答案 1 :(得分:0)
w->map
是cell *
。 C中的指针算术已经处理了数组元素的大小,因此要获得cell x y
的地址,只需添加行的索引乘以列数和列的索引:
cellInMap = w->map + x*w->col + y;
警告就在那里,因为您使用&(w.map)
cell **
分配给cell *
,因此使用不同的索引级别。