реклама на сайте
подробности

 
 
> STM32F207, Проверить USART_SR_RXNE и DR
ViKo
сообщение Mar 3 2015, 13:31
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Могу ли я задать вместо (сначала первое, затем второе)
if (USART3->SR & USART_SR_RXNE) {
if (USART3->DR == 24) {
Задать сразу
if (USART3->SR & USART_SR_RXNE && USART3->DR == 24) {
В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 27)
aaarrr
сообщение Mar 3 2015, 13:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Mar 3 2015, 16:31) *
В этом случае гарантии, что сначала прочитается статус, а потом данные, нет, правильно?

Нет: && всегда обрабатывается слева направо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 3 2015, 13:58
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



И его выполнение прекращается как только получен однозначный результат. Т.е. если USART3->SR & USART_SR_RXNE не равно true, то USART3->DR == 24 проверяться не будет, так как уже не влияет на результат.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:00
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(aaarrr @ Mar 3 2015, 16:45) *
Нет: && всегда обрабатывается слева направо.

То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!
А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 3 2015, 14:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



А вот не надо хитромудрый код плодить.
Написать в явном виде, и точка.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:07
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Mar 3 2015, 17:05) *
А вот не надо хитромудрый код плодить.
Написать в явном виде, и точка.

Это который? Мне второй вариант симпатичнее, меньше скобок в конце.
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 3 2015, 14:18
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(ViKo @ Mar 3 2015, 18:00) *
То есть, гарантия есть. И могу так писать? Спасибо ответившим, и Кернигану с Ричи!
А вот если бы было (a + x) - (c + d)? Там тоже попорядку? Вроде, в книжках, наоборот, обращают внимание, что никакой определенной последовательности нет.


Сначала скобочки, а потом разность


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:28
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Obam @ Mar 3 2015, 17:18) *
Сначала скобочки, а потом разность

Вопрос, какие скобочки сначала, а какие потом.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2015, 14:33
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Mar 3 2015, 17:28) *
Вопрос, какие скобочки сначала, а какие потом.

А вот тут никаких гарантий.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:42
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 3 2015, 14:53
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(ViKo @ Mar 3 2015, 18:28) *
Вопрос, какие скобочки сначала, а какие потом.


(a + x) - (c + d) переменные все разные => всё равно


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2015, 14:56
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Mar 3 2015, 17:42) *
Для полного просветления: а если я возьму проверку DR в скобки, во втором варианте? Все равно пойдет слева направо?

Все равно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 14:58
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Obam @ Mar 3 2015, 17:53) *
(a + x) - (c + d) переменные все разные => всё равно

Представьте, что эти переменные обновляются в прерывании. Или это содержимое таймеров. Портов. Volatile.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 3 2015, 17:44
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

Потому что, что вам даст в какой последовательности будут выполняться скобки, если при любой последовательности у вас будут любые данные на входе?...

Вот если запрос первых данных, как то меняет вторые, то тогда надо написать в явном виде что за чем и не придумывать.


Потому что мировой запас скобок, строчек, пробелов и переносов строки в целом не ограничен!

Я бы даже вот так
if (USART3->SR & USART_SR_RXNE && USART3->DR == 24)
не написал, потому что читать неудобно,
вот так лучше
if ((USART3->SR & USART_SR_RXNE) && (USART3->DR == 24))
а еще лучше вот так
if (
((USART3->SR & USART_SR_RXNE) != 0) && //проверяем то-то
(USART3->DR == 24) //проверяем сё-то
)

явно указанные условия и коменты повышают читаемость, ИМХО. Опять же написание явных условий еще раз заставляет их обдумать и уменьшает число ошибок вынесенных на тесты.

проверяем что флаг приемник не пуст - стоит - тут явно надо != 0
проверяем что флаг фифо переполнено - нет - тут надо == 0
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 3 2015, 19:03
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Для операторов && и || порядок вычисления операндов четко определен. Для остальных операторов - нет. Поэтому если в выражении с другими операторами более одной volatile-перменной, то многие компиляторы выдадут предупреждение о неопределенном порядке вычисления подвыражений. Дальше программист волен сам решать - положиться на случай или разбить выражение на несколько с явным порядком вычисления.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 3 2015, 19:11
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Mar 3 2015, 17:07) *
Это который? Мне второй вариант симпатичнее, меньше скобок в конце.

Аплодирую вашей эрудированности.

Цитата(ViKo @ Mar 3 2015, 17:28) *
Вопрос, какие скобочки сначала, а какие потом.

А, нет, поспешил. Аплодирую вашей самонадеянности biggrin.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 3 2015, 19:58
Сообщение #17


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||. К чему ваш сарказм? Вы тоже не с рождения обзавелись эрудицией. Вот я задал вопрос, получил ответы, поблагодарил. Обогатился знаниями.

Для Golikov A.
Как минималист, предпочитаю краткость, настолько, насколько это допустимо. Мне так проще. Комментариев к очевидным местам не пишу. У меня перед этим блоком есть пара строк комментариев, где описаны условия. Но не в виде "если флаг не равен нулю", а "если принято сообщение".
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 3 2015, 21:49
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



хорошо вам минималистам.

в каком то из контрактов у меня было требования - коменты к каждой строке...

Код
int i = 0; //параметр цикла

//пустая переменная для вычитывания FIFO UART
int dummy = dummy; //инициализируем ей-же чтобы не было варнинга


и так далее... после 3-4 лет, так и пишу коменты по привычке почти к каждой строчке... Пару раз мне помогали, но гораздо больше помогают тем кто будет поддерживать после вас.

а минимализм.... я даже не люблю
temp = cond ? 1 : 0;
а теперь еще лямда функций понаделали...
Go to the top of the page
 
+Quote Post
VAI
сообщение Mar 4 2015, 04:58
Сообщение #19


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Цитата(ViKo @ Mar 3 2015, 23:58) *
scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||.


Не занудства ради, а пользы для:
Керниган и Ричи
2.12. Старшинство и порядок вычисления


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 4 2015, 06:28
Сообщение #20


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(VAI @ Mar 4 2015, 07:58) *
Не занудства ради, а пользы для:
Керниган и Ричи
2.12. Старшинство и порядок вычисления

Там только упоминается в скобках "Исключением являются &&, ||, ?: и ','."
А для пользы в разделе 2.6 описано с примерами то, что нужно. Да, пролетело было мимо, а теперь внедрено в моск. rolleyes.gif
А у Шилдта на этот счет - ничего.

Цитата(Golikov A. @ Mar 4 2015, 00:49) *
а минимализм.... я даже не люблю
temp = cond ? 1 : 0;

А я тащусь... biggrin.gif
Код
#define WDELAY_START(US);                        \
  TIM7->PSC = ((US < 65536) ? (60 - 1) :                \
          ((US < 655360) ? (600 - 1) :                 \
          ((US < 6553600) ? (6000 - 1) : (60000 - 1))));        \
  TIM7->ARR = ((US < 65536) ? (US - 1) :                \
          ((US < 655360) ? (US / 10 - 1) :                \
          ((US < 6553600) ? (US / 100 - 1) : (US / 1000 - 1))));    \
  TIM7->EGR = TIM_EGR_UG;                        \
  TIM7->SR = 0;                                \
  TIM7->CR1 |= TIM_CR1_CEN;
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 4 2015, 06:49
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Mar 3 2015, 22:58) *
scifi, я прочитал 2 книги по С, КиР и Шилдта. Ни там, ни там я не видел описанного свойства && ||. К чему ваш сарказм?

Вот об этом и речь. Не надо писать код, для понимания которого программисту нужно лезть в справочники. Я, к примеру, не помню всю таблицу приоритетов операторов, поэтому ставлю скобки, когда есть сомнения, и другим советую.

Цитата(ViKo @ Mar 3 2015, 22:58) *
Вы тоже не с рождения обзавелись эрудицией. Вот я задал вопрос, получил ответы, поблагодарил. Обогатился знаниями.

Вообще-то последней инстанцией по этим вопросам является даже не форум, а стандарт языка.
Цитата
Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated.

Оч. рекомендую туда заглядывать.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 4 2015, 07:01
Сообщение #22


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Mar 4 2015, 09:49) *
Вот об этом и речь. Не надо писать код, для понимания которого программисту нужно лезть в справочники. Я, к примеру, не помню всю таблицу приоритетов операторов, поэтому ставлю скобки, когда есть сомнения, и другим советую.

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

Это да. Правда, там труднее копаться. Но надо.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 4 2015, 07:36
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Mar 4 2015, 10:01) *
На это я пойти не могу. Я периодически заглядываю в таблицу приоритетов, но лишних скобок не ставлю. Это противоречит моим принципам.

Тогда вам сюда. Уверен, сможете выступить очень достойно biggrin.gif

Цитата(ViKo @ Mar 4 2015, 10:01) *
Это да. Правда, там труднее копаться. Но надо.

А я привык. На любой вопрос нахожу ответ за 5 минут максимум.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 4 2015, 08:03
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(scifi @ Mar 4 2015, 08:49) *
Не надо писать код, для понимания которого программисту нужно лезть в справочники.
"Создайте программу, которой может пользоваться дурак, и только дурак захочет ей пользоваться".

Гордое звание "программист" подразумевает наличие некоторых базовых знаний. Поведение операторов языка и правила неявных приведений типов входят в эти базовые знания. Добавление в исходник излишеств вроде ==0, (a * b ) + c, комментариев к очевидным действиям только отвлекает и затрудняет понимание алгоритма.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 4 2015, 08:31
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(Сергей Борщ @ Mar 4 2015, 12:03) *
"Создайте программу, которой может пользоваться дурак, и только дурак захочет ей пользоваться".

Гордое звание "программист" подразумевает наличие некоторых базовых знаний. Поведение операторов языка и правила неявных приведений типов входят в эти базовые знания. Добавление в исходник излишеств вроде ==0, (a * b ) + c, комментариев к очевидным действиям только отвлекает и затрудняет понимание алгоритма.

Как раз сейчас читаю Макконелл"Совершенный код" и он с вами не согласен насчет излишеств.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 4 2015, 10:16
Сообщение #26


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(WHALE @ Mar 4 2015, 13:31) *
Как раз сейчас читаю Макконелл"Совершенный код" и он с вами не согласен насчет излишеств.

Я не читал эту книгу, но судя по здешним отзывам о ней, она мне уже не нравится sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 4 2015, 11:33
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Да пустое все...

если что-то лишне разжевано - это можно не читать

если чего-то не хватает, то это надо допридумывать.

Первое просто, второе сложнее... Так что энергетически выгоднее код с излишком коментов, чем с недостатком...

Скобки, структура текста и коменты, позволяет отобразить не только суть конкретной конструкции, но и ход мысли, структуру архитектуры... но это дело каждого...


Go to the top of the page
 
+Quote Post
kostyan
сообщение Mar 4 2015, 11:59
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577



Красиво структурированный читаемый код, и "только дурак" - имхо несовместимые понятия. Особенно для проектов, в которых трудятся программистов в количестве больше одного.

Сообщение отредактировал kostyan - Mar 4 2015, 12:01
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 06:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01638 секунд с 7
ELECTRONIX ©2004-2016