Интерпретатор и обработчик сообщений – как сохранить имя функции в структуре?
Для проекта мне нужно сохранить массив структур в PROGMEM. Массив MessageTable[]
будет состоять примерно из десяти элементов struct InMessage
. InMessage выглядит примерно так:
struct AvcInMessage {
MessageHandler msgHandler;
byte dataSize;
byte data[8];
char description[20];
};
MessageHandler не является типом данных... пока. Я не совсем уверен, какой тип данных использовать. Я хочу иметь возможность выбрать сообщение из таблицы, а затем вызвать MessageTable[x].msgHandler()
, если это имеет смысл. Я почти уверен, что здесь используется указатель. Есть ли у кого-нибудь здесь представление о том, что я ищу?
@Bo Thompson, 👍0
Обсуждение1 ответ
Лучший ответ:
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
- Создание массива структур, в которых хранятся растровые изображения для работы с u8glib.
- Инициализация массива структур
- Как получить размер (sizeof) массива структур
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Почему структура переменного размера не компилируется в Arduino IDE?
- Передача массивов, глобальных массивов внутри функций, указателей и объявление размеров массивов.
- Установка указателя массива на null при объявлении
- Почему я не могу получить размер массива указателей
Возможно, я неправильно понимаю, но похоже, что вы хотите хранить в PROGMEM массив структур, содержащих ссылку на объект... Это выглядит немного излишним: вам нужно иметь разные обработчики сообщений для каждого элемента в множество?, @Roberto Lo Giacco