Передача указателей структуры на функции - PullRequest
0 голосов
/ 30 января 2020

Эй, у меня проблемы с пониманием того, как структуры передаются функциям как указатели, потому что я хочу изменить свои структуры позже в моем проекте. Итак, я создаю игру, в которой есть комнаты, и эта функция создает двумерный массив мира. Я передаю в struct room и struct World, потому что я храню каждую комнату в шнуре в World struct, которая представляет собой 2d массив. Когда я распечатал каждую комнату, она ничего не распечатывает, и я думаю, что проблема связана с моими указателями.

Итак, моя первая функция, которая находится в массиве struct, будет содержать все комнаты и инициализирует каждую из них. комната для массива. Затем я пытаюсь распечатать номер каждой комнаты, но он ничего не печатает.

Вторая функция создает мой 2d мир, он будет 3х3 мира. Что ставит комнату на Шнуры Мира

struct room
{
    int roomNum;
    int creaturesTotal;
    char description[50];
    char cleanOrdirty[20];
};

int main()
{
    int MaxRooms = 8;
    int rows = 2;
    int cols = 2;
    //creaste each room
    struct room Room1;
    struct room Room2;
    struct room Room3;
    struct room Room4;
    struct room Room5;
    struct room Room6;
    struct room Room7;
    struct room Room8;
    struct room Room9;
    struct PC player;
    player.respect = 40;

    //Store them into a array
    struct room AllRooms[MaxRooms];
    AllRooms[0] = Room1;
    AllRooms[1] = Room2;
    AllRooms[2] = Room3;
    AllRooms[3] = Room4;
    AllRooms[4] = Room5;
    AllRooms[5] = Room6;
    AllRooms[6] = Room7;
    AllRooms[7] = Room8;
    AllRooms[8] = Room9;

    struct room World[rows][cols];

    createRooms(AllRooms);

    //create the world
    createWorld(AllRooms,rows,cols,World);

    struct PC cords[rows][cols];
    player = startPointPC(&player,rows,cols,&World,&cords);
}



void createRooms(struct room* AllRooms[])
{
    int MaxRooms = 8;
    int number = 1;
    for(int i = 0;i <= MaxRooms; i++)
    {
        AllRooms[i]->roomNum = number;
        number++;
    }
    for(int i = 0;i <= MaxRooms; i++)
    {
        printf("%d",AllRooms[i]->roomNum);
    }

}

//creates the 2d world
void createWorld(struct room* AllRooms[], int rows, int cols, struct room* World[rows][cols])
{
    int counter = 0;
    for(int i = 0; i <= rows;i++)
    {
        for(int j = 0; j <= cols; j++)
        {
            World[i][j] = AllRooms[counter];
            counter++;
            printf("\nWorld %d", World[i][j]->roomNum);
        }

    }
}

    struct PC startPointPC(struct PC* player,int rows, int cols, struct room* 
    World[rows][cols],struct PC* cords[rows][cols])
    {

       int x = 0;
       int y = 0;

       player->x = x;
       player->y = y;

       //cords[x][y] = player;
       printf("\nYou are starting in Room %d",World[x][y]->roomNum);

       return player;

}

1 Ответ

2 голосов
/ 30 января 2020

Этот оператор

AllRooms[8] = Room9;

обращается к памяти за пределами массива, в котором элементы находятся в диапазоне [0, MaxRooms).

Кроме того, такое назначение, например, это

AllRooms[0] = Room1;

может вызывать неопределенное поведение, поскольку объект Room1 не был инициализирован, а его целочисленные члены-данные могут иметь значения ловушек.

Вы создали одномерный массив

struct room AllRooms[MaxRooms];

и передали его как аргумент функции createRooms

createRooms (AllRooms);

Указатель массива в выражениях (за редким исключением) преобразуется в указатели на свои первые элементы.

Итак, в фактически этот вызов

createRooms (AllRooms);

эквивалентен

createRooms (& AllRooms [0]);

, а аргумент имеет тип struct room *.

Однако вы объявили функцию, имеющую параметр типа struct room* AllRooms[], который компилятором настроен на тип struct room **.

Компилятор должен выдать ошибку сообщение о том, что нет неявное преобразование одного типа аргумента в другой тип параметра функции.

И, кроме того, функция должна быть объявлена ​​до ее использования в main.

Также внутри функции в циклах, подобных этой

для (int i = 0; i <= MaxRooms; i ++) </p>

вы используете неверный диапазон индексов. Допустимый диапазон: [0, MaxRooms)

Поэтому функция должна быть объявлена ​​и определена как минимум следующим образом

void createRooms( struct room AllRooms[] )
{
   int MaxRooms = 8;
   int number = 1;
   for(int i = 0;i < MaxRooms; i++)
   {
       AllRooms[i].roomNum = number;
       number++;
    }
    for(int i = 0;i < MaxRooms; i++)
    {
       printf("%d",AllRooms[i].roomNum);
    }

 }

Также не рекомендуется использовать локальную переменную MaxRooms из функция

   int MaxRooms = 8;

вместо передачи соответствующего аргумента, определяющего размер массива.

Аналогичные проблемы существуют для функции createWorld.

Она должна быть объявлена ​​и определяется как

void createWorld( struct room AllRooms[], int rows, int cols, struct room World[rows][cols])
{
    int counter = 0;
    for(int i = 0; i < rows;i++)
    {
        for(int j = 0; j < cols; j++)
        {
            World[i][j] = AllRooms[counter];
            counter++;
            printf("\nWorld %d", World[i][j].roomNum);
        }

    }
}
...