Выход из функций. Как не ждать ее завершения?
- Войдите на сайт для отправки комментариев
Пнд, 23/11/2015 - 09:57
Всем привет. Есть лед куб. На ардуино установлен фоторезистор. Программно сделал так, что при отключении света куб включается, а при в ключении света в комнате он отключается.
Почти все работет. Но если я включаю свет куб отключится тогда когда пройдут все его световые эффекта.
Эффекты - список функций, а функции состоят из циклов. Помогите пожалуйста как внезапно прервать выполнение функций. Спасибо заранее.
Выход из функции - оператор return.
Но правильно - построить логику так, чтобы функция нормально завершалась по одному из условий. Но это не требования ЯП, а просто правило хорошего стиля.
а кто видел ваш код ?
http://arduino.ru/Reference/Break
я нестал приводить как подключены пины цифровых выходов и аналоговых, описал вкоде суть
я нестал приводить как подключены пины цифровых выходов и аналоговых, описал вкоде суть
Простите, но это не суть, а поток сознания, который даже не компилируется. Вы решили в прятки поиграть? Боитесь, что мы Ваш код украдём? Ну, играйте сами, чего нас-то всех привлекать к этому?
Насчет оператора break читал. Но как же сделать чтоб из общей функции выйти , не присваивая каждому циклу оператор break.
Я сделал функцию runAll() , которая все функции из списка запускает. Вот как внезапно из runALL() выйти недожидаясь исполнения всег функци
Да нет же. сейчас скину, тем более я его из инета скачал. Просто решил что много будет в нем лишнего написано
Я сделал функцию runAll() , ... тем более я его из инета скачал.
Так сделал или скачал?
Теперь по сути.
Коллеги Вам правильно написали, что лучше, чтобы функция завершалась сама по условиям, безо всяких экстренных выходов.
Но если Вам так уж невмоготу сделать экстренный выход из пачки вложенных функций сразу, то Ваша тема функции setjmp/longjmp. Первая устанавливает точку глобального (откуда угодно) перехода, а вторая на эту точку переходит. Объяснений и примеров в сети полно - ройтесь.
Только сразу говорю - это вещь снижающая читабельность и, в конечном итоге, качество кода. Используйте на свой риск. Коллеги Вам тут правильно сказали, лучше не полениться и выписать условия.
Код весь скачал, но немного изменил его в плане написания runAll() - для эктреннего завершения.
За функции setjmp/longjmp спасибо. буду искать.
На счет .......Коллеги Вам тут правильно сказали, лучше не полениться и выписать условия.... Я так понял Вы имели ввиду вписать в каждый цикл "break"?чтобы можно было выходить из любой функции когда она выполняется.
какова длительность самого продолжитльного эффекта?
Допустимо ли выключение куба (при включении света) по завершении текущего эффекта, или обязательно выключение куба "прям сразу" при обнаружении света?
Первое сделать легко - перед запуском любого эффекта проверять флаг (либо мерять освещенность).
Второе сложнее - использовать прерывания (допустим, каждые 100 мс), в которых читать значение фоторезистора. Но так как процесс аналогового чтения занимает около 18000 тактов, то возможны визуальные "подрагивания" во время измерений.
На счет .......Коллеги Вам тут правильно сказали, лучше не полениться и выписать условия.... Я так понял Вы имели ввиду вписать в каждый цикл "break"?чтобы можно было выходить из любой функции когда она выполняется.
Ну, теперь осталось просто в том месте, где программа понимает, что пора выходить, вставить присаивание ShuherValim = true; и всё немедленно вывалится из всех циклов (а те, что ещё не начиналиь, и не начнутся).
Длительность по разному. 10 - 15 секунд. Если ставить break в конкретном цикле то куб выключится. Я на примере в коде пару циклов оставлял и break вписал в них.
http://arduino.ru/Reference/Break
так из функции-же...
Из цикла выходим по break (с присваиванием флага), из функции по return (по анализу флага).
по ретурну не получалось выходить. В ретурне писал if (raw>200) то return(runAll()) . Может это не верно
попробую сделать по глобальному флагу, который вы писали пример
http://arduino.ru/Reference/Return читали ?
Да читал. Я новичок в ардуино . может что не правильно делаю
В общем не компилируется ардуино пишет "fpermissive]"
или даже если пишу return 0 тоже не компилируется
или даже если пишу return 0 тоже не компилируется
Не скомпилируется даже, если написать "return 2" или, страшно сказать, "return 100500".
Вы это делаете в функции loop, которая у Вас void (читайте что это такое).
Только неясно для чего Вам return в loop после runAll - сама-то runAll от этого не прервётся.
А как когда можно выключить исполнение функции оператором return . Я пытаюсь разобраться , читаю разные статьи. Но пока не нашел про ретурн чтобы можно было функцию отключить .
Но ведь в void loop у меня стоит условие которое включает куб при отключении света, не могу понять почему так же в void loop невозможно отключить какую-либо функцию. Про loop знаю - функция выполняется с повторением.
А как когда можно выключить исполнение функции оператором return . Я пытаюсь разобраться , читаю разные статьи. Но пока не нашел про ретурн чтобы можно было функцию отключить .
http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf - От корки до корки! С запуском и разбором всех примеров.
Пока не прочитаете, про свой скетч просто забудьте. Кога же прочитаете и разберёте все примеры - посмеётесь над тем, что Вы писали здесь и над своими нынешними проблемами.
Если будут вопросы по книге - готов проконсультировать. Пишите сюда. Но именно по книге. Консультаций по скетчу до изучения книги от меня больше не будет - нет смысла - Вы просто не понимаете, что Вам говорят из-за недостатка знаний. Пополните их сначала.
ЕвгенийП, за все время хоть кто-нибудь послушался и прочитал?
Буду изучать. Спасибо за наставление
ЕвгенийП, за все время хоть кто-нибудь послушался и прочитал?
Не знаю, за консультациями типа "что писать вместо main и printf" никто не обращался.
Tomasina! Блин! Опять ведь ни хрена не прочитает! :(((((((((
а мы ему пряников не дадим, пока не объяснит как это работает :)
ЕвгенийП, за все время хоть кто-нибудь послушался и прочитал?
Я читаю, правда не быстро)))))
А ежели ознакомиться с "Блин без делай", то всю портянку можно упростить в разы. Но .. это наверное уже "высший пилотаж" :)