ладно, пусть будут сиськи. если вдруг появиться delay в одной сиське, то остальные сиськи будут ждать, или работать дальше
Конечно ждать! AVR - не многозадачный камень, по архитектуре, просто поверь. Можно писать параллельные потоки, только не новичку.
Мы - просто веселимся. Тема про Треды в Ардуинке уже обглодана и переварена и ... ну сами понимаете.... И все это уже не один раз.
Кроме истерического смеха больше ничего не вызывает.
Для каждой задачи есть свой способ сделать псевдопараллельность. Чаще всего - проще поменять голову программисту и обойтись без нее. Где-то, что-то повесить на прерывания, где-то, что-то разнести по состояниям автомата.
Но никогда не получится писать для AVR, как для Винды или Линукса.
слава тебе господи нашелся разумный человек. я собираю проект в котором очень много переменных и многофункциональный. для легкости его усовершенствования я приметил такой вариант, чтобы каждая функция лежала на своей полке
где в этом примеере несколько loop? Я вижу один. Номера строк укажите пожалуйста.
я не мог найти такое приминение лоора, у меня в голове запомнилось, но я еще туда не вникал, а когда пригодилось, я не могу его правильно в гугл ввести, чтобы изучить(и гугл переводит на ломанном)
благодаря вам я примерно понял принцип работы, но тестить я сегодня не буду. на завтра собираю информацию
Но оно работает, просто не понятно что там делает этот loop().
Может кто-то может объяснить?
loop() делает следующее:
void loop()
{
if (!flag)
{
digitalWrite (4, HIGH);
delay(5);
if (checkStatus())
setAlarm();
delay (10);
digitalWrite (4, LOW);
delay (5);
if (!checkStatys())
setAlarm ();
delay(10);
}
}
А зачекм он это делает - нужно либо спрашивать у автора кода, либо смотреть по схеме.
PS. Вообще-то дурной тон - размещать исходник без комментариев и без указания его предназначения. Откуда мы можем знать, например, что подключено к 4 пину?
Я не знаю, что Вы понимаете под словом "работает", т.к. Вы не удосужились объяснить что именно она делает (должна делать).
Shinsei пишет:
не понятно что там делает этот loop().
Рекурсивно вызывается.
Shinsei пишет:
Может кто-то может объяснить?
Вам уже объяснили, что это типичный говнокод. Разбираться в нём, т.е. ковыряться в дерьме, мне лично удовольствия не доставляет. Для чего Вам нужно знать как оно работает? Хотите научиться таким приёмам? Не стоит - говнокод, он говнокод и есть.
Вам же написали - это говнокод. То есть, плохо продуманный алгоритм и его кривая реализация. Возможно из-за того, что автор кода плохо знает программирование. Код надо писать так, чтобы не приходилось вручную вызывать loop().
Получается можно loop() вызывать несколько раз в программе?
Любую функцию можно вызывать сколько угодно раз. Они для этого и придуманы.
Shinsei пишет:
для чего такой огород возводить?
Блин, Вы знаете старый добрый анекдот: спрашивает лорд дворецкого:
- Что, за шум на улице?
- Гей-парад, сэр.
- А чего им надо?
- Борются за свои права, сэр!
- А что их права кто-то ущемляет?
- Нет, сэр.
- А чего ж они шумят?
- Пид@расы, сэр!
Так и Ваш вопрос. Я же много раз Вам отвечал: Говнокод, сэр!
Слово "говнокод" не раскрывает и не объясняет причину, а больше указывает на то что или не знают сути, но не хотят признать или не до конца сами в этом понимают, но опять не хотят в этом признаться. Как работают функции, для чего они нужны и т.д. и так все знают, вопрос был в другом.
В С тоже всего одна функция main, но есть программы в которых их больше 13 штук, а нормально объяснить как это работает единицы, за то много тех кто пишет "говнокод", но при этом сами не могут понять работы программы.
Да, мы (по крайней мере я лично) не можем разобраться в работе этой программы из-за отсутсвия мозгов, понимания и знаний, а также из-за нежелания ковыряться в чужих какашках - расслабьтесь уже.
Это даже не говнокод. Это просто неработающий пример непойми чего. И зачем там вызывается loop() внутри функции не известно, как и неизвестно то какой дебил это писал.. замечание что этот код работает (пост№63) - ВРАНЬЕ.
int flag=0;
void setup()
{
pinMode(4, OUTPUT);
pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
}
int checkStatus()
{
if (analogRead(0)<25)
{
digitalWrite(13,HIGH);
return 1;
}else{
digitalWrite(13,LOW);
return 0;
}
} // ТУТ была пропущена скобка!!! код - нерабочий "в принципе".
void setAlarm()
{
digitalWrite(2, HIGH);
loop();
}
void loop()
{
digitalWrite (4, HIGH);
delay(5);
if( checkStatus() ) setAlarm();
delay (10);
digitalWrite (4, LOW);
delay (5);
if( !checkStatys() ) setAlarm (); // Описка, checkStatys() вместо checkStatus()
delay(10);
}
} // ЭТА СКОБКА - ЛИШНЯЯ..
Да, кстати, переменная flag не изменяется и соответственно - редуцирована. Как и её проверка.
Да даже если исправить все явные ошибки - пример НЕ работающий. Почему об этом сразу никто не сказал?
Там же идет косвенный рекурсивный вызов loop() через функцию, которая вызывается В ЛЮБОМ случае из самого loop() ! Оно будет работать (после устранения огрехов) ровно пока стек не засрет всю оперативу, которой не так уж и много..
Потому, что ТС упорно не говорит что она должна делать. В этой ситуации нельзя говорить, что код нерабоачий, т.к. нет критерия "рабочести".
Вот Вы написали (сам я код не смотрел, просто с Ваших слов)
Arhat109-2 пишет:
Оно будет работать (после устранения огрехов) ровно пока стек не засрет всю оперативу, которой не так уж и много..
Стоит Вам сказать. что оно не работает, как Вам ответят: назначение этой программы работать пока стек не засрёт, а потом уйти в ребут и начать сначала, так что всё работает отлично! И попробуйте доказать, что опонент не прав :)
Этот вариант не стыкуется с вопросом ТС-а "нафига там вызывается loop() внутри функции" .. не может быть назначением ТО, о чем НЕ ЗНАЕТ афтар.. не верю! ;)
То есть, вместо того чтобы поковыряться и дать челу внятный ответ, пишем "чё попало" авось прокатит .. так? :)
В посте 64 я написал: "Для чего Вам нужно знать как оно работает? Хотите научиться таким приёмам? Не стоит". Считаю это наиболее внятным ответом. Более внятный ... ну. разве что Вы дадите :))))
К стому же, на вопрос "что там делает loop?" был дан точный ответ в том же посте - "рекурсивно вызывается". Вы не согласны с этим ответом? Так что если бы ТС действительно хотел разобраться, он бы уже нагуглил что это означает. Но, ТС, похоже, разбираться не очень хотел. Его дело и его право.
Про прием, когда из первой функции вызывается вторая, а из второй снова первая - как Arhat109-2 написал уже это косвенная рекурсия. Иногда сильно облегчает жизнь, обычно когда часть задачи решается так же как и вся задача целиком. Например найти файл в диске с подкаталогами - перебираем каталог, наткнулись на подкаталог, вызвали функцию которая вошла в него, а она снова вызвала функцию перебора каталога. Новичкам и любителям использовать не рекемендуется, сложновато.
Про loop - самая обычная функция, можете вызывать её как и любые другие сколько угодно, понимая что делаете. Но кроме Вас её еще и система вызывет сама в вечном цикле.
Про код найденый в инете - половина всего находимого как раз такого уровня как в примере. Не заслужывает даже времени на прочтение. И процентов 5-10 будет действительно стоящим. Ищите дальше, самому писать не надо ;)
ПС. Еще пример рекурсии - в лопе опрашиваем кнопки и датчики, один из датчиков требует паузу в 750мсек. В функции опроса этого датчик делаем цикл ожидания на милисе и из него вызываем лоп, чтоб не пропускать нажатие кнопок. Такая архитектура - не очень, но с пивом покатит в коде на заказ, за деньги, к которому больше никогда в жизни не прикасатся )))
ладно, пусть будут сиськи. если вдруг появиться delay в одной сиське, то остальные сиськи будут ждать, или работать дальше
ну, и где там три лупа, если один?
теперь будем думать кто такой лавров))))
это я вот только нашел, до этого я с такой методикой не сталкиваося. просто помню пару скетчей в котором пару циклов, запараллеленных в лооре
ладно, пусть будут сиськи. если вдруг появиться delay в одной сиське, то остальные сиськи будут ждать, или работать дальше
Конечно ждать! AVR - не многозадачный камень, по архитектуре, просто поверь. Можно писать параллельные потоки, только не новичку.
Мы - просто веселимся. Тема про Треды в Ардуинке уже обглодана и переварена и ... ну сами понимаете.... И все это уже не один раз.
Кроме истерического смеха больше ничего не вызывает.
Для каждой задачи есть свой способ сделать псевдопараллельность. Чаще всего - проще поменять голову программисту и обойтись без нее. Где-то, что-то повесить на прерывания, где-то, что-то разнести по состояниям автомата.
Но никогда не получится писать для AVR, как для Винды или Линукса.
слава тебе господи нашелся разумный человек. я собираю проект в котором очень много переменных и многофункциональный. для легкости его усовершенствования я приметил такой вариант, чтобы каждая функция лежала на своей полке
вот наконец то пример нашел-
где в этом примеере несколько loop? Я вижу один. Номера строк укажите пожалуйста.
вот наконец то пример нашел-
где в этом примеере несколько loop? Я вижу один. Номера строк укажите пожалуйста.
я не мог найти такое приминение лоора, у меня в голове запомнилось, но я еще туда не вникал, а когда пригодилось, я не могу его правильно в гугл ввести, чтобы изучить(и гугл переводит на ломанном)
благодаря вам я примерно понял принцип работы, но тестить я сегодня не буду. на завтра собираю информацию
Это функция из программы, что в ней делает loop и зачем он в ней?
Void setAlarm()
{
digitalWrite(2, HIGH);
flag=0;
loop();
}
Это функция из программы, что в ней делает loop и зачем он в ней?
Void setAlarm()
{
digitalWrite(2, HIGH);
flag=0;
loop();
}
Для ответа на Ваш вопрос нужен либо полный текст программы, либо хрустальный шар (второе предпочтительнее).
Shinsei, забейте, это просто черезжопное программирование.
Но оно работает, просто не понятно что там делает этот loop().
Может кто-то может объяснить?
Но оно работает, просто не понятно что там делает этот loop().
Может кто-то может объяснить?
loop() делает следующее:
А зачекм он это делает - нужно либо спрашивать у автора кода, либо смотреть по схеме.
PS. Вообще-то дурной тон - размещать исходник без комментариев и без указания его предназначения. Откуда мы можем знать, например, что подключено к 4 пину?
Но оно работает
не понятно что там делает этот loop().
Рекурсивно вызывается.
Может кто-то может объяснить?
Получается можно loop() вызывать несколько раз в программе?
Andriano Вы не тот loop() смотрите. Интересует loop() в функции setAlarm().
Получается можно loop() вызывать несколько раз в программе?
Andriano Вы не тот loop() смотрите. Интересует loop() в функции setAlarm().
ага - ровно два раза void loop() {loop();}
Получается можно loop() вызывать несколько раз в программе?
Можно, но не нужно. Arduino IDE сама по кругу бесконечно гоняет функцию loop(). Поэтому она так и называется.
Andriano Вы не тот loop() смотрите. Интересует loop() в функции setAlarm().
Это один и тот же loop(). Точнее в строке 27 - это собственно объявленная функция, а в строке 24 - вызов этой функции (код из поста #60).
Читайте про функции, их объявления и вызов из разных кусков программы.
Jeka_M, а для чего такой огород возводить?
Да, и спасибо за ответ.
Jeka_M, а для чего такой огород возводить?
Вам же написали - это говнокод. То есть, плохо продуманный алгоритм и его кривая реализация. Возможно из-за того, что автор кода плохо знает программирование. Код надо писать так, чтобы не приходилось вручную вызывать loop().
Получается можно loop() вызывать несколько раз в программе?
Любую функцию можно вызывать сколько угодно раз. Они для этого и придуманы.
для чего такой огород возводить?
Блин, Вы знаете старый добрый анекдот: спрашивает лорд дворецкого:
- Что, за шум на улице?
- Гей-парад, сэр.
- А чего им надо?
- Борются за свои права, сэр!
- А что их права кто-то ущемляет?
- Нет, сэр.
- А чего ж они шумят?
- Пид@расы, сэр!
Так и Ваш вопрос. Я же много раз Вам отвечал: Говнокод, сэр!
Слово "говнокод" не раскрывает и не объясняет причину, а больше указывает на то что или не знают сути, но не хотят признать или не до конца сами в этом понимают, но опять не хотят в этом признаться. Как работают функции, для чего они нужны и т.д. и так все знают, вопрос был в другом.
В С тоже всего одна функция main, но есть программы в которых их больше 13 штук, а нормально объяснить как это работает единицы, за то много тех кто пишет "говнокод", но при этом сами не могут понять работы программы.
Вопрос был же не в том плохой код или нет
Да, мы (по крайней мере я лично) не можем разобраться в работе этой программы из-за отсутсвия мозгов, понимания и знаний, а также из-за нежелания ковыряться в чужих какашках - расслабьтесь уже.
Классный ответ, особенно с матом.
Прошу прощения, форумом ошибся, думал есть кто может оказать оказалось, что больше "гопоты" чем спецов.
извините, что побеспокоил такие умы
Да, ничего, не стоит извинений, заходите ещё.
Это даже не говнокод. Это просто неработающий пример непойми чего. И зачем там вызывается loop() внутри функции не известно, как и неизвестно то какой дебил это писал.. замечание что этот код работает (пост№63) - ВРАНЬЕ.
Да, кстати, переменная flag не изменяется и соответственно - редуцирована. Как и её проверка.
Там ещё и несуществующая функция checkStatys().
Да даже если исправить все явные ошибки - пример НЕ работающий. Почему об этом сразу никто не сказал?
Там же идет косвенный рекурсивный вызов loop() через функцию, которая вызывается В ЛЮБОМ случае из самого loop() ! Оно будет работать (после устранения огрехов) ровно пока стек не засрет всю оперативу, которой не так уж и много..
Почему об этом сразу никто не сказал?
Потому, что ТС упорно не говорит что она должна делать. В этой ситуации нельзя говорить, что код нерабоачий, т.к. нет критерия "рабочести".
Вот Вы написали (сам я код не смотрел, просто с Ваших слов)
Оно будет работать (после устранения огрехов) ровно пока стек не засрет всю оперативу, которой не так уж и много..
Стоит Вам сказать. что оно не работает, как Вам ответят: назначение этой программы работать пока стек не засрёт, а потом уйти в ребут и начать сначала, так что всё работает отлично! И попробуйте доказать, что опонент не прав :)
Этот вариант не стыкуется с вопросом ТС-а "нафига там вызывается loop() внутри функции" .. не может быть назначением ТО, о чем НЕ ЗНАЕТ афтар.. не верю! ;)
Да даже если исправить все явные ошибки - пример НЕ работающий. Почему об этом сразу никто не сказал?
Элементарно, Ватсон!
Потому, что никому не хочется ковыряться в дерьме.
То есть, вместо того чтобы поковыряться и дать челу внятный ответ, пишем "чё попало" авось прокатит .. так? :)
Нет, пишем: "я в этом ковыряться не буду и тебе не советую".
То есть, вместо того чтобы поковыряться и дать челу внятный ответ, пишем "чё попало" авось прокатит .. так? :)
В посте 64 я написал: "Для чего Вам нужно знать как оно работает? Хотите научиться таким приёмам? Не стоит". Считаю это наиболее внятным ответом. Более внятный ... ну. разве что Вы дадите :))))
К стому же, на вопрос "что там делает loop?" был дан точный ответ в том же посте - "рекурсивно вызывается". Вы не согласны с этим ответом? Так что если бы ТС действительно хотел разобраться, он бы уже нагуглил что это означает. Но, ТС, похоже, разбираться не очень хотел. Его дело и его право.
Про код - КГ/АМ. Там нечего обсуждать.
Про прием, когда из первой функции вызывается вторая, а из второй снова первая - как Arhat109-2 написал уже это косвенная рекурсия. Иногда сильно облегчает жизнь, обычно когда часть задачи решается так же как и вся задача целиком. Например найти файл в диске с подкаталогами - перебираем каталог, наткнулись на подкаталог, вызвали функцию которая вошла в него, а она снова вызвала функцию перебора каталога. Новичкам и любителям использовать не рекемендуется, сложновато.
Про loop - самая обычная функция, можете вызывать её как и любые другие сколько угодно, понимая что делаете. Но кроме Вас её еще и система вызывет сама в вечном цикле.
Про код найденый в инете - половина всего находимого как раз такого уровня как в примере. Не заслужывает даже времени на прочтение. И процентов 5-10 будет действительно стоящим. Ищите дальше, самому писать не надо ;)
ПС. Еще пример рекурсии - в лопе опрашиваем кнопки и датчики, один из датчиков требует паузу в 750мсек. В функции опроса этого датчик делаем цикл ожидания на милисе и из него вызываем лоп, чтоб не пропускать нажатие кнопок. Такая архитектура - не очень, но с пивом покатит в коде на заказ, за деньги, к которому больше никогда в жизни не прикасатся )))