Я застрял. Я пытаюсь создать функцию, которая будет использовать бесклассовые указатели функций и объекты из объектов. Вот мой текущий код, который, надеюсь, объясняет больше.
(Он должен работать на Arduino, поэтому я не могу использовать большие библиотеки.)
Во-первых, я использую эту библиотеку для Arduino:
/* SimpleTimer - A timer library for Arduino.
* Author: [email protected]
* 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. Этот класс должен иметь ссылку на объект, который содержит мою функцию "halt", правильно? Таким образом, перегрузка функции привязки к чему-то, что принимает мой объект, и моя функция как два отдельных указателя, будут работать...? Я думаю, что получаю это от этого, но я еще не с головой.
ИЗМЕНИТЬ
Я не знаю, кто пришел с этим снова, но кто-нибудь нашел эту нить. Если найдено указатели на функции и самые быстрые делегаты С++, вы получите очень хорошее введение в указатели функций и указатели функций-членов.
ИЗМЕНИТЬ
Сработал, изменил библиотеку SimpleTimer, чтобы использовать эту систему Delegate: 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 в консоли.
Следующий шаг, помещая его в массив, не видит там много проблем. Спасибо всем, я не могу поверить тому, чему научился через два дня.
Какой запах? Это запах...? Успех!
Для заинтересованных пользователей используемая система Delegate не связана с проблемами емкости памяти: С 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