Инициализировать структуру с гибким массивом - PullRequest
2 голосов
/ 06 апреля 2020

Я думаю, что это простой вопрос, но я не могу получить ответ самостоятельно. У меня есть такая структура и я хочу инициализировать массив команд.

typedef struct LPWA_COMMAND
{
    LPWA_COMMAND_TYPE type;
    const char text[];

}LPWA_COMMAND;

LPWA_COMMAND_TYPE - это просто перечисление. Не обращайте на это внимания.

Я не хочу указывать text фиксированный размер, например: const char text[30], так как я знаю каждую команду перед компиляцией программы, и это было бы пустой тратой памяти.

Поскольку это возможно сделать: const char text[] = "Hi";, должно быть решение, подобное этому.

Это работает:

LPWA_COMMAND test = {
        LPWA_EXTRA, "ATI"
};

, но это дает мне ошибка: (инициализация элемента гибкого массива во вложенном контексте)

LPWA_COMMAND test2[1] = {
        {LPWA_EXTRA, "ATI"}
};

Кстати: LPWA_COMMAND должен быть typedef.

Спасибо!

1 Ответ

0 голосов
/ 07 апреля 2020

Спасибо FelixG, Groo и Jabberwocky за ваши советы.

Я теперь решил мою проблему следующим образом:

typedef struct LPWA_COMMAND
{
    LPWA_COMMAND_TYPE type;
    const char *text;

} LPWA_COMMAND;

typedef enum LPWA_COMMAND_ID
{
    ATI = 0,
    QPING,
    QPOWD,
    // ... more commands ...
    NUMBEROFCOMMANDS
} LPWA_COMMAND_ID;

LPWA_COMMAND commandset[NUMBEROFCOMMANDS]= {
         [ATI].text = "ATI", [ATI].type = LPWA_EXTRA ,
         [QPING].text = "QPING", [QPING].type = LPWA_NORMAL ,
         [QPOWD].text = "QPOWD", [QPOWD].type = LPWA_NORMAL
         // ... more commands ...
};

Также возможно выполнить инициализацию в отдельной функции как предложил Гроо:

LPWA_COMMAND create_command(const char * text, LPWA_COMMAND_TYPE type )
{
    return (LPWA_COMMAND){ .text = text , .type = type};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...