' - >'并不适用于结构内部结构

时间:2016-02-28 12:39:44

标签: c struct

typedef struct {
    char name[3];
    bool initial_state;
    bool final_state;
    struct TRANSITION *transitions;
    int numberTransition;
} STATE;

typedef struct {
    char c;
    struct STATE *destination;
} TRANSITION;

STATE *create_state(char *name, bool is_initial, bool is_final);
void add_transition(STATE *source, char sign, STATE *dest);
void destroy_state(STATE **pp_state);

int main(void) {
    STATE *state1 = create_state("S'0", true, false);
    STATE *state2 = create_state("S'1", true, false);
    STATE *state3 = create_state("S'2", true, false);
    printf("%s  ", state1->name);
    printf("%d  ", state1->initial_state);
    printf("%d  ", state1->final_state);
    add_transition(state1, 'A', state2);
    TRANSITION *transitions = state1->transitions;
    printf("%c  ", transitions[0].c);
}

如您所见,我访问state1结构。它实际上适用于nameinitial_statefinal_state。但由于某种原因,它不适用于state1->transitions。我想因为它本身就是一个结构,我必须做点别的事。

这条线有什么问题?:

TRANSITION *transitions = state1->transitions;

3 个答案:

答案 0 :(得分:1)

在尝试打印转换的地方不能正确:transitions [0]是结构,而不是字符串。如果您打算输出char c结构成员,请使用:

printf("%c  ", transitions[0].c);

还存在未定义类型的问题。如果您使用typedef struct { } FOO,则struct FOO会定义单独的(不完整)类型。但是,在定义TRANSITION时,您仍需要告诉编译器STATE是什么。解决这个问题的一种方法是像这样转发声明TRANSITION

typedef struct transition TRANSITION;
typedef struct
{
    ....
    TRANSITION *transitions;
} STATE;

/* TRANSITION is already a typedef for struct transition.
   no need to add a typedef here */
struct transition
{
    char c;
    STATE *destination;
};

答案 1 :(得分:1)

这是因为在STATE中您声明了struct TRANSITION *transitions,但TRANSITION的声明没有struct关键字。使用:

typedef struct
{
    char name[3];
    bool initial_state;
    bool final_state;
    struct TRANSITION *transitions;
    int numberTransition;
} STATE;

typedef struct TRANSITION
{
    char c;
    struct STATE *destination;
} TRANSITION;

答案 2 :(得分:1)

问题是结构名称(如struct STATE)存在于它们自己的命名空间中,与C语言命名空间的其余部分分开,类型别名之类的东西存在(通过type-alias我的意思是用typedef)。

如果您这样做,例如

typedef struct STATE_STRUCTURE { ... } STATE_TYPE;

您定义两个不同的符号,首先是结构名称STATE_STRUCTURE,然后是类型别名STATE_TYPE。要使用STATE_STRUCTURE,请使用

中的struct关键字
struct STATE_STRUCTURE *state;

您无法在不实际定义结构名称的情况下使用结构名称。这就是您在结构定义中遗漏的内容。

另请注意,由于结构名称位于其自己的名称空间中,如前所述,您可以使结构名称与类型别名相同:

typedef struct STATE { ... } STATE;

我提出的问题解决方案是使用结构和类型别名的前向声明

typedef struct STATE STATE;
typedef struct TRANSITION TRANSITION;

这告诉编译器存在名称为STATETRANSITION的结构,以及那些具有相同名称的结构的类型别名。

然后你只是自己定义了结构,因为我们已经声明了类型别名,你可以在结构中使用它们:

struct STATE
{
    char name[3];
    bool initial_state;
    bool final_state;
    TRANSITION *transitions;
    int numberTransition;
};

struct TRANSITION
{
    char c;
    STATE *destination;
};