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

 
 
> IAR 4.31 глюки с константами.
KAlex
сообщение Jun 8 2012, 12:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



В чем разница этих двух строк:
memory_cap = 0xFFFFFF - Y_SIZE;
memory_cap = 0xFFFFFF - (Y_SIZE);

Y_SIZE определен как константа в globals.h.

В листинге:
memory_cap = 0xFFFFFF - Y_SIZE;
00001F9E 2000 MOV R0, #0
00001FA0 1C05 MOV R5, R0
memory_cap = 0xFFFFFF - (Y_SIZE);
00001FA2 483F LDR R0, [PC,#0x0FC] ; [0x20A0] =0xFEACFF
00001FA4 1C05 MOV R5, R0

Или я что-то не понимаю?
IAR 4.31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
aaarrr
сообщение Jun 8 2012, 12:35
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(KAlex @ Jun 8 2012, 16:20) *
Y_SIZE определен как константа в globals.h.

Как именно определен?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 8 2012, 12:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Хм, в чём именно проблема? Никакого криминала не видно.
Кстати, листинг без контекста вообще не интересен. Фигурально выражаясь, по фотографии ушей предлагаете судить о форме носа.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 8 2012, 12:38
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (KAlex @ Jun 8 2012, 15:20) *
Y_SIZE определен как константа в globals.h.
Покажите определение. Есть подозрение, что он определен как выражение, которое без этих дополнительных скобок дает в результате ноль, а со скобками- какое-то число, которое не может быть предлставлено как 8-битная константа со сдвигом. И если это так - то на будущее, заключайте такие выражения в скобки прямо в #define, дабы избежать подобных сюрпризов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KAlex
сообщение Jun 8 2012, 12:41
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



А это имеет значение?
Вообще то достаточно заковыристо определен.

#define G_PAGE_SIZE_HI 169
#define R_PAGE_SIZE_HI 85
#define B_PAGE_SIZE_HI 85

#define FULL_FRAME_HC G_PAGE_SIZE_HI + R_PAGE_SIZE_HI + B_PAGE_SIZE_HI
#define FULL_FRAME FULL_FRAME_HC << 9

#define Y_SIZE FULL_FRAME >> 1

ЗЫ. Под отладчиком значение константы показывается правильное.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 8 2012, 12:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(KAlex @ Jun 8 2012, 16:41) *
А это имеет значение?

Семён Семёныч! Конечно имеет. На досуге проанализируйте, как это работает.
Вот почему все твердят, что макрос должен быть завёрнут в скобки.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Jun 8 2012, 12:50
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(scifi @ Jun 8 2012, 16:37) *
Хм, в чём именно проблема? Никакого криминала не видно.

В первом случае memory_cap = 0 получается, вот криминал.

Цитата(scifi @ Jun 8 2012, 16:43) *
Вот почему все твердят, что макрос должен быть завёрнут в скобки.


Но почему только когда я вычитаю константу такая фигня происходит?
memory_cap *= Y_SIZE; - вот это работает правильно, несмотря на отсутствие скобок.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 8 2012, 12:56
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Чтобы не было разночтений, делать надо так:

Код
#define   G_PAGE_SIZE_HI 169
#define   R_PAGE_SIZE_HI 85
#define   B_PAGE_SIZE_HI 85

#define   FULL_FRAME_HC  (G_PAGE_SIZE_HI + R_PAGE_SIZE_HI + B_PAGE_SIZE_HI)
#define   FULL_FRAME     (FULL_FRAME_HC << 9)

#define   Y_SIZE         (FULL_FRAME >> 1)


Цитата(KAlex @ Jun 8 2012, 16:41) *
ЗЫ. Под отладчиком значение константы показывается правильное.

Подозреваю, что отладчик не совсем верно интерпретирует макросы. Макросы - это текстовые подстановки, со всеми вытекающими феерическими последствиями при их неправильном применении. Отсюда и требование ставить скобки в макросах.

Цитата(KAlex @ Jun 8 2012, 16:50) *
Но почему только когда я вычитаю константу такая фигня происходит?
memory_cap *= Y_SIZE; - вот это работает правильно, несмотря на отсутствие скобок.

У операций '-' и '*=' разные приоритеты. Поэтому и неправильно применённые макросы дают любопытные результаты. Распишите полностью результат текстовой подстановки препроцессора (или просто посмотрите в листинг препроцессора) и сделайте вычисления руками с полным учётом приоритетов операций. Впечатления останутся надолго.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 8 2012, 21:11
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (KAlex @ Jun 8 2012, 15:41) *
А это имеет значение?
А вы наберите в виндовом калькуляторе 2+2*2, получИте 8, потом вычислите результат этого выражения используя школьные правила арифметики и обдумайте полученные результаты.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 9 2012, 06:25
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Сергей Борщ @ Jun 9 2012, 00:11) *
А вы наберите в виндовом калькуляторе 2+2*2, получИте 8,
Только калькулятор должен быть в «обычном« режиме, квадратный с малым числом кнопок.
В «инженерном» покажет 6. А в «обычном» он имитирует поведение простейшего настольного калькулятора.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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