У меня есть университетское задание, и я совершенно смущен тем, как правильно передать массив, чтобы предотвратить передачу массива как одного массива, а не 2D-массива.
Мы должны создать случайный генератор лабиринтов, который позволит нам играть в этот лабиринт. Мы используем специализированный код Windows для отображения лабиринта, но это не проблема. Так что я оставляю это. Мой лектор дал нам скелетный код для работы. Что я должен изменить, чтобы заставить его работать?
Мы не изучили местоположение или векторы динамической памяти. Мы должны использовать массив. Пожалуйста помоги!!?
Вот его код: я использовал то же самое и просто добавил все параметры функции. Я ничего не изменил с "лабиринтом", хотя
class MazeSquare
{
public:
bool leftWall, rightWall, bottomWall, topWall;
bool visited;
int steps;
MazeSquare() // constructor
{
Initialise();
}
void Initialise(void) // reinitialise a square for a new maze
{
leftWall = true; // create the maze square with all the walls
rightWall = true;
bottomWall = true;
topWall = true;
visited = false; // the robot has not visited the square yet
steps = 256; // greater than maximum possible number of steps
}
};
// constants
const int MAZE_SIZE = 16;
// function prototypes
void CreateMaze(MazeSquare maze[MAZE_SIZE][MAZE_SIZE]);
void SolveMaze(MazeSquare maze[MAZE_SIZE][MAZE_SIZE]);
void RestartMaze(MazeSquare maze[MAZE_SIZE][MAZE_SIZE]);
void MoveRobot(MazeSquare maze[MAZE_SIZE][MAZE_SIZE], int &x, int &y, Point click);
void DrawWindow(MazeSquare maze[MAZE_SIZE][MAZE_SIZE], int x, int y);
int ccc_win_main() // main function for a graphics program
{
MazeSquare maze[MAZE_SIZE][MAZE_SIZE]; // maze design
int x = 0, y = 0; // robot position
bool exit = false; // flag to control end of program
// initialise the random number generator
srand((unsigned int)(time(NULL)));
/* initialise the window coordinates here */
CreateMaze(maze); // create a new maze
DrawWindow(maze); // draw the image in the GUI window
do
{
// get a mouse click
Point click = cwin.get_mouse("Click a button or move the robot");
// handle the different types of mouse clicks
if (/* new button is clicked */)
{
CreateMaze(maze);
x = 0;
y = 0;
}
if (/* solve button is clicked */)
{
SolveMaze(maze);
}
if (/* restart button is clicked */)
{
RestartMaze(maze);
x = 0;
y = 0;
}
if (/* exit button is clicked */)
{
exit = true;
}
// handle robot moves
if (/* maze is clicked */)
{
MoveRobot(maze, x, y);
}
DrawWindow(maze);
} while (!exit);
return 0;
}
Путаница номер один. Вы не можете передавать массивы в функции в C++.
Путаница номер два. Вы не можете объявлять массивы в качестве параметров функции в C++
Тревога номер три - 2D-массивы - это одиночные массивы, 2D-массив - это массивы массивов, поэтому он также является "одним массивом". Думаю, я говорю, что термин одиночный массив не имеет большого значения.
Массивы являются путаной темой в C++. Вы не можете делать все, что можете ожидать от них. Вместо этого все делается с помощью указателей. Связь между массивами и указателями в C++ - еще одна запутанная тема. Вам действительно нужно прочитать книгу. Любые конкретные вопросы, спросите еще раз.
Но с яркой стороны я не вижу ничего особенного в вашем коде. Вы, конечно, не передаете одиночные массивы вашим функциям, так как вы беспокоитесь.
РЕДАКТИРОВАТЬ:
Возможно, я должен сделать это немного яснее. В точке два этот код
void CreateMaze(MazeSquare maze[MAZE_SIZE][MAZE_SIZE]);
конечно, похоже, что вы объявляете функцию с параметром массива. Но это не так. Вместо этого компилятор принимает код и преобразует его в эквивалентный код, который использует указатели.
В первом случае этот код
CreateMaze(maze); // create a new maze
конечно, похоже, что вы передаете массив функции, но опять же вы этого не делаете. Учитывая этот код, компилятор передает указатель на первый элемент вашего массива лабиринта, он не передает сам массив.