2017-08-21 39 views
1

私は、データを格納する構造体と構造体の配列を作成し、私の機能にそれらのそれぞれを通過したC.にかなり新しいです:C:関数内の構造体の内部構造体の配列へのポインタ

int dosomething(struct s1 *struct1, struct s2 *struct2); 

struct S1 { 
    int a; 
    int b; 
    int c; 
}; 

struct S2 { 
    double x; 
    double y; 
    double z; 
}; 


int main() 
{ 
    int n = 200; 
    struct S1 s1; 
    struct S2 *s2 = malloc(n * sizeof(struct S2)); 

    dosomething(&s1, &s2[0]) 

    return 0; 
} 

int dosomething(struct S1 *s1, struct S2 *s2) 
{ 
    s1->a = 1; 
    s1->b = 2; 
    s1->c = 3; 

    s2[0].x = 1.1; 
    s2[1].x = 1.123233; 
    ... 

    return 1; 
} 

これは時間の経過とともにかなり迷惑になりました。 私は構造体に、アレイへの、構造体の配列へのポインタについて多くを読んでというように、私はまだわからない、どのようなI場合: は、今私は今、事はある。この

struct S1 { 
    int a; 
    int b; 
    int c; 
    struct S2 *s2; 
}; 

struct S2 { 
    double x; 
    double y; 
    double z; 
}; 


int main() 
{ 
    int n = 200; 
    struct S1 s1; 
    struct S2 *s2 = malloc(n * sizeof(struct S2)); 
    s1.s2 = s2; 

    dosomething(&s1) 

    return 0; 
} 


int dosomething(struct S1 *s1) 
{ 
    s1->a = 1; 
    s1->b = 2; 
    s1->c = 3; 

    s1->s2[0].x = 1.1; 
    s1->s2[1].x = 1.123233; 
    ... 

    // OR 

    struct S2 *s2 = s1->s2; 
    s2[0].x = 1.1; 
    s2[1].x = 1.123233; 
    ... 
} 

をしていますここにいるのは正しいです。 , c pointer to array of structs, How to declare pointer to array of structs in C, Pointer to array of struct in function。 私のプロジェクトは、それをより良くしようとすることによってそれを悪化させたくない大きさに成長しています。

s2.s1 [x]へのポインタの配列を作成する必要はありますか?

1つのポインタ(struct S2 * s2 = s1-> s2)にs2の要素数を伝える必要がありますか?

落とし穴がありますか、または何かが間違っている可能性がありますか?

+1

コンパイラに警告が表示されますか? 'main()'の暗黙の宣言について –

+0

あなたがしたことは言語の観点からは問題ないようです(エラーはなく、正しい機能を持っています)。しかし、それはもっとうまくできます。 –

+1

'n'はどこに定義されていますか? – Groo

答えて

0

あなたの要件に合っているかどうか、また長期的には良い設計選択であるかどうかは問題ありません。

また、あなたはおそらく構造体、ポインタまたは他の構造体の内部の配列を配置すること

s1.s2 = malloc(sizeof *s1.s2); 
if (s1.s2 == NULL) 
    error_handler(); // do not use s1.s2 after this 
dosomething(&s1); 
0

行うことができますが構図と呼ばれています。 S2配列は、S1構造体の中に配置する必要があります(の場合)。例えば

Point(x, y)座標のペアですので、それはすなわち、2つの int Sで構成されなければならない明らかです:

void do_stuff(int x, int y); 

しかし:

void do_stuff(struct Point pt); 

がより優れていますあなたがいくつかの入力を惜しまなくしたいので、これをしないでください。 S2S1に収まる場合はそれを行います。S2のない「S1がありません」がプログラムに含まれている場合は意味があります。これら二つの構造体が一緒に属していますが、複数の機能にパラメータの同じシーケンスを渡して自分自身を見つけることができません行う場合

だから、あなたは "introduce parameter object"と呼ばれるOOPのリファクタリング手法のバリアントを使用することができます。私。代わりにこれを行う:

do_stuff(&s1, &s2, &s3); 

あなたが他の目的は、これらのパラメータで構成することではなくではない新しい構造体を作成することができます

struct StuffParameters { 
    struct S1 * s1; 
    struct S2 * s2; 
    struct S3 * s3; 
}; 

をそして、あなたは、複数の「類似」の機能にそれを渡すことができます:

struct StuffParameters parameters = { &s1, &s2, &s3 }; 

do_stuff(&parameters); 
do_some_other_stuff(&parameters); 
yet_another_function(&parameters); 
+0

最初は、構造体をどのように組み立てるのか分からず、コードを実行したかったのですが、それらは一緒に属していました。 –

+0

@dimplemind:「パラメータオブジェクトを導入する」という考え方(Cはオブジェクト指向ではありませんが)は、最初のように少し涼しいです。このパラメータセットに関連するすべての関数をこれらの構造体を論理的に分離したままにしておきます。C++では、すべてのthこの新しい "パラメータオブジェクト"を扱う関数は、別のクラスのメンバになります。しかし、これらの構造体が実際に表しているものを明確にするためにコードの実際の部分を投稿した方が良いでしょう。 – Groo

+0

今日は遅すぎます。私は1分後に出発します。明日は、少なくとも関連する部分を投稿します。 –