分配给结构中的结构的语法
Syntax for assigning to a struct in a struct
我有一个由 Limbs 和一个枚举组成的结构实体,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
};
}
但是当我使用这种语法时出现错误(预期表达式),我在这里做错了什么?分配给结构内部结构的正确语法是什么。
指定的初始化语法只能在初始化中使用。
做你想做的事情的一种方法是:
Entity const new = {
.limb_1 = { 1, 0 },
.limb_2 = { 1, 0 },
.is_alive = ALIVE
};
*entity = new;
您正在尝试使用 compound literal 但省略了正确的语法。
应该是:
void assign_entity(Entity *entity){
*entity = ((Entity) {
.limb_1 = { 1, 0 },
.limb_2 = { 1, 0 },
.is_alive = ALIVE
});
}
请注意,这需要 C99(当然,或适当扩展的编译器)。
如果您已经在 entity
指向的地址分配了内存,而您要做的只是 "assign particular values",那么您可以按如下方式进行:
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);
}
对于以下代码的人来说可能过于冗长:
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;
}
我有一个由 Limbs 和一个枚举组成的结构实体,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
};
}
但是当我使用这种语法时出现错误(预期表达式),我在这里做错了什么?分配给结构内部结构的正确语法是什么。
指定的初始化语法只能在初始化中使用。
做你想做的事情的一种方法是:
Entity const new = {
.limb_1 = { 1, 0 },
.limb_2 = { 1, 0 },
.is_alive = ALIVE
};
*entity = new;
您正在尝试使用 compound literal 但省略了正确的语法。
应该是:
void assign_entity(Entity *entity){
*entity = ((Entity) {
.limb_1 = { 1, 0 },
.limb_2 = { 1, 0 },
.is_alive = ALIVE
});
}
请注意,这需要 C99(当然,或适当扩展的编译器)。
如果您已经在 entity
指向的地址分配了内存,而您要做的只是 "assign particular values",那么您可以按如下方式进行:
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);
}
对于以下代码的人来说可能过于冗长:
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;
}