Помогите не могу разобраться с синтаксисом оператора if

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Пт авг 22, 2014 17:12:03

Сообщение Kot_Bigimot »

Добрый день решил разобраться с 1wire и встретил там функцию:




uint8_t onewire_skip() {
if (!onewire_reset()) // Функция onewire_reset() возвращает "0" или "1" не понятен прием со знаком неравенства (!onewire_reset())
return 0;
onewire_send(0xCC); // и непонятно как происходит ветвление где else ??????
return 1;
}

Извините за глупый вопрос я только начинаю осваивать AVR и СИ.
Спасибо за ответ!
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Ветвления нет. Функция, в которой лежит if, возвращает 0 если onewire_reset() == 0 (в этом случае условие внутри if становится true и if выполняет оператор, следующим сразу за ней, т.е. return 0.
Далее просто выполняется еще одна функция и фунция завершается оператором return 1. Можно после if поставить else, но тут оно не принципиально, т.к. здесь нет кода, не зависящего от условия if. Поэтому else просто опустили.

Код: Выделить всё

uint8_t onewire_skip() {
if (!onewire_reset()) // Функция onewire_reset() возвращает "0" или "1" не понятен прием со знаком неравенства (!onewire_reset())
return 0;
else
{
onewire_send(0xCC); // и непонятно как происходит ветвление где else ?????? 
return 1;
}
}
! - меняет результат логической операции на противоположный. Т.е. если результат равен true (любое число, не равное 0), то с ! перед ним он принимает значение false (ноль), если значение false (0), то результат принимает значение true (обычно компилятор использует значение 1).

P.S. Может, все-таки рано еще с 1 wire разбираться? Мож че попроще освоить для начала? Русский язык, например.. ;) бИгИмот.. ))
Последний раз редактировалось Pink-Pank Пт авг 22, 2014 17:54:36, всего редактировалось 1 раз.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Родился
Сообщения: 2
Зарегистрирован: Пт авг 22, 2014 17:12:03

Сообщение Kot_Bigimot »

Спасибо !!!!!

Kot_Bigimot а где тут хоть одна русская буква??????
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

uint8_t onewire_skip() {
if (!onewire_reset()) // Функция onewire_reset() возвращает "0" или "1" не понятен прием со знаком неравенства (!onewire_reset())
return 0;
onewire_send(0xCC); // и непонятно как происходит ветвление где else ??????
return 1;
}
"!" - логическая инверсия, про нее уже написали выше. На будущее - не путайте ее с побитовой инверсией - "~".

При выполнении конструкции return выполнение функции завершается, так что если if в вашем примере выполнится, то все, что в этой функции дальше строчки с return 0, не выполнится. Так что else тут можно пропустить.

По идее, смысл этого кода в том, что если устройство на шине обнаружено (onewire_reset()), он посылает устройству сигнал игнорировать адрес (для доступа ко многим устройствам одновременно или для упрощения, если на шине всего одно устройство) и возвращает 1. Если устройства нет, просто возвращает 0. Инверсия возвращаемого значения onewire_reset() видимо связана с особенностями реализации этой функции.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»