0

私はCに慣れていないので、ご容赦ください。次のような可変サイズの他の構造体の結合を含む構造体があります。

typedef struct _obj_struct {
    struct_type type;
    union obj {
        struct1 s1;
        struct2 s2;
        struct3 s3;
    } s_obj;
} obj_struct;

typedef struct _t_struct {
    unsigned int number_of_obj;
    obj_struct* objs;
    other_struct os;
    unsigned int loop;
} t_struct;

struct_typeは、共用体で使用する構造体の型です。オブジェクト内のすべての要素を確認するにはどうすればよいですか?これはこれを行う正しい方法ですか?

struct1 s1;
struct2 s2;
struct3 s3;

for (j=0; j<t_struct.number_of_obj; j++)
{
    switch (t_struct.obj[j].type) {
        case STRUCT1:
            s1 = t_struct.objs[j].s_obj.s1;
            break;
        case STRUCT2:
            s2 = t_struct.objs[j].s_obj.s2;
            break;
    }
}
4

3 に答える 3

1

これt_struct.obj[j].s_objは結合であり、実際の構造ではありません。あなたはt_struct.obj[j].s_obj.s1などを使用する必要があります。

于 2012-12-05T08:04:42.923 に答える
1

各構造のコピーが必要でない限り、代わりにポインターを使用してください。

struct1 *s1;
// ...
s1 = &t_struct.objs[j].s_obj.s1;

ユニオンの要素も指定する必要があることに注意してください。

于 2012-12-05T08:05:32.627 に答える
1

構造体内に含まれるunionのメンバーにアクセスする場合、一般的な構文は次のとおりです。

structVariable.unionVariable.memberName

最後にメンバー名を追加するだけで、アクセス方法は問題ありません。したがって、正しいバージョンは次のようになります。

switch (t_struct.objs[j].type) {
    case STRUCT1:
        s1 = t_struct.objs[j].s_obj.s1;
        break;
    case STRUCT2:
        s2 = t_struct.objs[j].s_obj.s2;
        break;
}
于 2012-12-05T08:40:31.887 に答える