|
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
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 29 2015, 11:25
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Что касается предупреждений по поводу управляющего выражения, то тут, по-моему, стоит разделять два случая: 1. Когда выражение изначально представляет собой константу: Код while(1) {...}
if(123) {...} /* Правда, выглядит ужасно? */ Тут предупреждение явно ни к чему. 2. Когда выражение обращается в константу на этапе компиляции: Код unsigned int x;
if(x >= 0) {...} В этом случае есть явный повод для предупреждения. Оформление бесконечного цикла - это уже дело вкуса программиста. Я, пожалуй, соглашусь, что for(;;) {..} лучше, просто на основании того, что if(1) {...} мне представляется ужасным. Но while(1) {...} все же ни малейшего отторжения не вызывает.
|
|
|
|
|
Aug 29 2015, 16:57
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Для zltigo: Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора.
Например: if (1) ... до препроцессора могло быть if (Expr) ..., где Expr определялось дефайном. Вся конструкция вызывала бы опциональную инициализацию периферии, например. В отличие от #if допускает даже рунтайм-условие (вроде Fclk > 100). И безусловно должно допускать простейшую константу или выражение, вычисляемое на этапе компиляции. Неполиткорректно называть это ужасным. Ну а что позволено if-у, то юпитеру while и подавно. ИМХО всё вполне читабельно.Так же ИМХО, должно вызывать ремарку компилятора, если условие известно на этапе компиляции.
Смысла в таких конструкциях более чем достаточно. Хватит вопить про бессмысленность и всякий криминал. Даже просто if (0 или 1) (это без вмешательства препроцессора) могло быть промежуточной (но 100% рабочей) версией кода, расчитанной на изменение условия в дальнейшем. Вобщем код опционален и этот блок можно включить или выключить по необозначенному явно условию. Смысл в константах есть. Нарушений стандарта нет.
Сообщение отредактировал GetSmart - Aug 29 2015, 17:31
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 29 2015, 17:29
|

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

|
QUOTE (GetSmart @ Aug 29 2015, 19:57)  Для zltigo: Качество кода ремарками не измеряется. Не вводите в заблуждение читателей, называя их ругательством компилятора. Поскольку я многие годы много вычитываю чужого кода, то могу утверждать, что еще как измеряется. Писатели не могущие четко выражать свои мысли компилятору, в результате чего компилятору приходится принимать какое-либо неоднозначное решение, получают такой-же нечеткий результат.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 17:39
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Aug 29 2015, 21:29)  Писатели не могущие четко выражать свои мысли компилятору получают такой-же нечеткий результат. На while (const) ? Критикуйте конструктивней и точечней. Необоснованность ругательств компиляторов нужно разбирать в каждом конкретном случае. Компиляторописатели тоже лажают. Встречал граблю когда в конструкции if (0) стоит метка и вне if-а, ниже по коду, стоит на неё переход. Виновен компиляторописатель. Необычный код, но по стандарту ошибки нет.
Сообщение отредактировал GetSmart - Aug 29 2015, 17:58
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 29 2015, 17:47
|

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

|
QUOTE (GetSmart @ Aug 29 2015, 20:39)  Критикуйте конструктивней и точечней. Читайте внимательнее и не фантазируйте. Warning на constant expression это не единственный warning выдаваемый компиляторами из тех, ктороые нерадивые любят давить. QUOTE (ViKo @ Aug 29 2015, 20:40)  Кстати, я никогда не пишу #if (0) или #if (1), а только #if (true), #if (false) А смысл? Тем более для препроцессора, для которого это никаким боком не ключевые слова, как впрочем и для произвольного (не C11? C99?) Си компилятора. Только в свежих стандартах true и false определены и в том числе для препроцесора. Зато какие прелесные эффекты будут с каким-нибудь GCC препроцессором, который молча без всяких предупреждений подсунет вместо недефинированого true нолик.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 18:07
|

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

|
QUOTE (ViKo @ Aug 29 2015, 21:05)  На то есть #include <stdbool.h> А смысл - лично для меня, эстета.  "Истина" круче "единицы". Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то...
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 18:14
|

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

|
Цитата(zltigo @ Aug 29 2015, 21:07)  Повторяю - ЕСЛИ ЕСТЬ, а есть только начиная, помнится, с C99, а если нет, то... Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое? В том, чем я пользуюсь, есть. Прикажете забить (забыть)?
|
|
|
|
|
Aug 29 2015, 18:39
|

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

|
QUOTE (ViKo @ Aug 29 2015, 21:14)  Напомните, сколько лет прошло с 1999 года? Что ж цепляться за старое? Абсолютно согласен, что использовать следует C99. Но жизнь, есть жизнь. Я вот до сих пор вынужден пользовать И компиляторы не поддерживающие C99. C99 просто нет. Есть и глупые варианты, например, пару месяцев назад начал рабтать с котроллерос с ядром BA22. Есть GCC toolchain весь из себя C99. Но весь говнокод идущий с контроллером компилируется не в С99. Какого черта - вопрос не ко мне, а к "программистам" тупо по умолчанию собравших. А там действительно чистый говнокод, который-бы сто лет не читал-бы, но он идет, в соответствии с новейшими тенденциями, ВМЕСТО документации  . QUOTE (aaarrr @ Aug 29 2015, 21:18)  Зачем? Потому что это нормальная языковая конструкция. В вопросе, по причине того, что такой "ответ" повторяется вместо мантры, был сразу и второй - почему на "нормальную" ругаются компиляторы? Их разработчики так-же, как и я "заблуждаются"? QUOTE (GetSmart @ Aug 29 2015, 21:14)  Список компиляторов в студию Не сочтите за труд ознакомится с ранее данным ответом на этот вопрос. QUOTE (GetSmart @ Aug 29 2015, 21:14)  Сможете опровергнуть? Частные случаи на то и частные, что не всегда эквиваленты общим. По этой причне в стандарте эти понятия и РАЗДЕЛЕНЫ и constant expression в контесте while() НЕ упоминаются, в отличие, кстати, от for() QUOTE (aaarrr @ Aug 29 2015, 21:18)  Специально посмотрел: использую оба варианта, но чаще while(1). Объясняется это очень просто - в старые времена компиляторы под ARM отвратительно компилировали циклы for, из-за чего повсеместно использовал do-while. У меня еще для одного изделия на AM186CC еще живет BCC 3.1 за него, правда уже не уверен, но 2.0 для while( 1 ) генерил лишний код в цикле, в отличие от for( ; ; ).
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 29 2015, 23:04
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Aug 29 2015, 22:39)  Не сочтите за труд ознакомится с ранее данным ответом на этот вопрос. По ключевому вопросу whille (const) всё прояснилось. Остальное не интересно. Превращать ремарки в варнинги и пугать народ не надо. Цитата(zltigo @ Aug 29 2015, 22:39)  Частные случаи на то и частные, что не всегда эквиваленты общим. По этой причне в стандарте эти понятия и РАЗДЕЛЕНЫ и constant expression в контесте while() НЕ упоминаются, в отличие, кстати, от for() Вхождение во множество частного случая не обязано упоминаться. Упоминаются только исключения частных случаев. Для ограничения множества (выражений) в каком-то типе цикла нужно это явно описывать с обоснованием. Т.к. в цикле for все три аргумента независимы друг от друга, то управляющее выражение ничем не должно отличаться от других циклов. Но, судя по всему, в стандарте оно отличается тем, что отсутствие выражения в нём принимается за истину. И это странно, во-первых из-за нарушения симметрии. Не читал стандарт, но возможно необоснованного. Кроме того, отсутствие чего-то логичнее принимать за 0. Упд. Похоже на за уши притягивание этого типа цикла к бесконечным.
Сообщение отредактировал GetSmart - Aug 30 2015, 10:03
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
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 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 Цитата(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            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
|
|
|