Инициализация трехмерного статического константного массива - PullRequest
1 голос
/ 10 ноября 2010

У меня есть трехмерный статический константный массив, который действует как справочная таблица.Каждая ячейка массива может возвращать до 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, чтобы возвращать мне беззнаковые массивы символов, которые также являются статическими, чтобы я мог получить к ним доступ без инициализации класса)?Есть ли лучший способ?

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

Ответы [ 3 ]

3 голосов
/ 10 ноября 2010

Вы можете дополнить каждый элемент до максимальной длины фиктивными элементами и использовать массив 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 },
                                             ...

или вы можете использовать отдельные биты в качестве флагов, например ::1004

static const unsigned char x[M][N][P] = { 0x53, // Bits 0, 1, 4, 6 are set
                                          0xFF,
                                          ...

Если вам нужно более 8 возможностей, перейдите, например, до. uint16_t или uint32_t.

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

1 голос
/ 10 ноября 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}}},{{{...}}}};
1 голос
/ 10 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...