#44. Указатели на функцию. Функция как параметр (callback) | Язык C для начинающих
Вставка
- Опубліковано 28 тра 2023
- Практический курс по C/C++: stepik.org/course/193691/
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru/c_base
Объявление указателей на функции. Передача функций через параметры. Пример программы использования указателей на функции.
Хочу выразить Вам огромную благодарность за Вашу деятельность, это просто титанический труд!
Я врач - невролог, год назад начал изучать питон ради одного научного проекта, теперь программирование для меня стало хобби, не могу остановиться учиться по Вашим видео, вот теперь добрался до Си.
Очень меня улыбнуло имя функции per_rect(), не смог удержаться, чтоб не написать про это комментарий))
Массив из указателей на функции.. Хммм..Сергей похоже живой прототип Морфеуса, который готов показать насколько глубока кроличья нора..Это просто нереально круто... Спасибо большое за отличный урок !
массив тредов или корутин это ваще зашквар?
массив - это штука не имеющая отношения к хранимиым данным, а данные массва это любые допустимые объекты
язык программирования - это абстракция по отношннию к машиному языку и ому как работает компбютер
Спасибо большое за науку!
Тема указателей способна вызвать взрыв мозга, на первый взгляд и на второй тоже.
Так и подмывает процитировать строки из книги Стивена Прата "Выразительность языка С в сочетании с богатством его операций делает возможным написание кода, который исключительно сложно понять. Конечно, вы отнюдь не обязаны писать неясный код, но такая возможность имеется. В конце концов, для какого еще языка устраивается ежегодный конкурс на самый запутанный код?"
Спасибо, Сергей. Как всегда на высоте!!!
Если кого-то заинтересовало как передать в функцию напрямую массив коллбеков то это выглядит так
// Функция, принимающая массив указателей на функции и их количество
void callFunctions(void (**functions)(), int count) {
for (int i = 0; i < count; i++) {
functions[i](); // Вызов функции по указателю
}
}
Главное, не забыть потом эти указатели слить в правильном месте, шоб не утекли🥴
Супер! Огромное спасибо за курс!
Добрый день, уважаемы Сергей! Очень понятная подача материала, с максимальным сжатым объяснением. Профессиональная подача, видна учительская способность, отличная дикция.
Сергей, прошу добавить тему или разобрать массив указателей функций и прокомментировать следующую задачу кода. Куда можно применить такой код и как часто он используется?
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); с точки зрения адресной арифметики?
Заранее благодарен за пояснение.
Вот это прям оч круто, очень полезно. Спасибо)
Спасибо Вам! Очень круто!
Спасибо. Ого! похоже на декораторы. Крышесносно!
Колбеки - тема интересная. В плюсах неск способов их сотворить. И выбрать, что же лучше, весьма непростое дело🥴
Спасибо за уроки, Сергей! Не пойму, для чего при инициализации указателя на функцию пишем int *(ptr_name) в скобках имя указателя. Это для читабельности или без скобок никак не обойтись? Для чего они?
это синтаксис такой, просто нужно запомнить
Как обычно, зачетно!!! Лайк за работу!!! По идее, последние функции должны возвращать "bool"?
В языке Си (равно, как и во многих других) можно возвращать не ноль для True и 0 - для False. Тем более, что в базовом Си как такового типа bool все равно нет.
@@selfedu_rus полностью согласен. Я имел ввиду, с точки зрения логики функций...
@@AlexRootx без разницы ))
данный курс будет на степике?
Извиняюсь если вы уже отвечали, но будет ли курс по Си на степике?
пока не планирую
я чуть не умер когда в книге увидел char (*(*x[3])())[5] - массив [3] указателей на функцию, возвращающую указатель на массив [5] типа char . Такое действительно используют в коде? как это вообще можно разобрать?
Почти как [](){[](){[](){}}}…
как можно получить доступ к 17 скрытым видео???
они открываются постепенно
@@selfedu_rus спасибо
Извините, что не в тему, но есть ли у вас уроки по git?
нет, этого не делал
@@selfedu_rus Я думаю, это было бы многим полезно, одна из самых важных тем, как мне кажется. Я уже вроде бы немного разобрался, но думаю с вашим структурированным подходом к подаваемому материалу многим было бы намного проще въехать в эту тему.
Еще один вопрос не по теме, если можно - является ли в питоне экземпляр класса хешируемым объектом, если у него не определен метод __hash__? Меня интересует возможность использовать экземпляр класса в качестве ключа словаря. Чатгпт говорит, что нет, он не является хешируемым без определения, и что его нельзя использовать в качестве ключа для словаря, но я пробовал использовать и вполне успешно, в том плане, что компилятор не ругается и я получаю по этому же экземпляру класса корректное значение из словаря. Также hasattr показывает, что у него есть __hash__, и также функция hash выводит хеш, но почему тогда чат говорит, что нельзя, может этот хеш у него меняется если он не определен, или еще что-то и поведение станет в какой-то момент некорректным? Или чат использует какую-то древнюю информацию и сейчас это изменилось, как например то, что словарь стал упорядоченной коллекцией, о чем чат также не знает, пока у него намеренно не спросишь об этом изменении. Не могли бы вы прояснить этот момент?
@@Gvinbleid Спасибо! Экземпляры классов в Python можно использовать в качестве ключей, только метод hash() в них лучше переопределить. Подробнее, как все работает здесь proproprogs.ru/python_oop/magicheskie-metody-eq-hash
Будут ли еще уроки по С?