三维静态const数组的初始化

时间:2010-11-09 21:52:49

标签: c++ initialization const static-array

我有一个三维静态const数组,它充当查找表。阵列的每个单元格最多可以返回8个单独的数字(每个数字是立方体的一个角落 - 确切地说是一个体素)。例如,MyStaticArray[0][1][1]可能会返回1,2,5,7。它可以返回一个数字或最多八个数字,如下所示:1,2,3,4,5,6,7,8。

我已经准备好了查找表(在纸上),我的问题是存储它的最佳方法是什么?最初我使用的是static const unsigned char[][][],但在这种情况下显然不会起作用,因为该表可以返回多个数字(同样,从1-8开始)。

我的下一个解决方案是返回一个unsigned char数组。也就是说,static const unsigned char * [] [] []。我如何初始化它(也就是说,如何初始化静态const数组以返回给我的无符号char数组,这些数组也是静态的,这样我可以在不初始化类的情况下访问它们)?还有更好的方法吗?

我希望我能够正确地解释这个问题。如果没有,请告诉我,我会尝试重新编写和/或提供额外信息。

3 个答案:

答案 0 :(得分:3)

您可以使用虚拟元素将每个元素填充到最大长度,然后使用4D数组:

static const unsigned char x[M][N][P][8] = { { 1, 2, 5, 7, -1, -1, -1, -1 },
                                             { 1, 2, 3, 4,  5,  6,  7,  8 },
                                             ...

或者您可以使用单个位作为标志,例如:

static const unsigned char x[M][N][P] = { 0x53, // Bits 0, 1, 4, 6 are set
                                          0xFF,
                                          ...

如果您发现自己需要超过8种可能性,请升级至例如uint16_tuint32_t

您使用哪种方法取决于您打算如何处理数据。

答案 1 :(得分:1)

由于您只返回8个可能的数字中的0-8,我认为您应该坚持static const unsigned char[][][]并将“数字”存储为一个字节的位域,如果{n设置为n 1}}是这个单元格的使用数字之一,所以fe 1,2,5,7可能被编码为01010011二进制或0x53十六进制。

答案 2 :(得分:1)

要使用静态初始化,您需要知道数组的每个维度。我认为你已经知道这一点,但在你的问题中没有提到它,所以我将使用维度[2] [2] [2]作为我的例子。

您还需要一种方法来确定阵列中每个位置的元素数量。您可以将元素数量作为列表的第一个值,或者创建一个标记列表末尾的标记值。

要将每个列表填充到8个元素,它将如下所示。数组中任何未初始化的值都将设置为0。

static const unsigned char array[2][2][2][8] = {{{{1,2,3,4,5},{1,2,3,4,5,6,7,8}},{{4},{5}}},{{{...}}}};