【问题标题】:Initialization of a three dimensional static const array初始化一个三维静态常量数组
【发布时间】:2011-05-07 13:05:58
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ initialization constants static-array


    【解决方案1】:

    您可以使用虚拟元素将每个元素填充到最大长度,然后使用 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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        要使用静态初始化,您需要了解数组的每个维度。我想您已经知道这一点,但在您的问题中没有提及,所以我将使用维度 [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}}},{{{...}}}};
        

        【讨论】:

          猜你喜欢
          • 2016-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-02
          • 2015-02-18
          • 1970-01-01
          相关资源
          最近更新 更多