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

 
 
> Странное поведение компилятора
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
 
Start new topic
Ответов
andrvisht
сообщение Dec 22 2006, 13:58
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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
_Bill
сообщение Dec 22 2006, 14:48
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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



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

 


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


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