Как писать функции, применимые к разным типам данных, или Мнимый полиморфизм в C (Си)

แชร์
ฝัง
  • เผยแพร่เมื่อ 7 ก.พ. 2025
  • Вы замечали, что одним и тем же оператором * можно умножать числа самых разных типов - а вот вывод на печать требует очень разных команд форматирования (% и дальше целый зоопарк)? Не говоря уж об аргументах функций. Не говоря уж о массивах. Не говоря уж… А почему, собственно, не говоря? Давайте поговорим! И избавимся от диктата типов данных (ну, почти).

ความคิดเห็น • 82

  • @TheLordWilex
    @TheLordWilex หลายเดือนก่อน +6

    Я программирую на c++ и то давно уже не программирую. И я не знаю зачем я вообще смотрю лекцию про си, особенно с учетом того, что мне через 4 часа на работу вставать. Но очень залипательно! Лайк, подписка и с нетерпением жду ещё Ваших лекций!

  • @ВладимирПавленко-д8ш
    @ВладимирПавленко-д8ш หลายเดือนก่อน +2

    Очень признателен за вашу работу и эту публикацию. Она мне как философу поможет обосновать решение проблемы субъектности и связи математики с социальной философией. Спасибо!

  • @Shineglow
    @Shineglow หลายเดือนก่อน +2

    Очень кртая лекция и не менее крутая лектор. Большое спасибо за понятное объяснение и интересную тему.

  • @alexishome4322
    @alexishome4322 หลายเดือนก่อน +5

    Коммент в поддержку канала ❤❤❤
    Мне прям очень^2 нравиться как Вы рассказываете.

    • @ВладимирПавленко-д8ш
      @ВладимирПавленко-д8ш หลายเดือนก่อน

      я не читал и не слушал ещё, но сама постановка проблемы очень обрадовала, это то, о чём я давненько думал, но не знал, как подступиться. Чуть освобожусь - и стану читать и вникать, спасибо огромное автору ❤

  • @Nämë_öt
    @Nämë_öt หลายเดือนก่อน +3

    С моей подпиской к Вам придёт много народа. Так держать!

  • @vdrmkr
    @vdrmkr หลายเดือนก่อน +4

    Женщина в Си это конечно удивительно и интересно, если бы у меня был такой учитель информатики думаю я бы полюбил программирование ещё в школе

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +3

      Удивительно - это слон в 3D-принтере :) А женщины - они где только не, чего б и не в Си.
      Сейчас-то полюбили? Надеюсь, да!

    • @vdrmkr
      @vdrmkr หลายเดือนก่อน

      @olgapavlova я-то уже 5 лет как полюбил, руководитель в крупном банке в 26. А мог прям со школы, тогда в 18 можно было бы уже выходить на рынок труда сразу на достойные условия. Так что школота - мотайте на ус.

    • @oeaoo
      @oeaoo หลายเดือนก่อน

      какая кринжатина всё-таки, и оно ж даже не понимает что пишет емое

  • @deadman-o7d
    @deadman-o7d หลายเดือนก่อน +6

    Си прост, но нужно быть гением, чтобы понять его простоту.

    • @daiske2867
      @daiske2867 หลายเดือนก่อน

      И нужно быть PhD, чтобы понять, что там, где действительно нужна была простота, имеем...

  • @sashababushkin8258
    @sashababushkin8258 หลายเดือนก่อน +1

    За 10 лет кодинга так и не столкнулся с ситуацией, где бы этот полиморфизм был прям нужен-нужен. Но для учебных целей, понимать, какую хрень тянет за собой всё это .... ДА, ЭТО ПОЛЕЗНО!

  • @exx-ns4tt
    @exx-ns4tt หลายเดือนก่อน

    опять питон🙃🪱🪱. Благодарю Вас, много нового узнал👍🤝

  • @Глупыйдурачок
    @Глупыйдурачок หลายเดือนก่อน +2

    Ждём видео про произвольное количество аргументов!! Возможно кстати можно кодогенерацию как-то настроить?

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +1

      Да, дней через 10 сделаю про произвольное количество аргументов.
      Кодогенерацию в некоторых объёмах можно, постараюсь чуть позже показать основные штуки там.

  • @_dzen_tv_
    @_dzen_tv_ หลายเดือนก่อน +1

    30:25 Ещё хорошей практикой для макросов является использование конструкции do{}while(0)

  • @hsqlk
    @hsqlk หลายเดือนก่อน +1

    Сам пишу на Python, но поскольку он написан на С, то однозначно лайк

    • @azerqgaming
      @azerqgaming 12 วันที่ผ่านมา +1

      По логике большинство компиляторов и интерпретаторов ЯП так или иначе написано на C и ASM.

  • @НиколайШорников-н7т
    @НиколайШорников-н7т 29 วันที่ผ่านมา +1

    Поскольку во freepascal(да, я патологоанатом) одинаково названные функции, но с разными аргументами считаются разными и ошибок компиляции не вызывают, я по наивности своей предполагал, что в в С тоже самое))) а оказывается необходимо женерик городить, но всё равно прикольно. А людей "боящихся" точку-с-запятой предлагаю в программисты не брать)))

  • @MSaidu-sj6vx
    @MSaidu-sj6vx 29 วันที่ผ่านมา

    Оооо!!!! Шикарная тема!

  • @m_stifeev
    @m_stifeev 29 วันที่ผ่านมา

    Здравствуйте. Спасибо лекцию. После просмотра сразу возникли вопросы. 1) Как макрос _Generic реагирует на наличие модификаторов const, volatile, restrict у управляющего выражения? Он их отбрасывает, или нужно писать "реализацию" под каждый вариант/варианты? Или явно кастовать в тип без модификаторов? 2) Если передать NULL напрямую (без посредников-указателей) в управляющую конструкцию, то разве весь макрос не раскроется по ветке с int, ведь NULL = 0 по факту?

    • @olgapavlova
      @olgapavlova  28 วันที่ผ่านมา +1

      Прекрасные вопросы, спасибо.
      Отвечу в двух словах.
      1. Все верхнеуровневые квалификаторы типа отвалятся перед сравнением. То есть тип const int в вариантах задавать нет смысла, достаточно int. И отличить тип с квалификатором от типа без квалификатора (верхнеуровневого) нельзя всё по той же причине: cvr-квалификаторы не доживают до момента сравнения, отваливаются.
      2. В большинстве компиляторов конкретно для Си NULL - это макрос для сущности с типом (void *). Так что он чаще всего и опознаётся как void *. Что до равенства нулю, то это, скажем так, встречается, но далеко не повсеместно. Вообще тут не устоялась норма, насколько я знаю.
      Если ошибаюсь, буду рада об этом узнать.

  • @MSaidu-sj6vx
    @MSaidu-sj6vx 29 วันที่ผ่านมา +1

    Был на ютубе канал "си от эксперта", не обновлялся уже давно. Будете ли Вы рассматривать "тонкие" моменты при программировании в Си ( появление "утечек памяти", откуда они берутся, если в явном виде выделения не происходило и подобные моменты )?

    • @olgapavlova
      @olgapavlova  29 วันที่ผ่านมา +1

      А это тонкие? Я просто пребываю в счастливом заблуждении, что утечки памяти - это ого-го какие толстые моменты :) Наберу материала - расскажу, конечно. Спасибо за мысль!

  • @a.d.d.i.t.
    @a.d.d.i.t. หลายเดือนก่อน +1

    2:00
    В Си для мелочи-встройки или при очень строгих требованиях по быстродействию лучше переписать алгоритм под нативные для железки форматы данных, а сам язык позволяет удобно писать не выходя за рамки возможностей железа.
    19:20
    NULL - это не значение "ноль", это указатель (!!!) типа void, указывающий на нулевой адрес. При чтении такого указателя без разыменования будет считываться ноль, но тип такой "переменной" будет приводиться к типу, используемому в данной аппаратуре для указателей, как и при чтении любого другого указателя. В большинстве случаев это будет int. Но не всегда.
    ...
    В целом - жуть. Зашёл на заголовок про полиморфизм в Си, на деле тут вводная о том как написать макросы для реализации перегрузки в Си.

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +1

      Может быть, язык и позволяет, а вот образовательные материалы по нему - нет.
      Вы правы, NULL - это _в большинстве случаев_ (но не всегда) void*.
      Знаете, я, пожалуй, продолжу ориентироваться не на вас, а на свою аудиторию и свои задачи.
      Правкам в комментах буду рада, могут пригодиться (а могут и нет).

    • @a.d.d.i.t.
      @a.d.d.i.t. หลายเดือนก่อน

      @@olgapavlova
      Си как язык по сути является человекочитаемым аппаратно-независимым ассемблером, об этом часто забывают. Заходить в Си без знаний о регистрах, разрядности, ширине слов, АЛУ и прочих базовых понятий довольно странно. Все похожие на С++, C#, Java и других языков фокусы были введены в язык для того чтобы в компиляторах были одни и те же ассемблерные определения и поэтому рантаймы библиотеки написанные на разных языках в принципе можно было использовать совместно.
      Ну хорошо, не всегда на void. В любом случае, в Си и плюсах при начале работы на новой платформе и/или новом компиляторе всегда надо смотреть хотя бы в содержимое stddef, а не удивляться приведению к типу, указанному в макросе стандартного заголовочного файла.
      На тему ориентирования на аудиторию - в названии слово полиморфизм, а не деле всё не выходит за рамки самописного велосипеда для перегрузки имён функций. Это по сути введение в заблуждение.
      Нужен высокоуровневый язык с прямым доступом к памяти - берите плюсы. Си нужен там, где программист проверяет в дизассемблере вывод тулчейна, для чего в свою очередь нужно чтобы символы в дизассемблере и символы в исходнике всегда совпадали.
      Правки комментов - смотрю видео, по ходу дела пишу и дописываю комментарий. Так и получаются правки.

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน

      Ответственный подход, спасибо.
      Вообще я очень рада, что в комменты пришли люди, лучше меня (гораздо лучше!) разбирающиеся в предмете.
      Вы правы насчёт того, что без базовых понятий заходить в Си странно. Однако перед нами реальность: Си массово используют как первый язык. Да, в надежде на то, что человечество отвлечётся от Python и заметит, что программирует на железненьком таком компьютере, а не на Всемогущей Универсальной Шайтан-Машине с GUI-интерфейсом :-) Но, увы, это приводит к тому, к чему приводит: «Слушай, а программа - это вообще что?» Приходится объяснять.
      Разным людям разное. Заходите ещё :) Можно чуть позже, когда с драйверами будем развлекаться (точно будем).

  • @tuksser
    @tuksser หลายเดือนก่อน

    Познавательно очень! Расскажите какой стек применяете на работе? В каком области работаете?

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน

      Моя компания автоматизирует дизайн интерфейсов. От Си это очень, очень далеко.

    • @tuksser
      @tuksser หลายเดือนก่อน

      @@olgapavlova что востребовано знать и уметь чтобы работать в eduhund?

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน

      @@tuksser TypeScript + React + общая эрудиция по фронтенду и сетям - ваши верные друзья :) Но мы пока не нанимаем.

  • @nataliepodgainova6582
    @nataliepodgainova6582 หลายเดือนก่อน +1

    Просто апплодирую стоя😊

  • @blusterhash
    @blusterhash หลายเดือนก่อน +1

    Здравствуйте, а в рамках чего проходят данные стримы? Есть какой-то курс по си?

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +5

      Да просто рассказываю что кажется интересным, никаких формальностей :)

  • @megannnn98
    @megannnn98 29 วันที่ผ่านมา

    Ждём продолжение

  • @notforvideoschannel
    @notforvideoschannel หลายเดือนก่อน +2

    Для процессора вообще нет таких понятий как переменная и тип данных. Существует только понятие данных и размера этих данных (byte, word, dword, qword). А остальное - это уже высокоуровневая интерпретация.

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +5

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

  • @yavbvb123
    @yavbvb123 หลายเดือนก่อน +2

    А где можно посмотреть расписание будущих стримов?

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +2

      Хорошая идея, спасибо. Вывешу в описание канала.
      Ближайший - про ошибки как часть дизайна программы на C (Си).

    • @yavbvb123
      @yavbvb123 หลายเดือนก่อน

      @@olgapavlova это просто великолепно!

  • @mtp7261
    @mtp7261 หลายเดือนก่อน

    Отличный канал, как получить ваши замечательные настройки vim?

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน

      Спасибо за вопрос. Выложу. К сожалению, не обещаю, что скоро.

  • @exx-ns4tt
    @exx-ns4tt หลายเดือนก่อน +1

    1:14:33 офигенный пример

  • @LetroScript
    @LetroScript หลายเดือนก่อน

    Ольга, а вы знате плюсы (C++)? Если да, то будут видео по нему?

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +1

      Ага, будут видео по C++ - примерно через полгода.

  • @ГубкаБоб-р8ъ
    @ГубкаБоб-р8ъ 9 วันที่ผ่านมา

    Многие плачут по поводу форматированных строк в Python? Ошалеть, для меня новость, покажите этих людей (образно). Наоборот, большинство в восторге как это удобно и функционально. Нет разве?

    • @olgapavlova
      @olgapavlova  8 วันที่ผ่านมา

      Это смотря где искать это «большинство». Впрочем, как всегда.

    • @ГубкаБоб-р8ъ
      @ГубкаБоб-р8ъ 8 วันที่ผ่านมา

      @@olgapavlova Наверное. Знаю много народа кто пишет на питоне, что бы кто-то из них был недоволен f строками, ни знаю ни одного. Я даже перемотал и еще раз прослушал момент про то что плачут от форматированной строки, подумал может не то имелось ввиду.
      Спасибо за интересный контент

  • @Shineglow
    @Shineglow หลายเดือนก่อน

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

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน

      Добью вопрос, ага. Спасибо за идею!

  • @dmitriizapalatovskii2658
    @dmitriizapalatovskii2658 หลายเดือนก่อน +1

    Зачем это все чтобы напечатать одну строчку. Джависты: и это всё?

  • @Retro_Botanik
    @Retro_Botanik หลายเดือนก่อน

    В каком редакторе происходит написание кода?

    • @olgapavlova
      @olgapavlova  29 วันที่ผ่านมา

      vim

    • @Retro_Botanik
      @Retro_Botanik 29 วันที่ผ่านมา

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

    • @olgapavlova
      @olgapavlova  29 วันที่ผ่านมา

      @@Retro_Botanik Спасибо за идею!

    • @MSaidu-sj6vx
      @MSaidu-sj6vx 29 วันที่ผ่านมา

      ​@@olgapavlova Наш человек!!! Самый лучший редактор ( настроил под себя, с остальными только мучался месяцами ).

  • @sibedir
    @sibedir หลายเดือนก่อน

    "Зловещая пауза" (с) 😊
    Кто понял, тот понял

  • @ВсеволодПарфёнов-ф2ъ
    @ВсеволодПарфёнов-ф2ъ หลายเดือนก่อน +2

    С таким применением union не согласен, а остальное - отлично.

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน

      А как вы его обычно используете?

    • @ВсеволодПарфёнов-ф2ъ
      @ВсеволодПарфёнов-ф2ъ หลายเดือนก่อน +1

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

  • @AlexAlex-jk2tn
    @AlexAlex-jk2tn 8 วันที่ผ่านมา

    Я не очень знаю, на кого расчитано данное видео, но как профессиональный программист на Си у меня глаза вытекают, чем вам точка с запятой не угодила? А коментарии кирилецей - это вообще мрак, за такое по рукам бьют ещё на первых курсах универа. Больше похоже на какое-то баловство. Извините за критику, но что есть, просто не хочу чтобы это считалось нормальным.

    • @olgapavlova
      @olgapavlova  8 วันที่ผ่านมา +1

      Вы правы. Там за скобками остались кое-какие понятные для слушателей умолчания, в том числе про кириллицу. Но лучше явно прокомментировать, что да, комменты на русском - это не то, что стоит практиковать, а только поясняющий инструмент к видео.

    • @AlexAlex-jk2tn
      @AlexAlex-jk2tn 8 วันที่ผ่านมา

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

  • @ДмитрийКиселев-е1й1с
    @ДмитрийКиселев-е1й1с หลายเดือนก่อน

    А как вам Zig?

    • @olgapavlova
      @olgapavlova  29 วันที่ผ่านมา

      О, вы уже второй, кто спрашивает :) Определённого мнения пока нет, но это временно. Расскажу, как будет что.

  • @НадеждаШейко-е9н
    @НадеждаШейко-е9н หลายเดือนก่อน +1

    То есть на Си надо написать целую библиотеку чтобы сделать аналог паскалевского WriteLn(); ?) Эх, отсталый язык!)

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +1

      И не говорите! Дикие люди, дети гор :)

    • @dmitriizapalatovskii2658
      @dmitriizapalatovskii2658 หลายเดือนก่อน +1

      У нас есть WriteLn дома (printf)

  • @alexzk3
    @alexzk3 หลายเดือนก่อน

    Я от не понимаю любителей С... ну ведь уже ж есть шаблоны в С++ :) Уже все изобрели и оттестировали. И виртуальность всякая есть. Нет, продолжают изобретать С++ в частных случаях.

    • @olgapavlova
      @olgapavlova  หลายเดือนก่อน +1

      Насамперед це iграшка. Як на мене, дуже цикава.

    • @alexzk3
      @alexzk3 หลายเดือนก่อน

      @@olgapavlova Думаю, для линукса пропихнули. Я код ядра как-то глянул - случайный файл - и сразу увидел, как они там С++ /виртуальные функции изобретают. Зато все вручную, с "полным контролем". Я этого "контроля" наелся на МК-61 :))

    • @ГеннадийШушпанов-д1ч
      @ГеннадийШушпанов-д1ч หลายเดือนก่อน +1

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

    • @philkulibin2602
      @philkulibin2602 หลายเดือนก่อน +1

      Есть программы которые действительно хуже работают если написаны на с++ а не с. Это RT (реал тайм) приложения. Си код более поозрачен и главное более предсказуем по времени выполнения любого участка кода. Полной предсказуемости нет всё равно но всё гораздо более предсказуемо чем в Си++ программе где STL используется. Другая крайность это Си# там есть уборка мусора и любой деструктор не предсказуем. То есть время выполнения мало зависит от кода если объекты там создаются или удаляются а вот количество и фрагментированность свободной памяти на момент выполнения этого кода очень даже сильно влияют. Насчёт прозрачности тоже на голом Си как-то проще. В отладчике зайти в функцию это действительно зайти в одну функцию а в Си++ зачастую пока зайдёшь прийдется зайти и выйти в кучу функций преобразования для аргументов желаемой функции. Отладка в Си прозрачнее.

    • @Mytest437
      @Mytest437 หลายเดือนก่อน +1

      Я думаю изобретают, потому что С++ используют те кто пишет на С++, а вот С часто бывает мостом для других языков через FFI. Он проще как раз сопрягается с другими языками и поэтому ценен сам без С++.

  • @default-writer
    @default-writer 28 วันที่ผ่านมา +1

    Типобезопасность в С - это просто ну конечно нужен не дедушкин С а какой-то более современный модификант или С3 на худой конец

    • @olgapavlova
      @olgapavlova  28 วันที่ผ่านมา

      Дорастём - разберём, ага.