многомерный массив с двумя динамическими измерениями и одним статическим измерением - PullRequest
0 голосов
/ 04 января 2019

Я знаю, что могу объявить массив, который имеет одно динамическое измерение, например:

double(*LHS)[3][3][3] = new double[M + 2][3][3][3];

Но мне нужно объявить массив, который имеет «два» динамических измерения. Я проверил синтаксис, как показано ниже:

double (**U)[3] = new double*[M + 2][3];    
for (int i = 0; i < M + 2; ++i) U[i][3] = new double[N + 2][3];

Но это не работает!

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

1 Ответ

0 голосов
/ 14 января 2019

Что вы могли бы использовать для вызова функции

void SolveBlockTri(double LHS[][3][3][3], double RHS[][3], int iNRows)

с использованием идиоматических техник С ++ с динамическим размещением:

int nRows = 42;
std::vector<std::array<std::array<std::array<double>,3>,3,3> lhs; 
    // = where ever you fill that from;
std::vector<std::array<double,3>> rhs,nRows);

SolveBlockTri(&(lhs.data()), &(rhs.data()), nRows);   

Вы также можете использовать шаблонную функцию-обертку в зависимости от фиксированного размера:

template<size_t FixedSize>
void CallSolveBlockTri(
    const std::vector<std::array<std::array<std::array<double>
                     ,FixedSize>,FixedSize,FixedSize>& LHS
  , std::vector<std::array<double,FixedSize>>& RHS
  , int iNRows) {
    SolveBlockTri(&(LHS.data()), &(RHS.data()), iNRows);
};

Но мне было очень сложно объявить 4d динамический массив (а затем удалить его!).

Обратите внимание, что с обоими решениями, описанными выше, вам не нужно выполнять какое-либо ручное выделение массива с использованием операторов new и delete.
Классы контейнеров std::vector и std::array уже будут обрабатывать все эти вещи правильно.

...