我遇到了一个问题,当我在函数中为值分配结构时,我的结构数组未分配值。 这是结构体声明:
typedef struct{
int length;
int width;
char texture;
int xpos;
int ypos;
}prop_info;
typedef struct{
int init_xpos;
int init_ypos;
int index;
prop_info prop[100];
}room_info;
这是函数:
void info_setup(room_info room,int init_xpos,int init_ypos,int index)
{
room.init_xpos=init_xpos;
room.init_ypos=init_ypos;
room.index=index;
}
void prop_setup(room_info room,int prop_index,int length,int width,char texture,int xpos,int ypos)
{
room.prop[prop_index].length=length;
room.prop[prop_index].width=width;
room.prop[prop_index].texture=texture;
room.prop[prop_index].xpos=xpos;
room.prop[prop_index].ypos=ypos;
}
room_info room_lobby;
void init_rooms()
{
info_setup(room_lobby,0,0,0);
prop_setup(room_lobby,0,1,1,'X',5,5);
}
当我在主函数中使用“ init_rooms()”函数时:
int main()
{
init_rooms();
printf("%d",room_lobby.prop[0].xpos);
}
printf仅输出0,并且如果我尝试打印出“ room_lobby.prop [0] .texture”(它是一个字符),则仅在打印X时才会打印一个空格。 预先感谢!
答案 0 :(得分:0)
“结构参数”是一个值参数。因此,该值将被复制到函数中,然后再复制到变量中。如果您想更改变量的值, 您应该使用struct参数的引用或地址,例如:
void info_setup(room_info& room,int init_xpos,int init_ypos,int index)
{
room.init_xpos=init_xpos;
room.init_ypos=init_ypos;
room.index=index;
}
void prop_setup(room_info& room,int prop_index,int length,int width,char texture,int xpos,int ypos)
{
room.prop[prop_index].length=length;
room.prop[prop_index].width=width;
room.prop[prop_index].texture=texture;
room.prop[prop_index].xpos=xpos;
room.prop[prop_index].ypos=ypos;
}
或
void info_setup(room_info* room,int init_xpos,int init_ypos,int index)
{
room->init_xpos=init_xpos;
room->init_ypos=init_ypos;
room->index=index;
}
void prop_setup(room_info* room,int prop_index,int length,int width,char texture,int xpos,int ypos)
{
room->prop[prop_index].length=length;
room->prop[prop_index].width=width;
room->prop[prop_index].texture=texture;
room->prop[prop_index].xpos=xpos;
room->prop[prop_index].ypos=ypos;
}
答案 1 :(得分:0)
将结构传递给函数时,该函数将接收该结构的副本,而不是对该结构的引用。因此,该功能所做的任何更改只会影响副本,而不会影响原始结构。
要更改原始结构,调用者需要传递结构的地址,并且函数参数需要是指向该结构的指针。
因此代码应如下所示:
void info_setup(room_info *room,int init_xpos,int init_ypos,int index)
{ // ^--- declare room as a pointer
room->init_xpos=init_xpos;
room->init_ypos=init_ypos;
room->index=index;
// ^^--- access the structure members using pointer notation
}
void prop_setup(room_info *room,int prop_index,int length,int width,char texture,int xpos,int ypos)
{
room->prop[prop_index].length=length;
room->prop[prop_index].width=width;
room->prop[prop_index].texture=texture;
room->prop[prop_index].xpos=xpos;
room->prop[prop_index].ypos=ypos;
}
room_info room_lobby;
void init_rooms(void)
{
info_setup(&room_lobby,0,0,0);
prop_setup(&room_lobby,0,1,1,'X',5,5);
// ^--- pass the address of the structure
}
int main(void)
{
init_rooms();
printf("%d\n",room_lobby.prop[0].xpos);
}