Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Arduino. Непонятное выражение в скетче

Пт апр 27, 2018 22:40:27

Иногда в скетчах попадается вот такое:

Код:
digitalWrite(dataPin, data & 1 ? HIGH : LOW);


Что это значит, как этим пользоваться?

Re: Arduino. Непонятное выражение в скетче

Сб апр 28, 2018 00:20:15

C ternary operator

Re: Arduino. Непонятное выражение в скетче

Сб апр 28, 2018 00:28:26


Не вяжется. По смыслу функция должна последовательно выдвигать байт

Код:
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

тогда вопрос у вас в чем? Что делает digitalWrite()?

Re: Arduino. Непонятное выражение в скетче

Сб апр 28, 2018 06:53:55

...Не вяжется...


Все там вяжется, Вам 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

...Понял, спасибо.
Но вот вопрос мучает. Ведь получается, что data & 1 - это if (data & 1), но разве "&" - это оператор сравнения? В описании языка ардуины как бы и нет такого вообще.

Мучения никому не нужны. Повторюсь, 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

Операции в Си.
Побитовое И два слагаемых собираются по И. Например 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;
}


много "конечных автоматов" на данном принципе устроено.
Последний раз редактировалось shindax Сб апр 28, 2018 14:32:37, всего редактировалось 6 раз(а).

Re: Arduino. Непонятное выражение в скетче

Сб апр 28, 2018 14:13:21

Голимый писал(а):если "А" лог.И "B"
если "А" лог.И "B" не равно нулю.

Re: Arduino. Непонятное выражение в скетче

Сб апр 28, 2018 14:29:26

Мурик писал(а):если "А" лог.И "B" не равно нулю.

Так "А" после лог.И с единицей никогда не будет равна нулю.
Ладно, я понял. Не стоит доискиваться, надо просто запомнить.

Re: Arduino. Непонятное выражение в скетче

Сб апр 28, 2018 14:37:09

...Ладно, я понял. Не стоит доискиваться, надо просто запомнить.

Так любой жизненный опыт так устроен. Есть туева хуча доказательств теоремы Пифагора. Но большинству людей достаточно получить правильный конечный результат. Цепь доказательств интересует немногих. :) В данном случае следует запомнить, что есть логическое сравнение ( &&, || ) и алгебраическое ( &, | )

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

...То ли дело строгий ассемблер.


Не бывает плохих ЯП, бывают плохие программисты. :) В холиуорах С_Vs_asm я давно уже не участвую, потому, как в теме. :)

Re: Arduino. Непонятное выражение в скетче

Сб апр 28, 2018 15:32:55

Так "А" после лог.И с единицей никогда не будет равна нулю.
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

Мурик писал(а):Не путайте И и ИЛИ

Виноват, бес попутал.
Спасибо, вопрос закрыт.
Ответить