Страница 1 из 1
Arduino. Непонятное выражение в скетче
Добавлено: Пт апр 27, 2018 22:40:27
Голимый
Иногда в скетчах попадается вот такое:
Код: Выделить всё
digitalWrite(dataPin, data & 1 ? HIGH : LOW);
Что это значит, как этим пользоваться?
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 00:20:15
arkhnchul
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 00:28:26
Голимый
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3364564#p3364564"]
C ternary operator[/uquote]
Не вяжется. По смыслу функция должна последовательно выдвигать байт
Код: Выделить всё
void t_send(byte data)
{
for (int i = 0; i < 8; i++) {
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, data & 1 ? HIGH : LOW);
data >>= 1;
digitalWrite(clockPin, HIGH);
}
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 04:18:41
arkhnchul
тогда вопрос у вас в чем? Что делает digitalWrite()?
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 06:53:55
shindax
[uquote="Голимый",url="/forum/viewtopic.php?p=3364567#p3364567"]...Не вяжется...[/uquote]
Все там вяжется, Вам arkhnchul правильную ссылку дал. Функция digitalWrite устанавливает на выводе МК (определяемым clockPin) бит данных, равный значению второго аргумента функции. В цикле, в выражении data & 1 ? HIGH : LOW выполняется проверка состояния 0-го бита переменной data и выводится HIGH, или LOW в зависимости находится в нём 1, или 0 соответственно. После выполняется data >>= 1; что есть сдвиг в нулевой бит переменной data значения очередного бита.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 11:24:46
Голимый
shindax писал(а):Все там вяжется, Вам arkhnchul правильную ссылку дал
Понял, спасибо.
Но вот вопрос мучает. Ведь получается, что data & 1 - это if (data & 1), но разве "&" - это оператор сравнения? В описании языка ардуины как бы и нет такого вообще.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 11:51:17
Мурик
Голимый писал(а):В описании языка ардуины как бы и нет такого вообще.
Разве есть язык ардуино? Еще скажите что разработчики ардуины написали свой компилятор?
В ардуине язык C++ и компилятор GCC.
По теме.
http://cppstudio.com/post/304/
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 13:36:23
shindax
[uquote="Голимый",url="/forum/viewtopic.php?p=3364797#p3364797"]...Понял, спасибо.
Но вот вопрос мучает. Ведь получается, что data & 1 - это if (data & 1), но разве "&" - это оператор сравнения? В описании языка ардуины как бы и нет такого вообще.[/uquote]
Мучения никому не нужны. Повторюсь, arkhnchul дал Вам ссылку, где Вы найдёте ответы решительно на все вопросы, касаемо языка Си. Тогда Вы уже не будете сомневаться, чем отличаются операторы & и && к примеру. data & 1 означает побитовое И переменной data c числом 0b00000001. Чувствуете разницу? Понятие "алгебра Буля" Вам говорит о чем-то? Электроникой, хотя-бы поверхностно, занимались когда-нибудь?
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 13:59:14
Голимый
shindax писал(а):Электроникой, хотя-бы поверхностно, занимались когда-нибудь?
Я пишу на ассемблере для MCS-51, и знаю что такое логические операции. Мне непонятно вот что: как логическая операция может становится условием.
Допустим,
если "А" (больше, меньше, равно, не равно и т.д) "B", тогда - что нибудь.
Понятно, нет вопросов
но, чего-то никак не въеду в ситуацию, когда условие: если "А" лог.И "B"... здесь затык.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 14:12:42
shindax
Операции в Си.
Побитовое И два слагаемых собираются по И. Например 0b000000001 & 0b00000011 на выходе будет 0b00000001, что есть побитовое И. Логическое И. Будет единица, при любом ненулевом значении. Т.Е. 0 && 1 будет 0, 0b00000001 && 0b00000010 будет 1. То же самое касается побитовом и логическом ИЛИ (| и ||), инверсии (~), отрицании (!). Для простоты картины запишите один операнд сверху, второй снизу, сложите их по И ( по ИЛИ ). В результате получите искомую величину. Либо логического характера, либо числового, если Вам это будет нужно. Для экономии памяти и логической определенности часто делается так:
Код: Выделить всё
#define STAGE ONE 0b00000001
#define STAGE TWO 0b00000010
#define STAGE THREE 0b00000100
...
unsigned char state;
...
if( state & STAGE_ONE )
{
... // действия на уровне ONE
state = 0b00000010;
...
}
if( state & STAGE_TWO )
{
... // действия на уровне TWO
state = 0b00000100;
}
if( state & STAGE_THREE )
{
... // действия на уровне THREE
state = 0;
}
много "конечных автоматов" на данном принципе устроено.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 14:13:21
Мурик
Голимый писал(а):если "А" лог.И "B"
если "А" лог.И "B" не равно нулю.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 14:29:26
Голимый
Мурик писал(а):если "А" лог.И "B" не равно нулю.
Так "А" после лог.И с единицей никогда не будет равна нулю.
Ладно, я понял. Не стоит доискиваться, надо просто запомнить.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 14:37:09
shindax
[uquote="Голимый",url="/forum/viewtopic.php?p=3364908#p3364908"]...Ладно, я понял. Не стоит доискиваться, надо просто запомнить.[/uquote]
Так любой жизненный опыт так устроен. Есть туева хуча доказательств теоремы Пифагора. Но большинству людей достаточно получить правильный конечный результат. Цепь доказательств интересует немногих.

В данном случае следует запомнить, что есть логическое сравнение ( &&, || ) и алгебраическое ( &, | )
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 15:04:34
Голимый
shindax писал(а): что есть логическое сравнение ( &&, || ) и алгебраическое ( &, | )
Кстати, вот тут (
https://www.arduino.cc/reference/en/lan ... reference/
про "&" в языке Arduino пишут что:
&
[Pointer Access Operators]
Description
Referencing is one of the features specifically for use with pointers. The ampersand operator & is used for this purpose. If x is a variable, then &x represents the address of the variable x.
Благодаря чему, "определенности" становится больше.
То ли дело строгий ассемблер.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 15:14:28
shindax
[uquote="Голимый",url="/forum/viewtopic.php?p=3364931#p3364931"]...То ли дело строгий ассемблер.[/uquote]
Не бывает плохих ЯП, бывают плохие программисты.

В холиуорах С_Vs_asm я давно уже не участвую, потому, как в теме.

Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 15:32:55
arkhnchul
[uquote="Голимый",url="/forum/viewtopic.php?p=3364908#p3364908"]Так "А" после лог.И с единицей никогда не будет равна нулю.[/uquote]A и не меняется, вычисляется результат операции.
Голимый писал(а):Благодаря чему, "определенности" становится больше.

ну да, в С/С++ местами есть зависимость от контекста.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 19:03:03
Мурик
Голимый писал(а):Так "А" после лог.И с единицей никогда не будет равна нулю.
Почему?
К примеру этой строке
Голимый писал(а):digitalWrite(dataPin, data & 1 ? HIGH : LOW);
условие будет ложно (равно 0) если 0 в нулевом бите переменной data. Не путайте И и ИЛИ.
Найдите учебник по С/С++ для начинающий и хорошо изучите язык чтобы не возникало путаницы. Или думали что ардуино это легко и просто и можно обойтись без знаний программирования?
Если Си кажется сложным, для ардуино можно писать в
BASCOM-AVR.
Re: Arduino. Непонятное выражение в скетче
Добавлено: Сб апр 28, 2018 20:05:15
Голимый
Мурик писал(а):Не путайте И и ИЛИ
Виноват, бес попутал.
Спасибо, вопрос закрыт.