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

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

|
QUOTE (aaarrr @ Aug 28 2015, 20:31)  Тогда и любимый Вами for(;;) столь же бессмысленнен, т.к. по сути цикл с константой в управляющем выражении. АБСОЛЮТНО адекватное выражение и по этой причине является официально-страндартым вариантом для бесконечного цикла. Это есть цикл без проверки условия, а не цикл с проверкой того, что измениться не может. Неадекватным оно было-бы в виде for( ; 1 ; ) QUOTE (aaarrr @ Aug 28 2015, 20:51)  Именно. Управляющее выражение может быть константой (явной или неявной). Все это - while(1) {}, for(;;) {}, do {} while(0) - нормальные и однозначно трактуемые языковые конструкции. 1 и 3 НЕТ. Вменяемые компиляторы выдают warnig именно по причине того, что константное "управляющее выражение" бессмысленно. Отключаемый, но warning.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 28 2015, 18:06
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Aug 28 2015, 21:03)  Это есть цикл без проверки условия, а не цикл с проверкой того, что измениться не может. Да ну! А в стандарте написано, что опущенное управляющее выражение заменяется ненулевой константой: Цитата An omittedexpression-2is replaced by a nonzero constant. То есть неявно превращается в "цикл с проверкой того, что измениться не может".
|
|
|
|
|
Aug 28 2015, 18:12
|

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

|
QUOTE (aaarrr @ Aug 28 2015, 21:06)  Да ну! А в стандарте написано, что опущенное управляющее выражение заменяется ненулевой константой Да, это описано ПОВЕДЕНИЕ компилятора. Но когда компилятор видит, что в результате выражения ЕМУ ПЕРЕДАННОГО получается константа, это однозначно тревожный факт указывающий, как минимум на потенциальную ошибку программиста.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 28 2015, 18:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Aug 28 2015, 21:12)  Да, это описано ПОВЕДЕНИЕ компилятора. Но когда компилятор видит, что в результате выражения ЕМУ ПЕРЕДАННОГО получается константа, это однозначно тревожный факт указывающий, как минимум на потенциальную ошибку программиста. Это справедливо, например, для такого случая: Код unsigned int e; ... if(e >= 0) { } Тут вменяемые компиляторы дают предупреждение. Но подозревать потенциальную ошибку в while(0) или while(1) как-то странно.
|
|
|
|
|
Aug 28 2015, 18:50
|

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

|
QUOTE (aaarrr @ Aug 28 2015, 21:41)  Но подозревать потенциальную ошибку в while(0) или while(1) как-то странно. Ну интеллект компиляторов, конечно растет семимильными шагами и можно многое требовать от них. Но все-же надо прежде всего говорить об ОБЩИХ минимальных требованиях описаных стандартом. А там, даже специально посмотрел C11  - такого требования не было и нет. Кроме того собственно компилятор НЕ знает, что в исходнике написано while( 1 ) - он получает после препроцессора текст, а там могло быть написано и while( EPRST - eklmn() + 1 ) Тут можно уже подозревать ошибку, или?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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        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      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 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|