Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
Я плохо провожу время, пытаясь вызвать корректно работающее выражение (ultra[currentSensor].ping_timer(echoCheck)
) из собственного метода класса (myclass::run
), а не из void loop()
.
Я получаю следующую ошибку компилятора: "недопустимое использование нестатической функции-члена".
Если я вызываю ultra[currentSensor].ping_timer(echoCheck)
непосредственно из void loop ()
, это не дает мне никакой ошибки, так что я, возможно, что-то упускаю.
Вот (сокращенный) фрагмент кода, который генерирует ошибку:
#include <NewPing.h>
#define ULTRA_NUM 3
#define MAX_DISTANCE 200
class myclass {
public:
void run();
void echoCheck();
unsigned int distance[ULTRA_NUM];
uint8_t currentSensor = 0;
};
NewPing ultra[ULTRA_NUM] = {
NewPing(4, 5, MAX_DISTANCE),
NewPing(6, 7, MAX_DISTANCE),
NewPing(8, 9, MAX_DISTANCE)
};
void myclass::run() {
// ....
ultra[currentSensor].ping_timer(echoCheck); // Ошибка компилятора
}
void myclass::echoCheck() {
if (ultra[currentSensor].check_timer())
distance[currentSensor] = ultra[currentSensor].ping_result
}
ping_timer()
определяется следующим образом:
void NewPing::ping_timer(void (*userFunc)(void), unsigned int max_cm_distance) {
if (max_cm_distance > 0) set_max_distance(max_cm_distance);
if (!ping_trigger()) return;
timer_us(ECHO_TIMER_FREQ, userFunc);
}
Надеюсь, кто-нибудь из вас сможет мне помочь!
Заранее спасибо,
Эдуардо
Правка:
Я пытаюсь адаптировать этот пример (из новой библиотеки Arduino) так, чтобы sonar ping (sonar[currentSensor].ping_timer(echoCheck)
) выполнялся из метода класса, а не из void loop()
.
@eduherminio, 👍0
Обсуждение2 ответа
Проблема в том, что echo_check
-это не void echo_check ()
, а void echo_check(myclass *this)
, потому что это функция-член класса.
Вы можете сделать все это статичным (вместе с run ()
), выполнив:
class myclass {
public:
static void run();
static void echo_check();
};
static void myclass::run() {
....
}
void myclass::echo_check() {
....
}
А потом ты звонишь:
myclass::run();
вместо создания экземпляра объекта.
мм, кажется, решает проблему, но теперь я получаю ошибки компилятора везде, где используются члены класса (а также внутри определения класса): "недопустимое использование члена 'Ultrabot::_xxxxxxx' в статической функции-члене", @eduherminio
Статическая функция может вызывать только другие статические функции или глобальные обычные функции, или функции других классов, которые определены как статические члены., @Majenko
Итак, теперь у меня есть функции компиляции, которые не могут делать то, что они должны делать? :/, @eduherminio
Я не знаю, так как вы никогда не удосуживались показать нам свой *настоящий* код, только какой-то крошечный фрагмент., @Majenko
Дело не в том, чтобы беспокоиться о том, делать это или нет, а в том, чтобы попытаться не беспокоить вас всем моим частично построенным кодом. Я надеюсь, что теперь с редактированием все стало более ясно., @eduherminio
Что ж, ответ, который я дал, отвечает на заданный вами вопрос. Поскольку это затем каким-то неопределенным образом нарушает неуказанный код, я не могу помочь вам дальше., @Majenko
Правка вообще ничего не проясняет, нет. Это именно то, что, как я предполагал, вы делали. Вам нужно либо переработать свой код, чтобы он был полностью статичным, либо переработать новый код, чтобы он мог принимать правильные функции в качестве обратного вызова и не иметь ничего статичного. Выбирай сам., @Majenko
Решено:
Я переместил обработчик событий из класса и сделал его статическим пустым.
Тогда код скомпилирован правильно
D
- Используйте ISR внутри библиотеки более элегантно
- Как объявить указатель на библиотеку arduino neopixels, чтобы настроить его в функции настройки с помощью динамических переменных?
- Защита переменных и функций в библиотеке, не имеющей класса
- Передача ссылки на оборудование между методами в пользовательском классе
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Как получить исходные файлы для библиотек Arduino?
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
[Это](http://www.gammon.com.au/forum/?id=12983) может помочь. Существует дискуссия о вызове функции класса из ISR., @Nick Gammon