Callback Function

Блог им. Nemo
Прошу извинения за глупие вопросы, но не как не могу понять для чего нужны и как работат Callback Functions.

Читаю про них тут: www.linuxforu.com/2012/02/function-pointers-and-callbacks-in-c-an-odyssey/

Понял только так, пример:


int Sum (int a, inb b) {return a+b;}

int Result( int x, int y) {return x-y;}

int main(void)
{
    printf("RES: %d\n", Result(10,Sum(5,2)));
}


такой пример можно использовать, но для чего Callback не пойму…
Кто знает, помогите пожалуйста!

10 комментариев

avatar
В принципе в википедии довольно все подробно расписано, я, правда, вроде не пользовался никогда передачей функции в параметрах.
avatar
Пример кода в посте совершенно не затрагивает колбеки, а всего лишь отрабатывается функция и подставляет результат как параметр для другой.
Чтобы понять зачем нужны колбеки можно вспомнить, например, привычные ембеддерам прерывания в микроконтроллерах.
«Колбеком» в этом случае будет тот обработчик прерывания, который выполняется, например, по завершению отправки пакета.
avatar
Читал википедию, на руском совсем пример не понятен, на английском немного понятние, но не полностью. Не думал что обработчик прерывания можно назвать колбеком…
avatar
нельзя, просто смысл похожий: сделать что-либо после завершения выполнения какой-то задачи, которая выполнялась не синхронно с главным кодом.
в отличие от прерываний мы можем задавать программно функцию, которая будет запускаться. даже в реалтайме.
avatar
так вам сам код не понятен? что именно?
avatar
Первый пример из вики, кстати, как по мне, очень хорошо раскрывает сущность.
#include <stdlib.h>
// функция сравнения целых чисел по модулю
int compare_abs(const void *a, const void *b) {
int a1 = *(int*)a;
int b1 = *(int*)b;
return abs(a1) — abs(b1);
}
int main() {
int m[10] = {1,-3,5,-100,7,33,44,67,-4, 0};
// сортировка массива m по возрастанию модулей
qsort(m, 10, sizeof(int), compare_abs);
return 0;
}
Смысл что ф-я compare_abs может иметь произвольную реализацию, но её параметры и выход четко определены. Эта ф-я может делать что угодно с принятыми двумя параметрами,(сравнивать сумму цифр, само количество чисел цифр, сравнивать числа, или генерить на их основе рандомы по алгоритму и сравнивать результат), и на этом основании возвращает инт. а уже кьюсорт оценивая возвращенный инт, решает в каком месте отсортированного массива оставить один из входных параметров нашей калбек ф-ции.

В общем:
)Техника обратного вызова играет важную роль для достижения повторного использования кода. За счет: Функция обратного вызова является альтернативой полиморфизму функций. И позволяет: при этом поведение программы с неизменным (в том числе закрытым) кодом можно изменять в очень широких пределах. Это реализуется двумя путями — или «альтернативной реализацией» какой-либо функции, или «добавлением в цепочку вызовов» ещё одной функции.

Там же, в статье есть глава: Зачем использовать функции обратного вызова. Надо хорошенько прокурить эту часть, держа в регистре предыдущий абзац в этом ответе.

Вполне возможно, дополнительно, этот прием(калбек) используется для реализации каких-то и экзотических фич.

ru.wikipedia.org/wiki/Callback_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
avatar
В примере какая функция називаеться callback функцией, та что вызивает, или ту что вызивают?


int compare_abs(const void *a, const void *b) - callback функция ???
Комментарий отредактирован 2013-09-27 16:04:34 пользователем Nemo
avatar
В англоязычной версии статьи есть хорошая картинка, мне она очень понравилась. Да, компаре_абс — калбек функция.
Комментарий отредактирован 2013-09-27 16:41:51 пользователем Vasiliy_Br
avatar
Спасибо!
— такая?
Комментарий отредактирован 2013-09-27 18:22:43 пользователем Nemo
avatar
Она самая.

Как оказалось, на www.quizful.net я уже был зареган, но на данный момент мне те тесты как раз, еще не легко, но у же и интересно, потому что есть возможность подумать над ответом, опыта хватает. Самому доходить до заковыристых моментов это годы работы, а так — на тарелочке…

Так что и тебе — Спасибо!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.