C - 从3D阵列中选择2D切片

时间:2016-12-14 19:47:32

标签: c arrays pointers

我有一个像这样声明的全局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]那样使用双重索引。)

有可能吗?

3 个答案:

答案 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;
  }

然后问题就消失了。 表达有点麻烦,但你很快就会学会忍受它。