2

Arduino Mega マイクロ コントローラー (C/C++ で記述) で自動家庭用醸造システムを制御するプログラムを作成しています。つまり、プログラムが行っているのは、USB を介して定期的にメッセージをマイクロ コントローラーに送信する C# アプリケーションがあるということです。次に、メッセージを読み取り、メッセージの対象となるコンポーネントに転送する、私が作成したメッセージング インターフェイスがあります。各メッセージの長さは 16 バイトで、最初の 4 つはトランザクション コード、最後の 12 はデータ用です。ここで、メッセージを読み取り、それを StateController クラスに転送します。InboundMessage 関数から取得されます。私がやろうとしているのは、StateController 内のメンバー関数へのトランザクション コードとポインターを含む構造体 (StateController.h で定義) があることです。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;
    }
  }
}

StateController.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 に答える