首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递自定义函数类型时“赋值中的不兼容类型”

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

Stack Overflow用户
提问于 2018-02-08 03:14:23
回答 1查看 548关注 0票数 0

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

代码语言:javascript
复制
    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缩减了

代码语言:javascript
复制
#include "Comms.h"


Comms::Comms(bool isMaster, uint16_t hz, DataHandler handlers[]){
  master = isMaster;
  pingDelay = 1/hz;
  dataHandlers = handlers; ######ERROR HERE######

  ////setup code////
  ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-08 03:27:00

你在这里有两个选择:

  1. 您可以将dataHandlers/handlers/both标记为DataHandler *
  2. 可以将上述变量标记为std::vector<DataHandler>,处理程序是lvalue (std::vector<DataHandler> &)引用。

我在重新创建代码的关键方面时遇到的错误是,堆栈分配的数组基本上是不可变的指针,因此您基本上是在编写相当于DataHandler * const的指针。由于所有字段都具有默认初始化,无论您是否在构造函数中的初始化程序列表中指定了初始化程序列表(对于dataHandlers的类型不能指定,因为您在字段声明中基本上指定了其默认值),因此基本上是试图重新分配DataHandler指针所指向的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48676953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档