3

私のプログラムでは、1から100,000までの数の累乗(0から5)の合計で配列を生成する必要があります。

だから私はこのコードをコンパイルしようとしました:

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

2 に答える 2

4

一見すると、配列の次元の順序を単に誤解しているように見えます。あなたが持っている

ulong[MAX_POWER_SIZE][MAX_ARRAY_SIZE]

そしてあなたのコードは正反対を想定しています

ulong[MAX_ARRAY_SIZE][MAX_POWER_SIZE]

また、100000は少し多すぎるのではないかと思います。上記の修正を行った後、内部コンパイラエラーが発生します。ただし、小さいMAX_ARRAY_SIZE値でも機能します。

于 2013-01-24T13:31:53.870 に答える
4

ミハイルが言ったように、次元の順序を逆にする必要があります。

ただし、静的配列の最大サイズは D ( http://dlang.org/arrays.html )で制限されているため、すべてのサイズに対して計画したことを実行できない可能性が高くなります。

静的配列の合計サイズは 16Mb を超えることはできません。

于 2013-01-25T13:04:25.113 に答える