3

SO に D 個の質問 (=p) を入力するという 1 人での探求を支援するために、別の問題に遭遇しました。構造体の配列をグローバルに初期化します。観察:

struct A
{
    int a;
    float b;
}

A[2] as;
as[0] = {0, 0.0f};
as[1] = {5, 5.2f};

void main() {}

結果:

$ dmd wtf.d 
wtf.d(8): no identifier for declarator as[0]
wtf.d(9): no identifier for declarator as[1]

Digital Marsのドキュメントを調べても、まったく明らかなことは何も見えないので、Stack Overflow の勇敢な住人にもう一度目を向けます。[0]が識別子であるのと同じように、エラーメッセージは実際の問題とはあまり関係がないと思います(しかしdmd、それは宣言子だと思いますが、AFAICT はdocsを調べていますが、そうではありません)?

4

2 に答える 2

6

そのように要素ごとに要素を初期化することはできないと思います。これは機能しますか?

A[2] as = [
    {0, 0.0f},
    {5, 5.2f}
];

あなたの例で、あなたがas[0]複数回言及した場合に何が起こるかを考えてください:

as[0] = {0, 0.0f};
as[0] = {1, 1.0f};

as[0]プログラムの初期化での価値は何でしょうか?これは、イニシャライザーというよりもステートメントのようになりつつあります。

Dでは、次のように特定のインデックスで配列要素を初期化できることに注意してください。

A[2] as = [
    0: {0, 0.0f},
    1: {5, 5.2f}
];

これは、より大きな配列(などA[10])があり、一部の要素のみを初期化する必要がある場合に役立ちます。詳細については、Dリファレンスドキュメントのアレイを参照してください。

于 2009-08-24T21:52:41.410 に答える
3

これは、1つずつ初期化する場合にも機能します

struct A
{
    int a;
    float b;
}

A[2] as;
as[0] = A(0, 0.0f);
as[1] = A(5, 5.2f);

void main() {}

コンストラクターを明示的に定義しない場合 (つまり、静的な opCall)、すべての構造体は、各引数を順番に受け取るデフォルトのコンストラクターを取得します。構造体リテラルを参照してください

しかし、マイナス面は、おそらく最初に配列をデフォルト値に初期化し、次に値を 1 つずつ変更することです。したがって、事前にすべての値を知っている場合は、実際の初期化構文を使用する方がおそらく効率的です。

于 2009-08-24T22:38:24.440 に答える