2011-10-26 6 views
2

私はCで以下のデータ構造を効率的に管理(アクセスする方法)するのはかなり混乱しています。簡単に説明すると、私は別の構造体のメンバを含む構造体を持ち、等々。このようなもの:この複合Cデータ構造を構築して管理するにはどうすればよいですか?

typedef struct 
{ 
    int num; 
} D; 

typedef struct 
{ 
    D *boo; 
} C; 

typedef struct 
{ 
    C *far; 
} B; 

typedef struct 
{ 
    int foo; 
    B *bar; 
} A; 

A *func() { 
    A *var; 
    // POPULATE var 
} 

int main(...) { 
    A *a = func(); 
    // PRINTING 
} 

このデータ構造を管理するにはどのような方法が最適ですか?私はこのA型ポインタのデータをどのように埋めるのでしょうか?

aが(// PRINTINGに)保存されているすべてのデータを印刷しようとしているとしたら、a->bar->far->boo->numのようになります。これが適切に機能するかどうかわからないので、堅牢です。

+0

最初にするべきことは、各単一メンバー 'struct'を' typedef'で置き換えることです。 –

答えて

3

これは、 Pythonのような散在したデザインを選択している場合は、自然に管理するのが少し面倒です。

印刷は、あなたの言うとおりに機能します.Cの->オペレータは、通常そのように使用されます。もちろん、構造体が「完全」でないNULLポインタがある場合は、ポインタの逆参照を行う前にそれをチェックする必要があります。そうしないと、未定義の動作が発生します。これは少しある

D* d_create(int num); 
C* c_create(int num); 
B* b_create(int num); 

A* a_create(int foo, int num) 
{ 
    A* a = malloc(sizeof *a); 
    if(a != NULL) 
    { 
    a->foo = foo; 
    a->bar = b_create(num); 
    if(a->bar != NULL) 
     return a; 
    free(a); 
    } 
    return NULL; 
} 

:その後、最上位のタイプを設定するためにチェーンで互いを呼び出すことができます

人口はおそらく最高は、各レイヤでインスタンスを作成するための機能を書き込むことによって行われるだろう、すべての実際のデータ(foonum)は、Aのインスタンスを作成するトップレベル関数に渡されなければならないので、扱いにくく、扱いにくく、非常に単純です。

BポインタがNULLでないことを確認して、下位レベルのメモリアロケータからエラーをキャッチする方法に注目してください。これらの種類のチェックは、他のcreate関数でも必要になります。

+0

+1このような素敵な答えは、私はこれについてもっと考えて、すぐにあなたに戻ってきます。 –

+0

ちょっと**くつろぎ**、ちょうど簡単な質問:あなたはそれを返す後にどのように(a)を解放することができますか?プログラムはまだfree()関数を実行しますか? –

0

ポインタを使用する理由を知らずに「どうすればこのことを管理できますか」と答えることはできません。 Aがそれぞれ独自のBなどを所有している場合は、Aを割り当てるときにはBを割り当て、Aを解放するときは解放する必要があります。しかしその場合、ポインタは役に立たず、余計な作業が必要になります。あなただけ行っている可能性:

typedef struct 
{ 
    int num; 
} D; 

typedef struct 
{ 
    D boo; 
} C; 

typedef struct 
{ 
    C far; 
} B; 

typedef struct 
{ 
    int foo; 
    B bar; 
} A; 

A func() { // don't necessarily need to return a pointer here either 
    A var; 
    var.foo = 1; 
    var.bar.far.boo.num = 2; 
    return var; 
} 

をポインタの理由は、あなたがBの同じインスタンスにAそのすべてのポイントの複数のインスタンスを持つことができるということであれば、あなたがたときに、そのインスタンスあなたが知っている方法を決定する必要がありますBは使用されなくなり、解放することができます。参照カウントのような汎用ソリューションがいくつかあります。あるいは、アプリケーション固有のものがあり、質問への回答が簡単になるかもしれません。

関連する問題