Надо обсудить оптимальный код для if else

Adind
Offline
Зарегистрирован: 04.05.2014

Есть три рабочих варианта одной функции с операторами 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;  // ошибка программы считывания датчиков 
  }

Жду советов.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
int statZaslGorl()
  { 
     return digitalRead(switchPin_D3_0)*1+digitalRead(switchPin_D3_1)*2; 
  }

Я думаю тут проще математику использовать.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Adind пишет:

Есть три рабочих варианта одной функции с операторами 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

Geronimo
Offline
Зарегистрирован: 06.05.2013

NeiroN пишет:

int statZaslGorl()
  { 
     return digitalRead(switchPin_D3_0)*1+digitalRead(switchPin_D3_1)*2; 
  }

Я думаю тут проще математику использовать.

это самый быстрый, но самый не расширяемый способ

Abyss
Offline
Зарегистрирован: 12.05.2014

Насколько я понимаю, второй вариант будет выдавать только "0" или "3". "1" и "2" не получится получить?

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

Abyss пишет:

Насколько я понимаю, второй вариант будет выдавать только "0" или "3". "1" и "2" не получится получить?

 

start==0 && finis==1

вот условия для 2

Abyss
Offline
Зарегистрирован: 12.05.2014

Да, но последним условием выполнится else. а он будет выполняться ВСЕГДА, когда старт или финиш не равны нулю.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Да действительно.

Adind
Offline
Зарегистрирован: 04.05.2014

Таких функций в моем скетче будет 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;  // ошибка программы считывания датчиков
  }

Abyss
Offline
Зарегистрирован: 12.05.2014

Подумайте над математикой. Очень удобный вариант. Можно даже ускорить, если не умножать и складывать, а использовать битовые операции. 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

вариант 3 самый наглядный, особенно для новичков (через полгода заглянешь в скетч и сразу разберешься).

А так мне нравится изящность математического метода (пост #3).

Abyss
Offline
Зарегистрирован: 12.05.2014

Tomasina пишет:

А так мне нравится изящность математического метода (пост #3).

Более того, этот вариант и самый расширяемый. Каждый последующий вход просто умножаем на двойку в степени номера входа (нумерация входов начинается с нуля, разумеется).

Adind
Offline
Зарегистрирован: 04.05.2014

Спасибо NeiroN принял Ваш совет.  Математика убрала две страницы кода и сделали его визуально проще и понятнее.