У меня есть функция обработчика событий, и в этой функции есть вызов функции-члена класса. Функция обработчика событий объявляется в файле cpp класса, но не является частью класса, она не является функцией-членом.Использование функций-членов класса в глобальной функции перед объявлением объекта
Когда я компилирую код, компилятор говорит, что функция является заметкой в области видимости, потому что она вызывает функцию-член в функции глобального обработчика событий.
Мой вопрос следующий: есть ли способ использовать функцию meber в глобальной функции? (Объект создается сначала во время выполнения).
Ниже функция член и глобальный обработчик события:
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);
}
Update
С ответом Даниила (спасибо!) Я изменил функцию-член в файле заголовка и файле cpp на static следующим образом:
static void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size);
И функция вызывается в глобальной EventHandler как следует:
// 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: ошибка: дополнительная квалификация 'CommunicationModuleUSB ::' на члене SendBuffer.
Есть ли у кого-нибудь идеи, кто может это решить?
Обновление 2
Еще раз спасибо Daniel за ваш ответ!
Я изменил функцию-член с вашей обратной связью. Но теперь я получаю следующую ошибку:
C: \ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB \ CommunicationModuleUSB.cpp: 77: error: невозможно объявить функцию-член 'static void CommunicationModuleUSB :: SendBuffer (uint8_t *, int) 'иметь статическую связь
Я сделал переменную Connection static в файле заголовка. Bellow - это заголовочный файл, а функция deffenition формирует файл 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:
};
Функция decleration в файле CPP:
static void CommunicationModuleUSB::SendBuffer(uint8_t* Buffer, int Size){
connection->write(Size,(uint8_t*)&Buffer);
}
и вызов в глобальной функции:
CommunicationModuleUSB::SendBuffer(data, sizeof(data));
Update 3
Я обновил te кода с помощью Daniel, единственная проблема, с которой я столкнулся сейчас, заключается в том, что переменная Connection, объявленная в классе, больше не входит в область.
Ошибка компилятора, что я получаю, как следует: C: \ Users \ Gebruiker \ Documents \ Arduino \ библиотеки \ CommunicationModuleUSB/CommunicationModuleUSB.cpp: 79: неопределенная ссылка на CommunicationModuleUSB::connection' C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:79: undefined reference to
CommunicationModuleUSB :: связи» CommunicationModuleUSB \ CommunicationModuleUSB. cpp.o: в функции CommunicationModuleUSB::Connect()': C:\Users\Gebruiker\Documents\Arduino\libraries\CommunicationModuleUSB/CommunicationModuleUSB.cpp:53: undefined reference to
CommunicationModuleUSB :: подключение ' C: \ Users \ Gebruiker \ Documents \ Arduino \ библиотеки \ CommunicationModuleUSB/CommunicationModuleUSB.cpp: 53: неопределенная ссылка на `CommunicationModuleUSB :: связи'
изменяемого соединения объявляется в файле заголовка следующим образом:
// 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);
}
И используются в следующем глобальной функции обработчика событий:
// 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));
}
Doe кто-нибудь есть предложение, как решить эту проблему ?
@ Daniel: Спасибо за ваш комментарий. Я получаю следующую ошибку компилятора при изменении функции на статическую. C: \ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB/CommunicationModuleUSB.h: 26: ошибка: дополнительная квалификация 'CommunicationModuleUSB ::' для участника 'SendBuffer'. Я опубликовал изменения под uptdate: – Roy08
Извините, я допустил ошибку (или я не был ясен в своем объяснении). Вам нужно объявить метод как статический, вам не нужно ставить 'CommunicationModuleUSB ::' впереди. Проверьте мой ответ (через секунду) –
@ Danliel: Еще раз спасибо за ваш ответ. Я использовал вашу обратную связь, но не получаю следующую ошибку: C: \ Users \ Gebruiker \ Documents \ Arduino \ libraries \ CommunicationModuleUSB \ CommunicationModuleUSB.cpp: 77: ошибка: не может объявить функцию-член 'static void CommunicationModuleUSB :: SendBuffer (uint8_t *, int) ', чтобы иметь статическую связь. Я изменил Connection на static. Я обновил свой код под обновлением 2 – Roy08