|
|
  |
Косяк у Кейла, Препроцессор не следит за скобками |
|
|
|
Oct 13 2015, 09:05
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Кто-то обкакался и пытается сохранить лицо... ок продолжим Цитата Я не вижу никакого другого использования bus для чего либо. тогда вы тоже написали чушь Код data = get_addr() ? data_in : END_DATA; потому что я не вижу определения END_DATA, и не припоминаю такого ключевого слова в С, более того я хотел на шине выдать флаг -1, как флаг ошибочного адреса, а не как флаг окончания данных....  у меня кусок выдранный из контекста и бас используется чуть ниже ключевым образом - гипотетически, а вы даже переменные не определили... тоже мне гуру
|
|
|
|
|
Oct 13 2015, 09:11
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 13 2015, 12:03)  Я не вижу никакого другого использования bus для чего либо. Ну не видите - и ладно. С кем не бывает? Цитата(zltigo @ Oct 13 2015, 12:03)  Еще вопросы? Вообще, мне кажется, Вы излишне возбуждены, нет? Эй, модераторы, пора бы уже зарубить этот топик. Он давно превратился в какое-то соревнование по писькометрии и/или метанию какашек (не будем показывать пальцем). В других топиках карающий меч разит за прыжок на месте, а тут такое
|
|
|
|
|
Oct 13 2015, 09:19
|

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

|
QUOTE (Golikov A. @ Oct 13 2015, 12:05)  потому что я не вижу определения END_DATA, и не припоминаю такого ключевого слова в С, более того я хотел на шине выдать флаг -1, как флаг ошибочного адреса, а не как флаг окончания данных....  Хотите сказать, что #define Вас тоже бесят? Это уже Ваше дело, как назвать флаг. Главное, что не должно быть -1 да и еще с издевательским коментарием типа // это -1 Вот Вы сейчас у меня увидели абсолютно произвольное название флага и СРАЗУ поняли, что он ОЗНАЧАЕТ и присваивается что-то неправильноe. А я из Вашего -1 не смог понять НИЧЕГО. А если-бы у Вас было что-то типа CODE #define DATA_ADDR_ERROR (-1) То все было-бы ясно. А так, вкупе со всеми ненужными выражениями и комментариями - обыденный образчик говнокода  . Очень жаль, но это так  QUOTE Ну не видите - и ладно. С кем не бывает? Ну если "ладно", то к чему вообще была Ваша предыдущая реплика, а если уж ее написали, то уж потрудитесь объясниться. QUOTE (scifi @ Oct 13 2015, 12:11)  Вообще, мне кажется, Вы излишне возбуждены, нет? Для этого у меня есть какие-то причины?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 13 2015, 18:12
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Oct 11 2015, 23:38)  Удивился. Проверил. ... ругается: Error[Pa045]: function "dummy" has no prototype Уже указали почему. Неявным логичнее было делать void. Не вижу грабли, т.к. объявления функций делаются всегда вне тел функций. И для явного указания типа результата функции void удачно подходит. И его смысл, как и других типов, в указании типа одного объекта. Что касается применения в коде (void) в качестве преобразования типа rvalue, то хз какой смысл этой конструкции должен быть в идеальном Си. Встречал его в FatFS и там он точно не вызывал чтение только что объявленной локальной неволатильной переменной (или аргумента функции, не помню точно). Скорее всего маскировал какой-то варнинг. Увидев такое в первый раз без чтения стандарта или инета догадаться "что хотел сказать автор" было невозможно. Наиболее ключевой момент в указании списка аргументов функции - указать пустое множество, совместимое с данным контекстом. Совместимое, если множества применялись бы и для других целей. Скобки после идентификатора в процессе объявления объекта указывают компилятору, что объявляется функция. Пустое множество в этом контексте семантически ближе всего к пустым скобкам, если нет специального ключевого слова или конструкции пустого множества. "Пустой" тип (можно перевести по-разному) не является пустым множеством, как навязывается стандартом. IAR в этом плане с настройками по-умолчанию позволяет программистам писать свои программы без семантической кривизны. Цитата(den_po) Неявное объявление функции при первом использовании - вот, наверное, самое отвратительное в сях. Всё зависит от момента в эволюции языка, в котором делается такая оценка. Вызов функции из другого объекта компиляции без наличия прототипа, то есть всех типов и поэтому кол-ва всех аргументов конечно неоднозначен. В этом случае ошибку разумнее всего выдать.
Сообщение отредактировал GetSmart - Oct 14 2015, 04:11
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 14 2015, 01:27
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Oct 14 2015, 00:58)  Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны. Для удовлетворения амбиций можете начинать создавать собственый совершенно "правильный" язык. Ну или заведите в качестве личного компромисса себе чего нибудь типа #define void_set void Этот дефайн что-то вроде "ничего не слышу, ничего не вижу". Цитата(zltigo) Тогда, пожалуйста, просто подумайте, как до введения стандарта с прототипами, я должен был написать вызов функции находящейся в другом объекте компиляции и, например, возврашаюшей указатель на char. Прототипов нет. Написали вызов функции, а что она возвращает компилятору неведомо, ну точнее ведомо, что по умолчанию int. А если не int? Нужно как-то декларировать возвращаемое значение. Вызов компилятор по известым ему типам аргументов сделает, а что возвратят ему неведомо. Посему так: Кривизна из-за разной интерпретации пустых скобок в разном контексте глаз мозг режет. В декларациях их нагрузили неизвестностью параметров. И вместе с этим в заголовке и при вызове они означали отсутствие параметров. Если разработчик планировал вызывать функцию, то знать лучше и результат и типы аргументов. Основания для отбрасывания аргументов не озвучены. Про вариант передачи аргументов через стек и удаление из вызывающей стороной я в курсе, но это не тянет на основания удаления аргументов из декларации, т.к. кроме их кол-ва нужно знать их типы для конвертации rvalue. Для вызова функций из своего модуля можно было сверить и заругаться, а из другого модуля, если неизвестно какого типа у неё аргументы и во что конвертировать rvalue, то. невозможно вообще скомпилить "объект компиляции" и с самого начала была видна нужность указания аргументов. Игра в грабли кого-то с кем-то. А сейчас в чём например грабля, если компилятор будет иметь опцию (как require prototypes и др.) задающую по-умолчанию смысл пустых скобок в прототипах равный отсутствию аргументов и выдающую варнинг, если функцию вызывают с какими-то аргументами? В этом режиме не обломается скомпилить даже комбинацию с древними исходниками. Эта опция даже к стандарту не обязана относиться. Могу только повторить - хвала ИАРу, который не идёт на поводу у недоброжелателей языка. В соседней ветке ещё упоминают объявления функций внутри typedef. Там тоже (мне) не понятно как интерпретируется объявление, как прототип или как декларация. Опять двусмысленность, т.к. судя по теме можно и с void и с пустыми скобками в Кейле. Должен был быть разрешён только один вариант. Если НЕИСКУШЁННЫЙ граблями программист будет ломать голову о том, что хотел сказать автор и будет много шансов ошибиться, то это всегда будет на совести разработчиков.
Сообщение отредактировал GetSmart - Oct 14 2015, 09:49
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 15 2015, 05:59
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(Golikov A. @ Oct 13 2015, 10:05)  предпочту блок вида Код bus = get_addr(); // получаем адрес if(bus !=0) //если не 0 data = data_in; //забираем данные else //для 0 адреса data = -1; //ставим флаг - 1 Просто потому что читать легче и понять легче, даже тем кто не знает язык, но и тем кто знает проследить алгоритм легче, поддерживать легче, значит и ошибок в итоге меньше. Комментировать каждую строку - вы серьезно? Если кто-то не знает язык, то его надо просто выучить. Комментарии нужны там, где решение неочевидно из кода, но комменты вида Код x = 0; // положим в x 0 - это просто мусор. Комментировать надо алгоритм, какие-то блоки кода. Но делать из программы учебник по языку - зачем? Цитата(GetSmart @ Oct 14 2015, 04:27)  А сейчас в чём например грабля, если компилятор будет иметь опцию (как require prototypes и др.) задающую по-умолчанию смысл пустых скобок в прототипах равный отсутствию аргументов и выдающую варнинг, если функцию вызывают с какими-то аргументами? В этом режиме не обломается скомпилить даже комбинацию с древними исходниками. Эта опция даже к стандарту не обязана относиться. Могу только повторить - хвала ИАРу, который не идёт на поводу у недоброжелателей языка. Компилируйте новые исходники в режиме С++ и будет вам счастье. Конечно хидеры 20-летней давности придется поправить, но неужели их так много?
|
|
|
|
|
Oct 15 2015, 06:52
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(ViKo @ Oct 15 2015, 09:46)  Интересно, кто-нибудь занимается разработкой нового стандарта на язык C? Или он уже достиг предела совершенства. Стандарт периодически обновляется. В последнем - атомики появились, еще что-то. Не слежу пристально Цитата Мне вот C++ кажется неоправданно сложным. Знаю, гуру скажут, от "дремучести" моей рождаются монстры. Чего не хватает в C - например, определения функции внутри функции... сам не знаю, чего... но что-то не так. Хочу простого, но качественного. Дык используйте подмножество С++, и будет вам счастье. Никто не заставляет использовать все и сразу. Код void func(int a, int B) { int c = 0; auto localFunc = [&](int x) { a += x; b -= x; c *= x; };
localFunc(15); localFunc(25); } Цитата Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически? Раздельная компиляция жеж...
|
|
|
|
|
Oct 15 2015, 07:05
|

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

|
QUOTE (ViKo @ Oct 15 2015, 09:46)  Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически? 1) Библиотеки и объектники тоже  ? 2) При работе с кем-то пока не получите полные исходники - фиг откомпилируете свой кусок? 3) Хотите - просматривайте, составляйте. Как будете "составленый" список компиятору предавать? Прототипы это механизм предачи описания, который должен быть по любому. А окуда Вы это описание возьмете - дело не принципиальное. QUOTE (Непомнящий Евгений @ Oct 15 2015, 09:52)  Дык используйте подмножество С++, и будет вам счастье. Никто не заставляет использовать все и сразу. Именно так. Начиная я писать на С++, а не на Cи, так-что на PC как-то после ухода на Cи в основной массе работ, сполз постепенно на "псевдо Си" - Си, но под плюсовый компилятор.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 15 2015, 23:19
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Моё мнение о Си. Переменная-указатель на функцию с неизвестными аргументами, как и аналогичная декларация, есть грабля. Пустые скобки при её объявлении логично интерпретировать как отсутствие аргументов. При вызове её с какими-то аргументами выдавать варнинг, аналогично вызову функции через декларацию. Варнинг при вызовах через декларации более чем уместен из-за неизвестности типа аргументов при конвертации rvalue. Даже опция его включения лишняя. На заре эволюции разрешили криминал, который давно надо было плавно заблокировать. Пример: объявление глобальной или локальной переменной: void (*Func)(стандартные правила для прототипов/деклараций); в коде функций: Func = (void (*)())FuncAddr; Интерпретация пустых скобок в смысле неизвестности списка аргументов удачна в конструкции преобразования типа целочисленного rvalue, интерпретируемого как адрес функции. Наделяя получившееся rvalue универсальностью в дальнейших конвертациях. Но попытку вызова функции через rvalue с таким типом лучше интерпретировать как ранее описано из переменной. Декларацией здесь, ранее и далее я называю только прототип функции с пустыми скобками списка аргументов. В контексте определений типа (в т.ч typedef) это тоже наличие пустых скобок там же. Т.к. текстовый препроцессор тоже разгребает список передаваемых ему аргументов, то и там могут быть какие-то грабли с "(void)", "()", неоднозначностью толкования и разными контекстами. И вообще, корректностью стандарта. Про void в скобках в списке аргументов ничего хорошего не добавлю  Цитата(GetSmart @ Oct 11 2015, 18:28)  По поводу пустых скобок в for() ошибся, т.к. никогда его не использую, ... for(;;) Уточняю. В таком виде.
Сообщение отредактировал GetSmart - Oct 16 2015, 10:25
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|