Логическая переменная с оператором if
Я пытаюсь использовать логические переменные с двумя операторами if. Второе условие if никогда не оценивается как истинное. Может быть, это проблема с тем, как я определил свои логические переменные. Вы видите ошибку?
Вот код:
int x = 0;
boolean state1 = (x <= 10);
boolean state2 = (x > 10);
void setup() {
Serial.begin(9600);
}
void loop() {
x++;
if (state1) {
Serial.println("x <= 10");
} else if (state2) {
Serial.println(" x > 10");
}
}
@Zaffresky, 👍1
Обсуждение1 ответ
Лучший ответ:
Я попросил перенести этот вопрос в Stackoverflow, поскольку он не связан с Arduino.
Однако, чтобы ответить на ваш вопрос, вы назначаете логические значения перед запуском программы, поэтому они никогда не оцениваются повторно и всегда сохраняют свое начальное значение, исходя из того, когда x = 0
.
Что вам следует сделать, так это переоценить их в цикле:
int x = 0;
boolean state1;
boolean state2;
void setup() {
Serial.begin(9600);
}
void loop() {
x++;
state1 = (x <= 10);
state2 = (x > 10);
if (state1) {
Serial.println("x <= 10");
} else if (state2) {
Serial.println(" x > 10");
}
}
Кроме того, если состояние1 истинно, состояние2 всегда будет ложно, и наоборот, поэтому вам не нужно иметь два логических значения. Это даст:
int x = 0;
boolean state;
void setup() {
Serial.begin(9600);
}
void loop() {
x++;
state = (x <= 10);
if (state) {
Serial.println("x <= 10");
} else {
Serial.println(" x > 10");
}
}
Кроме того, вам не нужно определять логическое значение глобально, потому что оно нужно только внутри цикла и его не нужно "сохранять" из одного цикла в другой. Таким образом, вы получаете
int x = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
x++;
boolean state = (x <= 10);
if (state) {
Serial.println("x <= 10");
} else {
Serial.println(" x > 10");
}
}
Конечно, вы также можете напрямую проверить x <= 10
вместо того, чтобы сохранять его в логическом значении, но я предполагаю, что вам нужно логическое значение в другом месте внутри loop
функция позже.
Да, я вижу проблему сейчас. Я видел несколько скетчей, где булевы переменные использовались в операторе if, и подумал, что могу использовать их для хранения самих условий. Я предполагал, что, поскольку условие теперь хранится/присваивается логической переменной, поэтому каждый раз, когда переменная используется, она автоматически сравнивает условие с текущим значением x. Но ваш код помог мне увидеть необходимость обновления переменных и их локального хранения. Теперь я понимаю это лучше. Спасибо, @Zaffresky
Пожалуйста... Правда, есть разница между объявлением переменных (boolean b) и присваиванием (b = x). Когда x изменяется, b не изменяется, пока вы не выполните новое присваивание (если это не указатель). Я предлагаю прочитать о C/C++, это делает использование Arduino намного более мощным)., @Michel Keijzers
Да, я планирую больше изучать C/C++, но на данном этапе я просто знакомлюсь с базовой электроникой и пишу простые скетчи для Arduino. Так что следующим шагом определенно будет углубление в C., @Zaffresky
Вы не можете ничего делать одновременно (я тоже все еще изучаю электронику), @Michel Keijzers
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Вы никогда не обновляете свои переменные состояния. Когда вы присваиваете значение в C, вы присваиваете *результат* формулы, *а не саму формулу.*, @Majenko
Я пытался присвоить два условия логическим переменным, так что да, как вы сказали, я присваивал формулу., @Zaffresky
Этот вопрос не касается Arduino, а является общим вопросом программирования., @StarCat