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

 
 
 
Reply to this topicStart new topic
> Странное поведение компилятора
Woodoo
сообщение Dec 22 2006, 12:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-05-05
Из: Севастополь
Пользователь №: 5 391



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

странное поведени компилятора заключаеться в неверном интерпретировании оператора пост-дикремента. Почему так происходит - непонятно.
Код
//Header file
__near __no_init volatile struct
{
    unsigned int Result;
    enum {K2 = 2, K4 = 4, K8 = 3, K16 = 4, K32 = 5, K64 = 6, K128 = 7} PS : 3;
    unsigned char IE : 1, IF : 1, FR : 1, SC : 1, EN : 1;
    enum {ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, ADC6, ADC7, VBG = 0x0E, GND = 0x0F} MUX : 4;
    unsigned char : 1, LAR : 1;
    enum {AREF = 0, AVCC = 1, Internal = 3} REF : 2;
} ADC @ 0x24;

//Source file
    ADC.MUX = 3;
    Array[ADC.MUX++] = ADC.MUX;     // почему? [3] = 4
    ADC.MUX = 4;
    Array[ADC.MUX] = ADC.MUX++;     //  [4] = 4  mux = 5 тут ок


Код составлен для тестирования. Смысла в нем искать не надо. Проблема заключаеться в том, что компилятор некоректно выполняет вторую строчку src. файла (Array[ADC.MUX++] = ADC.MUX;), в результате чего в третьем элементе массива записывается значение 4! Я уж потерял веру в Си, пока разбирался с проблемой.
Может подобное свойство - следствие использования облости ввода-вывода? НО! замена переменной ADC.MUX на DDRD(к примеру) приводит к нормальной работе: Array[3] = 3, Array[4] = 4.

при этом компиялтор, как по мне, безосновательно выругался, когда компилировал этот код:
Цитата
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement E:\Mazilla\Projects\IAR AVR ATMega8\main.c 59


Замечу вуругался на оба варианта, с ADC.MUX и с DDRD (точнее PORT.D.DIR.Value smile.gif ), но второй, повторюсь, скампилировал верно! В чем проблема?

Кстати, может кому понравится такой подход - организация регистров перефирии в смысловые структуры (ах как не хватает классов си++)? Если кто использует такой подход - поделитись опытом.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 22 2006, 13:40
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Woodoo @ Dec 22 2006, 12:30) *
Доброго времени суток!

странное поведени компилятора заключаеться в неверном интерпретировании оператора пост-дикремента. Почему так происходит - непонятно.
Код
//Header file
__near __no_init volatile struct
{
    unsigned int Result;
    enum {K2 = 2, K4 = 4, K8 = 3, K16 = 4, K32 = 5, K64 = 6, K128 = 7} PS : 3;
    unsigned char IE : 1, IF : 1, FR : 1, SC : 1, EN : 1;
    enum {ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, ADC6, ADC7, VBG = 0x0E, GND = 0x0F} MUX : 4;
    unsigned char : 1, LAR : 1;
    enum {AREF = 0, AVCC = 1, Internal = 3} REF : 2;
} ADC @ 0x24;

//Source file
    ADC.MUX = 3;
    Array[ADC.MUX++] = ADC.MUX;     // почему? [3] = 4
    ADC.MUX = 4;
    Array[ADC.MUX] = ADC.MUX++;     //  [4] = 4  mux = 5 тут ок


Код составлен для тестирования. Смысла в нем искать не надо. Проблема заключаеться в том, что компилятор некоректно выполняет вторую строчку src. файла (Array[ADC.MUX++] = ADC.MUX;), в результате чего в третьем элементе массива записывается значение 4! Я уж потерял веру в Си, пока разбирался с проблемой.
Может подобное свойство - следствие использования облости ввода-вывода? НО! замена переменной ADC.MUX на DDRD(к примеру) приводит к нормальной работе: Array[3] = 3, Array[4] = 4.

при этом компиялтор, как по мне, безосновательно выругался, когда компилировал этот код:
Цитата
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement E:\Mazilla\Projects\IAR AVR ATMega8\main.c 59


Замечу вуругался на оба варианта, с ADC.MUX и с DDRD (точнее PORT.D.DIR.Value smile.gif ), но второй, повторюсь, скампилировал верно! В чем проблема?

Кстати, может кому понравится такой подход - организация регистров перефирии в смысловые структуры (ах как не хватает классов си++)? Если кто использует такой подход - поделитись опытом.

Компилятор не выругался. Он просто сделал Вам предупреждение о том, что поведение компилятора непредсказуемо и результат может получится не тот, который Вы ожидали. Вообще, обе Ваши конструкции двусмысленны и интерпретировать их можно по-разному в зависимости от того, какая часть выражения (левая или правая) будет вычисляться первой.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Dec 22 2006, 13:58
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(Woodoo @ Dec 22 2006, 13:30) *
Код
    ADC.MUX = 3;
    Array[ADC.MUX++] = ADC.MUX;     // почему? [3] = 4


ну так вроде и должно быть 4
ADC.MUX = 3;
Array[3] = ++3;
потому как после выборки ячейки ADC.MUX инкрементируется, и только потом присваивается значению ячейки

хотя согласен с _Bill
потому как компилятор может по разному выполнять такую конструкцию.
Go to the top of the page
 
+Quote Post
Woodoo
сообщение Dec 22 2006, 14:47
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-05-05
Из: Севастополь
Пользователь №: 5 391



Уухх, разобрался.
спецификация Си не декларирует порядок выполнения посдикрементов при выполнении конструкций подобного рода. Оставляет на усмотрение компилятора. Поэтому и матерился компилятор.
Спа за ответы!
Тема закрыта. smile.gif
П'ятныця... это хорошо cheers.gif cheers.gif cheers.gif
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 22 2006, 14:48
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(&-rey @ Dec 22 2006, 13:58) *
Цитата(Woodoo @ Dec 22 2006, 13:30) *

Код
    ADC.MUX = 3;
    Array[ADC.MUX++] = ADC.MUX;     // почему? [3] = 4


ну так вроде и должно быть 4
ADC.MUX = 3;
Array[3] = ++3;
потому как после выборки ячейки ADC.MUX инкрементируется, и только потом присваивается значению ячейки

хотя согласен с _Bill
потому как компилятор может по разному выполнять такую конструкцию.

Можно просто посмотреть сгенерированный код для разных случаев. Хотя лично мне непонятно чего именно хотел получить автор.
Go to the top of the page
 
+Quote Post
Woodoo
сообщение Dec 22 2006, 15:40
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 26-05-05
Из: Севастополь
Пользователь №: 5 391



Я писал выше, что код "HAS NO EFFECT" (как любит выражаться компиляторsmile.gif ).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:51
Рейтинг@Mail.ru


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