#44. Указатели на функцию. Функция как параметр (callback) | Язык C для начинающих

Поділитися
Вставка
  • Опубліковано 28 тра 2023
  • Практический курс по C/C++: stepik.org/course/193691/
    Телеграм-канал: t.me/java_and_c
    Инфо-сайт: proproprogs.ru/c_base
    Объявление указателей на функции. Передача функций через параметры. Пример программы использования указателей на функции.

КОМЕНТАРІ • 32

  • @dextersinister7838
    @dextersinister7838 Рік тому +12

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

  • @vladimirastrelin1719
    @vladimirastrelin1719 Рік тому +9

    Массив из указателей на функции.. Хммм..Сергей похоже живой прототип Морфеуса, который готов показать насколько глубока кроличья нора..Это просто нереально круто... Спасибо большое за отличный урок !

    • @user-ne4bd3ry1n
      @user-ne4bd3ry1n Рік тому +2

      массив тредов или корутин это ваще зашквар?
      массив - это штука не имеющая отношения к хранимиым данным, а данные массва это любые допустимые объекты
      язык программирования - это абстракция по отношннию к машиному языку и ому как работает компбютер

  • @user-gl2pu2xx7n
    @user-gl2pu2xx7n День тому

    Спасибо большое за науку!
    Тема указателей способна вызвать взрыв мозга, на первый взгляд и на второй тоже.
    Так и подмывает процитировать строки из книги Стивена Прата "Выразительность языка С в сочетании с богатством его операций делает возмож­ным написание кода, который исключительно сложно понять. Конечно, вы отнюдь не обязаны писать неясный код, но такая возможность имеется. В конце концов, для какого еще языка устраивается ежегодный конкурс на самый запутанный код?"

  • @user-xm5zl9up4r
    @user-xm5zl9up4r 5 місяців тому +1

    Спасибо, Сергей. Как всегда на высоте!!!

  • @kolobroadgh8532
    @kolobroadgh8532 Рік тому +5

    Если кого-то заинтересовало как передать в функцию напрямую массив коллбеков то это выглядит так
    // Функция, принимающая массив указателей на функции и их количество
    void callFunctions(void (**functions)(), int count) {
    for (int i = 0; i < count; i++) {
    functions[i](); // Вызов функции по указателю
    }
    }

    • @user-pg8ry1tm3t
      @user-pg8ry1tm3t 5 місяців тому

      Главное, не забыть потом эти указатели слить в правильном месте, шоб не утекли🥴

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

    Супер! Огромное спасибо за курс!

  • @jhonlauder2736
    @jhonlauder2736 6 місяців тому +1

    Добрый день, уважаемы Сергей! Очень понятная подача материала, с максимальным сжатым объяснением. Профессиональная подача, видна учительская способность, отличная дикция.
    Сергей, прошу добавить тему или разобрать массив указателей функций и прокомментировать следующую задачу кода. Куда можно применить такой код и как часто он используется?
    Type in a code to call the functions pointed by the funcs array. Введите код для вызова функций, на которые указывает массив funcs.
    // suppose f1, f2, and f3 are declared
    void (*funcs[3])() = {f1, f2, f3};
    for (int ix = 0; ix < _____

    _____; ix++) {

    ______[ix]();
    }
    B вот пояснение. В сухом остатке.
    Массив указателей функций может заменять switch или оператор if для выбора действия, как в следующей программе:
    #include
    int add(int num1, int num2);
    int subtract(int num1, int num2);
    int multiply(int num1, int num2);
    int divide(int num1, int num2);
    int main()
    {
    int x, y, choice, result;
    int (*op[4])(int, int);
    op[0] = add;
    op[1] = subtract;
    op[2] = multiply;
    op[3] = divide;
    printf("Enter two integers: ");
    scanf("%d%d", &x, &y);
    printf("Enter 0 to add, 1 to subtract, 2 to multiply, or 3 to divide: ");
    scanf("%d", &choice);
    result = op[choice](x, y);
    printf("%d", result);

    return 0;
    }
    int add(int x, int y) {
    return(x + y);
    }
    Комментарий к коду.
    Оператор int (*op[4])(int, int); объявляет массив указателей функций. Каждый элемент массива должен иметь одинаковые параметры и тип возвращаемого значения.
    В этом случае функции, назначенные массиву, имеют два параметра int и возвращают int.
    Оператор result = op[choice](x, y); выполняет соответствующую функцию на основе выбора пользователя.
    Ранее введенные целые числа являются аргументами, передаваемыми в функцию.
    Запустите код и посмотрите, как он работает!
    Что тут значит - int (*op[4])(int, int); с точки зрения адресной арифметики?
    Заранее благодарен за пояснение.

  • @catsaur5991
    @catsaur5991 Рік тому +2

    Вот это прям оч круто, очень полезно. Спасибо)

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

    Спасибо Вам! Очень круто!

  • @andredru4278
    @andredru4278 6 місяців тому +1

    Спасибо. Ого! похоже на декораторы. Крышесносно!

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t 5 місяців тому +2

    Колбеки - тема интересная. В плюсах неск способов их сотворить. И выбрать, что же лучше, весьма непростое дело🥴

  • @Ordinary_man2049
    @Ordinary_man2049 4 місяці тому +1

    Спасибо за уроки, Сергей! Не пойму, для чего при инициализации указателя на функцию пишем int *(ptr_name) в скобках имя указателя. Это для читабельности или без скобок никак не обойтись? Для чего они?

    • @selfedu_rus
      @selfedu_rus  4 місяці тому

      это синтаксис такой, просто нужно запомнить

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

    Как обычно, зачетно!!! Лайк за работу!!! По идее, последние функции должны возвращать "bool"?

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

      В языке Си (равно, как и во многих других) можно возвращать не ноль для True и 0 - для False. Тем более, что в базовом Си как такового типа bool все равно нет.

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

      @@selfedu_rus полностью согласен. Я имел ввиду, с точки зрения логики функций...

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

      @@AlexRootx без разницы ))

  • @user-xj9nv6vi1t
    @user-xj9nv6vi1t Рік тому +1

    данный курс будет на степике?

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

    Извиняюсь если вы уже отвечали, но будет ли курс по Си на степике?

  • @Al-en6nj
    @Al-en6nj 11 місяців тому +3

    я чуть не умер когда в книге увидел char (*(*x[3])())[5] - массив [3] указателей на функцию, возвращающую указатель на массив [5] типа char . Такое действительно используют в коде? как это вообще можно разобрать?

    • @user-pg8ry1tm3t
      @user-pg8ry1tm3t 5 місяців тому +1

      Почти как [](){[](){[](){}}}…

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

    как можно получить доступ к 17 скрытым видео???

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

      они открываются постепенно

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

      @@selfedu_rus спасибо

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

    Извините, что не в тему, но есть ли у вас уроки по git?

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

      нет, этого не делал

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

      @@selfedu_rus Я думаю, это было бы многим полезно, одна из самых важных тем, как мне кажется. Я уже вроде бы немного разобрался, но думаю с вашим структурированным подходом к подаваемому материалу многим было бы намного проще въехать в эту тему.
      Еще один вопрос не по теме, если можно - является ли в питоне экземпляр класса хешируемым объектом, если у него не определен метод __hash__? Меня интересует возможность использовать экземпляр класса в качестве ключа словаря. Чатгпт говорит, что нет, он не является хешируемым без определения, и что его нельзя использовать в качестве ключа для словаря, но я пробовал использовать и вполне успешно, в том плане, что компилятор не ругается и я получаю по этому же экземпляру класса корректное значение из словаря. Также hasattr показывает, что у него есть __hash__, и также функция hash выводит хеш, но почему тогда чат говорит, что нельзя, может этот хеш у него меняется если он не определен, или еще что-то и поведение станет в какой-то момент некорректным? Или чат использует какую-то древнюю информацию и сейчас это изменилось, как например то, что словарь стал упорядоченной коллекцией, о чем чат также не знает, пока у него намеренно не спросишь об этом изменении. Не могли бы вы прояснить этот момент?

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

      @@Gvinbleid Спасибо! Экземпляры классов в Python можно использовать в качестве ключей, только метод hash() в них лучше переопределить. Подробнее, как все работает здесь proproprogs.ru/python_oop/magicheskie-metody-eq-hash

  • @renigat_tv9051
    @renigat_tv9051 10 місяців тому +1

    Будут ли еще уроки по С?