Класс 2D массив превращается в arr [] при вызове функцией C ++

0

У меня есть университетское задание, и я совершенно смущен тем, как правильно передать массив, чтобы предотвратить передачу массива как одного массива, а не 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;
}
Теги:
class
arrays
function
oop

1 ответ

0
Лучший ответ

Путаница номер один. Вы не можете передавать массивы в функции в C++.

Путаница номер два. Вы не можете объявлять массивы в качестве параметров функции в C++

Тревога номер три - 2D-массивы - это одиночные массивы, 2D-массив - это массивы массивов, поэтому он также является "одним массивом". Думаю, я говорю, что термин одиночный массив не имеет большого значения.

Массивы являются путаной темой в C++. Вы не можете делать все, что можете ожидать от них. Вместо этого все делается с помощью указателей. Связь между массивами и указателями в C++ - еще одна запутанная тема. Вам действительно нужно прочитать книгу. Любые конкретные вопросы, спросите еще раз.

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

РЕДАКТИРОВАТЬ:

Возможно, я должен сделать это немного яснее. В точке два этот код

void CreateMaze(MazeSquare maze[MAZE_SIZE][MAZE_SIZE]);

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

В первом случае этот код

CreateMaze(maze); // create a new maze

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

  • 0
    Но это проблема. Я не передаю отдельные массивы, но при отладке он возвращается с ошибкой в операторе return main и говорит: «Ошибка проверки времени выполнения # 2 - стек вокруг переменной« лабиринт »поврежден».
  • 0
    @ user2875423 Ну, это просто ошибка. Ничего общего с тем, как вы передаете параметры своим функциям. Возможно (определенно) вы обращаетесь к памяти, которую вы не должны.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню