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次元のことは私を混乱させています。

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);

最初の次元の角かっこの間に数字を入れると動的配列として扱われ、それ以降のレベルに数字を入れると静的配列として扱われるため、設計上の選択としては不適切であることがわかりました。その理由はわかりません。それがそうであるように、しかしそれはそれがそうである方法です。静的配列の動的配列を作成できるようにしたいことは理解できますが、長さ128ではなく、許可しないnew Cell[128]か、返すようにする方がはるかに一貫性がありますが、残念ながら、それは機能しません。Cell[128]*Cell[]

于 2012-05-09T20:20:13.663 に答える