У меня есть функция, которая принимает пустота * буфер параметр. Эта функция (которая обеспечивается HDF Вот. Насколько я понимаю, он читает информацию из набора данных в буфер. У меня это работает, но только если я создаю массив 3d int, используя постоянные значения. Я должен быть в состоянии сделать это, используя значения, переданные пользователем.
Вот начало этой функции:
void* getDataTest(int countX, int countY)
{
int NX = countX;
int NY = countY;
int NZ = 1;
int data_out[NX][NY][NZ]; //I know this doesn't work, just posting it for reference
//.
//. more code here...
//.
// Read function is eventually called...
h5Dataset.read(data_out, H5::PredType::NATIVE_INT, memspace, h5Dataspace);
}
Это постоянно терпит неудачу на мне. Однако моя предыдущая реализация, которая использовала значения const int при создании массива data_out, работала нормально:
void* getDataTest(int countX, int countY)
{
const int NX = 5;
const int NY = 5;
const int NZ = 1;
int data_out[NX][NY][NZ];
//.
//. more code here...
//.
// Read function is eventually called...
h5Dataset.read(data_out, H5::PredType::NATIVE_INT, memspace, h5Dataspace);
}
Это отлично работает. Насколько я понимаю, для этой функции (которую я не могу контролировать) требуются пространства данных одинаковой размерности (например, трехмерный массив будет работать только с трехмерным массивом, тогда как двумерный массив будет работать только с двумерным массивом при копировании данных в буфер).
Итак, моя ключевая проблема здесь заключается в том, что я не могу понять, как создать 3D-массив int, которым функция чтения довольна (параметр функции является пустым *, но я не могу получить ничего, кроме 3d int массив для работы). Я пробовал массив 3D int, представленный в виде массива массивов массивов, используя:
int*** data_out = new int**[NX];
но и это не удалось. Любые идеи о том, как я могу создать массив 3D-int вида int arrayName [непостоянное значение] [непостоянное значение] [непостоянное значение]? Я знаю, что вы не можете создать массив, используя непостоянные значения, но я добавил их, чтобы уточнить мою цель. Должен ли быть способ в C ++ использовать параметры функции в качестве значений для создания экземпляров массива?
Я думаю, что проще всего сделать это:
int* data_out = new int[NX * NY * NZ];
Затем вы можете получить доступ к этому 1D-массиву как к 3D-массиву:
int value = array[z * NX * NY + y * NX + x];
В стиле C ++ 11 вы можете использовать std::vector
:
std::vector<int> data_out;
data_out.resize(NX * NY * NZ);
И вызывая функцию так:
h5Dataset.read(data_out.begin(), H5::PredType::NATIVE_INT, memspace, h5Dataspace);
Сделай это так:
std::vector<int> array;
array.resize(Nx*Ny*Nz);
array[z*Ny*Nx + y*Nx + x] = value
Приятно иметь синтаксис массива [z] [y] [x], но его поддержка доставляет больше хлопот, чем стоит.