我有一个由肢体和枚举组成的结构实体,Limbs也是一个包含两个项目的结构,例如。
typedef enum{ALIVE, DEAD} state;
typedef struct Limb{
int is_connected;
int is_wounded;
} Limb;
typedef struct Entity{
Limb limb_1;
Limb limb_2;
state is_alive;
} Entity;
现在假设我有一个旨在分配实体特定值的函数,这里使用的正确语法是什么?我目前的猜测是:
void assign_entity(Entity *entity){
*entity = {
.limb_1 = { 1, 0 },
.limb_2 = { 1, 0 },
.is_alive = ALIVE
};
}
但是当我使用这种语法时,我得到一个错误(预期的表达式),我在这里做错了什么?分配给结构内部结构的正确语法是什么。
答案 0 :(得分:2)
您尝试使用compound literal,但省略了正确的语法。
应该是:
void assign_entity(Entity *entity){
*entity = ((Entity) {
.limb_1 = { 1, 0 },
.limb_2 = { 1, 0 },
.is_alive = ALIVE
});
}
请注意,这需要C99(当然还需要适当扩展的编译器)。
答案 1 :(得分:1)
对于以下代码的人来说可能过于冗长:
void assign_entity(Entity *entity)
{
entity->limp_1.is_connected = 1;
entity->limp_1.is_wounded= 0;
entity->limp_2.is_connected = 1;
entity->limp_2.is_wounded= 0;
entity->is_alive = ALIVE;
}
答案 2 :(得分:0)
指定的初始化语法只能在初始化中使用。
做你想做的事的一种方法是:
Entity const new = {
.limb_1 = { 1, 0 },
.limb_2 = { 1, 0 },
.is_alive = ALIVE
};
*entity = new;
答案 3 :(得分:0)
如果您已经在entity
指向的地址分配了内存,并且您要做的就是“分配特定值”,那么您可以按以下方式执行:
void assign_entity(Entity *entity)
{
entity->limb_1 = ( 1, 0 );
entity->limb_2 = ( 1, 0 );
entity->is_alive = ALIVE;
}
或者,如果你想把它全部翻到一行:
void assign_entity(Entity *entity)
{
*entity = ((1, 0), (1, 0), ALIVE);
}