我正在创建一个类来处理两个无线电之间的无线电通信,每个无线电都连接到Arduino。我计划将一个函数列表传递给类来处理收到的不同消息。
我的问题是,在将一组函数保存到私有变量时,我收到以下错误:
incompatible types in assignment of 'void (**)(uint8_t*) {aka void (**)(unsigned char*)}' to 'void (* [0])(uint8_t*) {aka void (* [0])(unsigned char*)}'
唯一的区别是*
与[0]
Comms.h
class Comms {
public:
//data handlers are arrays of functions that handle data received with an id equal to their index in the array
typedef void (*DataHandler)(uint8_t data[RH_RF95_MAX_MESSAGE_LEN]);
Comms(bool isMaster, uint16_t Hz, DataHandler handlers[]);
void updateRun();
//first element should be the id, followed by some data
void queueData(uint8_t data[RH_RF95_MAX_MESSAGE_LEN]);
int8_t getLastRSSI();
private:
RH_RF95 *rf95;
QueueList<uint8_t[]> messageQueue;
bool master;
uint16_t pingDelay;
DataHandler dataHandlers[];
};
Comms.cpp已裁减
#include "Comms.h"
Comms::Comms(bool isMaster, uint16_t hz, DataHandler handlers[]){
master = isMaster;
pingDelay = 1/hz;
dataHandlers = handlers; ######ERROR HERE######
////setup code////
...
答案 0 :(得分:0)
这里有两个选项:
dataHandlers
/ handlers
/两者标记为DataHandler *
。std::vector<DataHandler>
,处理程序为左值(std::vector<DataHandler> &
)引用。重新创建代码的关键方面时遇到的错误是堆栈分配的数组基本上是不可变的指针,所以你基本上写的是DataHandler * const
的等价物。由于所有字段都有一个默认的初始化,无论你是否在构造函数的初始化列表中指定了一个(你不能为dataHandlers提供类型,因为你在字段声明中实际指定了它的默认值),你本质上是尝试重新分配DataHandler指针所指向的内容。