2012-05-09 20 views
6

Dünyamı temsil eden devasa bir 3 boyutlu dizilim var. Bu statik olarak başlatmak için çok büyük:Bu çok boyutlu diziyi nasıl başlatmalıyım?

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

Error: index 128 overflow for static array 

Yukarıda taşma ile World* world ama yine de hatalar dışarı kullanarak çalıştı. Peki şu anda var bu çirkin karmaşa:

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

çalışır, ancak bana içeride biraz ağlatıyor. Calloc sonucunu 3 boyutlu bir diziye çevirmenin bir yolu var mı? Normal dizileri dilimleyerek yaptım, ama 3 boyutlu şey beni şaşırtıyor.

+1

Bu, [d] ile etiketlenen 666 soru. Hmm. – nmichaels

+0

Ve en sevdiğim D konusu, çok boyutlu dizilerin tanımı/başlatılması ile ilgili. Hala anlambilim yok. – sleeplessnerd

cevap

9

Tırtıklı bir dizi bildirmek isterseniz (yani, her alt dizinin değişken uzunlukta olması durumunda), yaptığınız gibi bir döngü kullanmanız gerekir, ancak bu, düzgün diziler için gereksizdir. statik diziler dinamik dizi yapmak parantez arasına rakamlar koyduğunuzda

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

, sen: Bu pürüzlü değil çok boyutlu bir diziyi başlatmak nasıl. Yani,

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

Ben aslında (Ben hiç olur) bunu yapmak gerekirse yararlı olacağını tahmin uzunluğu 128 statik Dizilerin uzunluğu 128 statik diziler dinamik bir dizi bildirir, ancak Düzenli olarak yeni başlayanlar kesinlikle katılır.

auto arr = new Cell[](128); 

ben parantez sayı koyarak gerçeğini bulmak:

Şahsen, tek bir boyut dizi bildirirken bile sadece, parantez içinde numara koymak asla tamamen bu tür sorunları önlemek için Birinci boyut, dinamik bir dizi olarak ele alınırken, herhangi bir başka seviyeye sayı koymak, kötü bir tasarım tercihi olarak statik bir dizi olarak ele alınır ve neden böyle olduğunu bilmiyorum, ama işte bu şekilde. . Dinamik dizilerden oluşan statik diziler oluşturabileceğimizi anlayabiliyorum, ancak new Cell[128]'a izin vermemenin ya da Cell[] 128 uzunluğundan ziyade Cell[128]* döndürmesi çok daha tutarlı olurdu, ama ne yazık ki, bu nasıl işe yaramıyor? .

İlgili konular