Невозможно присвоить значение массиву структуры в функции - PullRequest
0 голосов
/ 02 марта 2019

Я столкнулся с проблемой, когда моему массиву структур не присваивалось значение, когда я назначал им значение в функции.Вот объявления структуры:

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 голосов
/ 02 марта 2019

Когда структура передается функции, функция получает копию структуры, а не ссылку на структуру.Поэтому любые изменения, которые вносит функция, влияют только на копию, а не на исходную структуру.

Чтобы внести изменения в исходную структуру, вызывающая сторона должна передать адрес структуры, а параметр функции должен бытьуказатель на структуру.

Так код должен выглядеть так:

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);
}
0 голосов
/ 02 марта 2019

«параметр структуры» является параметром значения.Таким образом, значение будет скопировано в функцию, отличную от переменной.Если вы хотите изменить значение переменной, вы должны использовать ссылку или адрес параметра структуры, например:

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;
}
...