使用传入的参数在 C++ 中创建 3D 数组
Creating a 3D array in C++ using passed in parameters
我有一个接受 void* buffer 参数的函数。这个函数(由 HDF here 提供。根据我的理解,它将信息从数据集中读取到缓冲区中。我有这个工作,但前提是我使用常量值创建 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);
}
这对我来说总是失败。但是,我之前在创建 data_out 数组时使用 const int 值的实现工作正常:
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 数组只能与 3D 数组一起使用,而 2D 数组在将数据复制到缓冲区)。
所以,我的关键问题是我似乎无法弄清楚如何创建读取函数满意的 3D int 数组(函数参数是 void* 但我似乎无法让 3d int 数组以外的任何东西都可以工作)。我尝试了一个 3D int 数组,表示为数组的数组,使用:
int*** data_out = new int**[NX];
但这也失败了。关于如何创建 int arrayName[非常量值][非常量值][非常量值] 形式的 3D int 数组的任何想法?我知道您不能使用非常量值创建数组,但我添加它们是为了阐明我的目标。 C++ 中是否应该有一种方法可以将函数参数用作实例化数组的值?
这样做:
std::vector<int> array;
array.resize(Nx*Ny*Nz);
array[z*Ny*Nx + y*Nx + x] = value
有 array[z][y][x] 语法很好,但支持它比它的价值更麻烦。
我认为最简单的是这样做:
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);
我有一个接受 void* buffer 参数的函数。这个函数(由 HDF here 提供。根据我的理解,它将信息从数据集中读取到缓冲区中。我有这个工作,但前提是我使用常量值创建 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);
}
这对我来说总是失败。但是,我之前在创建 data_out 数组时使用 const int 值的实现工作正常:
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 数组只能与 3D 数组一起使用,而 2D 数组在将数据复制到缓冲区)。
所以,我的关键问题是我似乎无法弄清楚如何创建读取函数满意的 3D int 数组(函数参数是 void* 但我似乎无法让 3d int 数组以外的任何东西都可以工作)。我尝试了一个 3D int 数组,表示为数组的数组,使用:
int*** data_out = new int**[NX];
但这也失败了。关于如何创建 int arrayName[非常量值][非常量值][非常量值] 形式的 3D int 数组的任何想法?我知道您不能使用非常量值创建数组,但我添加它们是为了阐明我的目标。 C++ 中是否应该有一种方法可以将函数参数用作实例化数组的值?
这样做:
std::vector<int> array;
array.resize(Nx*Ny*Nz);
array[z*Ny*Nx + y*Nx + x] = value
有 array[z][y][x] 语法很好,但支持它比它的价值更麻烦。
我认为最简单的是这样做:
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);