Как вернуть матрицу (плату) из функции в C ++? - PullRequest
0 голосов
/ 30 октября 2019

Я делаю простую игру, которая требует от меня создания доски размером, определяемым пользователем.

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

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

int* boardStateDead(int width, int height){

    int* board_dead_state[width][height];

    for(int i = 0; i < height; i++){

        for(int j = 0; j < width; j++){
            board_dead_state[i][j] = 0;

        }
    }
    return  board_dead_state;
}

Я ожидаю, что функциячтобы иметь возможность вернуть указатель на матрицу, которую я только что сделал.

Ответы [ 3 ]

1 голос
/ 30 октября 2019

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

Я предлагаю создать его с новым оператором:

int* board_dead_state = new[width*height];

Затем задайте начальные значения либо с помощью:

memset(board_dead_state, 0, width*height*sizeof(int));

или измените цикл for на:

for(int i = 0; i < height; i++){
    for(int j = 0; j < width; j++){
        int offset = i * width + j
        board_dead_state[offset]= 0;
    }
}

После того, как вы вернете указатель из функции, вы отвечаете за его освобождение с помощью оператора delete [].

Вы можете создать класс доски для управления распределением и освобождением при необходимости.

0 голосов
/ 30 октября 2019

Я предлагаю вам создать простой класс или структуру для хранения состояния вашего форума. Внутренне используйте std::vector, чтобы вам не приходилось беспокоиться об управлении памятью.

Вы даже можете перегрузить operator[](int), чтобы заставить его работать как двумерный массив, если хотите.

#include <vector>

class Board
{
public:
    Board(int width, int height)
        : mWidth(width)
        , mHeight(height)
        , mState(width * height)
    {}

    int* operator[](int row) { return mState.data() + row * mWidth; }
    const int* operator[](int row) const { return mState.data() + row * mWidth; }

    int Width() const { return mWidth; }
    int Height() const { return mHeight; }

private:
    int mWidth, mHeight;
    std::vector<int> mState;
};

Теперь просто создайте его, когда вы знаете, какой он должен быть размер:

Board board(width, height);

Конструктор для std::vector инициализирует все значения нулями.

Вы можетераспечатайте это, обратившись к нему с помощью методов, которые я добавил:

for (int row = 0; row < board.Height(); row++)
{
    for (int col = 0; col < board.Width(); col++)
    {
        std::cout << ' ' << board[row][col];
    }
    std::cout << std::endl;
}

Или, что еще лучше, создайте на доске другой метод, например Print().

0 голосов
/ 30 октября 2019

Вот как использовать сделать это в вашем коде:

int** boardStateDead(int width, int height){

    int** board_dead_state = new int*[height];

    for(int i = 0; i < height; i++){
        board_dead_state[i] = new int[width];
        for(int j = 0; j < width; j++){
            board_dead_state[i][j] = 0;
        }
    }
    return  board_dead_state;
}

Тогда вы получите это так:

int** state = boardStateDead(someWidth, someHeight);

И получите доступ к его элементу, как state[i][j]. И наконец, но, вероятно, самое главное, когда вы закончите использовать его, освободите его память следующим образом:

          for (int i = 0; i < height; i++)
          {
            delete[] state[i];
          }
          delete[] state;
...