Я застрял. Я пытаюсь сформировать функцию, которая будет есть бесклассовые указатели на функции и объекты. Вот мой текущий код, который, надеюсь, объясняет больше.
(он должен работать на Arduino, поэтому я не могу использовать большие библиотеки.)
Во-первых, я использую эту библиотеку для Arduino:
/* SimpleTimer - A timer library for Arduino.
* Author: mromani@ottotecnica.com
* Copyright (c) 2010 OTTOTECNICA Italy
*/
Который принимает функции, которые он вызывает на заданном интервале таймера этого типа:
typedef void (*timer_callback)(void);
Насколько мне известно, это функция classles, веб-страница Указатели на функции-члены сделали меня очень далеко, но недостаточно. Возможно, дефицит терминологии с моей стороны.
Теперь я создал свой собственный класс, который я хотел бы, в свою очередь, использовать этой библиотекой SimpleTimer. Но если я передаю SimpleTimer свои функции класса, они им не нравятся (что я понимаю). Но как можно сделать это без изменения библиотеки SimpleTimer.
Итак, есть класс Robot, который имеет Robot::halt()
. Я хочу, чтобы робот двигался вперед на определенное количество времени. Вот так:
void Robot::forward(int speed, long time) {
reset();
timer.setTimer(time, c_func, 1);
analogWrite(l_a, speed);
analogWrite(r_a, speed);
isMoving(true);
}
void Robot::halt() {
__isMoving = false;
digitalWrite(r_a, LOW);
digitalWrite(r_b, LOW);
digitalWrite(l_b, LOW);
digitalWrite(l_a, LOW);
}
На данный момент переменная c_func является бесклассовой функцией, но я бы хотел использовать функцию Robot::halt
. Я посмотрел, прочитал, узнал, но пока не удалось. Я просто не могу обернуть голову вокруг этого, потому что мне не хватает какого-то угла.
Я пытался:
timer.setTimer(time, (this->*halt), 1);
timer.setTimer(time, Robot::*halt, 1);
timer.setTimer(time, &Robot::halt), 1);
Но это все равно одной и той же проблеме / мне просто нанести удар в темноте ...
EDIT
Ранее я говорил, что не хочу менять код библиотеки SimpleTimer. Я хочу вернуться к этому, я думаю, что его можно было бы изменить.
Спасибо за все текущие ответы, мне было разрешено помечать только один как жизнеспособный ответ, на самом деле все, что я прочитал здесь, было чрезвычайно полезно.
Чтобы продолжить, измените код SimpleTimer. Этот класс должен иметь ссылку на объект, который содержит мою функцию "halt", верно? Итак, перегрузка функции settimer чем-то, что воспринимает мой объект и мою функцию как два отдельных указателя, сработает ...? Я думаю, что понимаю это, но я еще не со своей головой.
EDIT
Я не знаю, кто пришел с этим снова, но кто-нибудь нашел эту тему. Если найдено Указатели на функции-члены и максимально быстрые делегаты C ++ , чтобы дать очень хорошее введение в указатели функций и указатели на функции-члены.
EDIT
Получил работу, изменил библиотеку SimpleTimer для использования этой системы делегатов:
http://www.codeproject.com/KB/cpp/FastDelegate.aspx
Он очень хорошо интегрировался, и было бы неплохо иметь стандартную систему делегатов, подобную этой, в библиотеке Arduino.
код как в тесте (рабочий)
ЬурейеЕ
typedef FastDelegate0<> FuncDelegate;
Код в классе роботов:
void Robot::test(){
FuncDelegate f_delegate;
f_delegate = MakeDelegate(this, &Robot::halt);
timer.setTimerDelg(1, f_delegate, 1);
}
void Robot::halt() {
Serial.println("TEST");
}
Код в классе SimpleTimer:
int SimpleTimer::setTimerDelg(long d, FuncDelegate f, int n){
f();
}
Arduino печатает TEST в консоли.
Следующий шаг, поместив его в массив, не видит там много проблем. Спасибо всем, я не могу поверить тому, чему научился за два дня.
Что это за запах? Это запах ...? Успех!
Для заинтересованных лиц используемая система делегатов не составляет проблем с объемом памяти:
С FastDelegate
AVR Memory Usage
----------------
Device: atmega2560
Program: 17178 bytes (6.6% Full)
(.text + .data + .bootloader)
Data: 1292 bytes (15.8% Full)
(.data + .bss + .noinit)
Finished building: sizedummy
Без FastDelegate:
AVR Memory Usage
----------------
Device: atmega2560
Program: 17030 bytes (6.5% Full)
(.text + .data + .bootloader)
Data: 1292 bytes (15.8% Full)
(.data + .bss + .noinit)
Finished building: sizedummy