Хранение массива пустых указателей
Я работаю над общей библиотекой для Arduino. В моих вложениях прерываний мне нужно объявить подпрограмму обработки прерываний с типом void(*)()
,
Я передаю массив функций void, которые затем перебираю, чтобы заполнить свойство объекта следующим образом:
MainUnit.h
class MainUnit {
public:
MainUnit(const String type,
const int revisionNumber,
const int totalInputs,
uint8_t avrPinNumbers[],
uint8_t spdtPinNumbers[],
void* isrs[]);
private:
void* InterruptServiceRoutines[];
};
MainUnit.cpp
MainUnit::MainUnit(const String type,
const int revisionNumber,
const int totalInputs,
uint8_t avrPinNumbers[],
uint8_t spdtPinNumbers[],
void* isrs[] )
{
// copy spdt pins and isrs over
for (uint8_t input = 0; input < totalInputs; input++) {
this->InterruptServiceRoutines[input] = isrs[input];
}
}
Есть ли способ использовать это вместо void(*)()
, Я получаю сообщение об ошибке "Не удается преобразовать тип lvalue void*
к типу параметра void(*)()
"когда я пытаюсь что-то вроде этого:
attachInterrupt(digitalPinToInterrupt(8), this->InterruptServiceRoutines[0], CHANGE)
Я думаю, больший вопрос, который у меня есть, в чем разница между void*
а также void(*)()
? Я пытался найти и не нашел ответов на этот вопрос. Я предполагаю, что void(*)()
это указатель на пустую функцию по сравнению с void*
такое указатель на тип void? Если так, есть ли правильный способ инициализировать массив указателей на функцию void?
1 ответ
Нет способа использовать ваш код вместо void (*)()
, Вам нужно использовать массив void (*)()
,
Разница между void * и void (*)() - это разница между указанием на число
int number = 3;
и указывая на my_die
int rando() {
return random() % 4;
}
Вот почему люди говорят, что это действительно большое дело.
Следующая основная проблема заключается в том, что вы объявляете член массива переменной длины, не назначая его, и я не думаю, что это работает. Я думаю, вам нужно, чтобы это был указатель на набор void_fptrs, который вам нужно будет выделить перед тем, как вы начнете их устанавливать.
Комментарий супер должен быть полезен для получения правильного типа. Тем не менее, они предложили массив указателей на функции фиксированной длины, который не согласуется с вашим использованием totalInputs. Я предполагаю, что вы действительно хотите иметь динамический массив вместо этого, основываясь на том факте, что ваш код позволяет вводить переменное число из них. Синтаксис массива переменной длины работает, только если вы присваиваете значение в объявлении, либо с помощью аргумента функции, либо с помощью присваивания при объявлении, и вы не делаете ни одного из них здесь. Вы должны быть в состоянии использовать new для выделения вашего динамического массива void_fptr.