Вопрос по if
- Войдите на сайт для отправки комментариев
Ср, 08/07/2015 - 21:57
if(((input_voltage_level/79.92) < 11.9)&&(control_voltage_act_flag==true)){
strcpy(Sensor_state_out,Power_fault);
digitalWrite(alarm_relay_pin , HIGH);
ALM_RELAY__delay_flag=HIGH;
control_voltage_act_flag=false;
delay(500);
}
else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=true;
Здравствуйте.
Непонятно следующее:В таком виде код работает.При инициализации control_voltage_act_flag устанавливаетс равным true условие выполняется один раз при этом выставляется флаг control_voltage_act_flag=false и все останавливается.
Но если при инициализации соntrol_voltage_act_flag установить равным false ,и при выполнении условия менять его соответственно на true то условие будет выполняться все время несмотря на флаг.Почему?
видимо потому что в true его будет делать elseif.
чему равно input_voltage_level/79.92 при той ситуации, которой вы тестировали?
Оно равно 11.5
Я убирал else if , и все равно выполнение условия не прекращается
А если из условия убрать ((input_voltage_level/79.92) < 11.9)&& ?
control_voltage_act_flag глобальная переменная?
Покажите весь код
Переменная глобальная.
При такой иницивлизации переменной все работает.Но если поменять на false то перестает
Если она true то условие должно выполниться 1 раз, после чего перевестись в false (если вольтаж < 11.9) и больше не повторяться до тех пор, пока вольтаж не повысится больше того что задано в elseif
Если false то не выполниться ниразу, пока напряжение не повысится
Вроде так
Да это так и приведенный выше код работает. Но если поменять при инициаоизации глобальной переменной control_voltage_act_flag значение на falce ,а потом в условии менять его на true ,то код перестает выполняться один раз,а выполняется все время.Я не могу понять почему?
И там должны выполняться два условия если напряжение меньше 11,5 и значение этого флага,первоначальное значение которого устанавливается при инициализации переменной.
покажите код который не работает, ато на "пальцах" непонятно
//Конроль напряжения питания системы если система активна if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==true)){ strcpy(Sensor_state_out,Power_fault); digitalWrite(alarm_relay_pin , HIGH); ALM_RELAY__delay_flag=HIGH; control_voltage_act_flag=false; delay(500); } else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=true;Этот работает
//Конроль напряжения питания системы если система активна if(((input_voltage_level/79.92) < 11.9)&&(control_voltage_act_flag==false)){ strcpy(Sensor_state_out,Power_fault); digitalWrite(alarm_relay_pin , HIGH); ALM_RELAY__delay_flag=HIGH; control_voltage_act_flag=true delay(500); } else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=falseВот такой код не работает
boolean control_voltage_act_flag=false; //до setup ... ... //Конроль напряжения питания системы если система активна if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==false)){ strcpy(Sensor_state_out,Power_fault); digitalWrite(alarm_relay_pin , HIGH); ALM_RELAY__delay_flag=HIGH; control_voltage_act_flag=true; delay(500); } else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=false;Так точно так же должно работать. т.е.:
Если напряжение (input_voltage_level/79.92) меньше 11.9 то выполняется 1 раз и больше не выполняется до тех пор пока напряжение (input_voltage_level/79.92) не поднимится больше 12.5
boolean control_voltage_act_flag=false; //до setup ... ... //Конроль напряжения питания системы если система активна if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==false)){ strcpy(Sensor_state_out,Power_fault); digitalWrite(alarm_relay_pin , HIGH); ALM_RELAY__delay_flag=HIGH; control_voltage_act_flag=true; delay(500); } else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=false;Так точно так же должно работать. т.е.:
Если напряжение (input_voltage_level/79.92) меньше 11.9 то выполняется 1 раз и больше не выполняется до тех пор пока напряжение (input_voltage_level/79.92) не поднимится больше 12.5
если
boolean control_voltage_act_flag=true;//до setupто просто ждет пока напряжение (input_voltage_level/79.92) поднимится выше 12.5
Должно.Но в первом случае все работает.А во втором условие опрверяется бесконечно пока напряжение не станет >12.5.Это мне и не понятно
Во вторм случае как будто не видит изменение состояния флага
Во втором, в нерабочем случае, тут что
boolean control_voltage_act_flag=?;//до setupДа до setup.А что? Объявляем глобальную переменную и присваиваем ей значение,во втором случае (не рабочем)- false.
В первом(рабочем) - true
boolean control_voltage_act_flag=false; //до setup int input_voltage_level = 11; void setup() { pinMode(13, OUTPUT); } void loop() { if(((input_voltage_level) < 11.9) && (control_voltage_act_flag==false)){ digitalWrite(13, HIGH); control_voltage_act_flag=true; delay(1000); digitalWrite(13 , LOW); delay(1000); } else if((input_voltage_level) >12.5) control_voltage_act_flag=false, digitalWrite(13, HIGH), delay(100), digitalWrite(13, LOW), delay(100); }Всё работает так как задано в условии. Либо у вас вводные данные неверные, либо условие не то.
Как по вашему должен отрабатывать этот код?
Этот код должен мигнуть светодиодом.(Одновибратор так сказать). У меня не работает второй вариант.Не знаю почему.
У меня считывается с аналогового входа ,может с этим связано.
Проверьте что у вас в переменных перед условием
в setup:
Перед условием:
Serial.print("input_voltage_level/79.92 = "); Serial.print(input_voltage_level/79.92); Serial.print(", control_voltage_act_flag = "); Serial.println(control_voltage_act_flag); if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==false)){ ... ...Ну вы и извращаетесь. Вы же уже работаете с булевой переменной. В условии пишется просто переменной:
if(((input_voltage_level/79.92) < 11.9) && (!control_voltage_act_flag)){...Ну вы и извращаетесь. Вы же уже работаете с булевой переменной. В условии пишется просто переменной:
if(((input_voltage_level/79.92) < 11.9) && (!control_voltage_act_flag)){...Настоящие герои всегда идут в обход :D
да, так правильно, но кроме изменения наглядности (в худьшую сторону) ничего не даёт.
Ну вы и извращаетесь. Вы же уже работаете с булевой переменной. В условии пишется просто переменной:
if(((input_voltage_level/79.92) < 11.9) && (!control_voltage_act_flag)){...И чем Ваш вариант лучше? Сэкономили 5 символов? А новичкам такое читать не удобно.
Не знаю как на микриках (никогда не нарывался), а на больших компах условие типа flag == true работал не всегда, потому что переменная flag могла принимать значение и 5 и 3, потому никогда не сравниваю flag == true, всегда пишу просто flag.
Однако это не значит, что нужно бросаться исправлять свои скетчи, нужно просто помнить, что при определенных условиях и синус может выдать значение, типа 5 или 6. Я такое видел, правда на QNX и всего лишь если не добавить #include <math.h>.
А потому сей вопрос считаю очень философским.
OFFTOP: после обеда так приятно ввязаться в дискуссию и чего нибудь насочинять, впрочем здесь я написал чистую правду!
Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"
Я про то что в том случае читается как "не истина равна не истине?" а в моем случае читается как "не истина?"
Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"
Ты думаешь, что тип boolean занимает один бит? Я тебя умоляю, выпей слабительного и снотворного одновременно, ещё Жванецкий этот рецепт озвучивал.
Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"
вот оно! теперь я знаю, каким образом вселенная образовалась из ничего - быдлокодеры!
Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"
Я думаю что boolean это переменная которая может (и должна раз такой объявлена) принимать только два значения: true или false (1 и 0 соответственно). А то что Вы в нее суете что попало (руки вымыть не забудьте!) это только Ваши проблемы.
Про то что она занимает в памяти 1 байт я никогда в жизни не знал и видимо не узнаю.
Хорошо что есть на форуме кто за меня думать может!
Это булевская false должно принимать одно значение-0, а булевская true - это любое целочисленное число,отличное от 0.Мне кажется что именно с этим и связана эта непонятка.В сериал мониторе y меня true прыгает,принимая разные целочисленные значения.Кстати почему?
не забывайте, что в некоторых случаях кроме 1 и 0, можно получить и -1
Это булевская false должно принимать одно значение-0, а булевская true - это любое целочисленное число,отличное от 0.Мне кажется что именно с этим и связана эта непонятка.В сериал мониторе y меня true прыгает,принимая разные целочисленные значения.Кстати почему?
Значит у вас в коде где-то еще присваивается значение к этой переменной, причем не тру или не тру а с какого-нибудь порта, например аналогового.
Я уверен что ниже написанному Вы тоже не поверите.
Wikipedia: a Boolean data type is a data type with only two possible values: true or false.
MSDN: This keyword is a built-in type. A variable of this type can have values true and false. Conditional expressions have the type bool and so have values of type bool. For example,
Oracle: boolean: The
booleandata type has only two possible values: true and falsefalse. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.У Вас видимо какие-то демократичные булевские переменные, что они любые значения принимать могут. Главное чтобы не курили.
Да, булевская переменная принимает только два значения false и true.Но только false строго равно 0. А true любое целочисленное значене отличное от 0.Например:-127 тоже будет true
Если быть демократичным, то true - это все что не ноль и все что может быть сделано.
Например (х=sin(5)) или строка: "Да мне как-то похрену что Вы сами себе в булеан пихаете" - тоже true
Повторю , мне тоже интересно быть умным :
ноль- это false , а всё остальное - true. Именно всё-всё-всё........
Повторю , мне тоже интересно быть умным :
ноль- это false , а всё остальное - true. Именно всё-всё-всё........
оно все тру, вот только все что не "1" и не "тру" это уже не булеан.
А приведение типов не сработает?
Смотрим там "0" или "что-то". И не важно что . Даже на строку и на лонг....????
А зачем приведение? Это уже совсем какие-то костыли получатся. В чем проблема сравнить строку или что-то еще на существование и/или нужные значения?
Если Вы про "автоматическое" привидение, то нет, в иф-е оно не работает.
"В чем проблема сравнить строку или что-то еще на существование и/или нужные значения"
Вот решение. Спасибо всем принявшим участие в обсуждение.Отдельная благодарность JollyBiber
Ой! Я не специально! :)
Еще такой вопрос в можно ли булеан присваивать значения LOW /HIGH.Я понимаю что это уровни напряжения для портв ввода/вывода. Будет ли это эквивалентно 0/1 для переменной булеан или существуют какие-то ограничения ?
А зачем? Вам нужно экономить память или Вы путаетесь в своих переменных?
Мне удобней использовать LOW и HIGH.Логический 0 и 1.Есть ли какие то ограничения ? И сколько памяти экономится при этом? Это тоже немаловажно
Найдено в просторах Arduino.h
#define HIGH 0x1
#define LOW 0x0
Но и без этого все прекрасно работает.
У Вас нет ардуино чтобы попробовать?
Ардуина есть и все работает.То есть как я понял никаких ограничений нет и можно булеан присваивать значения LOW/HIGH.Спасибо
Это Вы так поняли, я такого не говорил :)
Ну так Да или Нет?