Я прочитал это (Как инициализировать массив без знака?), но это не совсем отвечает на мой вопрос.
Я знаю, что могу создать массив строк, как это:
const char *str[] =
{
"first",
"second",
"third",
"fourth"};
и если я хочу написать (), то я могу использовать: write (fd, str [3], sizeof (str [3]));
Но что, если мне нужен массив беззнаковых символов переменной длины? Я попробовал это:
const unsigned char *cmd[] =
{
{0xfe, 0x58},
{0xfe, 0x51},
{0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
{0xfe, 0x3d, 0x02, 0x0f}
};
и я получаю предупреждения компиляции GCC, такие как
* «скобки вокруг скалярного инициализатора» * «инициализация делает указатель из целого числа без приведения»
Это один из способов
const unsigned char cmd1[] = {0xfe, 0x58};
const unsigned char cmd2[] = {0xfe, 0x51};
const unsigned char cmd3[] = {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23};
const unsigned char cmd4[] = {0xfe, 0x3d, 0x02, 0x0f};
const unsigned char *cmd[] =
{
cmd1,
cmd2,
cmd3,
cmd4
};
Когда используются многомерные массивы, вы должны указать размер последнего измерения, чтобы компилятор вычислил правильную адресную арифметику.
Ваш массив указателей cmd имеет два измерения. Второе измерение имеет максимальную длину 6 элементов, поэтому:
const unsigned char cmd[][6] =
{
{0xfe, 0x58},
{0xfe, 0x51},
{0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
{0xfe, 0x3d, 0x02, 0x0f}
};
Из стандарта ANSI C:
«Если массив неизвестного размера инициализирован, его размер определяется по наибольшему индексируемому
элемент с явным инициализатором. В конце списка инициализаторов массив больше не
имеет неполный тип. «
Это сработало для меня (компилируется с Clang & НКУ):
const unsigned char *cmd[] =
{
(unsigned char[]){0xfe, 0x58},
(unsigned char[]){0xfe, 0x51},
(unsigned char[]){0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
(unsigned char[]){0xfe, 0x3d, 0x02, 0x0f}
};