Способ динамического размещения многомерных массивов - PullRequest
4 голосов
/ 20 февраля 2011

салют ..

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

pbeans = new double [3][4];         // Allocate memory for a 3x4 array

И это ошибка:

error C2440: '=' : cannot convert from 'int (*)[4]' to 'int *'

как мне определить pbeans (если этот тип кодирования допустим)?

а в чем конкретно проблема?

Привет.

Ответы [ 3 ]

3 голосов
/ 20 февраля 2011

Это описано в моем FAQ по массивам :

double (*pbeans)[4];
pbeans = new double[3][4];

// ...

delete[] pbeans;

Для "нарушителя объявления C" вы можете сделать это более читабельным с помощью typedef:

typedef double row[4];

row *pbeans;
pbeans = new row[3];

// ...

delete[] pbeans;

Но в C ++ мы предпочитаем RAII-контейнеры вместо необработанных указателей:

#include <vector>
#include <array>

std::vector<std::array<double, 4> > beans(3);

Обратите внимание на полное отсутствие delete[], что делает это решение исключительным.

1 голос
/ 20 февраля 2011

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

double **pbeans = new double*[3];
for (int i = 0; i < 3; ++i) {
    pbeans[i] = new double[4];
}
0 голосов
/ 20 февраля 2011

Вот способ сделать это, распределяя память непрерывно в куче:

typedef double MyGrid[3][4];

int main(int argc, char* argv[])
{
    MyGrid& x = *(reinterpret_cast<Grid*>(new double[12]));
    ...
    x[1][2] = 0.3333;
    ...
    delete[] &x;
    return 0;
}

Который вы могли бы легко превратить в более общее решение:

template<typename T, int x, int y>
struct Array2D
{
    typedef T CArrayType[x][y];
    typedef CArrayType& RefType;
    static CArrayType& New()
    {
        return *(reinterpret_cast<CArrayType*>(new T[x * y]));
    }
    static void Delete(RefType x)
    {
        delete[] &x;
    }
};

typedef Array2D<double, 3, 4> MyGrid;// define your 2d array with 3 rows / 4 columns.

int main(int argc, char* argv[])
{
    MyGrid::RefType j = MyGrid::New();
    ...
    j[1][2] = 0.3333;
    ...
    MyGrid::Delete(j);
    return 0;
}

Идея состоит в том, чтобы просто сгенерировать элементы в 1D (x * y) и привести их к двумерному массиву. Но поскольку типы массивов являются типами значений, вам нужно иметь дело с указателями на массивы. Использование ссылки делает ее почти прозрачной.

Boost, вероятно, имеет что-то вроде этого, но я не знаю достаточно хорошо, чтобы сказать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...