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

 
 
18 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> Косяк у Кейла, Препроцессор не следит за скобками
GetSmart
сообщение Aug 29 2015, 09:58
Сообщение #61


.
******

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



Цитата(zltigo @ Aug 29 2015, 13:53) *
Ошибку того, что программист получил не то, что он думал. Ибо компилятор получил в качестве инструкции БЕССМЫСЛЕННОЕ, хотя и однозначное выражение. Дальше у компилятора два варианта - решить, что это написал не программист а "Джамшут" и не пытаться от него чего-либо еще добиваться, либо таки сообщить о подозрительном выражении.
Для определения "Джамшут"/программист у хороших компиляторов есть опция соответствующего warnig.

Это уже не потенциальные, а реально НЕОБОСНОВАННЫЕ обвинения и опасения. Контраргументация ранее была изложена в достаточном объёме.

------

Предлагаю желающим обсудить другой криминал. Не запрещено ли всевышним использование пустых фигурных скобок. А так же точки с запятой после скобок. Или внутри скобок обязательно должна стоять хотя бы точка с запятой. Часто циклы ожидания какого-то события делают пустыми, а в конце {};

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


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


Гуру
******

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



QUOTE (GetSmart @ Aug 29 2015, 12:58) *
Контраргументация ранее была изложена в достаточном объёме.

Попробуйте убедить своей "контраргументацией" разработчиков компиляторов, которые ругаются на while(CONST). Мне рассказывать, что ныне принято писать дерьмокод и посему это "нормально", пожалуйста, не надо.
Из гарантированно мне известных это IAR и MS. Из гарантрованно плюющих помню только GCC.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 29 2015, 10:22
Сообщение #63


.
******

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



А разве while(1) не сам всевышний написал? sm.gif

Цитата(zltigo @ Aug 29 2015, 14:14) *
Попробуйте убедить своей "контраргументацией" разработчиков компиляторов, которые ругаются на while(CONST). Мне рассказывать, что ныне принято писать дерьмокод и посему это "нормально", пожалуйста, не надо.
Из гарантированно мне известных это IAR и MS. Из гарантрованно плюющих помню только GCC.

IAR в СИ-коде не выдаёт error или warning на while (Const). Если читаете ремарки Иара, то не передёргивайте.

---
Надо создать доску позора с необоснованными ошибками компиляторов. Сам иногда удивляюсь логике ругательств.

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


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


Гуру
******

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



QUOTE (GetSmart @ Aug 29 2015, 13:22) *
А разве while(1) не сам всевышний написал? sm.gif

Всевышний, как написано в библии K&R а так-же в примерах в стандарте, в том числе и C11, написал совершенно однозначное for( ; ; ) sm.gif Потом уже еретики начали писать while(1),while(2),while(3),.....,while(TRUE),while(true),while((_Bool)1) и так далее. Причем без всякой на то надобности.


QUOTE (GetSmart @ Aug 29 2015, 13:22) *
Надо создать доску позора с необоснованными ошибками компиляторов. Сам иногда удивляюсь логике ругательств.

Начние с MISRA - там МНОГО веселее sm.gif. А с компиляторами все просто - если по какой-то причине, пусть даже по причине собвстенного несовершенства, компилятор сомневается, как понять, лучше пусть ПРЕДУПРЕЖДАЕТ. Я, если вдруг не смогу выразить мысль в однозначно понятной компилятору форме, лучше прагмой в этом месте сообщение подавлю, нежели получу неведомо что.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 29 2015, 10:43
Сообщение #65


.
******

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



У цикла while только один аргумент - предусловие выполнения. Этот цикл логически естественнен для многих алгоритмов.

Цитата(zltigo @ Aug 29 2015, 14:32) *
А с компиляторами все просто - если по какой-то причине, пусть даже по причине собвстенного несовершенства, компилятор сомневается, как понять, лучше пусть ПРЕДУПРЕЖДАЕТ.

Компилятор Кейла ругается ошибкой на STM Rz!,{Rx-Ry} если Rz находется внутри сохраняемых регистров. Ошибка, не предупреждение. Писатели компиляторов слишком много себе позволяют.

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


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


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Что касается предупреждений по поводу управляющего выражения, то тут, по-моему, стоит разделять два случая:

1. Когда выражение изначально представляет собой константу:
Код
while(1) {...}

if(123) {...} /* Правда, выглядит ужасно? */

Тут предупреждение явно ни к чему.

2. Когда выражение обращается в константу на этапе компиляции:
Код
unsigned int x;

if(x >= 0) {...}

В этом случае есть явный повод для предупреждения.

Оформление бесконечного цикла - это уже дело вкуса программиста. Я, пожалуй, соглашусь, что for(;;) {..} лучше, просто
на основании того, что if(1) {...} мне представляется ужасным. Но while(1) {...} все же ни малейшего отторжения не вызывает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 11:35
Сообщение #67


Гуру
******

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



QUOTE (GetSmart @ Aug 29 2015, 13:43) *
У цикла while только один аргумент - предусловие выполнения. Этот цикл логически естественнен для многих алгоритмов.

Я что-то писал о неестественности цикла? Нет? Возражения только против того, что именно-то и УСЛОВИЯ быть-то и НЕ должно, ибо цикл БЕЗУСЛОВНЫЙ. Вот посему for c ОТСУТСТВУЮЩИМ условием есть логично, а while c БЕССМЫСЛЕННЫМ ВЫРАЖЕНИМ условия, есть настораживающий факт.

QUOTE (aaarrr @ Aug 29 2015, 14:25) *
что if(1) {...} мне представляется ужасным.

Тем неменее изрядно часто используется if(0){...} для того что-бы закомментировать кусок исходника. Кому-то это уже ужасным не кажется sad.gif - типа очередной супертрюк - одним символом комментировать/раскомментировать. Задавлены предупреждения и понеслись писать говнокод.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 29 2015, 11:57
Сообщение #68


Гуру
******

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



Гы-гы. Развели мегасрач на пустом месте. Модераторы за прыжок на месте расстреливают, а тут такое... Я их не понимаю laughing.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 29 2015, 12:08
Сообщение #69


.
******

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



Цитата(zltigo @ Aug 29 2015, 15:35) *
Вот посему for c ОТСУТСТВУЮЩИМ условием есть логично, а while c БЕССМЫСЛЕННЫМ ВЫРАЖЕНИМ условия, есть настораживающий факт.

Все сразу отсутствующие аргументы лично у меня вызывают диссонанс. Как и do .. while (0) в дефайнах из-за доисторических компиляторов, выдававших варнинг на голую точку с запятой. Последнее напоминает решение проблемы через одно место.

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

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


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


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ViKo @ Aug 29 2015, 10:10) *
Восклицательный знак в желтом треугольнике напротив опасной строки. rolleyes.gif И подчеркивает красненьким опасное место.
При наведении мыши на подчеркнутое или на значок выдается:
warning: operator '<<' has lower precedence than '+'; '+' will be evaluated first
На самом деле предупреждает не зря. Одно дело 1 << 7 + 16, а сам неоднократно накалывался на word = byte1 << 8 + byte2, хотя точно знаю, что приоритет у сложения выше. И только благодаря этому предупреждению не тратил время на поиски очевидной, но тем не менее пролетающей между глаз ошибки.

По поводу вашего спора о do {} while (0). Единственное место, где это выражение необходимо - подобный функции макрос из более чем одного выражения. Который можно не задумываясь и однообразно вставлять в любое место, где допустим вызов функции, в том числе и в выражение if(cond) macro(); else ... И идите лесом с убеждениями меня в бессмысленности while(0) - он здесь делает именно то, что от него требуется. И я буду его использовать в линейном коде do { if(!func1()) break;... if(!func2()) break; ..... } while(0); потому что это совершенно однозначная конструкция, существенно упрощающая исходник. И мне глубоко фиолетово, что кому-то она эстетически неприятна.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 14:59
Сообщение #71


Гуру
******

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



QUOTE (Сергей Борщ @ Aug 29 2015, 17:55) *
И мне глубоко фиолетово, что кому-то она эстетически неприятна.

Дело совершенно не в эстетике. В безвыходных случаях можно использовать все. Вот я тоже использую, например для того, что-бы до поры до времени не трогать чужие исходники, например того-же FreeRTOS, где макросов дофига. Только у меня warning на это активизированы и давятся прагмами по месту. А в общем случае сложные макросы-псевдофункции просто не надо использовать - есть механизм заинлайнивания функций. Такой подход безопаснее.
Warnig активизированы всегда по максимуму. Не для себя, а для того, что-бы были в качестве одного из индикаторов какчества попадающих в мои руки чужих исходников.


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


Гуру
******

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



Цитата
Ошибку того, что программист получил не то, что он думал

Горе тому программисту, который написав while(0) думает получить что то иное....
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 16:01
Сообщение #73


Гуру
******

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



QUOTE (Golikov A. @ Aug 29 2015, 18:42) *
Горе тому программисту, который написав while(0) думает получить что то иное....

Горе тому, кто не может ни думать (а чего тут думать - трясти надо писать while(1) надо - так все индийские студенты пишут) ни даже читать: http://electronix.ru/forum/index.php?showt...t&p=1361255
QUOTE
...собственно компилятор НЕ знает, что в исходнике написано while( 1 ) - он получает после препроцессора текст, а там могло быть написано и while( EPRST - eklmn() + 1 ) Тут можно уже подозревать ошибку, или?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 29 2015, 16:07
Сообщение #74


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Препроцессор тут с визгом притянут за уши. Это не аргумент. Совсем.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2015, 16:20
Сообщение #75


Гуру
******

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



QUOTE (aaarrr @ Aug 29 2015, 19:07) *
Препроцессор тут с визгом притянут за уши. Это не аргумент. Совсем.

А зачем писать на самом деле НЕПОНЯТНОЕ, хотя и "привычная", но бессмысленная конструкция while(1), на которую хоть и некоторые компиляторы, но ругатся (и правильно делают), вместо канонического варианта - цикл БЕЗ проверки условий, прямо для такого случая предусмотренного? Зачем?
Что это вообще - "пока один"? Ну? Тогда-уж агитировали-бы за while( 1 == 1 ) по любому бессмысленная проверка неизменного условия, но хоть какой-то смысл типа "понятнее" можно было притянуть.


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

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:55
Рейтинг@Mail.ru


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