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

 
 
> Косяк у Кейла, Препроцессор не следит за скобками
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
18 страниц V  « < 2 3 4 5 6 > »   
Start new topic
Ответов (45 - 59)
scifi
сообщение Aug 28 2015, 21:14
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Aug 28 2015, 22:22) *
Увы, это совершеная реальность - ПЕРЕД компиляцией сишный исходник проходит через препроцессор. Удивлен немало, что это для Вас новость sad.gif.

Вы будете смеяться, но перед вёрсткой текст книги проходит корректора, редактора и кого-то там ещё, наверное. И вы утверждаете, что редактор не может посмотреть на то, на что смотрит корректор? Пардон, но какую траву вы курите? Исходный текст злобные чекисты спрятали что ли? Я вас умоляю... twak.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2015, 21:32
Сообщение #47


Гуру
******

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



QUOTE (scifi @ Aug 29 2015, 00:14) *
Пардон, но какую траву вы курите? Исходный текст злобные чекисты спрятали что ли? Я вас умоляю... twak.gif

От того, что Вы будете повторять дурь находящуюся в Вашей голове, Ваши фантазии о том, как должен работать препроцессор + компилятор ничего не изменят.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 28 2015, 21:40
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Aug 29 2015, 00:32) *
От того, что Вы будете повторять дурь находящуюся в Вашей голове, Ваши фантазии о том, как должен работать препроцессор + компилятор ничего не изменят.

Мне более не интересно пытаться донести свою мысль до вас. Адью.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2015, 21:43
Сообщение #49


Гуру
******

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



QUOTE (Petka @ Aug 28 2015, 22:37) *
в конструкции:
CODE
r = (a * b) + (c * d);

тоже есть "лишние конструкции", которые транслятор "выкинет". Например, скобки вообще "лишние". Да и пробелы совсем не нужны. Может программист "все-же рассчитывал этими скобками на какой-то другой эффект"?

Вы, очевидно не поверите, но компилятор скобки не "выкинет", он выполнит НЕ РАСУЖДАЯ предписанные ими действия. С пробелами еще проще - их игнорирование описано стандартом, так-что компилятор де-юре не думает, что кто хотел сказать пробелами.
QUOTE
P.S. Модераторам: из топика имеет смысл обсуждение конструкции do-while-zero вынести в отдельную тему.

Уже была когда-то. Вторая никчему.


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


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

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



Цитата(zltigo @ Aug 29 2015, 00:43) *
Вы, очевидно не поверите,

Очевидно, тут не вопрос веры.
Цитата
но компилятор скобки не "выкинет", он выполнит НЕ РАССУЖДАЯ предписанные ими действия. С пробелами еще проще - их игнорирование описано стандартом, так-что компилятор де-юре не думает, что кто хотел сказать пробелами.

Сказали "А", говорите и "Б". Если "лишние" пробельные символы компилятор может удалять(игнорировать) без предупреждений, то и валидные конструкции "while(0)", "for(;;)", "#if 0", по той-же самой логике транслятор должен обрабатывать согласно стандарту "НЕ РАССУЖДАЯ".
Что бы не уводить обсуждение в сторону прошу подкрепить или опровергнуть Ваше заявление
Цитата
...Да и сам трюк, увы, грязноват, ибо while(константа) принципиально ошибочное выражение, хотя из-за его распространенности...

Откуда вы это взяли? Есть какой-то стандарт где это описано? Отраслевые инструкции? Исследования? В книжке какой-то прочитали? Бложик? Твиттер? Сплетни? С удовольствием ознакомлюсь с источником такой информации.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2015, 23:39
Сообщение #51


Гуру
******

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



QUOTE (Petka @ Aug 29 2015, 01:09) *
Откуда вы это взяли? Есть какой-то стандарт где это описано?

Стандарт языка Cи, надо читать и ПОНИМАТЬ написанное. for( ; ; ) абсолютно ОДНОЗНАЧНОЕ указание компилятору сгенерировать цикл БЕЗ проверки каких либо условий. Любой другой вариант уже требует проверки, а для выкидывания ненужной проверки уже наличия минимальной, но оптимизации. Начинать думать можете начать с того, что в в примерах стандарта вечный цикл for( ; ; ) и нет ни одного while( CONST ) у K&R совершенно аналогично. Ни то ни другое не есть -
QUOTE
Бложик? Твиттер? Сплетни?
С удовольствием ознакомлюсь с источником такой информации.

Знакомьтесь.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 29 2015, 03:34
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
у K&R совершенно аналогично.

Это вообще странный авторитет, особенно в свете последней выдержки с преобразованием типов....

Цитата
Стандарт языка Cи, надо читать и ПОНИМАТЬ написанное.

Надо, и в нем нет запрета на конcтрукцию while(0) и while(1), ровно как и нет неоднозначного толкования как она будет выполнена.

Ошибкой является утверждение что это "принципиально ошибочное" выражение, оно даже потенциально не ошибочное, не то что принципиально....

Цитата
Нужно только помнить, что константы все равно по умолчанию интерпретируются как double, т.е. 1.234 - это double, а 1.234F - float.
Это понятно, и наличие этой константы в виде дабла по стандарту затянет все выражение в расчет в даблах. Но все же можно вести счет во флотах и это принципиально важно, это же ускорение за счет аппаратных модулей.... и по мне вот это гораздо важнее того как сделан вечный цикл через for(;;) или через while(1)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2015, 04:30
Сообщение #53


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

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



Что вы сцепились на пустом. Я вот ни разу не использовал do { } while (0), и ничего. Программы работают, как задумано.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 29 2015, 04:52
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ща и вам достанетсяsm.gif.... как вы могли ни разу не использовать?!!!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2015, 05:00
Сообщение #55


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

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



Цитата(Golikov A. @ Aug 29 2015, 07:52) *
ща и вам достанетсяsm.gif.... как вы могли ни разу не использовать?!!!

Ничего, с меня не убудет. Я авторитетом себя не считаю. Просто стараюсь писать аккуратно, не упуская нужных символов и не лепя ненужных. Пробелы не в счет, на них не экономлю. Например, если мне надо 1 << 7 + 16, то так и пишу. Хотя компилятор ругается предупреждением (не компилятор, а сама среда в Кейле значок ставит).

А VALUE я, пожалуй, в скобки возьму. Вдруг захочется мне (или кому-то другому) задать задержку в виде DELAY(2 + 2, _MS).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 06:04
Сообщение #56


Гуру
******

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



QUOTE (Golikov A. @ Aug 29 2015, 06:34) *
Надо, и в нем нет запрета на конcтрукцию while(0) и while(1), ровно как и нет неоднозначного толкования как она будет выполнена.

Уже писал - в стандарте нет запрета на использование русских матерных слов, тем неменее компиляторы не захотят компилировать такие выражения. Точно так-же, как компиляторы, пусть даже и не все, таки выдают предупреждения на while( CONST ). Так-что давайте Вы свой талант толкователя стандартов будете демонстрировать не мне.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 29 2015, 06:22
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Уже писал - в стандарте нет запрета на использование русских матерных слов

ну как же нет? Есть стандарт формирования имен переменных и список ключевых слов. Ваши матерные выражения не попадают в множество которые возможно создать по данным правилам, потому их и нельзя использовать....

Цитата
Так-что давайте Вы свой талант толкователя стандартов будете демонстрировать не мне.

А вы не читайте....

Цитата
Хотя компилятор ругается предупреждением (не компилятор, а сама среда в Кейле значок ставит).

а что за значок?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2015, 07:10
Сообщение #58


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

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



Цитата(Golikov A. @ Aug 29 2015, 09:22) *
а что за значок?

Восклицательный знак в желтом треугольнике напротив опасной строки. rolleyes.gif И подчеркивает красненьким опасное место.
При наведении мыши на подчеркнутое или на значок выдается:
warning: operator '<<' has lower precedence than '+'; '+' will be evaluated first
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 29 2015, 09:37
Сообщение #59


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Aug 28 2015, 22:12) *
Но когда компилятор видит, что в результате выражения ЕМУ ПЕРЕДАННОГО получается константа, это однозначно тревожный факт указывающий, как минимум на потенциальную ошибку программиста.

Какую ошибку? Условие/выражение может быть опционально вычисляемое в рунтайме. Или в какой-то опции проекта вычисляемое на этапе компиляции. Но место проверки условия задаёт тип цикла и его устанавливает программер исходя из оптимальности алгоритма, в том числе опционального удобства.

Подозревать препроцессор в перетрахе только выражений - мало. Это текстовый препроцессор и он может заменять любое место исходника. for (;;) мог быть перед препроцессором for (A;B;C) где A, B, C дефайном задавались пустыми или не пустыми. Потенциальность ошибки зацитированным методом компилятору не определить.

----
Цитата(zltigo @ Aug 28 2015, 22:50) *
Ну интеллект компиляторов, конечно растет семимильными шагами и можно многое требовать от них.

У zltigo могло бы быть большое будущее во главе какого-нибудь ЦБ, ну или будучи физиком-теоретиком. Умеет фундаментализировать инфляцию. Инфляцию отсутствия ошибок через повышение интеллекта компилятора. А так же переориентируя точку отсчёта на прокладку препроцессор.

Сообщение отредактировал GetSmart - Aug 29 2015, 09:56


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 09:53
Сообщение #60


Гуру
******

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



QUOTE (Golikov A. @ Aug 28 2015, 20:22) *
вообще то, насколько я помню трюк
do
while(0)
создан для того чтобы в теле можно было в любой момент поставить break или continue и вывалиться из цикла, то есть закончить....

Да ну! Вообще-то дело обстоит с точностью до наоборот.
1) break это выход из ЛЮБОГО цикла и городить для этого while(0) совершенно незачем.
2) именно ИСПОЛЬЗОВАНИЕ do while(0) в обертке макроса приводит в ПОБОЧНОМУ эффекту выхода по break из макроса ну СОВСЕМ не туда.


QUOTE (GetSmart @ Aug 29 2015, 12:37) *
Какую ошибку?

Ошибку того, что программист получил не то, что он думал. Ибо компилятор получил в качестве инструкции БЕССМЫСЛЕННОЕ, хотя и однозначное выражение. Дальше у компилятора два варианта - решить, что это написал не программист а "Джамшут" и не пытаться от него чего-либо еще добиваться, либо таки сообщить о подозрительном выражении.
Для определения "Джамшут"/программист у хороших компиляторов есть опция соответствующего warnig.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

18 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 


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


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