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

 
 
18 страниц V  « < 13 14 15 16 17 > »   
Reply to this topicStart new topic
> Косяк у Кейла, Препроцессор не следит за скобками
Golikov A.
сообщение Oct 13 2015, 09:05
Сообщение #211


Гуру
******

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



Кто-то обкакался и пытается сохранить лицо... ок продолжим

Цитата
Я не вижу никакого другого использования bus для чего либо.

тогда вы тоже написали чушь
Код
data = get_addr() ? data_in : END_DATA;

потому что я не вижу определения END_DATA, и не припоминаю такого ключевого слова в С, более того я хотел на шине выдать флаг -1, как флаг ошибочного адреса, а не как флаг окончания данных.... wink.gif

у меня кусок выдранный из контекста и бас используется чуть ниже ключевым образом - гипотетически, а вы даже переменные не определили... тоже мне гуруsm.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 13 2015, 09:11
Сообщение #212


Гуру
******

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



Цитата(zltigo @ Oct 13 2015, 12:03) *
Я не вижу никакого другого использования bus для чего либо.

Ну не видите - и ладно. С кем не бывает?

Цитата(zltigo @ Oct 13 2015, 12:03) *
Еще вопросы?

Вообще, мне кажется, Вы излишне возбуждены, нет?

Эй, модераторы, пора бы уже зарубить этот топик. Он давно превратился в какое-то соревнование по писькометрии и/или метанию какашек (не будем показывать пальцем). В других топиках карающий меч разит за прыжок на месте, а тут такое laughing.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 13 2015, 09:19
Сообщение #213


Гуру
******

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



QUOTE (Golikov A. @ Oct 13 2015, 12:05) *
потому что я не вижу определения END_DATA, и не припоминаю такого ключевого слова в С, более того я хотел на шине выдать флаг -1, как флаг ошибочного адреса, а не как флаг окончания данных.... wink.gif

Хотите сказать, что #define Вас тоже бесят?
Это уже Ваше дело, как назвать флаг. Главное, что не должно быть -1 да и еще с издевательским коментарием типа // это -1
Вот Вы сейчас у меня увидели абсолютно произвольное название флага и СРАЗУ поняли, что он ОЗНАЧАЕТ и присваивается что-то неправильноe. А я из Вашего -1 не смог понять НИЧЕГО.
А если-бы у Вас было что-то типа
CODE
#define DATA_ADDR_ERROR (-1)

То все было-бы ясно.
А так, вкупе со всеми ненужными выражениями и комментариями - обыденный образчик говнокода sad.gif. Очень жаль, но это так sad.gif

QUOTE
Ну не видите - и ладно. С кем не бывает?

Ну если "ладно", то к чему вообще была Ваша предыдущая реплика, а если уж ее написали, то уж потрудитесь объясниться.

QUOTE (scifi @ Oct 13 2015, 12:11) *
Вообще, мне кажется, Вы излишне возбуждены, нет?

Для этого у меня есть какие-то причины?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 13 2015, 18:12
Сообщение #214


.
******

Группа: Участник
Сообщений: 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


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


Гуру
******

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



QUOTE (GetSmart @ Oct 13 2015, 21:12) *
...писать свои программы без семантической кривизны.

https://www.youtube.com/watch?v=L4Jsij6eLsA
Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны. Для удовлетворения амбиций можете начинать создавать собственый совершенно "правильный" язык. Ну или заведите в качестве личного компромисса себе чего нибудь типа
#define void_set void


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 13 2015, 22:00
Сообщение #216


.
******

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



Цитата(zltigo @ Oct 14 2015, 00:58) *
Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны.

Не могу смотреть ютуб и вообще видео. Напишите словами.

Может заодно проясните выбор запятой в качестве разделителя аргументов. Т.к. в этом тоже есть двухсполовинная неидеальность. Очевидная в постоянном указании типа нового аргумента после каждой запятой. Что и не очень удобно и явно синтаксически отличается от объявления переменных вне заголовка. Это полтора. И ещё одна кажись какая-то грабля из-за использования comma в качестве оператора в коде функций. Обсуждалось год-три назад. Точка с запятой там "ложилась" очень удачно. Похоже конечно на for(a;b;c), но икс знает хорошо это или плохо. Опять всплывёт какой-нить исторический подвох. Псевдобонус в вырезании имён аргументов из прототипов равноценен по трудозатратам замене имён аргументов при разделении их точкой с запятой. Но этот оверхед трудозатрат скорее бесполезен, т.к. компилятор должен встречая прототип делать то же самое самостоятельно.

Сообщение отредактировал GetSmart - Oct 14 2015, 00:59


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


Гуру
******

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



QUOTE (GetSmart @ Oct 14 2015, 01:00) *
Не могу смотреть ютуб и вообще видео. Напишите словами.

Там мнение Остапа Бендера о подобной проблеме.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 14 2015, 01:27
Сообщение #218


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 15 2015, 05:59
Сообщение #219


Знающий
****

Группа: Свой
Сообщений: 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-летней давности придется поправить, но неужели их так много?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 15 2015, 06:46
Сообщение #220


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

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



Интересно, кто-нибудь занимается разработкой нового стандарта на язык C? Или он уже достиг предела совершенства. Мне вот C++ кажется неоправданно сложным. Знаю, гуру скажут, от "дремучести" моей рождаются монстры. Чего не хватает в C - например, определения функции внутри функции... сам не знаю, чего... но что-то не так. Хочу простого, но качественного. Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически?
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 15 2015, 06:52
Сообщение #221


Знающий
****

Группа: Свой
Сообщений: 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);
}


Цитата
Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически?

Раздельная компиляция жеж...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 15 2015, 07:05
Сообщение #222


Гуру
******

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



QUOTE (ViKo @ Oct 15 2015, 09:46) *
Те же прототипы - зачем они, если можно просмотреть все исходники проекта, и составить список определений функций автоматически?

1) Библиотеки и объектники тоже sm.gif sm.gif sm.gif?
2) При работе с кем-то пока не получите полные исходники - фиг откомпилируете свой кусок?
3) Хотите - просматривайте, составляйте. Как будете "составленый" список компиятору предавать? Прототипы это механизм предачи описания, который должен быть по любому. А окуда Вы это описание возьмете - дело не принципиальное.



QUOTE (Непомнящий Евгений @ Oct 15 2015, 09:52) *
Дык используйте подмножество С++, и будет вам счастье. Никто не заставляет использовать все и сразу.

Именно так. Начиная я писать на С++, а не на Cи, так-что на PC как-то после ухода на Cи в основной массе работ, сполз постепенно на "псевдо Си" - Си, но под плюсовый компилятор.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 15 2015, 23:19
Сообщение #223


.
******

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



Моё мнение о Си.

Переменная-указатель на функцию с неизвестными аргументами, как и аналогичная декларация, есть грабля. Пустые скобки при её объявлении логично интерпретировать как отсутствие аргументов. При вызове её с какими-то аргументами выдавать варнинг, аналогично вызову функции через декларацию. Варнинг при вызовах через декларации более чем уместен из-за неизвестности типа аргументов при конвертации rvalue. Даже опция его включения лишняя. На заре эволюции разрешили криминал, который давно надо было плавно заблокировать.

Пример:

объявление глобальной или локальной переменной:
void (*Func)(стандартные правила для прототипов/деклараций);

в коде функций:
Func = (void (*)())FuncAddr;

Интерпретация пустых скобок в смысле неизвестности списка аргументов удачна в конструкции преобразования типа целочисленного rvalue, интерпретируемого как адрес функции. Наделяя получившееся rvalue универсальностью в дальнейших конвертациях. Но попытку вызова функции через rvalue с таким типом лучше интерпретировать как ранее описано из переменной.

Декларацией здесь, ранее и далее я называю только прототип функции с пустыми скобками списка аргументов. В контексте определений типа (в т.ч typedef) это тоже наличие пустых скобок там же.

Т.к. текстовый препроцессор тоже разгребает список передаваемых ему аргументов, то и там могут быть какие-то грабли с "(void)", "()", неоднозначностью толкования и разными контекстами. И вообще, корректностью стандарта.

Про void в скобках в списке аргументов ничего хорошего не добавлю sm.gif

Цитата(GetSmart @ Oct 11 2015, 18:28) *
По поводу пустых скобок в for() ошибся, т.к. никогда его не использую, ... for(;;)

Уточняю. В таком виде.

Сообщение отредактировал GetSmart - Oct 16 2015, 10:25


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


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

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



Цитата
По поводу пустых скобок в for() ошибся, т.к. никогда его не использую, ... for(;;)

У меня в коде есть даже for( ; ; ) ; rolleyes.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 16 2015, 22:15
Сообщение #225


.
******

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



Цитата(zltigo @ Oct 14 2015, 00:58) *
Мне с учетом предыстории развития языка все понятно и принятые компромиссы вполне разумны. Для удовлетворения амбиций можете начинать создавать собственый совершенно "правильный" язык.

Компромисс чего с чем? В скобках видна только лишняя сущность, вроде червя. Хочу понять, но не хватает информации. Перечитал все посты здесь. В разных контекстах интересно. В случае отсутствия необходимости наследования исходников есть какие-то недостатки? Или единственный недостаток в том, что компилятор будет ругаться на криминальные вызовы через декларации в древних исходниках?

Не сочтите за труд подытожить.

Сообщение отредактировал GetSmart - Oct 16 2015, 23:21


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:24
Рейтинг@Mail.ru


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