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

 
 
> Вопрос к знатокам С.
demiurg_spb
сообщение Oct 20 2008, 16:04
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Возник тут вопрос.
Кусочек программы можно написать двумя способами,
но с одним и тем же правильным результатом (компилятор avr-gcc 4.1.2).
Вопрос: это можно взять на вооружение?
И что стандарт может нам сказать по этому поводу?
Спасибо.
Код
//============================================
    unsigned char temp;

    temp = *uart->pUDR;   // Очищаем буфер 3-его уровня.
    temp = *uart->pUDR;  
    temp = *uart->pUDR;  

//============================================
    *uart->pUDR;   // Очищаем буфер 3-его уровня.
    *uart->pUDR;  
    *uart->pUDR;


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Oct 21 2008, 17:01
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Без финтов - это отлично, но!!! - очень непривычно. Чтение из переменной очевидно, когда оно стоит справа от знака присваивания. И когда этот знак опущен это и вызывает недоумение и неприятие.

Я думаю, если бы разместить где-нибудь на форумах вопрос типа: "Что означает выражение для переменной volatile int x?: x;"

абсолютное большинство ответит неправильно. Посему, учитывая, что всех не переучишь, и почти все люди работают в коллективах, я бы именно из этих соображений оставил бы: int temp = x;.

Коллеге zltigo респект за неординарный подход. Тем более, что почти аналогичное использование чтения переменной, например, в while(x) ни у кого вопросов не вызвало бы.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 21 2008, 20:38
Сообщение #3


Гуру
******

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



Цитата(sergeeff @ Oct 21 2008, 20:01) *
Чтение из переменной очевидно, когда оно стоит справа от знака присваивания.
К слову: совершенно неочевидно, что занесение значения в переменную слева от знака присваивания является лишь побочным эффектом опрератора "=", но это так и есть.
Цитата(scifi @ Oct 21 2008, 20:42) *
1) Согласно стандарту языка для чтения volatile переменной var достаточно написать
Код
var;

Кому интересно, могу подкрепить это цитатами из стандарта.
Очень интересно. ИАР для АРМов, версии 4.30 точно (более старшие не проверял), с легкостью выкидывает такие обращения. ReAl объяснил это мутностью стандарта в этой части. Самому искать было лень. Но раз вы предлагаете найти - с удовольствием почитаю цитаты.
Цитата(scifi @ Oct 21 2008, 20:42) *
- бороться с предупреждениями компилятора при присваивании вспомогательной переменной
Код
dummy = var;
Все встречавшиеся мне компиляторы убирали предупреждение при добавлении строчки dummy = dummy;


--------------------
На любой вопрос даю любой ответ
"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
ReAl
сообщение Nov 10 2008, 11:49
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Сергей Борщ @ Oct 21 2008, 22:38) *
ReAl объяснил это мутностью стандарта в этой части. Самому искать было лень.
Ой, не помню... Кажется, разночтение было на тему - обязательно ли в цепочке
Код
int a;
volatile int v;
a = v = 0;
для записи в a зачитывать из v. Согласно стандарту значением присваивающего выражения есть значение, которое будет записано в левую часть после присваивания.
Я утверждал, что в случае volatile-переменной значение неизвестно и нужно перезачитать.
Но какой-то компилятор радостно в таком случае явно писал нули во все переменные, что на мой взгляд неправильно. В каком-то обсуждении (RU.C-CPP или ещё где-то) было сказано, что смысл строки стандарта не "что там будет сидеть после записи", а "что туда будет записано", а это не зависит от volatile-ности. Я не стал разбираться дальше, "юридический английский" у меня не настолько... :-(
Впрочем, поскольку я всё равно был уверен, что надо перезачитывать, я всё равно не использовал значение присваивающего выражения, если в левой части volatile, так как это снижает читаемость - глаз воспринимает как значение правую часть, а реально будет прочитанное из левой.
т.е. не использовал while( (volatile_var = var) ), function( volatile_var = var), return (volatile_var = var);

Однако считаю, что в случае отдельно стоящей volatile-переменной в духе
Код
UDR;
компилятор должен провести все действия, необходимые для вычисления выражения (в данном случае только прочесть переменую, в случае с UDR+1; - прочесть и прибавить единицу), а только потом обнаружить, что результат-то никому не нужен и начать оптимизатором "отматывать" назад ненужные действия - пока не упрётся в запрет, поставленный квалификатором volatile. Т.е. чтение volatile-переменной должно остаться. Если какой-то компилятор этого не делает (это тоже, кажется, где-то в аське обсуждалось), то надо внимательно ещё раз прочесть стандарт и попытаться поругаться.



Цитата(sergeeff @ Oct 21 2008, 19:01) *
Без финтов - это отлично, но!!! - очень непривычно. Чтение из переменной очевидно, когда оно стоит справа от знака присваивания. И когда этот знак опущен это и вызывает недоумение и неприятие.
А многие не понимают указателей.
А у многих вызывает недоумение запись
Код
value = ( flag ? sin : cos)(x);

несмотря на то, что она, на мой взгялд, гораздо более читабельна, чем алгол-68
Код
value := if flag then sin else cos fi (x)


Если из С повыбрасывать всё то, что вызывает недоумение у новичков, то что останется?

Цитата(sergeeff @ Oct 21 2008, 19:01) *
Код
volatile int x;
...
    x ? : x;
Прочесть x, если он равен нулю - прочесть его ещё раз. С прочитанными значениями больше ничего не делать.

Цитата(sergeeff @ Oct 21 2008, 19:01) *
Коллеге zltigo респект за неординарный подход.
Подход правильный, называется "знать инструмент, которым пользуешся".


Цитата(scifi @ Oct 21 2008, 19:42) *
Итак, итоги:
...
2) Очевидно, что такой код не проходит тест "даже моя бабушка поймёт, что это значит". Другими словами, читаемость кода страдает.
Читаемость кода завиит от подготовки читающего. Так можно дойти и до "отмены" ++ и переходу от ++i к i = i + 1; (во всяком случае побыстрее запретить применение i++, так как это вообще непонятно).
Вменяемый человек, наткнувшись первый раз, при помощи стандарта либо более опытных товарищей разберётся и дальше для него читаемость будет нормальная.

Цитата(Сергей Борщ @ Oct 21 2008, 22:59) *
На строку с комментарием предупреждение: Warning[Pe174]: expression has no effect D:\Projects\Req\scmRTOS\Samples\LPC2xxx\1-EventFlag\Src\main.cpp 108
Странно...
Всё-таки странно.
Может всё-же пройтись ещё по стандарту и попробовать с ними поругаться?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Nov 11 2008, 10:56
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Код
  volatile int x;
  x ? : x;


IAR AVR 4.12 выдает ошибки
Error[Pe029]: expected an expression
Error[Pe053]: expected a ":"

Как к этому относится с учетом вышесказанного?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 11 2008, 11:13
Сообщение #6


Гуру
******

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



Цитата(VladimirYU @ Nov 11 2008, 13:56) *
Как к этому относится с учетом вышесказанного?

Правильно ругается: стандарт не предусматривает выбрасывания операндов из :?.

Можно написать так:
Код
  volatile int x;
  x ? 0 : x;
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Nov 11 2008, 11:42
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(aaarrr @ Nov 11 2008, 15:13) *
Можно написать так:
Код
  volatile int x;
  x ? 0 : x;


Все правильно, но вот конструкция, например
Код
char tmp = SPSR; // tmp далее не исп.;

генерит код чтения регистра а просто
Код
SPSR;

нет.
М.б. все таки "тупое" явное чтение в переменную более надежно,
чем варианты предлагаемые гуру.
IAR 4.12 оптимизация отключена.


Цитата(Непомнящий Евгений @ Nov 11 2008, 15:23) *

Спасибо a14.gif
Может и не убедительный, но все же аргумент в пользу "тупых" конструкций.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 11 2008, 11:43
Сообщение #8


Гуру
******

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



Цитата(VladimirYU @ Nov 11 2008, 14:42) *
Все правильно, но вот конструкция, например
Код
char tmp = SPSR; // tmp далее не исп.;

генерит код чтения регистра а просто
Код
SPSR;

нет.

Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Nov 11 2008, 11:57
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(aaarrr @ Nov 11 2008, 15:43) *
Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг.

SPSR это регистр статуса SPI, все I/O регистры описаны в .h как VOLATILE
компилятор отнюдь не старый, проверил на IAR AVR 5.10 то же самое.
Может быть из-за моей неграмотности, но я так и не понял это все же баг
компилятора, или если данная форма отдана стандартом на реализацию, тогда фитча.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 11 2008, 13:31
Сообщение #10


Гуру
******

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



Цитата(VladimirYU @ Nov 11 2008, 14:57) *
SPSR это регистр статуса SPI, все I/O регистры описаны в .h как VOLATILE

Они там описаны как __io union, никаких volatile в помине нет.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Nov 11 2008, 13:46
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(aaarrr @ Nov 11 2008, 16:31) *
Они там описаны как __io union, никаких volatile в помине нет.


Цитата
__io Controls the storage of data objects in I/O memory space, alternatively data memory
space.
The __io memory attribute implies that objects are __no_init and volatile, and allows
objects to be accessed by use of the special I/O instructions in the AVR microcontroller.
Your application may access the AVR I/O system by using the memory-mapped internal
special function registers (SFRs). To access the AVR I/O system efficiently, the __io
memory attribute should be included in the code.
Address range Max object size Pointer size Memory space
0-0x3F 4 bytes (32 bits) Pointers not allowed I/O
0x60-0xFF 4 bytes (32 bits) Pointers not allowed Data
Table 64: I/O address ranges
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- demiurg_spb   Вопрос к знатокам С.   Oct 20 2008, 16:04
- - zltigo   Цитата(demiurg_spb @ Oct 20 2008, 18:04) ...   Oct 20 2008, 16:17
|- - sergeeff   Цитата(zltigo @ Oct 20 2008, 20:17) Поско...   Oct 21 2008, 15:08
|- - sonycman   Цитата(zltigo @ Oct 20 2008, 20:17) Поско...   Jan 4 2009, 11:12
|- - zltigo   Цитата(sonycman @ Jan 4 2009, 14:12) Как ...   Jan 4 2009, 14:31
|- - sonycman   Цитата(zltigo @ Jan 4 2009, 18:31) Что-то...   Jan 4 2009, 15:42
|- - zltigo   Цитата(sonycman @ Jan 4 2009, 18:42) чтоб...   Jan 4 2009, 16:05
|- - GetSmart   Цитата(sonycman @ Jan 4 2009, 21:42) Попр...   Jan 4 2009, 16:22
|- - zltigo   Цитата(GetSmart @ Jan 4 2009, 19:22) но т...   Jan 4 2009, 16:27
|- - GetSmart   Цитата(zltigo @ Jan 4 2009, 22:27) С чего...   Jan 4 2009, 17:05
|- - zltigo   Цитата(GetSmart @ Jan 4 2009, 20:05) то в...   Jan 4 2009, 17:49
|- - Сергей Борщ   Цитата(GetSmart @ Jan 4 2009, 19:05) Если...   Jan 4 2009, 19:00
|- - sonycman   Цитата(Сергей Борщ @ Jan 4 2009, 23:00) Т...   Jan 4 2009, 20:18
- - scifi   Спасибо за подсказку. Я, по незнанию, наверное, вс...   Oct 20 2008, 17:27
|- - demiurg_spb   Цитата(scifi @ Oct 20 2008, 21:27) Спасиб...   Oct 20 2008, 18:05
|- - zltigo   Цитата(scifi @ Oct 20 2008, 19:27) ...но ...   Oct 20 2008, 18:17
|- - scifi   Цитата(zltigo @ Oct 20 2008, 22:17) 1.Упо...   Oct 20 2008, 18:35
|- - zltigo   Цитата(scifi @ Oct 20 2008, 20:35) Контрп...   Oct 20 2008, 19:11
|- - scifi   Цитата(zltigo @ Oct 20 2008, 22:17) 1.Упо...   Oct 20 2008, 19:34
|- - demiurg_spb   Цитата(scifi @ Oct 20 2008, 23:34) Я запу...   Oct 20 2008, 19:53
- - zltigo   Цитата(demiurg_spb @ Oct 20 2008, 21:53) ...   Oct 21 2008, 15:57
|- - aaarrr   Цитата(sergeeff @ Oct 21 2008, 21:01) Кол...   Oct 21 2008, 17:06
|- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 22:38) ...   Oct 21 2008, 20:42
||- - Сергей Борщ   Цитата(zltigo @ Oct 21 2008, 23:42) Любой...   Oct 21 2008, 20:46
|- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 22:38) ...   Oct 21 2008, 20:51
||- - Сергей Борщ   Цитата(zltigo @ Oct 21 2008, 23:51) Не ст...   Oct 21 2008, 20:59
|||- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 22:59) ...   Oct 21 2008, 21:19
|||- - demiurg_spb   Попробовал на древнем: Цитата# IAR Atmel AVR C/EC+...   Oct 21 2008, 21:34
|||- - Сергей Борщ   Цитата(zltigo @ Oct 22 2008, 00:19) Это т...   Oct 21 2008, 21:38
|||- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 23:38) ...   Oct 21 2008, 21:53
|||- - Сергей Борщ   Цитата(zltigo @ Oct 22 2008, 00:50) Тем н...   Oct 21 2008, 21:55
|||- - zltigo   Цитата(Сергей Борщ @ Oct 21 2008, 23:55) ...   Oct 21 2008, 22:02
||- - Непомнящий Евгений   Цитата(zltigo @ Oct 22 2008, 00:51) Одноз...   Oct 22 2008, 04:41
||- - IgorKossak   Цитата(Непомнящий Евгений @ Oct 22 2008, 07...   Oct 22 2008, 05:53
||- - zltigo   Цитата(Непомнящий Евгений @ Oct 22 2008, 06...   Oct 22 2008, 06:40
|- - IgorKossak   Цитата(ReAl @ Nov 10 2008, 13:49) Однако ...   Nov 11 2008, 10:09
||- - ReAl   Цитата(IgorKossak @ Nov 11 2008, 12:09) Т...   Nov 11 2008, 13:17
|||- - aaarrr   Цитата(VladimirYU @ Nov 11 2008, 14:57) к...   Nov 11 2008, 12:02
||||- - VladimirYU   Цитата(aaarrr @ Nov 11 2008, 16:02) Листи...   Nov 11 2008, 12:17
|||- - VladimirYU   Цитата(aaarrr @ Nov 11 2008, 16:31) Они т...   Nov 11 2008, 13:43
||||- - aaarrr   Цитата(VladimirYU @ Nov 11 2008, 16:43) Р...   Nov 11 2008, 13:51
|||- - ReAl   Цитата(aaarrr @ Nov 11 2008, 15:31) Они т...   Nov 11 2008, 13:46
||||- - VladimirYU   Цитата(ReAl @ Nov 11 2008, 16:46) Может г...   Nov 11 2008, 13:59
||||- - Сергей Борщ   Цитата(VladimirYU @ Nov 11 2008, 16:59) Т...   Nov 11 2008, 14:05
||||- - aaarrr   Цитата(Сергей Борщ @ Nov 11 2008, 17:05) ...   Nov 11 2008, 14:10
||||- - VladimirYU   Цитата(Сергей Борщ @ Nov 11 2008, 17:05) ...   Nov 11 2008, 14:24
||- - ReAl   Цитата(VladimirYU @ Nov 11 2008, 13:42) В...   Nov 11 2008, 13:42
|- - Непомнящий Евгений   Цитата(VladimirYU @ Nov 11 2008, 14:56) К...   Nov 11 2008, 11:23
|- - zltigo   Цитата(Непомнящий Евгений @ Nov 11 2008, 14...   Nov 11 2008, 12:19
|- - aaarrr   Цитата(zltigo @ Nov 11 2008, 15:19) Это в...   Nov 11 2008, 12:22
||- - zltigo   Цитата(aaarrr @ Nov 11 2008, 15:22) Тогда...   Nov 11 2008, 12:27
|- - VladimirYU   Цитата(zltigo @ Nov 11 2008, 16:19) Это в...   Nov 11 2008, 12:26
- - scifi   Итак, итоги: 1) Согласно стандарту языка для чтени...   Oct 21 2008, 17:42
|- - zltigo   Цитата(scifi @ Oct 21 2008, 19:42) Другим...   Oct 21 2008, 17:52
- - ARV   а, простите, разве писать читаемый всеми код - это...   Nov 11 2008, 11:13
|- - aaarrr   Цитата(ARV @ Nov 11 2008, 14:13) Кодuchar...   Nov 11 2008, 11:15
|- - ARV   Цитата(aaarrr @ Nov 11 2008, 14:15) Ворни...   Nov 11 2008, 17:32
|- - aaarrr   Цитата(ARV @ Nov 11 2008, 20:18) возможно...   Nov 11 2008, 17:39
|- - ReAl   Цитата(ARV @ Nov 11 2008, 19:32) возможно...   Nov 11 2008, 18:53
- - aaarrr   RVCT на пропуск операнда ругается.   Nov 11 2008, 12:33
- - ARV   гм... я и не говорил, что пустой if - это норма......   Nov 11 2008, 20:02
|- - defunct   Цитата(ARV @ Nov 11 2008, 22:02) практика...   Dec 25 2008, 00:06
|- - zltigo   Цитата(defunct @ Dec 25 2008, 03:06) С ка...   Dec 25 2008, 08:21
|- - HARMHARM   Цитата(zltigo @ Dec 25 2008, 10:21) Я бы ...   Dec 25 2008, 11:19
||- - zltigo   Цитата(HARMHARM @ Dec 25 2008, 14:19) Код...   Dec 25 2008, 11:42
|- - defunct   Цитата(zltigo @ Dec 25 2008, 10:21) Научи...   Dec 25 2008, 13:29
|- - zltigo   Цитата(defunct @ Dec 25 2008, 16:29) Дума...   Dec 25 2008, 14:06
|- - defunct   Цитата(zltigo @ Dec 25 2008, 16:06) Вопро...   Dec 25 2008, 15:32
|- - Сергей Борщ   Цитата(defunct @ Dec 25 2008, 17:32) if ...   Dec 25 2008, 16:09
|- - defunct   Цитата(Сергей Борщ @ Dec 25 2008, 18:09) ...   Dec 25 2008, 16:24
|- - Сергей Борщ   Цитата(defunct @ Dec 25 2008, 18:24) А пр...   Dec 25 2008, 17:09
|- - defunct   Цитата(Сергей Борщ @ Dec 25 2008, 19:09) ...   Dec 25 2008, 17:21
|- - ARV   Цитата(defunct @ Dec 25 2008, 20:21) Да в...   Dec 27 2008, 13:45
- - ReAl   Если Вам приятно в таком духе - продолжайте, утрир...   Nov 11 2008, 22:04
- - gormih   Обсуждение напоминает обсуждение кода типа Кодuns...   Nov 14 2008, 11:31
- - ARV   хочу для универсализма сделать версию функции prin...   Nov 17 2008, 15:59
|- - Сергей Борщ   Кодvoid printf_7led(char *format, ... ){ ...   Nov 17 2008, 16:24
- - ARV   большое спасибо! я вокруг чего-то похожего бро...   Nov 17 2008, 17:25
|- - ReAl   Цитата(ARV @ Nov 17 2008, 19:25) мне каже...   Dec 11 2008, 08:56
|- - ARV   Цитата(ReAl @ Dec 11 2008, 11:56) Ну избы...   Dec 12 2008, 07:09
|- - zltigo   Цитата(ARV @ Dec 12 2008, 10:09) ...сдела...   Dec 12 2008, 07:15
|- - ARV   Цитата(zltigo @ Dec 12 2008, 10:15) http:...   Dec 13 2008, 11:46
- - sonycman   В оригинальной библиотеке для STM32 квалификатор v...   Jan 4 2009, 18:30
|- - zltigo   Цитата(sonycman @ Jan 4 2009, 21:30) Но, ...   Jan 4 2009, 18:34
- - sergeeff   Я пробовал такое в MS VS2008 для ARM. Данные читаю...   Jan 4 2009, 20:36


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:39
Рейтинг@Mail.ru


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