Я хочу иметь функцию, которая инициализирует простую сетку (2d-массив) столбцами и строками, каждая позиция (ячейка) имеет размер struct.
Я нашел решение, которое выполняет это в основной функциино при выполнении в любой другой функции, после выполнения на полпути, она падает с ошибкой сегментации, прежде чем печатает Grid (в отличие от последнего абзаца).
Однако, если печать Grid добавляется непосредственно после инициализациипосле этого код работает нормально и все ошибки исчезают.
Я подозреваю, что main теперь не инициализирует массив Position, но я передаю его как указатель, так что я делаю неправильно?
Следующий код разделен на две части.Первый имеет ошибку сегментации, второй нет.Разница лишь в том, что во второй части циклы for для распечатки сетки находятся внутри функции, которая инициализирует массив 2d.
//SEGMENTATION FAULT
void CreateMap (struct GameGrid *Position, int &Dim_x, int &Dim_y)
{
cout << "Lets create the game map." << endl;
cout << "Enter number of Columns: ";
cin >> Dim_x;
cout << "Enter number of Rows: ";
cin >> Dim_y;
Position = new GameGrid[Dim_x * Dim_y];
}
int main()
{
struct GameGrid *Position = NULL;
int Dim_x;
int Dim_y;
CreateMap(Position, Dim_x, Dim_y);
for (int y=0; y < Dim_y; y++)
{
cout << setw (20);
for (int x=0; x < Dim_x; x++)
{
cout << Position[x*Dim_y + y].Element;
cout << char(32);
}
cout << endl;
}
delete[] Position;
return 0;
}
//NO FAULTS
void CreateMap (struct GameGrid *Position, int &Dim_x, int &Dim_y)
{
cout << "Lets create the game map." << endl;
cout << "Enter number of Columns: ";
cin >> Dim_x;
cout << "Enter number of Rows: ";
cin >> Dim_y;
Position = new GameGrid[Dim_x * Dim_y]
for (int y=0; y < Dim_y; y++)
{
cout << setw (20);
for (int x=0; x < Dim_x; x++)
{
cout << Position[x*Dim_y + y].Element;
cout << char(32);
}
cout << endl;
}
}
int main()
{
struct GameGrid *Position = NULL;
int Dim_x;
int Dim_y;
CreateMap(Position, Dim_x, Dim_y);
delete[] Position;
return 0;
}
Сетка должна выглядеть примерно так для измерений Dim_x = 6 иDim_y = 6 (выбирается конечным пользователем).
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
Также, когда печать сетки выполняется два раза (один раз в функции CreateMap и один раз в основном), она печатает их оба раза, затем останавливаетсяна 10 секунд и умирает.