在运行时创建一个N维数组,其中N由运行时确定(C++)

3

我正在将N维图像块编码为不同的图像格式。在运行时,我不知道图像的尺寸,而且我使用的库需要一个N维数组目标缓冲区作为参数来从原始图像中读取。

我该如何在C++中声明这样的数组呢?谢谢 :)


2
这完全取决于库... 你有查看文档/API吗? - Karoly Horvath
3
请告诉我们您的库接受哪种类型的参数。如果是 char*pixeltype***,那么这不是一个 C++ 的问题。 - Agent_L
void * bufvoid类型在运行时确定(图像可以存储为shorts、ints、floats等)。只是一个注意事项:我能够在运行时确定类型。并计划使用switch语句为每种不同的类型声明我的缓冲区。我可以对维度做同样的事情(并且仅支持最多4个维度)。这是我的最坏情况,因为它会使代码变得更长。 - Sean Peters
@user1841643 好的,你已经知道了:这是一件危险的事情,但你可能无法避免将数组转换为void*,并在将其转换回来时记住正确的维度。 - stefan
2个回答

2
简短的回答是在C++中你无法声明这样的数组。 数组的维数是类型的一部分,除了一个例外,有时候可以使用extern数组声明其中一个维度的值是未知的。维数的数量始终是类型的一部分,并且该类型必须在编译时已知。
您可以尝试使用适当大小的“扁平”数组来代替。例如,如果您需要一个3x3...x3数组,则可以在运行时计算3^n,动态分配相应数量的int(可能使用vector<int>为方便),然后您将拥有与int[3][3]...[3]相同布局的内存。 您可以通过void*引用此内存。
我不确定在C++中是否严格合法将一个扁平数组别名为多维数组。但首先,您调用的函数实际上可能并没有以那种方式别名它,因为它也不知道编译时的维数。其次,它在实践中可行(如果不行,则您调用的函数要么存在问题,要么有一些巧妙的方法来处理此问题,您应该找出并复制)。

用这个答案进行了快速测试,它起作用了。真的很酷。 - Sean Peters

-2

在这种情况下,您不能使用数组。数组仅适用于那些在编译时大小和维度已知的数据。尝试使用一个std::vector数组代替。


2
糟糕,API只接受与图像维度相等的数组类型缓冲区,因此我认为无法使用向量。 - Sean Peters
如果是这种情况,似乎我们无能为力,因为“数组缓冲区”类型似乎是编译时信息。顺便问一下,你说的是哪个API? - someone_ smiley
对不起,我想我的表述有点模糊了。缓冲区的类型是“void *”,具体类型取决于图像(可以是从float ***到short *的任何类型)。该库是HDF5。有关所涉及方法的链接link - Sean Peters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接