我有一个三维静态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数组,这些数组也是静态的,这样我可以在不初始化类的情况下访问它们)?还有更好的方法吗?
我希望我能够正确地解释这个问题。如果没有,请告诉我,我会尝试重新编写和/或提供额外信息。
答案 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_t
或uint32_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}}},{{{...}}}};