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

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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-битовое вычисление, а меньшее.
|
|
|
|
|
 |
Ответов
|
Aug 28 2015, 12:12
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Если говорить про стиль макрописания. То как только в макросе возникает символ "\" руки должны автоматически выводить Код do { \ <тело макроса> \ } while (0)
|
|
|
|
|
Aug 28 2015, 14:46
|

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

|
QUOTE (Kabdim @ Aug 28 2015, 15:12)  Если говорить про стиль макрописания. То как только в макросе возникает символ "\" руки должны автоматически выводить CODE do { \ <тело макроса> \ } while (0) Сюрприз! Вообще-то именно "\" НУ СОВСЕМ НИКАКОГО отношения не имеет к необходимости использования трюка do{}while(0) Почему - подумайте самостоятельно. Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности большинство компиляторописателей забили на предупреждение QUOTE (Golikov A. @ Aug 28 2015, 17:26)  Это руководство к действию или описание происходящего? Что - то как то странно звучит.... Это K&R, так-что это Ваш вопрос как-то странно звучит
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 28 2015, 18:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886

|
Цитата(zltigo @ Aug 28 2015, 17:46)  .... Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности большинство компиляторописателей забили на предупреждение  .... Что-то задело меня это безапелляционное утверждение. Для Си-программистов встраиваемых систем группа "энтузиастов" из индустрии разработала стандарт "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).
|
|
|
|
Сообщений в этой теме
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 страниц
1 2 3 >
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|