Проблема с оператором IF..else

Pavlik
Offline
Зарегистрирован: 09.01.2016

Здравствуйте прошу помощи



float poddergivaemaya_temperatura_v_pogrebe = 26.5; 
float gisterezis = 1.0; 
float temperatura = 27.5

if((poddergivaemaya_temperatura_v_pogrebe - gisterezis) < temperatura > mkmpoddergivaemaya_temperatura_v_pogrebe) 
 {
   digitalWrite(Pinventilyatorpogreb, HIGH); // включаем вентилятор
 Serial.print("   #  1 ");
 } 
 else
 {
  Serial.print("   # 2   ");
  }

Вот при данном раскладе при том что должно сработать условие #1, срабатывает #2
Подставляю сразу числа без ввода переменных т.е.
 if((26.5 - 1.0) < 27.5 > 26.5) 
то условие срабатывает верно

Выбрасывал заданные мною переменные в монитор порта. Отображаются верно 26.50; 27.50; 1.00
Что может быть?

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Так не пишут if (a<b<c)

Пиши так if (a<b && b<c)

Pavlik
Offline
Зарегистрирован: 09.01.2016

Исправил как вы сказали. Не помогло. Ничего не поменялось. :(

Araris
Offline
Зарегистрирован: 09.11.2012

Исправили - покажите результирующий скетч.

Pavlik
Offline
Зарегистрирован: 09.01.2016


float poddergivaemaya_temperatura_v_pogrebe = 26.5; 
float gisterezis = 1.0; 
float temperatura = 27.5

if(temperatura  > poddergivaemaya_temperatura_v_pogrebe && temperatura  < (poddergivaemaya_temperatura_v_pogrebe - gisterezis))
 {
 Serial.print("   #  1 ");
 } 
 else
 {
  Serial.print("   # 2   ");
  }

Всё равно срабатывает # 2 

Pavlik
Offline
Зарегистрирован: 09.01.2016

Araris, Не понимаю говорят что так не пишут if (a<b>c), почему же это работает когда подставляю просто числа.

__Alexander
Offline
Зарегистрирован: 24.10.2012

27.5 < (26.5-1)... дык сработает первый если 27.5 будет меньше 25.5, а вот когда это будет, это не сюда. )))))

Pavlik
Offline
Зарегистрирован: 09.01.2016


float poddergivaemaya_temperatura_v_pogrebe = 26.5; 
float gisterezis = 1.0; 
float temperatura = 27.5

if(temperatura  > poddergivaemaya_temperatura_v_pogrebe && temperatura  > (poddergivaemaya_temperatura_v_pogrebe - gisterezis))
 {
 Serial.print("   #  1 ");
 } 
 else
 {
  Serial.print("   # 2   ");
  }

ОЙ))))) заработало. Спасибо

 

Araris
Offline
Зарегистрирован: 09.11.2012

Pavlik пишет:

Araris, Не понимаю говорят что так не пишут if (a<b>c), почему же это работает когда подставляю просто числа.

Дело хозяйское, если желаете курьёзов в языковых конструкциях, то их тут на форуме немало можно найти. Была тут и тема с if (a<b>c), и большая тема про case, и много чего. Компилятор и не такое скомпилирует ))).

Если нужно, чтобы просто работало, то руководствуйтесь http://arduino.ru/Reference/If , либо ещё более солидными описаниями языка.

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

Pavlik пишет:

говорят что так не пишут if (a<b>c), почему же это работает когда подставляю просто числа.

И не только числа. С переменными тоже работает. Это вообще нормальная,  рабочая конструкция, только делает она не то, что Вы думаете. А то, что Вам где-то показалось, что сработало правильно - случайность. Поставьте другие числа и всё будет по другому.

А работает это так:

1. общий вид оператора if

if (<выражение>) op1; else op2;

Первым делом вычисляется <выражение>. Если результат отличен от 0, то выполняется op1, иначе op2.

То, что Вы пытаетесь писать - нормальное, правильное выражение, только давайте посмотрим, как оно реально вычисляется. Итак:

a < b < c

Равноприоритетные операции выполняются слева направо, поэтому, сначала будет выполнена операция a<b. Её результатом (R) будет либо 1 (истина), либо 0 (ложь). Теперь этот результат участвует во втором сравнении R < c совершенно законно. Результат зависит от c, как Вы понимаете.

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ну вот, названия переменных нормальные пошли, прекрасно! (я не шучу) Читабельно и не нужны комментарии.

 

msng
Offline
Зарегистрирован: 07.06.2012

Pavlik пишет:

if(temperatura  > poddergivaemaya_temperatura_v_pogrebe && temperatura  > (poddergivaemaya_temperatura_v_pogrebe - gisterezis))

непойму зачем первое условие ?

if (a>b && a>b-c) 

если только c может иметь отрицательное значение

а если положительное то достаточено только второго условия

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

kisoft пишет:

Ну вот, названия переменных нормальные пошли, прекрасно! (я не шучу) Читабельно и не нужны комментарии.

писать комментарий к переменной в имя переменной.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Клапауций 322 пишет:

kisoft пишет:

Ну вот, названия переменных нормальные пошли, прекрасно! (я не шучу) Читабельно и не нужны комментарии.

писать комментарий к переменной в имя переменной.

Слава Богу русские имена переменных пока что недопустимы. Видел я программы на русском, лучше не надо.

 

Sr.FatCat
Offline
Зарегистрирован: 19.02.2016

Пишу много на 1С. Только на русском. Сначала коробило, теперь привык.

И все-таки между самодокументиромостью кода и названиями переменных длинной 256 символов надо соблюдать баланс.
Как у топик стартера тоже трудночитаемо. Лучше все-таки не использовать транслит, а более лаконичный английский (заодно и подтягивается он, когда перевод ищешь) и уж предлоги и прочие суфиксы точно лучше не надо.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Sr.FatCat пишет:

Пишу много на 1С. Только на русском. Сначала коробило, теперь привык.

И все-таки между самодокументиромостью кода и названиями переменных длинной 256 символов надо соблюдать баланс.
Как у топик стартера тоже трудночитаемо. Лучше все-таки не использовать транслит, а более лаконичный английский (заодно и подтягивается он, когда перевод ищешь) и уж предлоги и прочие суфиксы точно лучше не надо.

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

 

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

О... пофлудю. Напомнили мне один код на дельфях. Дело было так: дали мне задачку подправить прогу на дельфях, и это при том, что дельфей я в глаза не видел, разве что преподавал когда-то Паскаль .. полез в код .. и смутили меня странные названия глобалов: zk, pzk, pzrk, ppzk .. со схожим назначением, но используются в разных модулях .. стало люботытно и таки разыскал контакты автора, позвонил. И, упс.. авторская расшифровка: "зае*л этот код", "програмист зае*тся в коде", "программист зае*тся разбирать код" .. и да, примерно такой коммент убил наповал: -"Да это по сути один глобал, просто код модифицировался несколько раз согласно требованиям начальства: сделай так, нет вот так, ой, верни как было, а теперь вот так .. я просто несколько раз забывал про него, а потом приходилось сводить разные куски кода .." :)

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

Arhat109-2 пишет:

О... пофлудю. Напомнили мне один код на дельфях. Дело было так: дали мне задачку подправить прогу на дельфях, и это при том, что дельфей я в глаза не видел, разве что преподавал когда-то Паскаль .. полез в код .. и смутили меня странные названия глобалов: zk, pzk, pzrk, ppzk .. со схожим назначением, но используются в разных модулях .. стало люботытно и таки разыскал контакты автора, позвонил. И, упс.. авторская расшифровка: "зае*л этот код", "програмист зае*тся в коде", "программист зае*тся разбирать код" .. и да, примерно такой коммент убил наповал: -"Да это по сути один глобал, просто код модифицировался несколько раз согласно требованиям начальства: сделай так, нет вот так, ой, верни как было, а теперь вот так .. я просто несколько раз забывал про него, а потом приходилось сводить разные куски кода .." :)

Дык самое главное в работе кодера - ПИСАТЬ ВНЯТНЫЕ КОММЕНТЫ!

Я делал проект по базе жилого фонда под ДОС на клиппере. Потом работа, времени нет, а клиенту надо под винду переезжать. Передал проект молодому, рассказал что смог (перед этим лет 5 так же подстраивался под Заказчика).

В результате молодой но талантливый программер перевел мой код с клиппера на дельфи под винду.

Когда я спросил его - А КАК? он сказал - комментов хватило %)

Т.е. я комментировал практически каждый чих кроме может совсем очевидных даже дебилу вещей....

ВЫВОД!

Если хотите через полгода-год вспомнить а что собственно написали - КОММЕНТИРУЙТЕ текст скетча!

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

А я код с первого раза пишу без коментов. Кроме самых извращенных мест. Хороший код в пояснениях не нуждается. А свеженаписаный всегда хороший, пока в отладки и доработки не попадет ))) Если же его откоментировать сразу, то при отладке коментарии исказятся, будут не соответствовать коду, но при этом формально будут и будут тока вредить. Проверки вариантов решения вобще коментировать глупо. А вот после отладки есть 2 варианта, если код для людей - чищу, вычитываю и коментирую без фанатизма. Если для себя, как раз ардуина  - без коментариев обойдусь. Если через пол года я вынужден сам себе признать что это я писал ))) - вот тогда идет разбор, возможно рефакторинг и подробное коментирование по ходу разбора. При этом еще и какую незамеченую багу можна пофиксить, т.к приходится смотреть как он работает на самом деле а не как он должен работать по коментарию. А если к коду не возвращаюсь - ну так он и помрет не изведав коментария.

Pavlik
Offline
Зарегистрирован: 09.01.2016

kisoft пишет:

Ну вот, названия переменных нормальные пошли, прекрасно! (я не шучу) Читабельно и не нужны комментарии.

Спасибо. Делаю такие названия потому что, что то "пишу" очень редко. Работа, дочка, жена и прочие проблемы не дают времени. Считаю что так легче читать (для меня лично) код.

msng пишет:

Pavlik пишет:

if(temperatura  > poddergivaemaya_temperatura_v_pogrebe && temperatura  > (poddergivaemaya_temperatura_v_pogrebe - gisterezis))

непойму зачем первое условие ?

if (a>b && a>b-c) 

если только c может иметь отрицательное значение

а если положительное то достаточено только второго условия

Может и может, надо все учесть. У меня проблема в том что мы сделали погреб. Когда его копали, дошли до воды, дальше копать не стали. (около 2,8 метра от поверхности земли). На случай поднятия этого уровня воды, хорошо погреб гидроизолировали. Плюс ко всему вход в погреб из отапливаемого гаража. Короче говоря в нем тепло. Сами себе навредели, уже ничего не переделать. Т.к. погребом пользуемся в основном зимой, было принято решение установить вентилятор загоняющий холодный воздух с улицы. Поддерживаемая температура скорее всего будет выставлена равной +4. На данный момент в начале темы выставлено 26,5 т.к. схема лежит на столе и датчик погреба в комнате, в которой как раз около 26 градусов (рядом батарея). 

Sr.FatCat пишет:

Пишу много на 1С. Только на русском. Сначала коробило, теперь привык.

И все-таки между самодокументиромостью кода и названиями переменных длинной 256 символов надо соблюдать баланс.
Как у топик стартера тоже трудночитаемо. Лучше все-таки не использовать транслит, а более лаконичный английский (заодно и подтягивается он, когда перевод ищешь) и уж предлоги и прочие суфиксы точно лучше не надо.

Один знакомый мне програмист (я видел его код) что бы не запутатся всегда в названии переменной первые три символа ставит одни и теже например "nmntemp". (сразу говорю, что nmn это не его ФИО) Говорит что так точно знает что это его переменная.

Araris пишет:

Pavlik пишет:

Araris, Не понимаю говорят что так не пишут if (a<b>c), почему же это работает когда подставляю просто числа.

Дело хозяйское, если желаете курьёзов в языковых конструкциях, то их тут на форуме немало можно найти. Была тут и тема с if (a<b>c), и большая тема про case, и много чего. Компилятор и не такое скомпилирует ))).

Если нужно, чтобы просто работало, то руководствуйтесь http://arduino.ru/Reference/If , либо ещё более солидными описаниями языка.

Читал я это. Тут про двойное сравнение то не пишут. Попробую найти про " if (a<b>c), и большая тема про case" на форуме. Спасибо.

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

Pavlik пишет:

говорят что так не пишут if (a<b>c), почему же это работает когда подставляю просто числа.

И не только числа. С переменными тоже работает. Это вообще нормальная,  рабочая конструкция, только делает она не то, что Вы думаете. А то, что Вам где-то показалось, что сработало правильно - случайность. Поставьте другие числа и всё будет по другому.

А работает это так:

1. общий вид оператора if

if (<выражение>) op1; else op2;

Первым делом вычисляется <выражение>. Если результат отличен от 0, то выполняется op1, иначе op2.

То, что Вы пытаетесь писать - нормальное, правильное выражение, только давайте посмотрим, как оно реально вычисляется. Итак:

a < b < c

Равноприоритетные операции выполняются слева направо, поэтому, сначала будет выполнена операция a<b. Её результатом (R) будет либо 1 (истина), либо 0 (ложь). Теперь этот результат участвует во втором сравнении R < c совершенно законно. Результат зависит от c, как Вы понимаете.

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

Спасибо за такое подробное разъяснение. Подскажите мне пожалуйста про моё самое первое сравнение в начале топика:

Так a < b > c и так a > b < c  вообще можно сравнивать?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Pavlik пишет:

Спасибо за такое подробное разъяснение. Подскажите мне пожалуйста про моё самое первое сравнение в начале топика:

Так a < b > c и так a > b < c  вообще можно сравнивать?

Боюсь, что Вы не поняли моего объяснения.

Вопрос "можно ли" здесь неуместе. Конечно, можно! Другое дело, нужно ли Вам так писать. Это уже это зависит от того, что именно Вы хотите этим сказать (Вы же этого не написали).

Ну, давайте разберём запись a < b > c.

Вы можете словами объяснить, что Вы этим хотите сказать?

Рискну предположить, что Вы хотели сказать: "а меньше b И_ПРИ_ЭТОМ b больше с".

Если так, то запись "a < b > c" неверна, т.к. она означает совсем другое, а именно: 
"(а меньше b И_ПРИ_ЭТОМ с меньше 1) ИЛИ (а не меньше b И_ПРИ_ЭТОМ c меньше 0)"

Pavlik
Offline
Зарегистрирован: 09.01.2016

Евгений, я действительно походу запутался. Я пока уйду в себя и в чтение мануалов. Пока пришел к выводу что данное сравнение мне вообще не нужно. Ну я его все равно разберу.

releyshic
Offline
Зарегистрирован: 20.11.2015

Pavlik пишет:

Евгений, я действительно походу запутался. Я пока уйду в себя и в чтение мануалов. Пока пришел к выводу что данное сравнение мне вообще не нужно. Ну я его все равно разберу.

не слушай ты Евгена так на практике никто не пишет. все пишут просто и понятно (a = =0&&b ==1 || a<2 &&b>4) всё просто

releyshic
Offline
Зарегистрирован: 20.11.2015

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

Pavlik пишет:

Спасибо за такое подробное разъяснение. Подскажите мне пожалуйста про моё самое первое сравнение в начале топика:

Так a < b > c и так a > b < c  вообще можно сравнивать?

Боюсь, что Вы не поняли моего объяснения.

Вопрос "можно ли" здесь неуместе. Конечно, можно! Другое дело, нужно ли Вам так писать. Это уже это зависит от того, что именно Вы хотите этим сказать (Вы же этого не написали).

Ну, давайте разберём запись a < b > c.

Вы можете словами объяснить, что Вы этим хотите сказать?

Рискну предположить, что Вы хотели сказать: "а меньше b И_ПРИ_ЭТОМ b больше с".

Если так, то запись "a < b > c" неверна, т.к. она означает совсем другое, а именно: 
"(а меньше b И_ПРИ_ЭТОМ с меньше 1) ИЛИ (а не меньше b И_ПРИ_ЭТОМ c меньше 0)"

Ты зачем парня путаешь ) он ещё операций то логичеких не знает а ты.. ))

как то на Интутите смотрел курс по PHP и просто офигел с примеров тешних, там такие мать его конструкцие нечитаемые были просто ужас )) и всё это запрвлено префиксными и постфиксными операторами в цикле ))

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

тут более интересен вопрос о том каой код производительней будет?

Не могу не затронуть то что в Arduino IDE нет условной операции, по крайне мере я не смог её запустить ((

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

releyshic пишет:

Ты зачем парня путаешь ) он ещё операций то логичеких не знает а ты.. ))

Был совершенно конкретный вопрос в посте №5 "почему это иногда работает". Вот и отвечаю.

releyshic пишет:

тут более интересен вопрос о том каой код производительней будет?

Мне неиинтересен. Вернее, не настолько интересен, чтобы я ради него "с дивана вставал". Если Вам интересно, посмотрите ассемлерный код, замерьте скорость и отпишитесь - почитаю :)

releyshic пишет:

Не могу не затронуть то что в Arduino IDE нет условной операции, по крайне мере я не смог её запустить ((

Не знаю чего Вы не смогли запустить. Всё там есть. Вообще нет такого понятия "в IDE". Это обычный С++, IDE тупо вызывает gcc (слегка погадив в коде, как мы уже обсуждали). Операция "?" там безусловно есть, я пользую её постоянно.