我应该如何初始化这个多维数组?

时间:2012-05-09 18:55:33

标签: arrays multidimensional-array initialization d

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

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的结果转换为三维数组?我已经完成了切割常规数组,但是三维的东西让我感到困惑。

1 个答案:

答案 0 :(得分: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]或使其返回Cell[128]*而不是Cell[]长度为128,但不幸的是,这不是它的工作原理。