Разница IF и WHILE

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

Все привет.

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

Написал условие с If - прекрасно работает. Привожу код без заголовка.

int i = PIND; 
    if (!((1 << PD6) & i)){
      moving();
      }

Решил сделать цикл с While, не работает! После первого нажатия выполнение функции уже не прекращается...

int i = PIND; 
    while (!((1 << PD6) & i)){
      moving();
      }

Что не так?

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

while() - это у нас что? Цыкл. Область действия цыкла где? А i обновляется где?

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

Я знаю, и даже пользуюсь языком, где нет while. Там его через for эмулируют а не через if. Может в этом разница? Есть же бесконечный цикл for(;;) ? Нет бесконечного цикла if - else.

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

верно, цЫкл
 

while (Условие) {
    Тело цикла;
}

i - считывает состояние кнопки, опрашивает порт. чем не обновление? нет? :)

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

Кто вам сказал, что переменная что-то считывает? Переменная - хранит когда-то считанное. А когда оно считано было?

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

while() - это у нас что? Цыкл. Область действия цыкла где? А i обновляется где?

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

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

Zero-Botanik пишет:

i - считывает состояние кнопки, опрашивает порт. чем не обновление? нет? :)

ответьте на вопрос, в какой строчке кода у вас считывается состояние кнопки?

ВН
Offline
Зарегистрирован: 25.02.2016

Zero-Botanik ,смотрите область видимости переменных

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

b707 пишет:

ответьте на вопрос, в какой строчке кода у вас считывается состояние кнопки?

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

int i = PIND;

 

bwn
Offline
Зарегистрирован: 25.08.2014

Zero-Botanik пишет:

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

int i = PIND;

А я что говорил?))))

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

bwn пишет:

А я что говорил?))))

вы посмеяться пришли? наслаждайтесь, я пока еще здесь.

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

b707 пишет:

ответьте на вопрос, в какой строчке кода у вас считывается состояние кнопки?

if  работает сколь угодно надежно, и было ощущение, что замена на while будет той же

bwn
Offline
Зарегистрирован: 25.08.2014

Ну с какого фака она должна что то считывать? Где вы такое увидели?
Третий за сегодня, кого в раздел "Программирование" отправляю.((((

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

Zero-Botanik пишет:

b707 пишет:

ответьте на вопрос, в какой строчке кода у вас считывается состояние кнопки?

if  работает сколь угодно надежно, и было ощущение, что замена на while будет той же

while() работает как калашников - на каждом проходе проверяет переменную i, которая не меняется. Воткните в центр цыкла Serial.println(i) и убедитесь.

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

bwn пишет:

Третий за сегодня, кого в раздел "Программирование" отправляю.((((

Очень не хочется грубить, но Вас я бы отправил в раздел "Вежливость".

А где еще задать вопрос, как не в песочнице? А Вы сами в курсе в каком раздела форума находитесь?

Я же именно занимаясь разделом Программирование не смог ответить на вопрос и задал его здесь.

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

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

sadman41 пишет:

while работает как калашников - на каждом проходе проверяет переменную i, которая не меняется. Воткните в центр цыкла Serial.print и убедитесь.

На это надеюсь.

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

bwn
Offline
Зарегистрирован: 25.08.2014

Zero-Botanik пишет:

Очень не хочется грубить, но Вас я бы отправил в раздел "Вежливость".

Ух ты, это я еще и не думал хамить.

Zero-Botanik пишет:

А Вы сами в курсе в каком раздела форума находитесь?

Уху, я один из его создателей.

Zero-Botanik пишет:

Я же именно занимаясь разделом Программирование не смог ответить на вопрос и задал его здесь.

Для этого, в единственной приколоченной теме этого раздела, в самом начале, имеется солидная библиография, которая дает ответы на заданные вами вопросы.

 

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

Могу написать, если намёки не помогают: внутри цикла необходимо обновлять значение переменной i.

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

Zero-Botanik пишет:

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

int i = PIND;

 

похоже до вас не доходит, что организовав цикл while - вы заблокировали программу внутри своего цикла, "бесконечный рабочий цикл" остаеновлен.

Программа больше не выходит из while и не исполняет строчку

int i = PIND;
negavoid
Offline
Зарегистрирован: 09.07.2016

Он не понимает, что такое while на самом деле.

int i = PIND; 
while (!((1 << PD6) & i)){
      moving();
      i = PIND; 
}

 

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

sadman41 пишет:

Могу написать, если намёки не помогают: внутри цикла необходимо обновлять значение переменной i.

 

Спасибо, но пока не догнал )

У меня логика кода такова:

для if: если (условие истинно) то выполнить

для while: пока (условие истинно) то выполнять. Есть какое-то ощущение, что что-то не так. Особенно когда не работает ))

Можно я предположу: если я в конце цикла буду i обнулять, получится?

ВН
Offline
Зарегистрирован: 25.02.2016

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

Раскройте код функции moving();  Zero-Botanik или таки sadman41 прав и все проще

 

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

negavoid пишет:

Он не понимает, что такое while на самом деле.

Именно! Не понимаю и пишу в открытую, как еще?

Спасибо большое всем!!! 

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

ВН пишет:

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

Раскройте код функции moving();  Zero-Botanik или таки sadman41 прав и все проще

 

 

все проще, это мой первый цикл while 

я месяц назад я спрашивал про неработающий код, где присваивание использовал вместо ==

да выучу, всего лишь месяц, дайте только срок )))

Спасибо еще раз всем! Тема закрыта.

Zero-Botanik
Zero-Botanik аватар
Offline
Зарегистрирован: 02.11.2019

b707 пишет:

Zero-Botanik пишет:

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

int i = PIND;

 

похоже до вас не доходит, что организовав цикл while - вы заблокировали программу внутри своего цикла, "бесконечный рабочий цикл" остаеновлен.

Программа больше не выходит из while и не исполняет строчку

int i = PIND;

 

именно так. спасибо.

теперь вот прям точно понял.