777777 0 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры. То есть, к примеру, пишу if(Command.Data[0] == 1) { ... } а компилятор считает, что Data[0] всегда не равно 1 и поэтому выкидывает содержимое скобок. Оказывается, нужно еще и каждое поле структуры объявлять volatile! Это что, нормально? Я же саму переменную Command объявил volatile, этого мало? По стандарту так положено? Или глюк в Кейле? Изменено 12 августа, 2011 пользователем 777777 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Но ведь решение найдено и известно. Как вариант - обратитесь в техподдержку Кайла, если и смогут объяснить квалифицировано, то только там, мне кажется. Для этого надо как минимум иметь легальный Кейл. И вообще, если вам нечего ответить - стоит ли засирать форум? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Фу, грубиян. Выложите как объявляли переменную и задавайте вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба Я же саму переменную Command объявил volatile, этого мало? По стандарту так положено? Или глюк в Кейле? Значит в кале не соблюдают стандарты, по крайней мере ISO/IEC 9899:1999 6.5.2.3 Structure and union members 7 EXAMPLE 2 In: struct s { int i; const int ci; }; struct s s; const struct s cs; volatile struct s vs; the various members have the types: s.i int s.ci const int cs.i const int cs.ci const int vs.i volatile int vs.ci volatile const int Изменено 12 августа, 2011 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба Значит в кале не соблюдают стандарты, Не исключено. Но также не исключено неверное объявление. volatile struct x{ /*stuff*/ } volatile_x; struct x non_volatile_x; Изменено 12 августа, 2011 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Имеется структура, которая используется в прерывании, поэтому объявляю ее volatile. Однако компилятор выкидывает обращение к полям этой структуры. Не верю. Объявление структуры (и типа, и переменной) - в студию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Не верю. Я тоже в шоке. Объявление структуры (и типа, и переменной) - в студию. typedef struct _CCommand { u8 Length; u8 Cmd : 4; u8 Addr : 4; vu8 Data[15]; } CCommand; volatile CCommand Command; Если Data[15] объявлено как u8, то не работает. Если Command без volatile, то тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба Хм. А вот так будет работать? struct _CCommand { u8 Length; u8 Cmd : 4; u8 Addr : 4; vu8 Data[15]; }; typedef volatile struct _CCommand VS_CCommand; VS_CCommand Command; P.S.: если vu8 - это volatile unsigned char, то вместо него просто u8. P.P.S.: Но на деле похоже на Изменено 12 августа, 2011 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба ... Изменено 12 августа, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 12 августа, 2011 Опубликовано 12 августа, 2011 (изменено) · Жалоба Хм. А вот так будет работать? typedef volatile struct _CCommand VS_CCommand; VS_CCommand Command; volatile применяется к переменным, а не к объявлениям. Но я пробовал писать typedef volatile struct _CCommand { ... u8 Data[15]; } CCommand; - не помогает, хотя компилятор и не ругается. Изменено 12 августа, 2011 пользователем 777777 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Бага в компиляторе. Стандарт языка (C99 - точно) говорит, что если переменную типа структура объявить как volatile, то все поля такой структуры тоже будут volatile (раздел 6.5.2.3 Structure and union members). Update: проглядел, sasamy уже об этом сообщил. Ну бага и бага. Значит, надо применить workaround, и он уже нашёлся, как я понял. А криворуким компиляторописателям выражаем протест. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Бага в компиляторе. Звучит почти невероятно. Всякое бывает, конечно, но не верится как-то, чтобы не всплыл такой косяк. 777777, можете озвучить версию компилятора? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Сдается мне, что там дело вовсе не в volatile. Просто тыкая volatile куда не поподя удалось сломать оптимизацию компилятору настолько, что изначально мутный код что-то начал делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 12 августа, 2011 Опубликовано 12 августа, 2011 · Жалоба Если использовать typedef struct {...}, то надо сразу писать typedef volatile struct {...} type_name; и далее type_name our_struct; Или же ещё вариант: если у вас только одна такая структура, то объявите её сразу: struct { volatile ... volatile ... } our_struct; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться