|
|
  |
Вопрос к знатокам С. |
|
|
|
Nov 11 2008, 10:09
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(ReAl @ Nov 10 2008, 13:49)  Однако считаю, что в случае отдельно стоящей volatile-переменной в духе Код UDR; компилятор должен провести все действия, необходимые для вычисления выражения (в данном случае только прочесть переменую, в случае с UDR+1; - прочесть и прибавить единицу), а только потом обнаружить, что результат-то никому не нужен и начать оптимизатором "отматывать" назад ненужные действия - пока не упрётся в запрет, поставленный квалификатором volatile. Т.е. чтение volatile-переменной должно остаться. Если какой-то компилятор этого не делает (это тоже, кажется, где-то в аське обсуждалось), то надо внимательно ещё раз прочесть стандарт и попытаться поругаться. Те же самые рассуждения можно провести и в случае Код if(UDR); и результат по логике рассуждений будет тем же самым, но ошибка в случае с if не выдаётся.
|
|
|
|
|
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:13
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
а, простите, разве писать читаемый всеми код - это уже признак дурного стиля программирования? по-моему, во все времена было наоборот... и на написанный без извратов код ни один компилятор не станет ругаться... Код uchar temp = UDR; по-моему, понятно абсолютно всем, не вызывает ошибок и ворнингов, компилится в ту же самую единственную команду... P.S. Имхо, то, что язык позволяет писать конструкции, с трудом поддающиеся расшифровке "простыми смертными", еще не означает, что так писать - хорошо или круто. в русском языке много матерных оборотов, однако их использование в речи все-же осуждается... равно как и арго и т.п. сленг...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Nov 11 2008, 11:23
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(VladimirYU @ Nov 11 2008, 14:56)  Код volatile int x; x ? : x; ... Как к этому относится с учетом вышесказанного? Это расширение gcc: http://hubbard.engr.scu.edu/embedded/avr/d...ml#Conditionals
|
|
|
|
|
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, 12:17
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(aaarrr @ Nov 11 2008, 16:02)  Листинг посмотреть можно? Если "тупо" Код 10 { 11 char tmp = SPCR; \ 00000000 B10D [b]IN R16, 0x0D[/b] \ 00000002 2F20 MOV R18, R16 12 13 return; \ 00000004 E000 LDI R16, 0 \ 00000006 E010 LDI R17, 0 \ 00000008 9508 RET \ 0000000A REQUIRE _A_SPCR 14 } Если с "изыском" Код 9 int main() \ main: 10 { 11 SPCR; 12 13 return; \ 00000000 E000 LDI R16, 0 \ 00000002 E010 LDI R17, 0 \ 00000004 9508 RET 14 } Цитата(aaarrr @ Nov 11 2008, 16:02)  Листинг посмотреть можно? Еще один из обсуждавшихся вариантов: Код 9 int main() \ main: 10 { 11 [b](void)SPCR;[/b] 12 13 return; \ 00000000 E000 LDI R16, 0 \ 00000002 E010 LDI R17, 0 \ 00000004 9508 RET 14 } То же самое. Чтения нет.
|
|
|
|
|
Nov 11 2008, 12:26
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(zltigo @ Nov 11 2008, 16:19)  Это вообще просто "C" - начиная с K&R. Совершенно переносимо. Только если выражение после ? не пустое. Цитата Therefore, the expression
x ? : y has the value of x if that is nonzero; otherwise, the value of y.
This example is perfectly equivalent to
x ? x : y Евгений абсолютно прав.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|