2012-05-09 2 views
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; 
    } 
} 

작동하지만, 내가 안쪽에 조금 울고 있습니다. 거기에 3 차원 배열에 calloc의 결과를 캐스팅하는 방법이 있나요? 나는 정기적 인 배열을 썰기 만하면되지만, 3-D 것은 나를 혼란스럽게합니다.

+1

이것은 [d]라는 태그가있는 666 번째 질문입니다. 흠. – nmichaels

+0

그리고 그것은 내가 좋아하는 D 주제, 다차원 배열의 정의/초기화에 관한 것입니다. 나는 아직도 의미를 알지 못한다. – sleeplessnerd

답변

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]을 허용하지 않거나 길이가 12830 인 Cell[]이 아닌 Cell[128]*을 반환하도록 훨씬 더 일관성이 있었지만 안타깝게도 그것이 작동하는 방식은 아닙니다. .

관련 문제