存储空指针数组

时间:2019-02-14 00:11:08

标签: arduino arduino-c++

我正在为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函数指针的数组?

1 个答案:

答案 0 :(得分:0)

没有一种方法可以使用您拥有的代码代替void (*)()。您需要使用void (*)()数组。

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

int number = 3;

并指向my_die

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

这就是为什么人们说这确实很重要。

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

super的注释应该有助于正确设置类型。也就是说,他们建议使用固定长度的函数指针数组,这与您使用totalInputs不一致。我猜想您真的要有一个动态数组,这是基于您的代码允许输入可变数量的数组这一事实。可变长度数组语法仅在您为声明分配值时才有效,通过将其作为函数的参数或对声明进行赋值,在此都不会执行任何操作。您应该可以使用 new 分配动态的void_fptr数组。