无法为函数中的结构数组分配值

时间:2019-03-02 07:16:26

标签: c function struct

我遇到了一个问题,当我在函数中为值分配结构时,我的结构数组未分配值。 这是结构体声明:

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时才会打印一个空格。 预先感谢!

2 个答案:

答案 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);
}