|
Вопрос к знатокам С. |
|
|
|
Oct 20 2008, 16:04
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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;
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
 |
Ответов
|
Oct 21 2008, 17:01
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Без финтов - это отлично, но!!! - очень непривычно. Чтение из переменной очевидно, когда оно стоит справа от знака присваивания. И когда этот знак опущен это и вызывает недоумение и неприятие.
Я думаю, если бы разместить где-нибудь на форумах вопрос типа: "Что означает выражение для переменной volatile int x?: x;"
абсолютное большинство ответит неправильно. Посему, учитывая, что всех не переучишь, и почти все люди работают в коллективах, я бы именно из этих соображений оставил бы: int temp = x;.
Коллеге zltigo респект за неординарный подход. Тем более, что почти аналогичное использование чтения переменной, например, в while(x) ни у кого вопросов не вызвало бы.
|
|
|
|
|
Oct 21 2008, 20:38
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 10 2008, 11:49
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 Странно... Всё-таки странно. Может всё-же пройтись ещё по стандарту и попробовать с ними поругаться?
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 11 2008, 10:56
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Код volatile int x; x ? : x; IAR AVR 4.12 выдает ошибки Error[Pe029]: expected an expression Error[Pe053]: expected a ":" Как к этому относится с учетом вышесказанного?
|
|
|
|
|
Nov 11 2008, 11:13
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(VladimirYU @ Nov 11 2008, 13:56)  Как к этому относится с учетом вышесказанного? Правильно ругается: стандарт не предусматривает выбрасывания операндов из :?. Можно написать так: Код volatile int x; x ? 0 : x;
|
|
|
|
|
Nov 11 2008, 11:42
|
Местный
  
Группа: Свой
Сообщений: 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)  Спасибо Может и не убедительный, но все же аргумент в пользу "тупых" конструкций.
|
|
|
|
|
Nov 11 2008, 11:43
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(VladimirYU @ Nov 11 2008, 14:42)  Все правильно, но вот конструкция, например Код char tmp = SPSR; // tmp далее не исп.; генерит код чтения регистра а просто Код SPSR; нет. Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг.
|
|
|
|
|
Nov 11 2008, 11:57
|
Местный
  
Группа: Свой
Сообщений: 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 то же самое. Может быть из-за моей неграмотности, но я так и не понял это все же баг компилятора, или если данная форма отдана стандартом на реализацию, тогда фитча.
|
|
|
|
|
Nov 11 2008, 13:46
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|