2013-09-02 3 views
0

Я пытаюсь объявить что-то вроде этого в плоскости СC, многомерный массив неравны

const unsigned char test[][][][] = {{0x22,0x33},{0x22,0x33,0x44},{0x22,0x33,0x44,0x55},{0x22,0x33,0x45}}; 

но не является действительным. Я ищу элегантный способ хранения 4 массивов, которые могут быть адресованы индексом, но они неравномерны, поскольку содержит некоторую команду RS232 для устройства.

Я ищу команду [INITIALISE], команду [RESET] и так далее.

Большое спасибо за предложения.

+1

Выберите максимальные экстенты и оставьте ненужные элементы незащищенными? –

+0

Просто сохраните их как строковый массив: 'const unsigned char * test [] = {" AB "," ABC "," ABCD ", ...}'. Я имею в виду, что вы можете завершить каждую часть данных на ноль (или другой символ, который не может быть в данных). –

+0

Большое спасибо за ценные комментарии, – user1797147

ответ

2

Это должно работать:

const unsigned char test[][4] = {{0x22,0x33},{0x22,0x33,0x44},{0x22,0x33,0x44,0x55},{0x22,0x33,0x45}}; 
+1

Где 4 не число элементов в этом массиве, а максимальное количество элементов в подмассивах. Тем не менее, я хочу посмотреть, как вы будете знать, сколько элементов в каждой действительно содержит ... – nickie

+0

Невозможно afaik. Вы должны получить предупреждение компилятора, если массив слишком мал. –

+1

И вам понадобятся отдельные счетчики или контрольная сумма в каждом массиве, чтобы узнать, где она заканчивается. – nickie

6

Вы не можете сделать это в одном объявлении переменной, в общем. То, что я хотел бы предложить было бы что-то вроде этого:

const unsigned char command1[] = {0x2, 0x3, 0x0}; 
const unsigned char command2[] = {0x3, 0x0}; 
const unsigned char *commands[] = {command1, command2}; 

Обратите внимание, что каждая из команд имеет 0x0 -terminator; это необходимо, потому что иначе не будет способа узнать, сколько байтов в командной строке.

Если вы не знаете максимальную длину команды, то вы можете сделать следующее:

const unsigned char commands[][MAX_LENGTH+1] = { 
    {0x2, 0x3}, 
    {0x3}, 
}; 

, который будет так же позволит вам знать длину команды, ища 0x0. Обратите внимание, что это будет пустое пространство, потому что для каждой команды, которая не на максимальной длине, есть дополнительные нулевые байты.

Этот ответ предполагает, что 0x0 не является допустимым байтом команды. Если это так, вам нужно будет хранить длины каждой команды отдельно.

Смежные вопросы