Я застрял. Я пытаюсь создать функцию, которая будет есть указатели бесклассовых функций и указатели из объектов. Вот мой текущий код, который, надеюсь, объясняет больше.
] (Он должен работать на Arduino, поэтому я не могу использовать большие библиотеки.)
Во-первых, я использую эту библиотеку для Arduino:
/* SimpleTimer - A timer library for Arduino.
* Author: mromani@ottotecnica.com
* Copyright (c) 2010 OTTOTECNICA Italy
*/
Которая выполняет функции, которые она вызывает с заданным интервалом таймера этого типа:
typedef void (*timer_callback)(void);
Насколько мне известно, это функция классов, веб-страница Указатели на функции-члены меня очень далеко, но недостаточно. Вероятно, дефицит терминологии с моей стороны.
Теперь, Я создал свой собственный класс, который, в свою очередь, хотел бы использовать эту библиотеку 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);
Но все это равнялось бы той же проблеме / я просто колю здесь в темноте...
РЕДАКТИРОВАТЬ
Ранее я сказал, что не хочу изменять код библиотеки SimpleTimer. Я хочу вернуться к этому, я думаю, что было бы лучше изменить его.
Спасибо за все текущие ответы, мне разрешили пометить только один как жизнеспособный, на самом деле все, что я здесь прочитал, было чрезвычайно полезно.
Чтобы продолжить, изменим код SimpleTimer. У этого класса должна быть ссылка на объект, который содержит мою функцию остановки, верно? Итак, перегрузка функции settimer на что-то, что принимает мой объект и мою функцию как два отдельных указателя, будет работать ...? Я думаю, что у меня это получается, но я еще не дошел до этого с головой.
РЕДАКТИРОВАТЬ
Я не знаю, кто пришел с этим снова, но кто-нибудь найдет эту ветку. Если найдены Указатели на функции-члены и самые быстрые из возможных делегатов C ++ , чтобы дать очень хорошее введение в указатели на функции и указатели на функции-члены.
РЕДАКТИРОВАТЬ
Все заработало, изменил библиотеку SimpleTimer, чтобы использовать эту систему делегирования: http://www.codeproject.com/KB/cpp/FastDelegate.aspx
Он очень хорошо интегрирован, и было бы неплохо иметь такую стандартную систему делегирования в библиотеке Arduino.
Код как в тесте (рабочий)
typedef
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