Способ динамического размещения многомерных массивов

салют ..

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

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

И это ошибка:

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

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

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

С уважением.

4 голоса | спросил C77431 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 18:21:54 +0300000000pmSun, 20 Feb 2011 18:21:54 +030011 2011, 18:21:54

3 ответа


0

Это описано в моем 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[], что делает это решение безопасным для исключений.

ответил fredoverflow 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 19:01:39 +0300000000pmSun, 20 Feb 2011 19:01:39 +030011 2011, 19:01:39
0

Вам нужно распределить каждое измерение массива отдельно:

double **pbeans = new double*[3];
for (int i = 0; i < 3; ++i) {
    pbeans[i] = new double[4];
}
ответил Alnitak 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 18:26:48 +0300000000pmSun, 20 Feb 2011 18:26:48 +030011 2011, 18:26:48
0

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

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, вероятно, имеет что-то вроде этого, но я не знаю, достаточно ли хорошо, чтобы сказать ...

ответил tenfour 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 18:42:21 +0300000000pmSun, 20 Feb 2011 18:42:21 +030011 2011, 18:42:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132