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;
};
何が間違っているのですか?