传递自定义函数类型时“赋值中的不兼容类型”

时间:2018-02-08 03:14:23

标签: c++ arduino

我正在创建一个类来处理两个无线电之间的无线电通信,每个无线电都连接到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////
  ...

1 个答案:

答案 0 :(得分:0)

这里有两个选项:

  1. 您可以将dataHandlers / handlers /两者标记为DataHandler *
  2. 您可以将上述变量标记为std::vector<DataHandler>,处理程序为左值(std::vector<DataHandler> &)引用。
  3. 重新创建代码的关键方面时遇到的错误是堆栈分配的数组基本上是不可变的指针,所以你基本上写的是DataHandler * const的等价物。由于所有字段都有一个默认的初始化,无论你是否在构造函数的初始化列表中指定了一个(你不能为dataHandlers提供类型,因为你在字段声明中实际指定了它的默认值),你本质上是尝试重新分配DataHandler指针所指向的内容。