Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода

Я плохо провожу время, пытаясь вызвать корректно работающее выражение (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().

, 👍0

Обсуждение

[Это](http://www.gammon.com.au/forum/?id=12983) может помочь. Существует дискуссия о вызове функции класса из ISR., @Nick Gammon


2 ответа


1

Проблема в том, что 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


1

Решено:

Я переместил обработчик событий из класса и сделал его статическим пустым.

Тогда код скомпилирован правильно

D

,