Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, наконец-то! А для того, чтобы понимать, нужно исследовать перегрузку оператора сравнения для классов используемых объектов. А если этот код писало десять человек три года назад, быстрее будет без всякого полиморфизма написать свое сравнение, чем копаться в тысячах строках кода, врубаясь, подходит реализованная кем-то когда-то перегрузка для данного случая или нет.
Даже в описанном мной классическом случае совершенно неоднозначно, требуется сравнение указателей или строк. Иногда важно одно, иногда - другое.
Я нигде не писал "плохой", в отличии от Вас. Я только пытаюсь предупредить читателей данной темы, особенно новичков, что ad-hoc полиморфизм в C++ имеет весомые недостатки. Его использовать допустимо только хорошо отдавая себе отчет, что вернувшись к своему же коду через год-другой понадобится углубляться в изучение реализации всех перегрузок давно забытого кода.
В общем случае, лучше начинающим вообще на C++ полиморфизмом не увлекаться. Код будет прозрачней и проще.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Reflector писал(а):все дружно перебираемся на паскаль?
Лучше на бейсик. :) :idea:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Мурик, тебе давно пора. Сидел на барсиках и нечего было слезать. Только СД мог такое за переход на барсик ляпнуть...
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="Reflector",url="/forum/viewtopic.php?p=3709209#p3709209"]Как ты на С будешь делать подобные проверки?[/uquote]
Не буду. Это - блажь!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3709344#p3709344"]Так что будет сравнивать полиморфный шаблон? Указатели или то, на что они указывают? А если речь будет уже о сложных объектах, с тысячами срок кода их реализации?[/uquote]Средства языка позволяют понять что за тип передаётся в шаблон и либо подобрать ему соответствующий метод сравнения, либо assert-нуть. Если программист этого не сделал, то он ССЗБ.

Добавлено after 7 minutes 10 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3709507#p3709507"]Не буду. Это - блажь![/uquote]Ваше мнение очень важно для нас! :)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

VladislavS, и что будет сравниваться в моем простейшем примере? )))
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3709595#p3709595"]и что будет сравниваться в моем простейшем примере? )))[/uquote]
Если бы изначально в С параллельно с char существовал еще один 8-ми битный тип, условный byte, и char использовался только для строк, то max() принимая char* могла бы исходить из того, что это строки, сравнивать их нужно как строки и нет никаких проблем. Внимание вопрос: а при чем тут параметрический полиморфизм на мономорфном ядре? :) Ты пытаешься убедить, что проблема в С++, т.к. полиморфизм там какой-то недоделанный, но даже идеальная реализация полиморфизма бесполезна когда нельзя сказать строка перед нами или что-то другое...
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, я никого не убеждаю, я просто констатирую факт, что в С++ нет параметрического полиморфизма, как, например, в ML. Вместо этого есть синтаксический сахар ad-hoc полиморфизма поверх мономорфного ядра. Именно из этого мономорфного ядра и проистекают все недостатки полиморфизма в C++. Полиморфизм в C++ не может быть "доделанным". Для этого нужно сменить ядро языка на полиморфное, но тогда это будет уже другой язык )

Добавлено after 18 minutes 38 seconds:
P.S. У меня складывается ощущение, что многие просто не понимают, что такое полиморфизм. На удивление, в Вики очень неплохая статья по этому поводу.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3709639#p3709639"]У меня складывается ощущение, что многие просто не понимают, что такое полиморфизм.[/uquote]
У меня не просто ощущение, я на все 100% уверен, что некоторые не понимают даже что такое синтаксический сахар :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, тоже поделюсь ссылкой на статью в Вики.
Даже процитирую определение оттуда:
Под «синтаксическим сахаром» понимается любой имеющийся в языке программирования синтаксический элемент, механизм, способ описания, который дублирует другой, имеющийся в языке элемент или механизм, но является более удобным в использовании, или более краток, или выглядит естественнее, или более привычен (похож на аналогичные элементы других языков), или просто лучше воспринимается при чтении программы человеком. Принципиально то, что синтаксический сахар, теоретически, всегда можно удалить из языка без потери его возможностей — всё, что можно написать с применением синтаксического сахара, может быть написано на этом же языке и без него. Таким образом, синтаксический сахар предназначен лишь для того, чтобы сделать более удобным для программиста написание программы.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18740
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в таком случае, всё, кроме оператора if и goto, является синтаксическим сахаром, ибо любой алгоритм реализуется в этом базисе операторов (не считая операторов элементарной арифметики и присваивания).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

ARV, а Вы не знали? В той же статье, на которую я давал ссылку, даже пример есть:
Например, в языке C и его потомках имеются операторы увеличения и уменьшения (++, --, +=, -= и т. п.). Введение этих операторов в язык было вызвано необходимостью поддержки ручной оптимизации программ, так как код с их использованием мог транслироваться в более эффективные машинные команды («++a» транслировалось в одну команду INC, а аналогичное выражение «a=a+1» — в целую группу команд). Развитие технологии оптимизации кода сделало подобную ручную оптимизацию бессмысленной; сейчас компиляторы порождают одинаковый код для «длинного» и «короткого» варианта операции. В результате сокращённые операторы превратились в синтаксический сахар, хотя изначально им не были.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18740
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

ARV, но тогда почему плюсанули сообщение Reflector? Ведь он, получается, бросил камень, в том числе, и в Ваш огород?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18740
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Мне правда глаз не колет :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Подскажите как красиво сделать такую вещь. Есть тип направление:

Код: Выделить всё

typedef enum {
    north = 0,
    east = 1, 
    south =2,
    west =3}
И вот нужно вычислить его изменение приповороте направо или на лево.
Если в цифрах то направо (x +1) & 0x03, налево, соответственно, (x-1) &0x03. Но компилятор ругается на смешивание типов. Как это сделать красиво?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18740
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

x++ или x-- ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="uldemir",url="/forum/viewtopic.php?p=3711136#p3711136"]Как это сделать красиво?[/uquote]Надо делать не красиво, а правильно. Явное приведение типов делать надо. Ты же не просто ради дефайна констант enum применил, правда?

[uquote="ARV",url="/forum/viewtopic.php?p=3711137#p3711137"]x++ или x-- ?[/uquote]Кхм, не будет так работать. Зато красиво то как :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

uldemir, а вам обязательно enum? Просто объявите направление движения типом int (скажем, int8_t), задефайните основные направления, а после каждой процедуры изменения делайте проверку вроде

Код: Выделить всё

int rotate(int olddir, int angle){
  olddir += angle;
  olddir %= 4;
  if(olddir < 0) olddir += 4;
  return olddir;
}
Вот и все!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3711208#p3711208"]задефайните основные направления,[/uquote]Ну он это и сделал enum-ом.
Ответить

Вернуться в «Разные вопросы по МК»