2017-02-02 17 views
0

私は、他の構造体の一部を使って構造体を初期化するコードをC言語で記述しています。たとえば:構造体内の配列を別の配列で初期化する

//Original structure 
struct 
{ 
    int foo1; 
    int foo2; 
    int foo3; 
} orig_struct = {1,2,3}; 

//New structure 
struct 
{ 
    int bar1; 
    int bar2; 
} new_struct = {orig_struct.foo1, orig_struct.foo2}; 

私は、構造体のたくさんのためにこれをしなければならない、と初期化方法は、上記のコードは非常にきれいで読みやすいに見えるのです。明らかにするために、私は元の構造を支配していません。私はちょうどそれらからデータをキャプチャするために新しい構造を作成しています。

構造の一つは、大規模な配列を持っていたとき、私が問題に遭遇した

//Original structure 
struct 
{ 
    int foo1; 
    int foo2[50]; 
    int foo3; 
} orig_struct = {1,{2,3,etc},52}; //<--replace "etc" with 48 more int values 

//New structure 
struct 
{ 
    int bar1; 
    int bar2[50]; 
} new_struct = {orig_struct.foo1, XXX}; 

は、私がの配列内の値を持つ新しい構造で配列を初期化するとXXXを置き換えることができますものはあります元の構造?繰り返しますが、私は自分のコードにきれいで一貫した見た目を残したいので、中括弧の中に置いておくのが理想的です。私は手動で自分の中括弧内の配列の各要素を入力することができます知っている:

... 
} new_struct = {orig_struct.foo1, {orig_struct.foo2[0],orig_struct.foo2[1],orig_struct.foo2[2],orig_struct.foo2[3],etc} 

しかし、それはすぐに受け入れ難いなることができますなぜそれはかなり明白です。

答えて

1

cでは、配列の割り当てがサポートされていないため、式は定数式でなければならないため、イニシャライザ内でこれを行う方法はありません。そうループまたはmemcpyは、初期化中には不可能である(参照array initialization reference):他のすべての初期化と同様

静的 またはスレッドローカルの配列を初期化するとき、初期 リスト内のすべての式は、定数式でなければなりません保存期間:

その後、memcpy(new_struct.bar2, orig_struct.foo2, sizeof(new_struct.bar2))と書くこともできますが、このコードは構造体/変数宣言から切り離されています。

+0

ええ、私は現在memcpyメソッドを使用しています。確かに、それはひどいことではない。あなたが本当に他の方法がないということが正しいなら、私はそれを永久的なコードにしなければならないでしょう。 –

1

new_structを初期化する構文は、new_structに保存期間がstaticの場合は動作しません。この場合、定数式が必要なためです。

実際に配列を別の配列に直接割り当てる方法はありません。これは、配列自体が構造体でカプセル化され、構造体割り当てを使用している場合にのみ許可されます。あなたは、単にコードの重複を削減しようとしている場合

struct orig_struct_type orig_struct = {1,{2,3},52}; 

void some_function() 
{ 
    union { 
     struct orig_struct_type o; 
     struct new_struct_type n; 
    } *u = (void *)&orig_struct; 
    struct new_struct_type new_struct = u->n; 
    /* ... */ 
} 

、あなたがマクロに配列初期化子リストを置くことができます:あなたの元の構造と新構造が共通の初期の接頭辞を共有しているので、あなたは労働組合を介してこれを悪用しよう。

#define VALUES {2,3,etc} //<--replace "etc" with 48 more int 

//Original structure 
struct 
{ 
    int foo1; 
    int foo2[50]; 
    int foo3; 
} orig_struct = {1,VALUES,52}; 

void some_function() 
{ 
    struct 
    { 
     int bar1; 
     int bar2[50]; 
    } new_struct = {orig_struct.foo1, VALUES}; 
    /* ... */ 
} 
関連する問題