Всегда ли delay () - признак дурного вкуса?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Вопрос чисто академический. Понятно, что использования delay () следует избегать: останавливает выполнение скетча. Но является ли вообще его применение признаком недостаточной образованности программиста (типа "дурной тон" и "правильные пацаны" использовать delay () не должны)? В качестве примера: в своем скетче счел нужным перед выполнением программы проводить кратковременое включение периферии с целью теста ее готовности и исправности (моторы, калпана, индикаторы...). Сунул это все в сетап (все равно проверка выполняется один раз), интервалы между проверками устройств определил посредством delay (). Не сойду ли за лоха (пардон за сквернословие) с этим delay ()?  Хотя, если честно, не знаю ему альтернативы в однократно исполняемом блоке.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Давайте уже без преувеличений ... Так и до маразма не далеко ...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Стоит ли бояться человека с delay()?   ;))))))

После того, как ты понял, чему и когда мешает делей, а написал ты всё верно, не надо доходить до маразма, это верно замечено постом выше! Не мешает - используй на здоровье!

sadman41
Offline
Зарегистрирован: 19.10.2016

А чем девайс будет заниматься, если вместо дилэя будет что-то неблокирующий?

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
А чем девайс будет заниматься, если вместо дилэя будет что-то неблокирующий?

бесконечно проверять

1if (millis() - prev_millis > interval)

 

nik182
Offline
Зарегистрирован: 04.05.2015

Или спать, если уложишь.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Да используй , если код позволяет, нормальная практика.
Главное без фанатизма.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sonologist пишет:

Всегда ли delay () - признак дурного вкуса?

Нет.

А вот проверка "говнокод или нет?" путём контекстного поиска delay (goto, или любого другого контекста) - всегда признак отсутствия мозгов.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

ЕвгенийП пишет:

Нет.

А вот проверка "говнокод или нет?" путём контекстного поиска delay (goto, или любого другого контекста) - всегда признак отсутствия мозгов.

Я уже понял, что не всегда (спасибо соконфетникам). Делэи и гото в лупе и функциях не применяю (расту же в программировании!). А вот в сетапе после всех объявлений и инициаций однократную проверку периферии сделал с интервалами, определяемыми делэем. Ну, и зачесалось.... :) Кстати, так и не понял, чем в сетапе паузу можно организовать кроме делэя? Миллис, вроде требует зацикливания программы, не пойдеть. А что еще?.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Sonologist пишет:

Миллис, вроде требует зацикливания программы

нет, не требует, но смысла не имеет.

Если подразумевается, что инициализация чего либо потребуется в будущем и не один раз, например полностью сбросить модем и заново инициализировать, то все эти инициализации делать так же в loop, добавить некую переменную в программу - т е сначала шаги инициализации, потом основная работа.

типа так

1byte modem_step = 100; // current work mode mode in table of command
2// static steps:
3// 100 - delay 30 sec for registration modem in net
4// 101 - not wait response, wait incomming call or other commands

 

negavoid2
negavoid2 аватар
Offline
Зарегистрирован: 06.05.2020

Функция delay() - это то же самое зацикливание программы на определённое время, с единственной проверкой, на микросекунды.

https://github.com/arduino/ArduinoCore-samd/blob/master/cores/arduino/delay.c#L64

-NMi-
Offline
Зарегистрирован: 20.08.2018

Када буите апсуждать макаронный, спагетти и кенгуру --- код ???

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

-NMi- пишет:

Када буите апсуждать макаронный ... код ???

Для пастафарианцев это богохульство! Негоже коду уподобляться Божеству!

vlad072
Offline
Зарегистрирован: 01.08.2017

Setup() всё стерпит ИМХО

inspiritus
Offline
Зарегистрирован: 17.12.2012

Каждый строчит как хочет. 
присоединюсь к #3 комменту, если есть что делать, то делай вреден, а, если просто блинк и ничего кроме блинка, то полезен, ибо позволяет экономить время и моск.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Друзья, чтобы не заводит новую тему - вопрос более обширный, но и довольно конкретный. Сообщество уже давно знает, что я новичок (порой, туповатый). Постепенно обучаюсь (медленно, блин...). А размеры скетчей растут и растут. Уже, иной раз самому в них разбираться, быстро находить нужное и т.д. стало если не проблемой, то некоей сложностью. Попрошу вот о чем: дайте ссылочку, что надо прочитать относительно общих правил правильной организации скетча (оптимальная последовательность операций, что следует заносить в циклы, что - в отдельные фукнции и т.д.). Большую часть я "умственно" уже понимаю. Но хотелось бы устаканить всё это в мозгах.  Понимаю,  что подобного рода информации вагон, только гугли. Однако, сразу оценить полезность и понятность информации трудно. А прочесть всё - жизни не хватит. Поэтому, большая просьба в первую очередь подсказать источники, предназначенные для идиётов - все-таки, пока я еще не силен в программировании. Заранее спасибо!

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Не претендую на истину, но вроде вот так:

https://habr.com/ru/post/280764/

https://www.cyberforum.ru/cpp-beginners/thread2518182.html

https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

andycat пишет:

Не претендую на истину, но вроде вот так

Спасибо, вечером дома посмотрю: на работе чортова платформа все три адреса объявляет как недоступные.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Там про разбиение на файлы. Я так понимаю что ТС сейчас о другом спрашивает...

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Komandir пишет:

Там про разбиение на файлы. Я так понимаю что ТС сейчас о другом спрашивает...

Если там про это, то я действительно вопрошаю о другом. У АлексГивера выудил насчет применения нужного типа перемнных, констант и прочего. Но этого маловато: многому по этим крохам меня уже тут научили. Я как раз про оптимизацимю структуры кода спрашивал. Чорт, знаний не хватает даже для того, чтобы грамотно задать вопрос :(

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Гивер и типы переменных это несочетаемая окрошка.
Для него в порядке вещей int'ом миллисы ловить

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Сначала надо на ватмане квадратиками и связями между ними нарисовать АЛГОРИТМ.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Kakmyc пишет:

Для него в порядке вещей int'ом миллисы ловить

Да, про это я тоже читал. Но я про разумную достаточность при использовании разных типов переменных. Собственно, в этом сам Гивер и его особенности ни при чем.

sadman41
Offline
Зарегистрирован: 19.10.2016

Собственно об этом давно написано в атмеловских аппнотах, которые лежат переведенным на microsin-e. А гивер - это фотокопия фотокопии фотокопии.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Komandir пишет:

Сначала надо на ватмане квадратиками и связями между ними нарисовать АЛГОРИТМ.

Так и делаю (это уже давно, начиная с программирования на ВижуалБэйсик). Даже в Сплане понаписал в библиотеку фрагменты, чтоб их как кубики раскладывать.

Logik
Offline
Зарегистрирован: 05.08.2014

Kakmyc пишет:
Для него в порядке вещей int'ом миллисы ловить

А че не так? Наверно переполнения ;)

Умеючи и байтом ловятся )))

 

Logik
Offline
Зарегистрирован: 05.08.2014

Sonologist пишет:

Сунул это все в сетап (все равно проверка выполняется один раз), интервалы между проверками устройств определил посредством delay (). Не сойду ли за лоха (пардон за сквернословие) с этим delay ()?  

Нет, не сойдете. Но как только захотите сделать выход из процесса этих проверок по нажатию кнопки, то взгляд на delay () в сетапе несколько пересмотрите ;) А прекращение проверок таки захочется сделать. Зачем что проверять при очередном ребуте если и так уже проверено? Если же просто свет моргнет, ребутнется, то эти проверки еще и на основной процесс могут негативно повлиять.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Logik пишет:

Нет, не сойдете. Но как только захотите сделать выход из процесса этих проверок по нажатию кнопки, то взгляд на delay () в сетапе несколько пересмотрите ;) А прекращение проверок таки захочется сделать. Зачем что проверять при очередном ребуте если и так уже проверено? Если же просто свет моргнет, ребутнется, то эти проверки еще и на основной процесс могут негативно повлиять.

Я все это учитываю. Проверка примитивная, занимает 3 секунды, так что, выходить из нее принудительно на практике нет нужды. Более того, я сдуру (спижонил) сделал проверку последовательно, хотя все устройства и индикацию можно с тем же успехом тестировать одновременно, что ее еще более укоротит. Свет не моргнет :) На такой случай питаю управление от БП+аккумулятор (накушался этих "радостей" на даче). Понятное дело, высоковольтная часть "моргнет", но страшного ничего не произойдет, а перенастраивать ардуину уже не надо.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Sonologist пишет:

Свет не моргнет

ну да, молния не пролетит, помеха не прискачет, мышь кабель не съест, аккумулятор не сдохнет, транзистор в ИБП не взорвется.....

P.S. Я тоже наивным был лет десять назад, когда в деревню купил дорогущий стабилизатор на котел, типа отечественного производства, но из китайских деталей.....такая помеха прилетела в один прекрасный момент, что ничего не помогло. Понравился ответ поддержки производителя стабилизаторов Штиль: "вероятно внешний импульс был коротким по длительности и высоким по мощности, не соответствующий тех.характеристикам стабилизатора".

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

разрядники нада ставить перед тонко организованной душевно китайской техникой. 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

DetSimen пишет:

разрядники нада ставить перед тонко организованной душевно китайской техникой. 

теперь то много что стоит перед котлом......это выходит дешевле чем плату управляющую менять.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andycat пишет:

теперь то много что стоит 

Так опыт и приходит...

SLKH
Offline
Зарегистрирован: 17.08.2015

Komandir пишет:

Сначала надо на ватмане квадратиками и связями между ними нарисовать АЛГОРИТМ.

и ромбиками.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

и стрелочками

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andycat пишет:

DetSimen пишет:

разрядники нада ставить перед тонко организованной душевно китайской техникой. 

теперь то много что стоит перед котлом......это выходит дешевле чем плату управляющую менять.

В своё время выкинул настенник со всей этой постоянно проблемной хероборой, поставил напольник, насос, и - ляпота. Никаких геморов с помехами, там фактически ломаться-то и нечему, чистая механика.

Щас как вспомню все эти судороги - то с платой управления, то с пультом, то теплообменник потёк, то клапану захудало - так вздрогну. Чур меня больше электронных котлов - я лучше за эти деньги куплю несколько напольников про запас, и буду менять их, если вдруг. Думаю, жизни на три хватит, учитывая цены всяких раскрученных брендов.

Конечно, всё имхо, но по мне чем проще и надёжней система отопления и ГВС - тем лучше. И ардуина там (в тематику форума) - вот уж точно не нужна.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

DIYMan пишет:

В своё время выкинул настенник со всей этой постоянно проблемной хероборой, поставил напольник, насос, и - ляпота. Никаких геморов с помехами, там фактически ломаться-то и нечему, чистая механика.

А чё за настенник? У меня Висман-100 стоит уже лет 10-11 (может, и чуть больше). В первые годы его эксплуатации чего только в сети не случалось. Напряжение и отрубалось и возрастало до 270-280 вольт. Молоньей не шарахало, чего не было - того не было.При проблемах (очень низкое или очень высокое напряжение или отключат газ) котел уходил в спячку, по возврату напруги и газа  - снова включался. 333 раза тьфу На всякий случай  питаю через примитивный стабилизатор Ресанта (похоже, он - чистая бутафория, но для успокоения нерьвов...). Единственая поломка - перестал работать трехходовой кран. Гарантийный случай. Заменили за 10 минут без ворчания и заморочек (даже удивился на газовиков).  Других проблем нет. 3333 раза тьфу!

konachan
Offline
Зарегистрирован: 20.07.2020

Goto - признак криворукости. Использовать можно только в одном случае - когда критично закрыть общий ресурс или освободить память при сбое. Тогда или дерево if () будет, или goto в конец функции, за основной return. Получается некий аналог try{} catch(){} из жавы.

Задержки - абсолютная норма. Даже в циклах. Другой вопрос, что использование зависит от контекста, и там, где событие можно поймать через прерывание, лучше оное и использовать. Прерывание ставит флаг - в главном цикле этот флаг проверяется и при поднятии происходит обработка/сброс. Там, где можно решить через опрос регистра, тоже самое. А вот если пилим ногодрыг - там задержки норм, ибо без вариантов. Или если идет обращение к железу, у которого есть константная задержка выполнения. Короче, тут головой думать надо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

konachan пишет:

Goto - признак криворукости. 

Значит, Кнут - криворукий, так и запишем :-)

konachan пишет:

аналог try{} catch(){} из жавы.

Скорее уж из С++. В яве try{} catch(){} немного отличается.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

Значит, Кнут - криворукий, так и запишем :-)

Кнут, он по тем временам мыслил Фортрановскими категориями, а там goto один из основных апираторов, как в Васике.  

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

konachan пишет:

Goto - признак криворукости. 

Чо здесь криворукого? 

 

konachan
Offline
Зарегистрирован: 20.07.2020

>> Чо здесь криворукого?

Я же написал про этот случай как исключение. Но некоторые лепят GOTO внутри суперфункции на тысячу строк как оператор вызова подфункций или ветвления - вот это действительно зло и лапша.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

konachan пишет:

Я же написал про этот случай как исключение. 

А я к тому, что из любой конструкции языка можно сделать зло и лапшу, а можно применять наглядно и правильно.  На то нам образование дадено, чтоб отличать одно от другова. 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

konachan пишет:

Goto - признак криворукости. 

Чо здесь криворукого? 

 

насчет криворукости не берусь судить, но я бы это написал без goto.

Меня учили, что goto - зло безусловное и что нет таких ситуаций, где его нужно применять. Я и не применяю.... за все годы ни в одной моей программе нет ни одного goto и меток, за исключением switch - case :)

но я никому ничего не навязываю :)))

konachan
Offline
Зарегистрирован: 20.07.2020

При обучении новичка вполне допустимо некоторые вещи демонизировать, чтобы избежать злоупотребления. Вырастет в профессии - поймет, что нет ничего абсолютно хорошего или абсолютно плохого, есть лишь границы применимости. Но если дать ему молоток и отвертку сразу, то шурупы он с большой вероятностью будет заколачивать - это проще и быстре, да и держится вроде.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Кнут, он по тем временам мыслил 

Ну, почему? Примеры в той его знаменитой статье вполне себе на Паскале.

Ему принадлежит знаменитая фраза: "И чего они прицепились к этому goto? Может потому, что слово четырёхбуквенное?".

Гриша
Offline
Зарегистрирован: 27.04.2014

Знакомый рассказывал, как один его товарищ написал программу ООП использую gotu и перекрестные . Убил год... А после этого потребовалась ее доработка и модификация - оказалась проще написать новую программу, чем переделать якобы базовую... 

удобство в малом привело к бездарно загубленному году работы...  

nik182
Offline
Зарегистрирован: 04.05.2015

Что то я не понял. Залезем в ассемблер, там goto или jmp по другому постоянно встречается. Все if case while и прочие ветвления через goto, вернее jmp реализуются. А си goto нельзя? Криворукость?

Logik
Offline
Зарегистрирован: 05.08.2014

DetSimen пишет:

konachan пишет:

Goto - признак криворукости. 

Чо здесь криворукого? 

Почти все что по теме . Не порадовал ты, дед.

Сравнивай.

 

01int AM2320::internalReadErr(void)  {
02    uint8_t data[DEV_MEMORY_SIZE];
03 
04    if (!WakeUpDevice(FDevAddress)) return err_i2c_DeviceNotFound;
05 
06    Wire.beginTransmission(FDevAddress);
07    Wire.write(CMD_READ);
08    Wire.write(0x00);
09    Wire.write(0x04);
10    if (Wire.endTransmission() > 0) return err_i2c_ReadError;
11 
12    Wire.requestFrom(FDevAddress, DEV_MEMORY_SIZE);
13    if (Wire.readBytes(data, DEV_MEMORY_SIZE) != DEV_MEMORY_SIZE) return err_i2c_ReadError;
14     
15    if (!CheckCRC(data,DEV_MEMORY_SIZE-2)) return  err_i2c_CRCError;
16 
17    Check(data);
18 
19    return 0;
20 
21 
22}
23 
24void AM2320::internalRead(void) override {
25    int     error;
26    error= internalReadErr(void);
27    if (error == err_i2c_CRCError) {
28        PostMessage(msg_Error, error);
29    }
30    else {
31        Error(error);
32    }
33}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Logic, ничего не имею против твоей интерпретации.

Я писал к тому, что каждый инструмент нужно применять по-разному, в зав-ти от ситуации.  Мой вариант проще, твой - по научному. Ну так я и не спец, мне бы как пропроще и чтоб не сильно "лапшить" код. Функция в один экран влезает - и щастье. :) 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

Ну, почему? Примеры в той его знаменитой статье вполне себе на Паскале.

Cтатью читал в 1990м. Сделал для себя вывод, что можно и на Паскале как на Фортране писать.  :-)

Мои первые программы на Паскале были так и написаны, с goto, ибо привык. :-)   Потом разглядел прелести языка, отошел. 

Ну так я всегда и говорил, я игрушечный программист, без спицального образования, самоучка.  Если чему-то и научился, то тока случайно. :-)  Про С++ никада раньше не слышал, кропал авнакод на Дельфи. :-)

konachan
Offline
Зарегистрирован: 20.07.2020

nik182 пишет:
Что то я не понял. Залезем в ассемблер, там goto или jmp по другому постоянно встречается. Все if case while и прочие ветвления через goto, вернее jmp реализуются. А си goto нельзя? Криворукость?

Асм это чуть другая тема. Во-первых, на нем сейчас пишут только критичные участки, либо участки с DSP-инструкциями, о которых компиляторы обычно не знают. Ну еще в реверсинге используют. То есть используют люди с большим опытом кодинга как такового. Если на нем кто-то пишет простой системный код, то это обычно либо поехавший кукухой перфекционист, не доверяющий компилятору, либо столетний динозавр, привыкший так делать во времена каменных топоров.  Во-вторых, не комментированные простыни асма читаются как... ну ты понел. Никак не читаются, их чтением врагов пытать можно.

Теперь к вопросу goto. Люди на goto реализуют циклы, ветвления, функции... Получается write-only лапша, читать которую невозможно без кровавых слез и матов в адрес аффтара.