我有一个像这样声明的全局3D数组:
TileType maps[DLVL_MAX][LEVEL_HEIGHT][LEVEL_WIDTH];
这是一个函数,我想命名这个数组的一个2D切片,以减少麻烦,比如
void f(int dlvl) {
TileType level_map[LEVEL_HEIGHT][LEVEL_WIDTH] = &(maps[dlvl]);
...
}
乍一看,这对我来说应该是可能的,因为C数组维度是从左到右排序的。然而,我无法找到正确的表达方式。 (当然,我可以给level_map
TileType*
类型,但我不能像level_map[x][y]
那样使用双重索引。)
有可能吗?
答案 0 :(得分:2)
TileType level_map[LEVEL_HEIGHT][LEVEL_WIDTH] = &(maps[dlvl]);
您不能这样做,因为level_map
是数组,并且无法重新分配数组。
您需要的是memcpy
。鉴于您需要分配给level_map
的是3D maps
的第一个元素(在索引0处):
memcpy(level_map, &maps[0], sizeof(level_map));
您可以对其他元素执行相同的操作。
编辑:
我应该更清楚 - 我希望将level_map元素赋值给相应的地图元素
好的,你需要声明一个指针而不是数组:
TileType (*level_map)[LEVEL_HEIGHT][LEVEL_WIDTH]; // pointer to 2D array
level_map = &maps[0]; // reassign pointer to the address of `maps` first element
答案 1 :(得分:2)
TileType level_map[LEVEL_HEIGHT][LEVEL_WIDTH] = &(maps[dlvl]);
&(maps[dlvl])
评估一个地址,即dlvl
的{{1}}元素的地址。
您无法使用地址初始化数组maps
。
你可以做
level_map
上述语句定义TileType (*plevel_map)[LEVEL_HEIGHT][LEVEL_WIDTH] = maps[dlvl];
到指向并将plevel_map
的{{1}}元素初始化。
然后,您可以像{
}一样访问dlvl
maps
元素的元素
dlvl
<强>更新强>
你可以做的是
maps
然后像这样访问(*plevel_map)[x][y]
的元素:
TileType * pplevel_map = maps[dlvl][0];
然后再做
map[dlvl][0]
寻求pplevel_map[x]
。
然后像这样访问pplevel_map += sizeof(**maps);
的元素(也是):
maps[dlvl][1]
更新^ 2
仍然可以使用map[dlvl][1]
来访问所有&#34;级别&#34;的元素:
pplevel_map[x]
然后像这样访问[x][y]
的元素:
TileType (*aplevel_map)[LEVEL_WIDTH] = maps[dlvl];
答案 2 :(得分:0)
帮自己一个忙“
TileType maps[DLVL_MAX * LEVEL_HEIGHT* LEVEL_WIDTH];
现在总是传递地图和levelid(猜测你的意思),y 坐标和x坐标。
void foo(TileType *maps, int levelid, int x, int y)
{
TileType tile = BLANK;
map[levelid * LEVEL_HEIGHT * LEVEL_WIDTH + y * LEVEL_WIDTH + x]
= tile;
}
然后问题就消失了。 表达有点麻烦,但你很快就会学会忍受它。