C ++ Попытка определить двумерный массив с помощью аргументов функции - PullRequest
0 голосов
/ 18 декабря 2018

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

int func(const int x, const int y) {

    char maze[x][y] = { 0 };
    return 0; 
}

При определении x & y внутри функции как постоянных целых чисел массив определяется просто отлично.Когда x и y являются аргументами функции, программа не будет компилироваться.Почему это так и как мне обойти это?

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Вам необходимо использовать динамическое выделение памяти.Массивы Variadic длины не являются частью стандарта c ++.Однако массивы переменной длины доступны как расширение для GCC.Хотя вы можете использовать STL или реализовать свой класс, не забывайте о new [] и одномерном представлении для двумерного массива:

char* maze = new char[x*y]; // create
maze[i + j * x]; // access
delete[] maze; // delete

Он компактен и в большинстве случаев быстр.

0 голосов
/ 19 декабря 2018

При определении x & y внутри функции как постоянных целых чисел массив определяется очень хорошо

Это работает, потому что размер вашего массива определяется и известен вашему компилятору, известному в время компиляции

Когда x и y являются аргументами функции, программа не будет компилироваться.

Когда вы хотите определить свой массивтолько когда вы вызываете свою функцию, вы просите свою программу сделать это во время выполнения .Как ответил Дмитрий Дадыка, вы должны использовать динамическое выделение памяти и самостоятельно управлять выделением памяти (delete [] maze; // delete)

Вот альтернатива динамического определения 2D-массива с использованием шаблона !Обратите внимание, что это всегда делается во время компиляции.

template<int X, int Y>
int f()
{
    char c[X][Y];

    for(int x=0; x < X; ++x)
    {
        for(int y=0; y < Y; ++y)
        {
            c[x][y] = '1';
        }


    }
    // write your algorithm now!....
    c[2][2] = 'a';

    for(int x=0; x < X; ++x)
    {
        for(int y=0; y < Y; ++y)
        {
           std::cout << c[x][y] << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

    int main()
    {
      f<5,5>();
      f<7,4>();
      return 0;
    }
0 голосов
/ 18 декабря 2018

Вы можете сделать обертку вокруг одномерного массива следующим образом:

class Maze {
    friend class Row;
public:
    /* This helper class represents a single row of the maze */
    class Row {
        friend class Maze;
        Maze& owner;
        std::size_t row;
        Row(Maze& owner_, std::size_t row_) : owner(owner_), row(row_) {}
        /* this operator resolves 2nd pair of brackets */
    public:
        inline char& operator[](std::size_t col) { return owner.data[col + row*owner.cols]; }
    };
    Maze(std::size_t rows_, std::size_t cols_)
      : data(rows_ * cols_, 0)
      , cols(cols_)
    {}
    /* this operator resolves 1st pair of brackets */
    inline Row operator[](std::size_t index) { return Row(*this, index); }
private:
    std::vector<char> data;
    std::size_t cols;
};

...

Maze m(5, 10);
m[2][3] = 1;
...