使用传入的参数在 C++ 中创建 3D 数组

Posted

技术标签:

【中文标题】使用传入的参数在 C++ 中创建 3D 数组【英文标题】:Creating a 3D array in C++ using passed in parameters 【发布时间】:2017-05-19 08:04:18 【问题描述】:

我有一个接收 void* 缓冲区 参数的函数。这个函数(由 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[non-constant value][non-constant value][non-constant value] 形式的 3D int 数组的任何想法?我知道您不能使用非常量值创建数组,但我添加它们是为了阐明我的目标。 C++中是否应该有一种方法可以将函数参数用作实例化数组的值?

【问题讨论】:

我认为这是您想要链接到的方法:support.hdfgroup.org/HDF5/doc/cpplus_RM/… 谢谢,我更新了帖子。 【参考方案1】:

这样做:

    std::vector<int> array;

    array.resize(Nx*Ny*Nz);

    array[z*Ny*Nx + y*Nx + x] = value

拥有 array[z][y][x] 语法很好,但支持它比它的价值更麻烦。

【讨论】:

【参考方案2】:

我认为最简单的方法是这样做:

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);

【讨论】:

虽然我对答案投了赞成票,但附加的 C++1 风格 评论让我感到困扰,因为它需要 NX * NY * NZ 作为编译时常量,在这种情况下OP 可以很容易地制作一个 C 样式的数组,并且不会问这个问题。 真的!那么唯一的解决方案是std::vector,我会编辑我的答案。

以上是关于使用传入的参数在 C++ 中创建 3D 数组的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中创建锯齿状 3D 数组

在 C++ 中创建一个大数组 [重复]

在 C++ 中创建一个大数组 [重复]

如何在 C++ 中创建类似于 Python 的 numpy 数组的数组?

如何在 C++ 中的子类中创建父对象数组?

在 C++ 中使用另一个类的对象计数在一个类中创建一个数组