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

 
 
> Косяк у Кейла, Препроцессор не следит за скобками
ViKo
сообщение Aug 28 2015, 11:21
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Делаю функцию программной задержки. (Длинная не нужна, естественно, но вопрос уже академический, захотел дойти до предела.) Каждый цикл выполняется за 4 такта, отсюда и деление на 4000. Нюансы не интересны, не в этом дело.

Код
#define SYSCLK        48000000ULL
#define _NS    1
#define _US    1000
#define _MS    1000000
#define _SS    1000000000

#define DELAY(VALUE, UNIT);    \
  /* DelayFourCycles(VALUE * UNIT * (SYSCLK / 1000000) / 4000); */ \
  DelayFourCycles((SYSCLK / 1000000) * VALUE * UNIT / 4000);

  DELAY(50, _SS);


Так вот, когда сделал, как в закомментированной строке, Кейл ругается на то, что число не влазит в int. И загружает в функцию абы что. Если же сделать, как в строке без комментария, то все вычисляется правильно. Выходит, Кейл видит что последовательность операций равнозначна, что со скобками, что без, и лихо их отбрасывает. Возникает переполнение. Хотя не понятно, отчего возникает, 64 битов должно хватать (на компьютерном калькуляторе хватает). Как будто у Кейла не 64-битовое вычисление, а меньшее.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kabdim
сообщение Aug 28 2015, 12:12
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Если говорить про стиль макрописания. То как только в макросе возникает символ "\" руки должны автоматически выводить
Код
do { \
<тело макроса> \
} while (0)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2015, 14:46
Сообщение #3


Гуру
******

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



QUOTE (Kabdim @ Aug 28 2015, 15:12) *
Если говорить про стиль макрописания. То как только в макросе возникает символ "\" руки должны автоматически выводить
CODE
do { \
<тело макроса> \
} while (0)

Сюрприз!
Вообще-то именно "\" НУ СОВСЕМ НИКАКОГО отношения не имеет к необходимости использования трюка do{}while(0)
Почему - подумайте самостоятельно.
Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности большинство компиляторописателей забили на предупреждение sad.gif



QUOTE (Golikov A. @ Aug 28 2015, 17:26) *
Это руководство к действию или описание происходящего?
Что - то как то странно звучит....

Это K&R, так-что это Ваш вопрос как-то странно звучит sm.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 28 2015, 18:51
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(zltigo @ Aug 28 2015, 17:46) *
....
Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности большинство компиляторописателей забили на предупреждение sad.gif
....

Что-то задело меня это безапелляционное утверждение.

Для Си-программистов встраиваемых систем группа "энтузиастов" из индустрии разработала стандарт "MISRA C".
Приведу небольшую выдержку из стандарта редакции 2004 года.

Цитата
Rule 19.4 (required): C macros shall only expand to a braced initialiser, a constant,
a string literal, a parenthesised expression, a type qualifier, a
storage class specifier, or a do-while-zero construct.
[Koenig 82–84]
These are the only permitted uses of macros. Storage class specifiers and type qualifiers include
keywords such as extern, static and const. Any other use of #define could lead to unexpected
behaviour when substitution is made, or to very hard-to-read code.
In particular macros shall not be used to define statements or parts of statements except the use
of the do-while construct. Nor shall macros redefine the syntax of the language. All brackets of
whatever type ( ) { } [ ] in the macro replacement list shall be balanced.
The do-while-zero construct (see example below) is the only permitted mechanism for having
complete statements in a macro body. The do-while-zero construct is used to wrap a series of one
or more statements and ensure correct behaviour. Note: the semicolon must be omitted from the
end of the macro body.
For example:
Код
/* The following are compliant */
#define PI 3.14159F /* Constant */
#define XSTAL 10000000 /* Constant */
#define CLOCK (XSTAL/16) /* Constant expression */
#define PLUS2(X) ((X) + 2) /* Macro expanding to expression */
#define STOR extern /* storage class specifier */
#define INIT(value){ (value), 0, 0} /* braced initialiser */
#define CAT (PI) /* parenthesised expression */
#define FILE_A "filename.h" /* string literal */
#define READ_TIME_32() \
do { \
    DISABLE_INTERRUPTS (); \
    time_now = (uint32_t)TIMER_HI << 16; \
    time_now = time_now | (uint32_t)TIMER_LO; \
    ENABLE_INTERRUPTS (); \
} while (0) /* example of do-while-zero */
/* the following are NOT compliant */
#define int32_t long /* use typedef instead */
#define STARTIF if( /* unbalanced () and language redefinition */
#define CAT PI /* non-parenthesised expression */


Так что если заниматься программированием для встраиваемых систем, такая нотация макросов является не только "допустимой", но и обязательной (с точки зрения MISRA C).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2015, 18:55
Сообщение #5


Гуру
******

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



QUOTE (Petka @ Aug 28 2015, 21:51) *
Так что если заниматься программированием для встраиваемых систем, такая нотация макросов является не только "допустимой", но и обязательной (с точки зрения MISRA C).

Это просто борьба с потенциальной ошибкой, котороая ДЕЙСТВИТЕЛЬНО имеет очень большую вероятность быть сделанной. Вот по этой причине и пошли на соглащение, что тут уж все способы хороши.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Petka
сообщение Aug 28 2015, 19:13
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(zltigo @ Aug 28 2015, 21:55) *
Это просто борьба с потенциальной ошибкой, котороая ДЕЙСТВИТЕЛЬНО имеет очень большую вероятность быть сделанной. Вот по этой причине и пошли на соглащение, что тут уж все способы хороши.

1) С точки зрения стандарта Си конструкция do-while-zero не является "Implementation-Defined Behavior", "Undefined behavior" или пр. Так что поводов "давать по рукам" программисту никаких нет.
2) Уважаемый Вами инструмент от "IAR Systems" имеет возможность проверять в том числе и правила "MISRA C". Было бы забавно наблюдать что на единственно возможную конструкцию согласно правилам "MISRA C" транслятор при проверке будет выдавать предупреждение. smile3046.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   Косяк у Кейла   Aug 28 2015, 11:21
- - aaarrr   В макросе не хватает скобок для VALUE и UNIT.   Aug 28 2015, 11:44
- - den_po   Цитата(ViKo @ Aug 28 2015, 16:21) Как буд...   Aug 28 2015, 11:51
- - ViKo   Заменил #define _NS 1ULL #define _US 1000ULL #defi...   Aug 28 2015, 12:00
|- - aaarrr   Цитата(ViKo @ Aug 28 2015, 15:00) "Н...   Aug 28 2015, 12:08
|- - ViKo   Цитата(aaarrr @ Aug 28 2015, 15:08) Прост...   Aug 28 2015, 12:13
- - Kabdim   Кмк объяснение другое. VALUE * UNIT * (SYSCLK / 10...   Aug 28 2015, 12:01
|- - ViKo   Цитата(Kabdim @ Aug 28 2015, 15:01) Кмк о...   Aug 28 2015, 12:04
|- - aaarrr   Цитата(zltigo @ Aug 28 2015, 17:46) Да и ...   Aug 28 2015, 14:57
||- - zltigo   QUOTE (aaarrr @ Aug 28 2015, 17:57) В чем...   Aug 28 2015, 15:02
||- - scifi   Цитата(zltigo @ Aug 28 2015, 18:02) В бес...   Aug 28 2015, 15:13
- - Mihey_K   ЦитатаСначала любые операнды типа CHAR или SHORT п...   Aug 28 2015, 13:47
- - Golikov A.   ЦитатаСначала любые операнды типа CHAR или SHORT п...   Aug 28 2015, 14:26
- - Kabdim   Огласите пожалуйста решение лучше. Думаю многим бы...   Aug 28 2015, 15:16
|- - zltigo   QUOTE (Kabdim @ Aug 28 2015, 18:16) Оглас...   Aug 28 2015, 16:17
|- - aaarrr   Цитата(zltigo @ Aug 28 2015, 19:17) Бессм...   Aug 28 2015, 17:31
||- - zltigo   QUOTE (aaarrr @ Aug 28 2015, 20:31) Тогда...   Aug 28 2015, 18:05
||- - aaarrr   Цитата(zltigo @ Aug 28 2015, 21:03) Это е...   Aug 28 2015, 18:06
|||- - zltigo   QUOTE (aaarrr @ Aug 28 2015, 21:06) Да ну...   Aug 28 2015, 18:12
|||- - aaarrr   Цитата(zltigo @ Aug 28 2015, 21:12) Да, э...   Aug 28 2015, 18:41
||||- - zltigo   QUOTE (aaarrr @ Aug 28 2015, 21:41) Но по...   Aug 28 2015, 18:50
||||- - scifi   Цитата(zltigo @ Aug 28 2015, 21:50) Ну ин...   Aug 28 2015, 18:58
|||||- - zltigo   QUOTE (scifi @ Aug 28 2015, 21:58) Я вас ...   Aug 28 2015, 19:22
|||||- - Petka   Цитата(zltigo @ Aug 28 2015, 22:22) Не см...   Aug 28 2015, 19:37
||||||- - zltigo   QUOTE (Petka @ Aug 28 2015, 22:37) в конс...   Aug 28 2015, 21:43
||||||- - Petka   Цитата(zltigo @ Aug 29 2015, 00:43) Вы, о...   Aug 28 2015, 22:09
||||||- - zltigo   QUOTE (Petka @ Aug 29 2015, 01:09) Откуда...   Aug 28 2015, 23:39
|||||- - scifi   Цитата(zltigo @ Aug 28 2015, 22:22) Увы, ...   Aug 28 2015, 21:14
|||||- - zltigo   QUOTE (scifi @ Aug 29 2015, 00:14) Пардон...   Aug 28 2015, 21:32
|||||- - scifi   Цитата(zltigo @ Aug 29 2015, 00:32) От то...   Aug 28 2015, 21:40
||||- - aaarrr   Цитата(zltigo @ Aug 28 2015, 21:50) ...ко...   Aug 28 2015, 18:59
|||- - GetSmart   Цитата(zltigo @ Aug 28 2015, 22:12) Но ко...   Aug 29 2015, 09:37
||- - gerber   Цитата(zltigo @ Aug 28 2015, 22:05) for(;...   Aug 30 2015, 09:34
||- - zltigo   QUOTE (gerber @ Aug 30 2015, 12:34) В опе...   Aug 30 2015, 10:01
|- - Kabdim   Цитата(zltigo @ Aug 28 2015, 20:17) Давай...   Aug 28 2015, 18:27
|- - zltigo   QUOTE (Kabdim @ Aug 28 2015, 21:20) Не мо...   Aug 28 2015, 18:36
|- - Kabdim   Демагогия в техническом споре... свежо! И легк...   Aug 28 2015, 18:55
- - aaarrr   Бессмысленной можно было бы признать запись while(...   Aug 28 2015, 15:18
- - Mihey_K   Сам по себе цикл с единичной итерацией да, бесмысл...   Aug 28 2015, 15:21
- - Golikov A.   вообще то, насколько я помню трюк do while(0) созд...   Aug 28 2015, 17:22
|- - zltigo   QUOTE (Golikov A. @ Aug 28 2015, 20:22) в...   Aug 29 2015, 09:53
- - scifi   Цитата(ViKo @ Aug 28 2015, 20:09) Думал, ...   Aug 28 2015, 17:39
|- - aaarrr   Цитата(scifi @ Aug 28 2015, 20:39) Да это...   Aug 28 2015, 17:51
|- - zltigo   QUOTE (scifi @ Aug 28 2015, 20:39) Да это...   Aug 28 2015, 18:09
- - ViKo   напишите for ( ; true; ), если пустота не нравится...   Aug 28 2015, 17:57
- - Golikov A.   ЦитатаСначала любые операнды типа CHAR или SHORT п...   Aug 28 2015, 18:01
|- - aaarrr   Цитата(Golikov A. @ Aug 28 2015, 21:01) я...   Aug 28 2015, 19:13
- - Golikov A.   вот я знаю пример явно ошибочного выражения Кодin...   Aug 28 2015, 18:11
- - Golikov A.   вот while(0) уже не интересно, а тезис что при выч...   Aug 28 2015, 18:46
- - Golikov A.   Цитатау K&R совершенно аналогично. Это вообще ...   Aug 29 2015, 03:34
|- - zltigo   QUOTE (Golikov A. @ Aug 29 2015, 06:34) Н...   Aug 29 2015, 06:04
- - ViKo   Что вы сцепились на пустом. Я вот ни разу не испол...   Aug 29 2015, 04:30
- - Golikov A.   ща и вам достанется.... как вы могли ни разу не ис...   Aug 29 2015, 04:52
|- - ViKo   Цитата(Golikov A. @ Aug 29 2015, 07:52) щ...   Aug 29 2015, 05:00
- - Golikov A.   ЦитатаУже писал - в стандарте нет запрета на испол...   Aug 29 2015, 06:22
|- - ViKo   Цитата(Golikov A. @ Aug 29 2015, 09:22) а...   Aug 29 2015, 07:10
|- - Сергей Борщ   Цитата(ViKo @ Aug 29 2015, 10:10) Восклиц...   Aug 29 2015, 14:55
|- - zltigo   QUOTE (Сергей Борщ @ Aug 29 2015, 17:55) ...   Aug 29 2015, 14:59
|- - ViKo   Цитата(Сергей Борщ @ Aug 29 2015, 17:55) ...   Aug 29 2015, 17:37
- - GetSmart   Цитата(zltigo @ Aug 29 2015, 13:53) Ошибк...   Aug 29 2015, 09:58
|- - zltigo   QUOTE (GetSmart @ Aug 29 2015, 12:58) Кон...   Aug 29 2015, 10:14
- - GetSmart   А разве while(1) не сам всевышний написал? Цитат...   Aug 29 2015, 10:22
|- - zltigo   QUOTE (GetSmart @ Aug 29 2015, 13:22) А р...   Aug 29 2015, 10:32
- - GetSmart   У цикла while только один аргумент - предусловие в...   Aug 29 2015, 10:43
|- - zltigo   QUOTE (GetSmart @ Aug 29 2015, 13:43) У ц...   Aug 29 2015, 11:35
|- - GetSmart   Цитата(zltigo @ Aug 29 2015, 15:35) Вот п...   Aug 29 2015, 12:08
- - aaarrr   Что касается предупреждений по поводу управляющего...   Aug 29 2015, 11:25
|- - GetSmart   Для zltigo: Качество кода ремарками не измеряется....   Aug 29 2015, 16:57
|- - zltigo   QUOTE (GetSmart @ Aug 29 2015, 19:57) Для...   Aug 29 2015, 17:29
|- - GetSmart   Цитата(zltigo @ Aug 29 2015, 21:29) Писат...   Aug 29 2015, 17:39
|- - zltigo   QUOTE (GetSmart @ Aug 29 2015, 20:39) Кри...   Aug 29 2015, 17:47
|- - ViKo   Цитата(zltigo @ Aug 29 2015, 20:47) А смы...   Aug 29 2015, 18:05
||- - zltigo   QUOTE (ViKo @ Aug 29 2015, 21:05) На то е...   Aug 29 2015, 18:07
||- - ViKo   Цитата(zltigo @ Aug 29 2015, 21:07) Повто...   Aug 29 2015, 18:14
||- - zltigo   QUOTE (ViKo @ Aug 29 2015, 21:14) Напомни...   Aug 29 2015, 18:39
||- - aaarrr   Цитата(zltigo @ Aug 29 2015, 21:39) В воп...   Aug 29 2015, 18:44
|||- - zltigo   QUOTE (aaarrr @ Aug 29 2015, 21:44) Как В...   Aug 29 2015, 19:00
||- - aaarrr   Цитата(zltigo @ Aug 29 2015, 21:39) Частн...   Aug 29 2015, 19:10
|||- - zltigo   QUOTE (aaarrr @ Aug 29 2015, 22:10) Чисто...   Aug 29 2015, 19:28
||- - GetSmart   Цитата(zltigo @ Aug 29 2015, 22:39) Не со...   Aug 29 2015, 23:04
||- - zltigo   QUOTE (GetSmart @ Aug 30 2015, 02:04) Пре...   Aug 30 2015, 07:03
||- - GetSmart   Цитата(zltigo @ Aug 30 2015, 11:03) Делен...   Aug 30 2015, 10:11
||- - zltigo   QUOTE (GetSmart @ Aug 30 2015, 13:11) Рем...   Aug 30 2015, 10:17
|- - GetSmart   Цитата(zltigo @ Aug 29 2015, 21:47) Warni...   Aug 29 2015, 18:14
- - scifi   Гы-гы. Развели мегасрач на пустом месте. Модератор...   Aug 29 2015, 11:57
- - Golikov A.   ЦитатаОшибку того, что программист получил не то, ...   Aug 29 2015, 15:42
|- - zltigo   QUOTE (Golikov A. @ Aug 29 2015, 18:42) Г...   Aug 29 2015, 16:01
|- - aaarrr   Препроцессор тут с визгом притянут за уши. Это не ...   Aug 29 2015, 16:07
|- - zltigo   QUOTE (aaarrr @ Aug 29 2015, 19:07) Препр...   Aug 29 2015, 16:20
||- - aaarrr   Цитата(zltigo @ Aug 29 2015, 19:20) Что э...   Aug 29 2015, 17:12
||- - zltigo   QUOTE (aaarrr @ Aug 29 2015, 20:12) 1 - э...   Aug 29 2015, 17:39
||- - aaarrr   Цитата(zltigo @ Aug 29 2015, 20:39) А где...   Aug 29 2015, 18:18
|- - zltigo   QUOTE (aaarrr @ Aug 29 2015, 19:07) Препр...   Aug 30 2015, 08:53
- - ViKo   Кстати, я никогда не пишу #if (0) или #if (1), а т...   Aug 29 2015, 17:40
3 страниц V   1 2 3 >


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:13
Рейтинг@Mail.ru


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