Можно ли проверить несколько условий одним оператором If.

Раздел начинающих пользователей
Правила форума
В песочнице можно спрашивать когда незнаешь где спросить.
В песочнице нелзя посылать в гугл
В песочнице можно задавать любой вопрос, но на него могут и неответить.
Песочница для тех, кто начинает свои вопросы с защиты чайников от пинков.
В песочницу будут перетаскиваться вопросы неполучившие ответа.
Песочница - попытка навести порядок.
На песочницу большие надежды.

Re: Можно ли проверить несколько условий одним оператором If

Сообщение goldexer (Вадим) » 18 мар 2017, 22:37

Конечно можно и практический пример. Пример не FC!, а именно по просьбе ручками.
Есть микроконтроллер ATmega328P, в главном цикле которого проверяется, нажата ли пользователем кнопка (т.е. появление логического НУЛЯ на пин порта, именно нуля, поскольку включена подтяжка). Поскольку микроконтроллер работает очень быстро, то дребезг пружины под кнопкой вызовет множественное кратковременное замыкание контактов, пока палец ещё не придавил кнопку окончательно.Для этого заводится инкрементальная переменная задержки, скажем, на 100 циклов. Т.е. если как минимум в течение 100 циклов кнопка была нажата, то можно работать. Плюс к этому проверку можно делать если активен флаг какого-либо условия.

Могло выглядеть так:
Код: выделить все
unsigned char pin_state = 0;

pin_state = PIND.4; //Кнопка на 4 пин порта D
pin_state = !pin_state;  //Истиность условия это 1, а на пин приходит ноль - инвертируем

if (flag_active)
{
    if (pin_state)
    {
        if (delay_counter == 100) DoSomething();
    }
}


будет переделано в:
Код: выделить все
if ( flag_active & !pin_state & delay_counter == 100) DoSomething();


С учетом специфики работы, например, тех же микроконтроллеров, иногда приходится проверять сразу пять-семь условий и это не предел. Иногда в прерываниях вместо выполнения самого тела долгих процедур приходится только выставлять флаги, чтобы не тормозить основной цикл или более жизненно важные прерывания, а уже только потом по этим флагам запускать по-кусочкам мало-приоритетный код.А теперь представьте входить в 5-7 проверок и каждый держать на учете... Пока дойдете до 5 вложения забудете что было первым. А когда всё это одной строкой или рядом в столбик, сразу видно что проверяется. Но и это ещё не всё! Теперь представьте что всё это дерево ветвлений из первого примера вложено ещё и в проверку номера кнопок. Т.Е. при десяти кнопках ЭТО повторится 10 раз, только для каждой разные флаги, условия, задачи и ещё и ветвления разные в зависимости нажата эта чертова кнопка, или нет. Ведь пока она не нажата можно тоже что-то делать.

Код: выделить все
switch (button_number)
   case 1: { if ( flag_active1 & !PIND.1 & delay_counter[1] == 100) DoSomething1(); break; }
   case 2: { if ( flag_active2 & !PIND.2 & delay_counter[2] == 100) DoSomething2(); break; }
   case 3: { if ( flag_active3 & !PIND.3 & delay_counter[3] ==   50) DoSomething3(); break; }
   case 4: { if ( flag_active4 & !PIND.4 & delay_counter[4] == 500) DoSomething4(); break; }
   case 5: { if ( flag_active5 & !PIND.5 & delay_counter[5] == 500) DoSomething5(); break; }
   case ... и так далее     


Всё это очень легко читается с учетом почти одинаковых условий, а представьте, если развернуть это дерево в мутанта на несколько страниц? Везде есть свои нюансы, условия, оптимизации. Иногда в поставленных условиях более громоздкий код, как это ни парадоксально быстрее работает, но это не значит, что его нужно делать нечитабельно-громоздким.

Например если чип вычисляет 360 шим-точек синусоиды за критически долгое время, а сами эти значения являются константами, то их помещают в массив.
Можно так:
Код: выделить все
unsigned char sine_points[360];
sine_points[0] = xxx;
sine_points[1] = xxx;
sine_points[2] = xxx;
sine_points[3] = xxx;
sine_points[4] = xxx;
...
sine_points[359] = xxx;    //итого читающий пошлет вас сами знаете куда


А можно и в 10 строчек по 36 значений в строке, чтобы было удобнее просматривать:
Код: выделить все
const unsigned char sine_points[360] = {xxx,xxx,xxx,xxx,xxx,xxx, ...
                                                           xxx,xxx,xxx,xxx,xxx,xxx, ...} //предположем строчек было 10 ;-)                                                                                                     


Ещё раз, это не для FC, это если придется где-нибудь ручками. Для FC по-барабану, поскольку вы итак это рисуете и всё перед глазами.
Аватар пользователя
Ник: goldexer
Имя: Вадим
(Бельцы)
Новичок
Новичок
Информация о пользователе

Re: Можно ли проверить несколько условий одним оператором If

Сообщение tran3istor (Ivan) » 20 апр 2017, 18:10

Вот обещанное что получилось viewtopic.php?f=18&t=2279
Прошу ваши замечания, исправления, критику...
Ник: tran3istor
Имя: Ivan
(asdfg)
Новичок
Новичок
Информация о пользователе

Пред.

Вернуться в ПЕСОЧНИЦА

Кто сейчас на форуме

Пользователь просматривает форум: Enigm

cron