IgorKossak 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Однако считаю, что в случае отдельно стоящей volatile-переменной в духе UDR; компилятор должен провести все действия, необходимые для вычисления выражения (в данном случае только прочесть переменую, в случае с UDR+1; - прочесть и прибавить единицу), а только потом обнаружить, что результат-то никому не нужен и начать оптимизатором "отматывать" назад ненужные действия - пока не упрётся в запрет, поставленный квалификатором volatile. Т.е. чтение volatile-переменной должно остаться. Если какой-то компилятор этого не делает (это тоже, кажется, где-то в аське обсуждалось), то надо внимательно ещё раз прочесть стандарт и попытаться поругаться. Те же самые рассуждения можно провести и в случае if(UDR); и результат по логике рассуждений будет тем же самым, но ошибка в случае с if не выдаётся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба volatile int x; x ? : x; IAR AVR 4.12 выдает ошибки Error[Pe029]: expected an expression Error[Pe053]: expected a ":" Как к этому относится с учетом вышесказанного? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Как к этому относится с учетом вышесказанного? Правильно ругается: стандарт не предусматривает выбрасывания операндов из :?. Можно написать так: volatile int x; x ? 0 : x; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба а, простите, разве писать читаемый всеми код - это уже признак дурного стиля программирования? по-моему, во все времена было наоборот... и на написанный без извратов код ни один компилятор не станет ругаться... uchar temp = UDR; по-моему, понятно абсолютно всем, не вызывает ошибок и ворнингов, компилится в ту же самую единственную команду... P.S. Имхо, то, что язык позволяет писать конструкции, с трудом поддающиеся расшифровке "простыми смертными", еще не означает, что так писать - хорошо или круто. в русском языке много матерных оборотов, однако их использование в речи все-же осуждается... равно как и арго и т.п. сленг... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба uchar temp = UDR; по-моему, понятно абсолютно всем, не вызывает ошибок и ворнингов, компилится в ту же самую единственную команду... Ворнинг выдает, т.к. temp не используется после присвоения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба volatile int x; x ? : x; ... Как к этому относится с учетом вышесказанного? Это расширение gcc: http://hubbard.engr.scu.edu/embedded/avr/d...ml#Conditionals Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Можно написать так: volatile int x; x ? 0 : x; Все правильно, но вот конструкция, например char tmp = SPSR; // tmp далее не исп.; генерит код чтения регистра а просто SPSR; нет. М.б. все таки "тупое" явное чтение в переменную более надежно, чем варианты предлагаемые гуру. IAR 4.12 оптимизация отключена. Это расширение gcc: http://hubbard.engr.scu.edu/embedded/avr/d...ml#Conditionals Спасибо :a14: Может и не убедительный, но все же аргумент в пользу "тупых" конструкций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Все правильно, но вот конструкция, например char tmp = SPSR; // tmp далее не исп.; генерит код чтения регистра а просто SPSR; нет. Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг. SPSR это регистр статуса SPI, все I/O регистры описаны в .h как VOLATILE компилятор отнюдь не старый, проверил на IAR AVR 5.10 то же самое. Может быть из-за моей неграмотности, но я так и не понял это все же баг компилятора, или если данная форма отдана стандартом на реализацию, тогда фитча. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба компилятор отнюдь не старый, проверил на IAR AVR 5.10 то же самое. Листинг посмотреть можно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Листинг посмотреть можно? Если "тупо" 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 } Листинг посмотреть можно? Еще один из обсуждавшихся вариантов: 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 } То же самое. Чтения нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Это расширение gcc: http://hubbard.engr.scu.edu/embedded/avr/d...ml#Conditionals Это вообще просто "C" - начиная с K&R. Совершенно переносимо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Это вообще просто "C" - начиная с K&R. Совершенно переносимо. Тогда почему в C99 об этом ни слова нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Это вообще просто "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 Евгений абсолютно прав. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 11 ноября, 2008 Опубликовано 11 ноября, 2008 · Жалоба Тогда почему в C99 об этом ни слова нет? Да? Могу, конечно, ошибаться :(. Но все встреченные на жизненном пути компиляторы начиная с TurboC 1.0 такое поддерживали и поддерживают. Удобно очень. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться