LINUX.ORG.RU

Полиморфизм в Си

 


0

3

Всегда были проблемы с такого рода проектированием.

Вот пример:

struct ca_str {
  char n;
};

struct cb_str {
  int n;
};

struct p_str {
  struct c_str *c;
  /*must be a link to either
    struct ca_str or struct cb_str
  */
};

Нужно что бы struct p_str содержала указатель или на struct ca_str, или же на struct cb_str. Из моих изобретений – можно держать указатели на все возможные структуры. Все ненужные из них делать тотальными NULL.

Но как это делают программисты в программировании?

Перемещено leave из general

Ответ на: комментарий от eagleivg

почему же он остался только в ведре да в эмбедде

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

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

firkax ★★★★★
()
Ответ на: комментарий от eagleivg

Интересно получается, полиморфизма в С нет, а функция animal_say полиморфна. Как так?

Полиморфизм в Си (комментарий)

А в glib, получается, тоже наврали, и никакого полиморфизма нет?

https://developer.gnome.org/gobject/stable/gobject-Boxed-Types.html

О, а за тонкий юмор зачет:)

Я правильно понимаю, что вы не знаете язык С?

Siborgium ★★★★★
()
Ответ на: комментарий от eagleivg

ТС решает задачу, языковыми средствами не предусмотренную.

Как это не предусмотренную, когда union как раз для этого. Не путай «мы тут всё уже сделали за тебя» и «вот тебе инструмент, но логику к нему пиши сам, ты же программист». Хочешь хранить параллельно два типа - вот тебе union. Как именно регулировать обращения к ним - пиши код, тебе доступны настройки любых подробностей сего процесса.

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

Проблема в некомпетентных программистах, правильно?

Например, в геймдеве, где надо всю тормозящую фигню как-то запихнуть в 16 мс, там тоже? Поэтому они на С++ перешли, верно я понял? Потому что си не могут освоить?

eagleivg ★★★★★
()
Ответ на: комментарий от eagleivg

Например, в геймдеве, где надо всю тормозящую фигню как-то запихнуть в 16 мс, там тоже?

Ну тут без конкретики никуда. А то вполне может статься, что у компетентного программиста она вовсе и не была бы тормозящей изначально.

Грубый пример: нам надо в течение суток собирать какие-то данные, и ровно в полночь отдать какой-то обработанный результат по ним.

Ты будешь героически оптимизировать этот полуночный расчёт, сначала он у тебя будет делаться час, потом полчаса, потом наконец 5 минут, и ты хвастаешься, что ускорил свои расчёты больше чем в 10 раз.

Правильно же так: почти все расчёты, оказывается, можно было делать инкрементально в течение тех самых суток, а в конце потратить 2 секунды на подведение итогов. Никаких героических оптимизаций не требуется, всё работает сразу быстро и дае на медленном железе.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Осталось понять...

Хочешь другую - бери С

Какую это «другую». Вариантов в С немного. Полиморфизм сам по себе всего один. И придумать тут что-то очень сложно.

Либо полиморфизм достижим через использование структур и объединений (в т.ч. и анонимных). Либо полиморфизм достижим через использование _Generic (введено в С11, если не ошибаюсь). Ну либо извольте в структуре создать свой элемент vtbl, vtable и дальше через него. Сами, ручками, без участия компилятора.

Больше вариантов нет. А сам по себе полиморфизм одинаков что в С, что в С++, что где-либо ещё. По своей семантике. По синтаксису отличия будут. Но тут уже что первично, что вторично, вот в чём вопрос. Шашечки или ехать.

Moisha_Liberman ★★
()
Ответ на: комментарий от eagleivg

Не совсем так.

Поэтому они на С++ перешли, верно я понял? Потому что си не могут освоить?

В своё время плюсы выглядели как благословение на фоне голимой императившины в С. Когда тот же Александреску сорвался с цепи и поперекусал тучу народа. В оособенности, когда ООП начало расцветать буйным цветом. Однако, тот же DOOM, ЕМНИП, id Software написала на энтом самом С и не обломалась.

С течением времени выяснилось (или, точнее, наконец-то дошло) что язык никоим образом не налагает ограничений на используемые парадигмы программирования. Поэтому в наши времена и в С ООП завезли (точнее, завозят при необходимости, там где ООП удобно в смысле реализации). С (даже!) до некоторой степени является вполне себе функциональным языком программирования.

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

Moisha_Liberman ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.