2016-08-04 8 views
2

私はRegisterという構造を作りました。その中に8つのフィールドがあります。 Instrumentという構造を作りたいと思っています。これには、さまざまなフィールドが必要です。各インストゥルメントで同じ6個のフィールドと、それに起因するレジスタの数に応じた一定量のフィールドが必要です。これをどうすれば作れますか?構造のサイズを変更しますか?

わかりやすくするために、ここでは私が作成したいものがあります(正確ではないかもしれませんが)。

typedef struct { 
    int x; 
    int y; 
    int z; 
} Register; 

typedef struct { 
     int x; 
     int y; 
     int z; 
     Register Reg1; 
     Register Reg2; 
     ... 
    } Instrument; 
+2

@iwinフレキシブルアレイメンバーですか? –

+0

別の可能な解決策は、異なるレジスタ可能性の和集合である。 – ikegami

+0

@ikegami unionは、少ないレギュレーションで多くのメモリを無駄にする機器を使用することができます。 – LPs

答えて

5

これを実現するには、flexible array membersを使用できます。その後、

typedef struct { 
     int x; 
     int y; 
     int z; 
     Register Reg1; 
     Register Reg2; //upto this is fixed.... 
     Register Reg[]; 
     } Instrument; 

など

何か後でsomeVar.Regに、必要に応じて、あなたはメモリを割り当てることができます。例えば

C11を引用し、章§6.7.2.1/ 20

例2宣言の後:

struct s { int n; double d[]; }; 

可撓性アレイ部材dを有するstruct s構造。これを使用する一般的な方法は次のとおりです。

int m = /* some value */; 
struct s *p = malloc(sizeof (struct s) + sizeof (double [m])); 

と がpのように宣言されたかのようにオブジェクトは、ほとんどの目的のためにp振る舞う、によって指さ、mallocへの呼び出しが成功したと仮定:

struct { int n; double d[m]; } *p; 
+0

ありがとう、それはmalloc()を使用していますか?もしそうなら、私はそれをどうやってどこへ行きますか? – Mst137

+0

@ Mst137私はあなたが正確に知りたいことは得られませんでした。上記の例について話していますか? –

+0

申し訳ありませんが、私は当時の例を見ていませんでした。ありがとうございました! – Mst137

2

あなたはint型、それを使用

typedef struct 
{ 
    int x; 
    int y; 
    int z; 
    Register *reg; 
} Instrument; 

ポインタを使用することができますoコード

Instrument a.reg = malloc(sizeof(Register)*NUM_OF_REGISTERS); 
if (a.reg != NULL) 
{ 
    // your STUFF 
    free(a.Reg); 
} 
関連する問題