2

我正在编写一个程序来控制 Arduino Mega 微控制器(用 C/C++ 编写)上的自动家庭酿造系统。简而言之,该程序正在做的是有一个 C# 应用程序,它定期通过 USB 向微控制器发送消息。然后有一个我编写的消息接口,它读取消息,并将其转发到消息所针对的任何组件。每条消息有 16 个字节长,前 4 个是事务代码,后 12 个是数据。现在,我阅读了消息并将其转发给我的 StateController 类。它来自 InboundMessage 函数。我想要做的是我有一个结构(在 StateController.h 中定义),其中包含事务代码和指向 StateController 中成员函数的指针。我定义了一个 QueueList(只是一个简单的链表库),并将一堆这些结构推入其中。我想做的是,当一条消息进入 inboundMessage 函数时,我想遍历链表,直到找到匹配的事务代码,然后调用该消息的成员函数,将其传递给消息中的数据。

我想我已经正确初始化了一切,但问题就在这里。当我尝试编译时,我收到一条错误消息,提示“此范围内不存在 func”。我已经到处寻找解决方案,但找不到。我的代码如下

StateController.cpp

StateController::StateController(){
  currentState = Idle;
  prevState = Idle;
  lastRunState = Idle;

  txnTable.push((txnRow){MSG_BURN, &StateController::BURNprocessor});
  txnTable.push((txnRow){MSG_MANE, &StateController::MANEprocessor});
  txnTable.push((txnRow){MSG_MAND, &StateController::MANDprocessor});
  txnTable.push((txnRow){MSG_PUMP, &StateController::PUMPprocessor});
  txnTable.push((txnRow){MSG_STAT, &StateController::STATprocessor});  
  txnTable.push((txnRow){MSG_SYNC, &StateController::SYNCprocessor});
  txnTable.push((txnRow){MSG_VALV, &StateController::VALVprocessor});
}

void StateController::inboundMessage(GenericMessage msg){
  // Read transaction code and do what needs to be done for it

  for (int x = 0; x < txnTable.count(); x++)
  {
    if (compareCharArr(msg.code, txnTable[x].code, TXN_CODE_LEN) == true)
    {
      (txnTable[x].*func)(msg.data);
      break;
    }
  }
}

状态控制器.h

class StateController{
  // Public functions
  public:

    // Constructor
    StateController();

    // State Controller message handeler
    void inboundMessage(GenericMessage msg);

    // Main state machine
    void doWork();

  // Private Members
  private:  

    // Hardware interface
    HardwareInterface hardwareIntf;

    // Current state holder
    StateControllerStates currentState;

    // Preveous State
    StateControllerStates prevState;

    // Last run state
    StateControllerStates lastRunState;

    // BURN Message Processor
    void BURNprocessor(char data[]);

    // MANE Message Processor
    void MANEprocessor(char data[]);

    // MAND Message Processor
    void MANDprocessor(char data[]);

    // PUMP Message Processor
    void PUMPprocessor(char data[]);

    //STAT Message Processor
    void STATprocessor(char data[]);

    // SYNC Message Processor
    void SYNCprocessor(char data[]);

    // VALV Message Processor
    void VALVprocessor(char data[]);

    void primePumps();

    // Check the value of two sensors given the window
    int checkSensorWindow(int newSensor, int prevSensor, int window);

    struct txnRow{
    char code[TXN_CODE_LEN + 1];
    void (StateController::*func)(char[]);
    };

    QueueList<txnRow> txnTable;

};

知道有什么问题吗?

4

1 回答 1

1

func只是一个普通成员,txnRow因此您可以使用.,而不是.*,例如txnTable[x].func.

要在 上调用此成员函数this,您可以执行以下操作:

(this->*(txnTable[x].func))(msg.data);
于 2012-11-03T21:44:09.323 回答