1

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

我已经准备好查找表(在纸上),我的问题是最好的存储方式是什么?最初我使用 a static const unsigned char[][][],但在这种情况下显然行不通,因为表可以返回多个数字(同样,从 1 到 8)。

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

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

4

3 回答 3

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 种以上的可能性,请升级到 eguint16_tuint32_t.

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

于 2010-11-09T21:58:32.677 回答
1

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

于 2010-11-09T22:00:07.537 回答
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}}},{{{...}}}};
于 2010-11-09T22:05:48.573 回答