Практика языка C (МФТИ, 2023-2024). Семинар 3.1. Линейный поиск и простые сортировки.

Поділитися
Вставка
  • Опубліковано 21 гру 2024

КОМЕНТАРІ • 25

  • @АндрейВасильев-ъ9э

    Классный сериал👍

  • @ddvamp
    @ddvamp 6 місяців тому

    51:10 Константин, как заметили ниже, здесь что-то не так. Во-первых, &arr3[0] это указатель на массив, а &arr3 это указатель на указатель на массив (int (**) [3]). Вероятно вы имели в виду &arr[0] и &arr. Во-вторых, адрес массива нельзя записать в int *, там должен быть как раз int (*parr3)[3]

    • @tilir
      @tilir  5 місяців тому

      Да при изложении на доске тут есть опечатки. Но на то и доска, а не слайды.

  • @vdalart
    @vdalart Рік тому

    5:50 const int * const cpca можно инициализировать и &a, и &b - ошибки не будет

    • @tilir
      @tilir  Рік тому

      Спасибо, внёс в errata.

  • @siarheimarozau6763
    @siarheimarozau6763 9 місяців тому +1

    На рисунке на 52 минуте мне кажется что логичнее написать в первой строчке
    int *arr[3]; int *pa = &arr[0];
    вместо int *arr[3]; int *pa = &arr3[0];

  • @МаксимРябцев-п9с
    @МаксимРябцев-п9с 3 місяці тому

    Спасибо за уроки! Где вы делаете презентации?

    • @tilir
      @tilir  3 місяці тому

      powerpoint, шаблон basic

  • @antonzhurba865
    @antonzhurba865 Рік тому +1

    как для практической части не раскрыта тема const для первого курса, когда всё таки его писать и когда его стоит упустить? Также упомянул бы основные проблемы что связанные (потеряна константности, "const poisoning").

    • @tilir
      @tilir  Рік тому

      Мы ещё много раз вернёмся к const. Пока правило простое: не собираемся изменять -- ставим const.

  • @ДенисСомин
    @ДенисСомин Рік тому

    Спасибо большое за лекцию, было, хоть и не сложно, но интересно.
    Осталась правда пара вопросов:
    1) можно ли написать свою обёртку над qsort, принимающая последним аргументом int (*)(), таким образом нам для каждого компаратора не пришлось бы писать эти явные преобразования из void * в TYPE *? (Вопрос, конечно, почему разработчики qsort так не сделали (скорее всего из-за ухудшения читаемости прототипа функции))
    2) вы рассказали о расстановке квалификатора const и его смысл, однако не объяснили семантику выражения const void *ptr, правда это больше не вопрос, конечно, а придирка)
    3) касательно сидекл и динамических массивов, что вы думаете по поводу указателя на vla в роли матрицы? т.е. int (*matrix)[m] = malloc(sizeof *matrix * n); это хорошая практика или же нет?

    • @tilir
      @tilir  Рік тому

      (1) Вы имели в виду int(*)(...)? Это добавить оверхеда которого и так немало. Каст же бесплатный.
      (3) Плохая практика. Работа VLA не гарантируется на конформной реализации в C и VLA явно запрещены в C++.

    • @ДенисСомин
      @ДенисСомин Рік тому

      @@tilir с vla понял, а касательно первого вопроса - нет, я имел в виду именно int (*)(), т.е. определение функции-обёртки выглядело бы так:
      void qsort_(void *arr, size_t num, size_t size, int cmp()) {
      qsort(arr, num, size_t, cmp);
      }
      Либо же ввести макрос а-ля
      #define QSORT_CB(CMP) (int (*)())CMP
      и потом вызывать qsort(arr, num, size, QSORT_CB(cmp));
      ну либо макрос на сам кусорт
      Хотя первый вариант мне нравится больше, там же обёртка заинлайнится.
      И в сухом остатке мы получаем преимущество в виде экономии двух строк для каждого компаратора.
      т.к. имхо
      const int *lhsi = lhs;
      const int *rhsi = rhs;
      выглядит ужасно

    • @tilir
      @tilir  Рік тому

      @@ДенисСомин а как может работать компаратор без аргументов?

    • @ДенисСомин
      @ДенисСомин Рік тому

      ​@@tilir так в си же объявление функции как int foo(); - синонимично тому, что для функции не предоставлено информации о количестве и типе аргументов, т.е. её можно вызвать с любыми аргументами, а определение int foo() {} да, синонимично функции не принимающей аргументов.
      UPD: и да, тип int (*)() является совместимым с любым типом int (*)(parameter type list)

    • @tilir
      @tilir  Рік тому

      Я к слову был уверен что это уже запретили году этак в 99м. Это немыслимо дурной хак, подписывающий вас на все возможные проблемы с ABI. Функция без аргументов это void, всё остальное не должно применяться.

  • @ivankrutov8789
    @ivankrutov8789 Рік тому

    Слайд 16. Кажется нужно заменить ++j на --j.

    • @tilir
      @tilir  Рік тому

      Спасибо, занёс в errata

  • @ShtrikeBirb
    @ShtrikeBirb Рік тому

    Кстати, а пузырек не выиграет у других в плане утилизации кэша?

    • @tilir
      @tilir  Рік тому

      Нет конечно. Там каждая итерация проходит полное расстояние.

  • @victormustya1745
    @victormustya1745 Рік тому

    На 17 слайде косяк: следующий минимальный элемент 3, хотя в массиве есть 2 не на своём месте.

    • @tilir
      @tilir  Рік тому

      Мы вслепую запускаем bubble sort каждый раз от конца массива. Он подхватывает в данном случае 3 и начинает её топить обменами вниз. Причём даже когда она перестаёт топиться, он идёт дальше. По дороге он установит и двойку.

    • @victormustya1745
      @victormustya1745 Рік тому

      ​@@tilirв случае bubble sort да. А в случае selection sort надо выбирать сначала двойку.