Инициализация трехмерного массива статических констант

У меня есть трехмерный статический массив const, который действует как таблица поиска. Каждая ячейка массива может возвращать до 8 отдельных чисел (каждое число — это угол куба, а точнее — воксель). Так, например, MyStaticArray[0][1][1] может вернуть 1,2,5,7. Он может возвращать одно число или максимум восемь чисел, например: 1,2,3,4,5,6,7,8.

У меня уже подготовлена ​​таблица поиска (на бумаге), мой вопрос: как лучше всего ее хранить? Первоначально я использовал static const unsigned char[][][], но в данном случае это явно не сработает, поскольку таблица может возвращать более одного числа (опять же, от 1 до 8).

Следующим моим решением было вернуть массив символов без знака. То есть static const unsigned char* [][][]. Как мне это инициализировать (то есть, как мне инициализировать статический массив const, чтобы возвращать мне массивы символов без знака, которые также являются статическими, чтобы я мог получить к ним доступ без инициализации класса)? Есть ли способ лучше?

Надеюсь, я смог правильно объяснить вопрос. Если нет, дайте мне знать, и я постараюсь перефразировать его и/или предоставить дополнительную информацию.


person Samaursa    schedule 09.11.2010    source источник


Ответы (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.

Какой метод вы выберете, зависит от того, что вы собираетесь делать с данными.

person Oliver Charlesworth    schedule 09.11.2010

Поскольку вы возвращаете только 0–8 из 8 возможных чисел, я думаю, вам следует придерживаться static const unsigned char[][][] и хранить «числа» в виде однобайтового битового поля, где бит n установлен, если n является одним из используемых чисел для этой ячейки, т.е. 1,2,5,7 может быть закодировано как 01010011 двоичное или 0x53 шестнадцатеричное.

person schnaader    schedule 09.11.2010

Чтобы использовать статическую инициализацию, вам нужно знать каждое измерение вашего массива. Я предполагаю, что вы уже знаете это, но не упомянули об этом в своем вопросе, поэтому я буду использовать размеры [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}}},{{{...}}}};
person Mark Ransom    schedule 09.11.2010