|
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
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, 16:17
|

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

|
QUOTE (Kabdim @ Aug 28 2015, 18:16)  Огласите пожалуйста решение лучше. Думаю многим было бы интересно на него посмотреть. Давайте все-же по порядку. То, что глупость про "\" написали поняли? QUOTE (aaarrr @ Aug 28 2015, 18:18)  Бессмысленной можно было бы признать запись while(0) {...} - тут warning был бы вполне уместен Бессмысленнен любой с константой. QUOTE в случае do {...} while(0) одна итерация будет выполнена, так что смысл остается (пусть только для помянутой обертки от макроса). Нет смысла и в этом, ибо для одной итерации достаточно {....} Так-что весь этот трюк из-за ";" и не для чего более. QUOTE (Mihey_K @ Aug 28 2015, 18:21)  там почти все макросы переносом строки, Да не имеет никкакого отношения склеивание строк к причинам использования этого трюка. ЛЮБОЙ макрос содержащий БОЛЕЕ одного выражения, хоть в одной строке, хоть в 999, проблематичен при использовании типа такого: if( ) MACRO(); Посему либо следить за тем, что-бы: if() { MACRO(); } либо трюк использовать, Либо только {}, но тогда так if() MACRO()
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 28 2015, 18:27
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(zltigo @ Aug 28 2015, 20:17)  Давайте все-же по порядку. То, что глупость про "\" написали поняли? Согласен исключительно по порядку. Вы воспользовались возможностью указать на формальную неправоту. Согласен конечно. Цитата(zltigo @ Aug 28 2015, 20:17)  Бессмысленнен любой с константой. Не могу сказать что я большой знаток стандарта C, но смутно помню что в стандарте есть определения undefined, unspecified, а вот "бессмысленного" не помню. Не могли бы вы указать где в стандарте говорится о том что цикл с константой бессмыслен? Цитата(zltigo @ Aug 28 2015, 20:17)  Нет смысла и в этом, ибо для одной итерации достаточно {....} Так-что весь этот трюк из-за ";" и не для чего более. Так подождите, есть всё таки оказывается смысл? Ну и напомню. В прошлом своём посте я попросил привести полноценную замену "бессмысленной" конструкции. Как вы верно подметили "{...}" на полноценную замену не годится.
Сообщение отредактировал Kabdim - Aug 28 2015, 18:27
|
|
|
|
|
Aug 28 2015, 18:36
|

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

|
QUOTE (Kabdim @ Aug 28 2015, 21:20)  Не могли бы вы указать где в стандарте говорится о том что цикл с константой бессмыслен? А давайте от обратного. В стандарте описаны ИМЕЮЩИЕ смысл синтаксические конструкции. Для do и while в constant expression НЕ упоминаются. Так-же в стандарте НЕ упомиается, что выражения на русском матерном с точки зрения компилятора бессмысленны. Означает-ли это, что их можно использовать и тоебовать от компилятора их понимания? QUOTE Ну и напомню. В прошлом своём посте я попросил привести полноценную замену "бессмысленной" конструкции. Как вы верно подметили "{...}" на полноценную замену не годится. Полноценной заметой является ИСПОЛЬЗОВАНИЕ фигурных скобок при ВЫЗОВЕ макроса. И в том числе по этой причине, кстати, и существует старое правило магросы большими буквами именовать. Ну а do{ }while(0) есть трюк. Обычный трюк, не всегда переносимый трюк, коих наизобретено множество.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 28 2015, 18:55
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Демагогия в техническом споре... свежо! И легко опровергаемо. Цитата(zltigo @ Aug 28 2015, 22:36)  А давайте от обратного. В стандарте описаны ИМЕЮЩИЕ смысл синтаксические конструкции. Для do и while в constant expression НЕ упоминаются. Так-же в стандарте НЕ упомиается, что выражения на русском матерном с точки зрения компилятора бессмысленны. Означает-ли это, что их можно использовать и тоебовать от компилятора их понимания? Для do и while зато упоминаются expression. А constant expression частный случай expression. Список допустимых символов для идентификаторов вполне прописан. Более того, если память меня не подводит, задекларирована максимальна длинна идентификатора. Так что требовать вы конечно можете, но исключительно для забавы. И придется освоить технику малолетних шкетов и выводить "<удалил транслит>" и тому подобное в рамках осмысленного по стандарту набора символов. Цитата(zltigo @ Aug 28 2015, 22:36)  Полноценной заметой является ИСПОЛЬЗОВАНИЕ фигурных скобок при ВЫЗОВЕ макроса. И в том числе по этой причине, кстати, и существует старое правило магросы большими буквами именовать. Ну а do{ }while(0) есть трюк. Обычный трюк, не всегда переносимый трюк, коих наизобретено множество. Ну я так понимаю что ответа по существу дождаться не получится. Но с другой стороны вы дали новую интересную тему. Уточните пожалуйста на какие платформы этот трюк непереносим? Это ведь значит что "грязный трюк" не соответствует стандарту?
Сообщение отредактировал Kabdim - Aug 28 2015, 19:02
|
|
|
|
Сообщений в этой теме
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 Kabdim Если говорить про стиль макрописания. То как тольк... Aug 28 2015, 12:12 zltigo QUOTE (Kabdim @ Aug 28 2015, 15:12) Если ... Aug 28 2015, 14:46  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  Petka Цитата(zltigo @ Aug 28 2015, 17:46) ....
... Aug 28 2015, 18:51   zltigo QUOTE (Petka @ Aug 28 2015, 21:51) Так чт... Aug 28 2015, 18:55    Petka Цитата(zltigo @ Aug 28 2015, 21:55) Это п... Aug 28 2015, 19:13 Mihey_K ЦитатаСначала любые операнды типа CHAR или SHORT п... Aug 28 2015, 13:47 Golikov A. ЦитатаСначала любые операнды типа CHAR или SHORT п... Aug 28 2015, 14:26  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 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 >
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|