Этот оператор
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);
}
}
}