2013-01-24 4 views
3

제 프로그램에서는 1에서 100,000까지의 숫자의 합계 (0에서 5까지)가있는 배열을 생성해야합니다.컴파일 타임에 2D 배열이 생성되었습니다.

const enum size_t MAX_ARRAY_SIZE = 100_000 + 1; 
const enum size_t MAX_POWER_SIZE = 5 + 1; 
const enum power_sum = calc_power_sum(); 

// some unimportant code here 

pure ulong[MAX_POWER_SIZE][MAX_ARRAY_SIZE] calc_power_sum() { 
    ulong[MAX_POWER_SIZE][MAX_ARRAY_SIZE] power_sum; 

    power_sum[0][] = 1; 

    foreach (x, ref element; power_sum[1]) { 
     element = x; 
    } 

    foreach (n; 2 .. MAX_POWER_SIZE) { 
     foreach (x, ref element; power_sum[n]) { 
      element = power_sum[n - 1][x] * power_sum[1][x]; 
     } 
    } 


    foreach (ref power; power_sum) { 
     foreach (x; 1 .. MAX_ARRAY_SIZE) { 
      power[x] += power[x - 1]; // error appears here 
     } 
    } 

    return power_sum; 
} 

그러나 컴파일러는 말한다 : 내가 잘못 뭐하는 거지

$ dmd problem.d 
problem.d(130): Error: array index 6 is out of bounds [1LU, 2LU, 3LU, 4LU, 5LU, 6LU][0 .. 6] 
problem.d(15): called from here: calc_power_sum() 

그래서 나는이 코드를 컴파일하려고?

답변

4

얼핏 보면 배열 치수 순서를 오해 한 것 같습니다. 당신은

ulong[MAX_POWER_SIZE][MAX_ARRAY_SIZE] 

이 당신의 코드는
ulong[MAX_ARRAY_SIZE][MAX_POWER_SIZE] 

이 또한 내가 100 000 나는 내부 컴파일러 오류가 위에서 언급 한 수정 후, 조금 너무 많이있을 수 있습니다 두려워 바로 맞은 가정합니다. 그래도 작은 MAX_ARRAY_SIZE 값으로 작동합니다.

4

Mihail이 말했듯이 치수의 순서를 반대로해야합니다. 정적 배열의 최대 크기는 D (http://dlang.org/arrays.html)에 제한되기 때문에

그러나, 당신은 대부분의 모든 크기에 당신이 계획하는 일을 할 수 없습니다 :

정적 배열의 전체 크기 16Mb를 초과 할 수 없습니다.

+0

감사합니다. – sigod