-2

我正在为 Arduino 开发一个共享库。在我的中断附件中,我需要声明一个类型为void(*)().

我传入一个 void 函数数组,然后循环遍历以填充对象的属性,如下所示:

主单元.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[];
};

主单元.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 函数指针数组的正确方法?

4

1 回答 1

0

没有办法使用您拥有的代码来代替void (*)(). 您需要使用一个数组void (*)()

void * 和 void (*)() 的区别是指向数字的区别

int number = 3;

并指向 my_die

int rando() {
    return random() % 4;
}

这就是为什么人们说这真的很重要。

下一个主要问题是您声明了一个可变长度数组成员而不分配它,我认为这不起作用。我认为您需要将其作为指向一组 void_fptrs 的指针,您需要在开始设置它们之前对其进行分配。

super 的评论应该有助于正确输入类型。也就是说,他们建议使用固定长度的函数指针数组,这与您对 totalInputs 的使用不一致。我猜你真的想要一个动态数组,因为你的代码允许输入可变数量的它们。可变长度数组语法只有在你在声明时分配一个值时才有效,要么将其作为函数的参数,要么在声明中进行赋值,而您在这里没有做任何一个。您应该能够使用new来分配您的动态 void_fptr 数组。

于 2019-02-14T01:25:35.627 回答