6

我有一个巨大的 3 维数组来代表我的世界。静态初始化太大了:

alias Cell[128][128][128] World; // <-- The compiler points to this line

Error: index 128 overflow for static array

我尝试使用World* world,但上面的溢出仍然出错。所以我现在拥有的是这个丑陋的烂摊子:

alias Cell[][][] World;
// ...
private World world;
// ...
world.length = WORLD_XDIM;
for (uint x = 0; x < world.length; ++x)
{
    world[x].length = WORLD_YDIM;
    for (uint y = 0; y < world[x].length; ++y)
    {
        world[x][y].length = WORLD_ZDIM;
    }
}

这行得通,但它让我内心有点哭泣。有没有办法将 calloc 的结果转换为 3 维数组?我已经通过切片常规数组来完成它,但是 3-D 的东西让我感到困惑。

4

1 回答 1

9

如果你想声明一个锯齿状数组(即每个子数组可能有不同的长度),那么你需要像你正在做的那样使用循环,但这对于统一数组是不必要的。这是您初始化非锯齿状多维数组的方式:

auto arr = new Cell[][][](128, 128, 128);

当您将数字放在括号之间时,您将使其成为静态数组的动态数组。所以,

auto arr = new Cell[128][128][128];

声明一个长度为 128 的静态数组和长度为 128 的静态数组的动态数组。我想如果你真的需要这样做(我从来没有),它会很有用,但它肯定会定期绊倒新手。

就个人而言,为了完全避免此类问题,我只是从不将数字放在括号之间,即使在声明一维数组时也是如此:

auto arr = new Cell[](128);

我发现将数字放在第一个维度的括号之间被视为动态数组,而将数字放在任何其他级别被视为静态数组是一个糟糕的设计选择,我不知道为什么会这样它是这样的,但它就是这样。我可以理解希望能够创建静态数组的动态数组,但是禁止new Cell[128]或使其返回 aCell[128]*而不是Cell[]长度为 128 的 a 会更加一致,但不幸的是,这不是它的工作原理。

于 2012-05-09T20:20:13.663 回答