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

 
 
 
Reply to this topicStart new topic
> Непонятки с volatile
Decan
сообщение Jul 6 2008, 13:54
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 29
Регистрация: 26-10-05
Из: Киев
Пользователь №: 10 128



Доброго времени суток!

Ситуация следующая:
a[b++]=c;
a,b,c имеют тип uchar volatile
компайлер ругается:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

Что у меня не так? GCC глотал на "ура"...


--------------------
Объективная реальность - есть бред, порождённый недостатком алкоголя в организме...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 6 2008, 14:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Decan @ Jul 6 2008, 15:54) *
Что у меня не так?

Черным по белому:
Цитата
the order of volatile accesses is undefined in this statement

Что не понятно? Что при безумном (подумайте зачем Вы их напихали!) количестве volatile разобраться компилятору в том, что Вы от него хотите сложно? Ну "GCC глотал" совершенно ни о чем не говорит без перечня ключей при которых его заставили замолчать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 6 2008, 20:28
Сообщение #3


Шаман
******

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



Цитата(Decan @ Jul 6 2008, 16:54) *
a[b++]=c;
a,b,c имеют тип uchar volatile

Когда столько volatile переменных в одном выражении, то порядок их вычисления неопределён, о чём и предупреждение.
Для полной определённости разбейте выражение на несколько, либо избавьтесь от неоправданных volatile.
Go to the top of the page
 
+Quote Post
navy2000
сообщение Jul 7 2008, 06:19
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 17-07-06
Пользователь №: 18 874



Компилятор все равно разобьет ваше выражение (за один такт он его несомнено не вычислит), а volatile говорит компилятору, что значение переменной может быть изменено где то в другом месте (например в прерывании), и он не понимает, в каком порядке проверять текущие значения переменных при вычислении.
Даже если бы компилятор не заругался, эта ситуация нестабильная. Если в процессе вычисления выражения произойдет прерывания и изменится одна из ваших переменных результат вычисления может быть не верным.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 8th June 2024 - 08:10
Рейтинг@Mail.ru


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