Надо обсудить оптимальный код для if else
- Войдите на сайт для отправки комментариев
Есть три рабочих варианта одной функции с операторами if else . Подскажите какой вариант использовать правильнее ( с точки зрения программирования).
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 1
{
int result;
int start = digitalRead(switchPin_D3_0);
int finis = digitalRead(switchPin_D3_1);
if (start==0 && finis==1 ) result=2;
else if (start==1 && finis==0 ) result=1;
else if (start==0 && finis==1 ) result=2;
else if (start==0 && finis==0 ) result=0;
else result=3; // ошибка программы считывания датчиков
return result;
}
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 2
{
int result;
int start = digitalRead(switchPin_D3_0);
int finis = digitalRead(switchPin_D3_1);
if (start==0 && finis==1 ) result=2;
if (start==1 && finis==0 ) result=1;
if (start==0 && finis==1 ) result=2;
if (start==0 && finis==0 ) result=0;
else result=3; // ошибка программы считывания датчиков
return result;
}
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 3
{
int result;
int start = digitalRead(switchPin_D3_0);
int finis = digitalRead(switchPin_D3_1);
if (start==0 && finis==1 ) return result=2;
if (start==1 && finis==0 ) return result=1;
if (start==0 && finis==1 ) return result=2;
if (start==0 && finis==0 ) return result=0;
return result=3; // ошибка программы считывания датчиков
}
Жду советов.
Я думаю тут проще математику использовать.
Есть три рабочих варианта одной функции с операторами if else . Подскажите какой вариант использовать правильнее ( с точки зрения программирования).
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 1
{
int result;
int start = digitalRead(switchPin_D3_0);
int finis = digitalRead(switchPin_D3_1);
if (start==0 && finis==1 ) result=2;
else if (start==1 && finis==0 ) result=1;
else if (start==0 && finis==1 ) result=2;
else if (start==0 && finis==0 ) result=0;
else result=3; // ошибка программы считывания датчиков
return result;
}
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 2
{
int result;
int start = digitalRead(switchPin_D3_0);
int finis = digitalRead(switchPin_D3_1);
if (start==0 && finis==1 ) result=2;
if (start==1 && finis==0 ) result=1;
if (start==0 && finis==1 ) result=2;
if (start==0 && finis==0 ) result=0;
else result=3; // ошибка программы считывания датчиков
return result;
}
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 3
{
int result;
int start = digitalRead(switchPin_D3_0);
int finis = digitalRead(switchPin_D3_1);
if (start==0 && finis==1 ) return result=2;
if (start==1 && finis==0 ) return result=1;
if (start==0 && finis==1 ) return result=2;
if (start==0 && finis==0 ) return result=0;
return result=3; // ошибка программы считывания датчиков
}
Жду советов.
по быстродействию:
3
1
2
Я думаю тут проще математику использовать.
это самый быстрый, но самый не расширяемый способ
Насколько я понимаю, второй вариант будет выдавать только "0" или "3". "1" и "2" не получится получить?
Насколько я понимаю, второй вариант будет выдавать только "0" или "3". "1" и "2" не получится получить?
start==0 && finis==1
вот условия для 2
Да, но последним условием выполнится else. а он будет выполняться ВСЕГДА, когда старт или финиш не равны нулю.
Да действительно.
Таких функций в моем скетче будет 8 штук - потому интересуюсь советами о правильности.
Немного поспешил - попала лишняя строчка. А исправит не могу- нет кнопки редактирования.
Переписываю задание заново, «корявый" Вариант №2 удаляю. Оба варианта 1 и 3 на макете работают одинаково хорошо и правильно (выдают 0 1 2 3 от в зависимости от состояния входов).
Собственно касательно Варианта 1 - с точки зрения правильности в одной книжке по С++ советуют писать именно так как в Варианте 1.
В Варианте 3 меня смущает можно ли "выскакивать из функции" как в этом примере - из четырёх возможных точек return ?
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 1 (исправлен)
{
int result;
int start = digitalRead (switchPin_D3_0);
int finis = digitalRead (switchPin_D3_1);
if (start==0 && finis==1 ) result=2;
else if (start==1 && finis==0 ) result=1;
else if (start==0 && finis==0 ) result=0;
else result=3; // ошибка программы считывания датчиков
return result;
}
int statZaslGorl() // Функция определения статуса датчиков горловины Вариант 3 (исправлен)
{
int result;
int start = digitalRead (switchPin_D3_0);
int finis = digitalRead (switchPin_D3_1);
if (start==0 && finis==1 ) return result=2;
if (start==1 && finis==0 ) return result=1;
if (start==0 && finis==0 ) return result=0;
return result=3; // ошибка программы считывания датчиков
}
Подумайте над математикой. Очень удобный вариант. Можно даже ускорить, если не умножать и складывать, а использовать битовые операции.
вариант 3 самый наглядный, особенно для новичков (через полгода заглянешь в скетч и сразу разберешься).
А так мне нравится изящность математического метода (пост #3).
А так мне нравится изящность математического метода (пост #3).
Более того, этот вариант и самый расширяемый. Каждый последующий вход просто умножаем на двойку в степени номера входа (нумерация входов начинается с нуля, разумеется).
Спасибо NeiroN принял Ваш совет. Математика убрала две страницы кода и сделали его визуально проще и понятнее.