在D中编译时生成的2D数组

时间:2013-01-24 12:45:32

标签: multidimensional-array d compile-time

在我的程序中,我需要生成具有幂(从0到5)数字总和从1到100,000的数组。

所以我试着编译这段代码:

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

我做错了什么?

2 个答案:

答案 0 :(得分:4)

乍一看,您似乎只是误解了数组维度顺序。

ulong[MAX_POWER_SIZE][MAX_ARRAY_SIZE]

并且您的代码与

正好相反
ulong[MAX_ARRAY_SIZE][MAX_POWER_SIZE]

另外我担心10万可能有点太多了,经过上面提到的修复后我得到了一个内部编译器错误。适用于较小的MAX_ARRAY_SIZE值。

答案 1 :(得分:4)

正如Mihail所说,你应该改变尺寸的顺序。

但是,您很可能无法为所有尺寸执行您的计划,因为静态数组的最大大小限制在D(http://dlang.org/arrays.html)中:

  

静态数组的总大小不能超过16Mb。