2012-03-22 16 views
3

は、これはokです:C++の構造体配列の初期化

int vec_1[3] = {1,2,3}; 

ので何
エラー与え

struct arrays{ 
    int x[3]; 
    int y[3]; 
    int z[3]; 
}; 
arrays vec_2; 
vec_2.x = {1,2,3}; 

と間違っている: 'INT' に変換することはできません '<括弧で囲まれた初期化子リスト>' を代入中

このエラーで多くの投稿を読んだことがありますが、問題がどこにあるかはまだ分かりません。

+0

と同じことをされ

arrays vec_2 = { {1, 2, 3} }; 

。 –

+1

2番目は有効なC++ではありません。これを試してください: 'int vec_1 [3];' vec_1 = {1,2,3}; 'これは同じ理由でコンパイルされません。 – Chad

答えて

1

最初の例では、宣言時にベクトルを初期化しています。 2番目の例では

、あなたはあなたがこの割り当てをある vec_2.x = {1,2,3}

3

言うとき、再びarrays structとを宣言一度際、二回(違法)intializingされている、いない初期設定:

arrays vec_2; 
vec_2.x = {1,2,3}; 

使用あなたがしようとしたものに相当する、以下:

arrays vec_2 = { {1, 2, 3 } }; 

あなたがに値を提供する場合およびzも:

arrays vec_2 = { {1,2,3}, // x 
       {4,5,6}, // y 
       {7,8,9} // z 
       }; 
5

最初は初期化です。 2番目は代入の試行ですが、配列は代入できません。

あなたが好きな何かができる:あなたが唯一のvec_2.xを初期化したい場合は、あなただけの初期化子の残りの部分は省略でき

arrays vec_2 = {{1,2,3}, {3,4,5}, {4,5,6}}; 

:この場合

arrays vec_2 = {1,2,3}; 

を、 vec_2の残りはゼロを含むように初期化されます。

イニシャライザの周りに少なくとも1組のカッコを含める必要がありますが、したくない場合は、「内側」のカバレッジを含める必要はありません。それらを含めると少し柔軟性が得られます。たとえば、あなたがvec_2.xの最初の2つの項目とvec_2.yの最初の1を初期化したい場合は、あなたが使用できます。

arrays vec_2 = {{1,2}, {3}}; 

この場合、もしあなた」、あなたはvec_2セットを取得しますdは{1, 2, 0, 3, 0, 0, 0, 0, 0};を初期化子として使用しました。エラーメッセージが言うよう

+0

私は 'x = {1,2,3}'を許可するのにC++ 11が期待していましたが、([expr.ass] 5.17/9)はしません。 'std :: array'を好むもう一つの理由。生の配列はあまりにも貧弱なデザインです。 – bames53

2
arrays vec_2; 
vec_2.x = {1,2,3}; 

は、2行目は、割り当て、ない初期あります。彼らは2つの異なるものです。

あなたはこれを実行する必要があります。,が最後インナーブレースの後に許可されている

arrays vec_2 = { 
     {1,2,3}, //initializes x 
     {5,6,7}, //initializes y 
     {7,8,9}, //initializes z 
}; 

注こと! (私。e {7,8,9}, < - 許可)。このような末尾のカンマは通常、生成されたコードに役立ちます。カンマを気にすることなく別の行を追加することができます。また、最後の行について特別なケースを考慮する必要もありません。それがどのように見えるにもかかわらず

2
int vec_1[3] = {1,2,3}; 

が、これは割り当てはありませんが、これは(事実上)コンストラクタ呼び出しです。これらの値に初期化されたintの配列を作成します。

arrays vec_2; 

これは構造体と各メンバー配列をデフォルト値で構成します。

vec_2.x = {1,2,3}; 

配列を割り当てることはできません。このメンバーはすでに構築されています。回避策は、このような通りです:それは既に作成されているので

arrays vec_2 = { {1, 2, 3}, {0, 0, 0}, {0, 0, 0} }; 
関連する問題