Golikov 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Кто-то обкакался и пытается сохранить лицо... ок продолжим Я не вижу никакого другого использования bus для чего либо. тогда вы тоже написали чушь data = get_addr() ? data_in : END_DATA; потому что я не вижу определения END_DATA, и не припоминаю такого ключевого слова в С, более того я хотел на шине выдать флаг -1, как флаг ошибочного адреса, а не как флаг окончания данных.... ;) у меня кусок выдранный из контекста и бас используется чуть ниже ключевым образом - гипотетически, а вы даже переменные не определили... тоже мне гуру:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Я не вижу никакого другого использования bus для чего либо. Ну не видите - и ладно. С кем не бывает? Еще вопросы? Вообще, мне кажется, Вы излишне возбуждены, нет? Эй, модераторы, пора бы уже зарубить этот топик. Он давно превратился в какое-то соревнование по писькометрии и/или метанию какашек (не будем показывать пальцем). В других топиках карающий меч разит за прыжок на месте, а тут такое :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба потому что я не вижу определения END_DATA, и не припоминаю такого ключевого слова в С, более того я хотел на шине выдать флаг -1, как флаг ошибочного адреса, а не как флаг окончания данных.... ;) Хотите сказать, что #define Вас тоже бесят? Это уже Ваше дело, как назвать флаг. Главное, что не должно быть -1 да и еще с издевательским коментарием типа // это -1 Вот Вы сейчас у меня увидели абсолютно произвольное название флага и СРАЗУ поняли, что он ОЗНАЧАЕТ и присваивается что-то неправильноe. А я из Вашего -1 не смог понять НИЧЕГО. А если-бы у Вас было что-то типа #define DATA_ADDR_ERROR (-1) То все было-бы ясно. А так, вкупе со всеми ненужными выражениями и комментариями - обыденный образчик говнокода :(. Очень жаль, но это так :( Ну не видите - и ладно. С кем не бывает? Ну если "ладно", то к чему вообще была Ваша предыдущая реплика, а если уж ее написали, то уж потрудитесь объясниться. Вообще, мне кажется, Вы излишне возбуждены, нет? Для этого у меня есть какие-то причины? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 13 октября, 2015 Опубликовано 13 октября, 2015 (изменено) · Жалоба Удивился. Проверил. ... ругается: Error[Pa045]: function "dummy" has no prototype Уже указали почему. Неявным логичнее было делать void. Не вижу грабли, т.к. объявления функций делаются всегда вне тел функций. И для явного указания типа результата функции void удачно подходит. И его смысл, как и других типов, в указании типа одного объекта. Что касается применения в коде (void) в качестве преобразования типа rvalue, то хз какой смысл этой конструкции должен быть в идеальном Си. Встречал его в FatFS и там он точно не вызывал чтение только что объявленной локальной неволатильной переменной (или аргумента функции, не помню точно). Скорее всего маскировал какой-то варнинг. Увидев такое в первый раз без чтения стандарта или инета догадаться "что хотел сказать автор" было невозможно. Наиболее ключевой момент в указании списка аргументов функции - указать пустое множество, совместимое с данным контекстом. Совместимое, если множества применялись бы и для других целей. Скобки после идентификатора в процессе объявления объекта указывают компилятору, что объявляется функция. Пустое множество в этом контексте семантически ближе всего к пустым скобкам, если нет специального ключевого слова или конструкции пустого множества. "Пустой" тип (можно перевести по-разному) не является пустым множеством, как навязывается стандартом. IAR в этом плане с настройками по-умолчанию позволяет программистам писать свои программы без семантической кривизны. Неявное объявление функции при первом использовании - вот, наверное, самое отвратительное в сях. Всё зависит от момента в эволюции языка, в котором делается такая оценка. Вызов функции из другого объекта компиляции без наличия прототипа, то есть всех типов и поэтому кол-ва всех аргументов конечно неоднозначен. В этом случае ошибку разумнее всего выдать. Изменено 14 октября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба ...писать свои программы без семантической кривизны. https://www.youtube.com/watch?v=L4Jsij6eLsA Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны. Для удовлетворения амбиций можете начинать создавать собственый совершенно "правильный" язык. Ну или заведите в качестве личного компромисса себе чего нибудь типа #define void_set void Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 13 октября, 2015 Опубликовано 13 октября, 2015 (изменено) · Жалоба Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны. Не могу смотреть ютуб и вообще видео. Напишите словами. Может заодно проясните выбор запятой в качестве разделителя аргументов. Т.к. в этом тоже есть двухсполовинная неидеальность. Очевидная в постоянном указании типа нового аргумента после каждой запятой. Что и не очень удобно и явно синтаксически отличается от объявления переменных вне заголовка. Это полтора. И ещё одна кажись какая-то грабля из-за использования comma в качестве оператора в коде функций. Обсуждалось год-три назад. Точка с запятой там "ложилась" очень удачно. Похоже конечно на for(a;b;c), но икс знает хорошо это или плохо. Опять всплывёт какой-нить исторический подвох. Псевдобонус в вырезании имён аргументов из прототипов равноценен по трудозатратам замене имён аргументов при разделении их точкой с запятой. Но этот оверхед трудозатрат скорее бесполезен, т.к. компилятор должен встречая прототип делать то же самое самостоятельно. Изменено 14 октября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Не могу смотреть ютуб и вообще видео. Напишите словами. Там мнение Остапа Бендера о подобной проблеме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 14 октября, 2015 Опубликовано 14 октября, 2015 (изменено) · Жалоба Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны. Для удовлетворения амбиций можете начинать создавать собственый совершенно "правильный" язык. Ну или заведите в качестве личного компромисса себе чего нибудь типа #define void_set void Этот дефайн что-то вроде "ничего не слышу, ничего не вижу". Тогда, пожалуйста, просто подумайте, как до введения стандарта с прототипами, я должен был написать вызов функции находящейся в другом объекте компиляции и, например, возврашаюшей указатель на char. Прототипов нет. Написали вызов функции, а что она возвращает компилятору неведомо, ну точнее ведомо, что по умолчанию int. А если не int? Нужно как-то декларировать возвращаемое значение. Вызов компилятор по известым ему типам аргументов сделает, а что возвратят ему неведомо. Посему так: Кривизна из-за разной интерпретации пустых скобок в разном контексте глаз мозг режет. В декларациях их нагрузили неизвестностью параметров. И вместе с этим в заголовке и при вызове они означали отсутствие параметров. Если разработчик планировал вызывать функцию, то знать лучше и результат и типы аргументов. Основания для отбрасывания аргументов не озвучены. Про вариант передачи аргументов через стек и удаление из вызывающей стороной я в курсе, но это не тянет на основания удаления аргументов из декларации, т.к. кроме их кол-ва нужно знать их типы для конвертации rvalue. Для вызова функций из своего модуля можно было сверить и заругаться, а из другого модуля, если неизвестно какого типа у неё аргументы и во что конвертировать rvalue, то. невозможно вообще скомпилить "объект компиляции" и с самого начала была видна нужность указания аргументов. Игра в грабли кого-то с кем-то. А сейчас в чём например грабля, если компилятор будет иметь опцию (как require prototypes и др.) задающую по-умолчанию смысл пустых скобок в прототипах равный отсутствию аргументов и выдающую варнинг, если функцию вызывают с какими-то аргументами? В этом режиме не обломается скомпилить даже комбинацию с древними исходниками. Эта опция даже к стандарту не обязана относиться. Могу только повторить - хвала ИАРу, который не идёт на поводу у недоброжелателей языка. В соседней ветке ещё упоминают объявления функций внутри typedef. Там тоже (мне) не понятно как интерпретируется объявление, как прототип или как декларация. Опять двусмысленность, т.к. судя по теме можно и с void и с пустыми скобками в Кейле. Должен был быть разрешён только один вариант. Если НЕИСКУШЁННЫЙ граблями программист будет ломать голову о том, что хотел сказать автор и будет много шансов ошибиться, то это всегда будет на совести разработчиков. Изменено 14 октября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 15 октября, 2015 Опубликовано 15 октября, 2015 · Жалоба предпочту блок вида bus = get_addr(); // получаем адрес if(bus !=0) //если не 0 data = data_in; //забираем данные else //для 0 адреса data = -1; //ставим флаг - 1 Просто потому что читать легче и понять легче, даже тем кто не знает язык, но и тем кто знает проследить алгоритм легче, поддерживать легче, значит и ошибок в итоге меньше. Комментировать каждую строку - вы серьезно? Если кто-то не знает язык, то его надо просто выучить. Комментарии нужны там, где решение неочевидно из кода, но комменты вида x = 0; // положим в x 0 - это просто мусор. Комментировать надо алгоритм, какие-то блоки кода. Но делать из программы учебник по языку - зачем? А сейчас в чём например грабля, если компилятор будет иметь опцию (как require prototypes и др.) задающую по-умолчанию смысл пустых скобок в прототипах равный отсутствию аргументов и выдающую варнинг, если функцию вызывают с какими-то аргументами? В этом режиме не обломается скомпилить даже комбинацию с древними исходниками. Эта опция даже к стандарту не обязана относиться. Могу только повторить - хвала ИАРу, который не идёт на поводу у недоброжелателей языка. Компилируйте новые исходники в режиме С++ и будет вам счастье. Конечно хидеры 20-летней давности придется поправить, но неужели их так много? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 октября, 2015 Опубликовано 15 октября, 2015 · Жалоба Интересно, кто-нибудь занимается разработкой нового стандарта на язык C? Или он уже достиг предела совершенства. Мне вот C++ кажется неоправданно сложным. Знаю, гуру скажут, от "дремучести" моей рождаются монстры. Чего не хватает в C - например, определения функции внутри функции... сам не знаю, чего... но что-то не так. Хочу простого, но качественного. Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 15 октября, 2015 Опубликовано 15 октября, 2015 · Жалоба Интересно, кто-нибудь занимается разработкой нового стандарта на язык 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); } Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически? Раздельная компиляция жеж... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 15 октября, 2015 Опубликовано 15 октября, 2015 · Жалоба Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически? 1) Библиотеки и объектники тоже :) :) :)? 2) При работе с кем-то пока не получите полные исходники - фиг откомпилируете свой кусок? 3) Хотите - просматривайте, составляйте. Как будете "составленый" список компиятору предавать? Прототипы это механизм предачи описания, который должен быть по любому. А окуда Вы это описание возьмете - дело не принципиальное. Дык используйте подмножество С++, и будет вам счастье. Никто не заставляет использовать все и сразу. Именно так. Начиная я писать на С++, а не на Cи, так-что на PC как-то после ухода на Cи в основной массе работ, сполз постепенно на "псевдо Си" - Си, но под плюсовый компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 15 октября, 2015 Опубликовано 15 октября, 2015 (изменено) · Жалоба Моё мнение о Си. Переменная-указатель на функцию с неизвестными аргументами, как и аналогичная декларация, есть грабля. Пустые скобки при её объявлении логично интерпретировать как отсутствие аргументов. При вызове её с какими-то аргументами выдавать варнинг, аналогично вызову функции через декларацию. Варнинг при вызовах через декларации более чем уместен из-за неизвестности типа аргументов при конвертации rvalue. Даже опция его включения лишняя. На заре эволюции разрешили криминал, который давно надо было плавно заблокировать. Пример: объявление глобальной или локальной переменной: void (*Func)(стандартные правила для прототипов/деклараций); в коде функций: Func = (void (*)())FuncAddr; Интерпретация пустых скобок в смысле неизвестности списка аргументов удачна в конструкции преобразования типа целочисленного rvalue, интерпретируемого как адрес функции. Наделяя получившееся rvalue универсальностью в дальнейших конвертациях. Но попытку вызова функции через rvalue с таким типом лучше интерпретировать как ранее описано из переменной. Декларацией здесь, ранее и далее я называю только прототип функции с пустыми скобками списка аргументов. В контексте определений типа (в т.ч typedef) это тоже наличие пустых скобок там же. Т.к. текстовый препроцессор тоже разгребает список передаваемых ему аргументов, то и там могут быть какие-то грабли с "(void)", "()", неоднозначностью толкования и разными контекстами. И вообще, корректностью стандарта. Про void в скобках в списке аргументов ничего хорошего не добавлю :) По поводу пустых скобок в for() ошибся, т.к. никогда его не использую, ... for(;;) Уточняю. В таком виде. Изменено 16 октября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 16 октября, 2015 Опубликовано 16 октября, 2015 · Жалоба По поводу пустых скобок в for() ошибся, т.к. никогда его не использую, ... for(;;) У меня в коде есть даже for( ; ; ) ; :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 16 октября, 2015 Опубликовано 16 октября, 2015 (изменено) · Жалоба Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны. Для удовлетворения амбиций можете начинать создавать собственый совершенно "правильный" язык. Компромисс чего с чем? В скобках видна только лишняя сущность, вроде червя. Хочу понять, но не хватает информации. Перечитал все посты здесь. В разных контекстах интересно. В случае отсутствия необходимости наследования исходников есть какие-то недостатки? Или единственный недостаток в том, что компилятор будет ругаться на криминальные вызовы через декларации в древних исходниках? Не сочтите за труд подытожить. Изменено 16 октября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться