Что вы могли бы использовать для вызова функции
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
уже будут обрабатывать все эти вещи правильно.