2010-11-09 64 views
1

我有一个三维静态常量数组充当查找表。数组中的每个单元格可以返回多达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 * [] [] []。我如何初始化这个(也就是说,如何初始化静态常量数组以返回给我的unsigned char数组,这些静态数组也是静态的,以便我可以在不初始化类的情况下访问它们)?有没有更好的办法?

我希望我能够正确地解释这个问题。如果没有,请告诉我,我会尝试对其进行修改和/或提供额外信息。

回答

3

你可以垫每个元素最多用的哑元的最大长度,去同一个四维阵列:

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

正如你只返回0-8出8个可能的数字,我想你应该坚持static const unsigned char[][][]和存储“数字”作为一个字节位字段,其中位n设置如果n是这所使用的号码中的一个细胞,所以fe 1,2,5,7可能编码为01010011二进制或0x53十六进制。

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}}},{{{...}}}};