void loop ()

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

satelit 2 пишет:

ладно, пусть будут сиськи. если вдруг появиться delay в одной сиське, то остальные сиськи будут ждать, или работать дальше

ну, и где там три лупа, если один?

satelit 2
Offline
Зарегистрирован: 04.12.2016

теперь будем думать кто такой лавров))))

 

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

 

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

satelit 2 пишет:

ладно, пусть будут сиськи. если вдруг появиться delay в одной сиське, то остальные сиськи будут ждать, или работать дальше

Конечно ждать! AVR -  не многозадачный камень, по архитектуре, просто поверь. Можно писать параллельные потоки, только не новичку.

Мы - просто веселимся. Тема про Треды в Ардуинке уже обглодана и переварена и ... ну сами понимаете.... И все это уже не один раз.

Кроме истерического смеха больше ничего не вызывает.

Для каждой задачи есть свой способ сделать псевдопараллельность. Чаще всего - проще поменять голову программисту и обойтись без нее. Где-то, что-то повесить на прерывания, где-то, что-то разнести по состояниям автомата.

Но никогда не получится писать для AVR, как для Винды или Линукса.

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

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

satelit 2 пишет:

вот наконец то пример нашел- 

где в этом примеере несколько loop? Я вижу один. Номера строк укажите пожалуйста.

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

satelit 2 пишет:

вот наконец то пример нашел- 

где в этом примеере несколько loop? Я вижу один. Номера строк укажите пожалуйста.

я не мог найти такое приминение лоора, у меня в голове запомнилось, но я еще туда не вникал, а когда пригодилось, я не могу его правильно в гугл ввести, чтобы изучить(и гугл переводит на ломанном)

благодаря вам я примерно понял принцип работы, но тестить я сегодня не буду. на завтра собираю информацию

Shinsei
Offline
Зарегистрирован: 11.06.2016

Это функция из программы, что в ней делает loop и зачем он в ней?

Void setAlarm()

{

digitalWrite(2, HIGH);

flag=0;

loop();

}

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Shinsei пишет:

Это функция из программы, что в ней делает loop и зачем он в ней?

Void setAlarm()

{

digitalWrite(2, HIGH);

flag=0;

loop();

}

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

Shinsei
Offline
Зарегистрирован: 11.06.2016
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()
{
...... Сама эта функция, что я указал выше
}

void loop()
{
if (!flag)
{
 digitalWrite (4, HIGH);
 delay(5);
 if (checkStatus())
     setAlarm();
     delay (10);
     digitalWrite (4, LOW);
     delay (5);
 if (!checkStatys())
      setAlarm ();
     delay(10);
  }
}

 

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

Shinsei, забейте, это просто черезжопное программирование.

Shinsei
Offline
Зарегистрирован: 11.06.2016

Но оно работает, просто не понятно что там делает этот loop().

Может кто-то может объяснить?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Shinsei пишет:

Но оно работает, просто не понятно что там делает этот 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 пину?

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

Shinsei пишет:

Но оно работает

Я не знаю, что Вы понимаете под словом "работает", т.к. Вы не удосужились объяснить что именно она делает (должна делать).

Shinsei пишет:

не понятно что там делает этот loop().

Рекурсивно вызывается.

Shinsei пишет:

Может кто-то может объяснить?

Вам уже объяснили, что это типичный говнокод. Разбираться в нём, т.е. ковыряться в дерьме, мне лично удовольствия не доставляет. Для чего Вам нужно знать как оно работает? Хотите научиться таким приёмам? Не стоит - говнокод, он говнокод и есть.
 

 

Shinsei
Offline
Зарегистрирован: 11.06.2016

Получается можно loop() вызывать несколько раз в программе?

Andriano Вы не тот loop() смотрите. Интересует loop() в функции setAlarm().

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Shinsei пишет:

Получается можно loop() вызывать несколько раз в программе?

Andriano Вы не тот loop() смотрите. Интересует loop() в функции setAlarm().

ага - ровно два раза void loop() {loop();}

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Shinsei пишет:

Получается можно loop() вызывать несколько раз в программе?

Можно, но не нужно. Arduino IDE сама по кругу бесконечно гоняет функцию loop(). Поэтому она так и называется.

Shinsei пишет:

Andriano Вы не тот loop() смотрите. Интересует loop() в функции setAlarm().

Это один и тот же loop(). Точнее в строке 27 - это собственно объявленная функция, а в строке 24 - вызов этой функции (код из поста #60).

Читайте про функции, их объявления и вызов из разных кусков программы.

Shinsei
Offline
Зарегистрирован: 11.06.2016

Jeka_M, а для чего такой огород возводить?

Да, и спасибо за ответ.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Shinsei пишет:

Jeka_M, а для чего такой огород возводить?

Вам же написали - это говнокод. То есть, плохо продуманный алгоритм и его кривая реализация. Возможно из-за того, что автор кода плохо знает программирование. Код надо писать так, чтобы не приходилось вручную вызывать loop().

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

Shinsei пишет:

Получается можно loop() вызывать несколько раз в программе?

Любую функцию можно вызывать сколько угодно раз. Они для этого и придуманы.

Shinsei пишет:

для чего такой огород возводить?

Блин, Вы знаете старый добрый анекдот: спрашивает лорд дворецкого:

- Что, за шум на улице?
- Гей-парад, сэр.
- А чего им надо?
- Борются за свои права, сэр!
- А что их права кто-то ущемляет?
- Нет, сэр.
- А чего ж они шумят?
- Пид@расы, сэр!

Так и Ваш вопрос. Я же много раз Вам отвечал: Говнокод, сэр!

 

Shinsei
Offline
Зарегистрирован: 11.06.2016

Слово "говнокод" не раскрывает и не объясняет причину, а больше указывает на то что или не знают сути, но не хотят признать или не до конца сами в этом понимают, но опять не хотят в этом признаться. Как работают функции, для чего они нужны и т.д. и так все знают, вопрос был в другом.

В С тоже всего одна функция main, но есть программы в которых их больше 13 штук, а нормально объяснить как это работает единицы, за то много тех кто пишет "говнокод", но при этом сами не могут понять работы программы.

Вопрос был же не в том плохой код или нет

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

Да, мы (по крайней мере я лично) не можем разобраться в работе этой программы из-за отсутсвия мозгов, понимания и знаний, а также из-за нежелания ковыряться в чужих какашках - расслабьтесь уже. 

Shinsei
Offline
Зарегистрирован: 11.06.2016

Классный ответ, особенно с матом. 

Прошу прощения, форумом ошибся, думал есть кто может оказать оказалось, что больше "гопоты" чем спецов.

извините, что побеспокоил такие умы

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

Да, ничего, не стоит извинений, заходите ещё.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это даже не говнокод. Это просто неработающий пример непойми чего. И зачем там вызывается 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 не изменяется и соответственно - редуцирована. Как и её проверка.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Там ещё и несуществующая функция checkStatys().

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да даже если исправить все явные ошибки - пример НЕ работающий. Почему об этом сразу никто не сказал?

Там же идет косвенный рекурсивный вызов loop() через функцию, которая вызывается В ЛЮБОМ случае из самого loop() ! Оно будет работать (после устранения огрехов) ровно пока стек не засрет всю оперативу, которой не так уж и много..

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

Arhat109-2 пишет:

Почему об этом сразу никто не сказал?

Потому, что ТС упорно не говорит что она должна делать. В этой ситуации нельзя говорить, что код нерабоачий, т.к. нет критерия "рабочести".

Вот Вы написали (сам я код не смотрел, просто с Ваших слов)

Arhat109-2 пишет:

Оно будет работать (после устранения огрехов) ровно пока стек не засрет всю оперативу, которой не так уж и много..

Стоит Вам сказать. что оно не работает, как Вам ответят: назначение этой программы работать пока стек не засрёт, а потом уйти в ребут и начать сначала, так что всё работает отлично! И попробуйте доказать, что опонент не прав :)

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Этот вариант не стыкуется с вопросом ТС-а "нафига там вызывается loop() внутри функции" .. не может быть назначением ТО, о чем НЕ ЗНАЕТ афтар.. не верю! ;)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arhat109-2 пишет:

Да даже если исправить все явные ошибки - пример НЕ работающий. Почему об этом сразу никто не сказал?

Элементарно, Ватсон!

Потому, что никому не хочется ковыряться в дерьме. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

То есть, вместо того чтобы поковыряться и дать челу внятный ответ, пишем "чё попало" авось прокатит .. так? :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нет, пишем: "я в этом ковыряться не буду и тебе не советую".

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

Arhat109-2 пишет:

То есть, вместо того чтобы поковыряться и дать челу внятный ответ, пишем "чё попало" авось прокатит .. так? :)

В посте 64 я написал: "Для чего Вам нужно знать как оно работает? Хотите научиться таким приёмам? Не стоит". Считаю это наиболее внятным ответом. Более внятный ... ну. разве что Вы дадите :))))

К стому же, на вопрос "что там делает loop?" был дан точный ответ в том же посте - "рекурсивно вызывается". Вы не согласны с этим ответом? Так что если бы ТС действительно хотел разобраться, он бы уже нагуглил что это означает. Но, ТС, похоже, разбираться не очень хотел. Его дело и его право.

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

Про код - КГ/АМ. Там нечего обсуждать.

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

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

Про код найденый в инете - половина всего находимого как раз такого уровня как в примере. Не заслужывает даже времени на прочтение. И процентов 5-10 будет действительно стоящим. Ищите дальше, самому писать не надо ;)

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