我正在为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(*)()
使用它。尝试执行以下操作时,出现错误“无法将类型void*
的左值转换为参数类型void(*)()
的错误:
attachInterrupt(digitalPinToInterrupt(8), this->InterruptServiceRoutines[0], CHANGE)
我想我有更大的问题,void*
和void(*)()
有什么区别?我尝试搜索,但没有找到任何答案。我假设void(*)()
是一个指向void函数的指针,而void*
是一个指向void类型的指针?如果是这样,是否有适当的方法来初始化void函数指针的数组?
答案 0 :(得分:0)
没有一种方法可以使用您拥有的代码代替void (*)()
。您需要使用void (*)()
数组。
void *和void(*)()之间的区别是指向数字之间的区别
int number = 3;
并指向my_die
int rando() {
return random() % 4;
}
这就是为什么人们说这确实很重要。
下一个主要问题是您在声明一个可变长度数组成员而不分配它,而我认为这不起作用。我认为您需要将其作为指向一组void_fptrs的指针,在开始设置它们之前将需要对其进行分配。
super的注释应该有助于正确设置类型。也就是说,他们建议使用固定长度的函数指针数组,这与您使用totalInputs不一致。我猜想您真的要有一个动态数组,这是基于您的代码允许输入可变数量的数组这一事实。可变长度数组语法仅在您为声明分配值时才有效,通过将其作为函数的参数或对声明进行赋值,在此都不会执行任何操作。您应该可以使用 new 分配动态的void_fptr数组。