Интерпретатор и обработчик сообщений – как сохранить имя функции в структуре?

Для проекта мне нужно сохранить массив структур в PROGMEM. Массив MessageTable[] будет состоять примерно из десяти элементов struct InMessage. InMessage выглядит примерно так:

struct AvcInMessage {
  MessageHandler  msgHandler;
  byte            dataSize;
  byte            data[8];
  char            description[20];
};

MessageHandler не является типом данных... пока. Я не совсем уверен, какой тип данных использовать. Я хочу иметь возможность выбрать сообщение из таблицы, а затем вызвать MessageTable[x].msgHandler(), если это имеет смысл. Я почти уверен, что здесь используется указатель. Есть ли у кого-нибудь здесь представление о том, что я ищу?

, 👍0

Обсуждение

Возможно, я неправильно понимаю, но похоже, что вы хотите хранить в PROGMEM массив структур, содержащих ссылку на объект... Это выглядит немного излишним: вам нужно иметь разные обработчики сообщений для каждого элемента в множество?, @Roberto Lo Giacco


1 ответ


Лучший ответ:

3
typedef void (*MessageHandler)(void);   // определяем обработчик сообщения как указатель на func

struct AvcInMessage {
  MessageHandler  msgHandler;
  byte            dataSize;
  byte            data[8];
  char            description[20];
} InMessage[] = {
   {
      function1, <datasize>, {<byte0>, <byte1>, ..., }, "DescriptionHere"
   },
   // и т. д., сколько бы элементов ни было в InMessage[].
};

Текст typedef определяет «указатель на функцию void, возвращающую void» — исправьте количество и типы аргументов, а также тип возвращаемого значения в соответствии с вашими потребностями. Мы предполагаем, что функция каждого элемента имеет одинаковый список аргументов и тип возвращаемого значения. (Обновление: извините за ошибку в моей первой итерации).

Следующий оператор определяет массив структур и инициализирует N из них. Укажите количество элементов в [], если у вас нет полного набора инициализаторов во время компиляции.

,

Кажется, я понимаю, что вы имеете в виду, но он не компилируется. Я получаю токен `ожидаемый неквалифицированный идентификатор перед ')'., @Bo Thompson

должно ли это быть typedef void (*MessageHandler)(void);, @Jaromanda X

У @JaromandaX оно есть (спасибо!). Я обновил свой ответ., @JRobert

Подтверждаем, что исправленный код работает. Большое спасибо вам обоим., @Bo Thompson