イベント ハンドラー関数があり、その関数にはクラスのメンバー関数への呼び出しがあります。イベント ハンドラー関数は、クラス cpp ファイルで宣言されていますが、クラスの一部ではなく、メンバー関数ではありません。
コードをコンパイルすると、グローバル イベント ハンドラー関数内でメンバー関数を呼び出しているため、関数はスコープ内にあるとコンパイラーは言います。
私の質問は次のとおりです。グローバル関数でメンバー関数を使用する方法はありますか? (オブジェクトは実行時に最初に作成されます)。
以下は、メンバー関数とグローバル イベント ハンドラーです。
Global event handler:
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data)
{
Serial.println("In data recieve handler");
Serial.println("Data recieved: ");
Serial.println(data[0]);
Serial.println(data[1]);
char a = data[0];
char b = data[1];
Serial.println(a);
Serial.println(b);
//uint16_t data2 = data;
// Member function of USBCommunicator class
SendBuffer(data, sizeof(data));
}
メンバー関数:
void CommunicationModuleUSB::SendBuffer(uint8_t * Buffer, int Size){
connection->write(Size,(uint8_t*)&Buffer);
}
アップデート
ダニエルの返信で(ありがとう!)、次のようにヘッダーファイルとcppファイルのメンバー関数を静的に変更しました:
static void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size);
そして、関数は次のようにグローバル イベント ハンドラで呼び出されます。
// Event handler for shell connection; called whenever data sent from Android to Microcontroller
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data)
{
Serial.println("In data recieve handler");
Serial.println("Data recieved: ");
//Serial.println(*data);
Serial.println(data[0]);
Serial.println(data[1]);
char a = data[0];
char b = data[1];
Serial.println(a);
Serial.println(b);
//uint16_t data2 = data;
CommunicationModuleUSB::SendBuffer(data, sizeof(data));
}
今だけ、コンパイル時に次のエラーが発生します。
C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.h:26: エラー: メンバー 'SendBuffer の追加修飾 'CommunicationModuleUSB::'。
誰がそれを解決するのか考えている人はいますか?
更新 2
返信ありがとうございます。
あなたのフィードバックでメンバー関数を変更しました。しかし、今では次のエラーが発生します。
C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB\CommunicationModuleUSB.cpp:77: エラー: メンバ関数 'static void CommunicationModuleUSB::SendBuffer(uint8_t*, int)' を静的リンケージに宣言できません
ヘッダー ファイルで Connection 変数を static にしました。以下は、cpp ファイルからのヘッダー ファイルと関数定義です。
あなた(または他の誰か)は手がかりを持っていますか?すべての提案を歓迎します!
ヘッダー ファイル:
#include "CommunicationModule.h"
#include <SPI.h>
#include <Adb.h>
class CommunicationModuleUSB : public CommunicationModule
{
public:
CommunicationModuleUSB();
int Connect();
void Send();
int CheckConnection();
void Recieve();
static void SendBuffer(uint8_t* Buffer, int Size);
void RecieveBuffer(char Buffer[], int Size);
// Adb connection made this static....(is this right?
static Connection * connection;
// Elapsed time for sensor sampling
long lastTime;
private:
};
cpp ファイルの関数宣言:
static void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size){
connection->write(Size,(uint8_t*)&Buffer);
}
そして、グローバル関数の呼び出し:
CommunicationModuleUSB::SendBuffer(data, sizeof(data));
アップデート 3
Daniel の助けを借りて te コードを更新しました。唯一の問題は、クラスで宣言されている Connection 変数がスコープ内にないことです。
私が得るコンパイラエラーは次のとおりです: C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:79: CommunicationModuleUSB::connection へのCommunicationModuleUSB::connection'
C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:79: undefined reference to
未定義参照CommunicationModuleUSB::Connect()':
C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference to
::connection' C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: 「CommunicationModuleUSB::connection」への未定義の参照
接続変数は、ヘッダー ファイルで次のように宣言されます。
// Adb connection made this static....(is this right?
static Connection * connection;
この変数は、次のメンバー関数で使用されます。
void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size){
connection->write(Size,(uint8_t*)&Buffer);
}
And は、次のグローバル イベント ハンドラー関数で使用されます。
// Event handler for shell connection; called whenever data sent from Android to Microcontroller
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data)
{
Serial.println("In data recieve handler");
Serial.println("Data recieved: ");
Serial.println(data[0]);
Serial.println(data[1]);
char a = data[0];
char b = data[1];
Serial.println(a);
Serial.println(b);
CommunicationModuleUSB::SendBuffer(data, sizeof(data));
}
これを解決する方法を提案している人はいますか?