Прерывание внутри библиотеки
- Войдите на сайт для отправки комментариев
Втр, 16/02/2016 - 18:04
Вопрос. Я создаю библиотеку "Biblioteka.h".
В Biblioteka.cpp подключаю
#include <CyberLib.h>
создаю:
void Biblioteka::Timer_Action1() { }
В конструкторе
Biblioteka() { StartTimer1(Timer1_action, 1000); }
При компиляции ошибка, т.к. как я понимаю в StartTimer1 передается не "Timer1_action" а "Biblioteka::Timer1_action".
Вот сама ошибка:
"error: cannot convert 'Biblioteka::Timer1_action' from type 'void (Biblioteka::)()' to type 'void (*)()' "
Вопрос собственно вот в чем: как внутри библиотеки использовать прерывания?
С библиотекой TimerOne тоже самое.
а в *.h что пишите?
помоему вы половину не написали того что нужно для библиотеки, или просто не выложили. давайте уж все файлы сюда.
не объявили, передавать передаете аргументы, а принимать не принимаете.
создайте сначала подфункцию. в подфункцию передавали аргументы, возвращили?
разместите вашу подфункцию после главной функции, в арду еде после лупа, посмотрите что скажет компиль.
... и собственно смотрю регистрация свежая... может рано еще библиотеки писать?
а прерывания как и везде...только библиотека с прерываниями не есть гуд. ставите таких две, используя один таймер рвут они мк на части... и думает юзер где же он накосячил, по отдельности в экземплах работает, а в один исходник свалил и мк завис...
Может и рано.. Но так быстрее и удобнее.
Вот собственно фалйлы.
StepIndi.h
StepIndi.cpp
Если использование прерывания вывести в стетч, то все работает. А если в библиотеку, то нет.
Это из CyberLib.h
Это из Cyber.cpp
... и собственно смотрю регистрация свежая... может рано еще библиотеки писать?
До этого как то в гугле все находил. А сейчас такой проблемы что то не встретил ни у кого
Полный текст ошибки
Ну и сам скетч
C:\Program Files (x86)\Arduino\libraries\StepIndi\StepIndi.cpp: In constructor
'StepIndi::StepIndi()'
:
C:\Program Files (x86)\Arduino\libraries\StepIndi\StepIndi.cpp:26:34: error: cannot convert
'StepIndi::Timer1_action'
from type
'void (StepIndi::)()'
to type
'void (*)()'
StartTimer1(Timer1_action, 1000);
Попробуй переопределить тип при вызове: StartTimer1((void*)Timer1_action, 1000);
Ключевое слово - static. У вас функция-член класса - не статическая, поэтому указатель на неё - двойной, т.е. складывается из указателя на экземпляр класса, плюс указателя на функцию. Это грубое объяснение, конечно же, но смысл передаёт.
Функция же StartTimer ждёт в качестве параметра указатель на функцию, не возвращающую ничего, и не имеющую параметров, и подсовывать её просто за вот так вот здрасьте функцию-член класса - не выйдет. Чтобы подсунуть - надо функцию-член класса объявить статической, но тогда будьте готовы к тому, что вызываемый контекст для этой функции станет неизвестен - грубо говоря, вы не сможете понять изнутри функции, для какого экземпляра класса была вызвана эта функция. Если это несущественно, то повторюсь - ключевое слово: static.
Добро пожаловать в мир ООП ;)
Вооот....
Почитав инфу про эти указатели, я понял примерно следующее. Функция StartTimer1 принимает указатель на функцию, а я передаю(вернее смог передать через какое то время) указатель на метод класса(вернее на метод созданого объекта класса StepIndi). А это как оказалось разные типы указателей(указатель на функцию это реальный адрес, а указатель на метод объекта это смещение от какого то адреса)! А чем мне компилятор долго и упорно сообщал(типа не мого преобразовать этот тип). Есть несколько способов передать указатель на метод объекта. Сделать метод статитичным(я так понял что это просто метод класса), но получается что метод используется без объекта и соотвественно все вызываемые внутри метода переменные и функции ни имеют смысла(адресов?). А чем мне компилятор сообщил выдачей порцией в 100500 ошибок. Есть другие методы с использование других функций(переменных), туда сюда присваивать, передавать....Короче я там запутался п...просто. Конкретного способа нету, каждый свое пытается придумать. Я пару попробывал и получил кучу ошибок что внутри Timer_action1 то не видит адресов переменных, то их объявление, то их принаждежность к классу...
Так что если кто задумает это делать, делайте это в главном скетче(как я в итоге и сделал). Хотя жаль что не смог вынести в библиотеку..
Даже если бы Вам удалось как-то обмануть компилятор с типами, работать-то это не может.
Нестатическому методу класса всегда передаётся "скрытый параметр" - this. Какая зараза и с какого перепугу Вам его передаст-то? Так что, как сказал коллега выше, "добро пожаловать в мир ООП".