2

私はCに非常に慣れていません。行13、14、および16のコードが機能しないのに、行17〜20が機能する理由を誰かが理解するのを手伝ってくれるとありがたいです。

最初のオプション (13、14、および 16 行目) を使用すると、エラーが発生します。

error: initializer element is not constant

これは何を意味するのでしょうか?また、これは、特定のタイプの変数を使用して新しい変数を生成できないことを意味しますか?

ありがとうございました。

// Define structure for a good
  5 struct good {
  6     char goodname;
  7     double p; //starting proportion
  8     int theta; //average utility
  9     int sigma; //variance of error
 10 };
 11
 12 // The goods H and L
 13 struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20};
 14 struct good L = {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20};
 15
 16 struct good goods[2] = {H, L}; // **Does not work**

 // ** Works**
 17 struct good goods[2] = {
 18     {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20},
 19     {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20}
 20 };
4

5 に答える 5

4

16 行目が機能しない理由は、このもっと単純な例が機能しない理由と同じです。

const int a = 5;
int b = a; // Does not work: "initializer element is not constant"

これが意味することは、初期化子でコンパイル時の定数式のみを使用する必要があるということです。C は変数をコンパイル時の定数とは見なしませんconst(一方、C++ はconst変数をコンパイル時の定数と見なします)。

于 2013-08-28T18:08:58.267 に答える
2

H と L は、データを含むストレージの場所です。ステートメント:

 struct good goods[2] = {H, L}; // **Does not work**

商品が H と L を指すか、H と L と同じ値を含む必要があることを意味します。

H と L からのデータを商品 [0] と [1] にコピーするか、次のように商品をポインターの配列に変更します。

 struct good *goods[2];

 goods[0] = &H;
 goods[1] = &L;
于 2013-08-28T18:12:05.387 に答える
2

これは、C では定数式のみを使用して、静的ストレージ期間を持つ配列または構造体を初期化できることを意味します。

あなたの例では、すべてのオブジェクトには静的な保存期間がありますが、

 struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20};

上記の初期化子はリテラルであり、リテラルは C の定数式なので、問題ありません。

 struct good goods[2] = {H, L};

ただし、ここHLはオブジェクトは定数式ではないため、コンパイラはエラーを返します。

C には、定数式とは何かについてかなり厳密な定義があり、オブジェクトの値は定数式とは見なされません (オブジェクトがconst修飾されているか、リテラルで初期化されている場合でも)。

于 2013-08-28T18:08:50.090 に答える
2

変数がすでにグローバルに初期化されていても (および修飾されていても)、変数の値自体は定数式ではありませんconst

静的期間変数2へのポインターは「拡張定数式」であり、ポインター変数の初期化に使用できるため、次のようにすることができます。

struct good *goods[2] = {&H, &L};

たとえば、それが問題に合っているかどうか。


1はい、「グローバルに初期化された」という言葉が明確に定義されていないことはわかっています。:-)つまり、初期化された静的期間変数であり、新しい初期化子の時点で可視である場合。

2つまり、任意の「グローバル」(ファイル スコープ) 変数、またはstaticブロック内の変数。

于 2013-08-28T18:09:34.503 に答える
2

オブジェクトが静的な「goods[0]/goods[1]」の場合、定数でのみ初期化できます。それで、「良いH」の初期化エラーが発生しなかった理由.

変数を非静的として定義した場合 (たとえば、main() または function() のいずれかで)、オブジェクトが「auto」として扱われるため、このエラーは発生しません。

于 2013-08-28T19:17:31.643 に答える