Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.72/308: Рейтинг темы: голосов - 308, средняя оценка - 4.72
144 / 144 / 32
Регистрация: 26.10.2008
Сообщений: 782
1

Для чего нужны callback-функции

10.04.2009, 17:55. Показов 55928. Ответов 64
Метки нет (Все метки)

Для чего нужны callback-функции? И можно привести какой-нибуль пример по их использованию.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2009, 17:55
Ответы с готовыми решениями:

Для чего нужны указатели на функции?
для чего нужны эти указатели на функции... не проще ли вызвать саму функцию, чем заводить под нее...

Для чего нужны виртуальные функции и виртуальное наследование ?
Для чего нужны виртуальные функции и виртуальное наследование ? Я нашел не сколько статей но не все...

Для чего нужны функции void, не возращающие никаких значений?
собственно сабж. выводить текст можно и без функции. а для чего делать что-то, что в дальнейшем и...

приведите пожалуйста реальный прмиер: для чего нужны дружественные функции?
приведите пожалуйста реальный прмиер: для чего нужны дружественные функции?

64
PB
Просто прогер
1286 / 1073 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
10.04.2009, 18:09 2
Цитата Сообщение от qwert Посмотреть сообщение
Для чего нужны callback-функции?
Так это же обработчик событий проги!
Это тот код, который реагирует внешние и внутрение воздействия, наример, выбор пункта меню или щелчок по кнопке.
1
Maniac
Эксперт С++
1454 / 955 / 159
Регистрация: 02.01.2009
Сообщений: 2,815
Записей в блоге: 1
10.04.2009, 18:10 3
Лучший ответ Сообщение было отмечено как решение

Решение

Ну вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
int my_function(int *arr,int len, bool(*fn)(int,int))
{
    int res = arr[0];
 
    for(int i = 1; i < len; ++i)
        if(fn(res,arr[i]))
            res = arr[i];
 
    return res;
}
 
bool max_(int i, int j) { return i < j; }
bool min_(int i, int j) { return i > j; }
 
int main()
{
    int arr[5] = {0,-1,2,3,5};
 
    cout<<"Max elem: "<<my_function(arr,5,max_)<<endl;
    cout<<"Min elem: "<<my_function(arr,5,min_)<<endl;
 
    return 0;
}
разбирайтесь
8
Деструктор ума
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
10.04.2009, 20:03 4
Callback эт передача исполняемогго кода в качестве одного из параметров другого колда.
Эта функция позволяет отсортировать массив блоков байт одинаковой длины. В качестве аргументов она получает адрес первого элемента массива, количество блоков в массиве, размер блока байт, и указатель на функцию сравнения двух блоков байт. - вики и прим ее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#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;
}
1
Maniac
Эксперт С++
1454 / 955 / 159
Регистрация: 02.01.2009
Сообщений: 2,815
Записей в блоге: 1
11.04.2009, 01:19 5
log, Вы только запутаете ТС таким примером(хотя может и мой не лучше).
В вики написано(сами предложили):
Callback ( обратный вызов ) — передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет внутри отдельных процедур исполнять код, определённый в других контекстах программного кода, то есть код недоступный в этих процедурах для прямого вызова. Кроме того, некоторые алгоритмические задачи в качестве своих входных данных имеют не только числа или объекты, но и действия (алгоритмы). Например, задача обхода двоичного дерева с применением некоторого действия к каждому узлу дерева. Обратный вызов в этих задачах может выступать в роли этого действия (алгоритма)
Ещё в стандарте не дочитал( проблема переводить с анг. на рус.) как оно там должно бить....

Цитата Сообщение от PB Посмотреть сообщение
Так это же обработчик событий проги!
Вот вы не правы.
1
682 / 231 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
11.04.2009, 13:40 6
Цитата Сообщение от ISergey Посмотреть сообщение
log, Вы только запутаете ТС таким примером
норм пример...Callback-Функция это функция которая передается ввиде параметра в функцию.че не ясно?
1
Деструктор ума
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
11.04.2009, 14:56 7
ISergey, может и прав,я просто особо дело не имел с такой функцией, а привиденные примеры, могут qwert куда нибудь подтолкнут
0
144 / 144 / 32
Регистрация: 26.10.2008
Сообщений: 782
12.04.2009, 01:44  [ТС] 8
Спасибо! Ну, принцип и для чего нужны я понял, не так всё и сложно.
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 7
16.09.2014, 14:56 9
а по человечески никто объяснять не умеет??
примеры полные хотяб привел кто, а то хрень поймешь как работать на вызывающей стороне.
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.09.2014, 15:04 10
Mit, вот адекватный пример.
Цитата Сообщение от ISergey Посмотреть сообщение
Ну вот пример...
то, что тебе может что-то не понятно, это не значит, что плохие примеры. Есть вопросы, пиши, получишь ответ.
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 7
16.09.2014, 15:27 11
вот небольшой кусок кода, где у меня ошибка?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef void(*callback_t)(void*data);
 
callback_t call_t;
 
void Fm_show(callback_t call){
call_t=call;
}
 
 void foo(){
call_t(NULL);
 }
 
  void foo2(void*data){
 
 }
 
 int main(){
Fm_show(foo2);
foo();
 }
0
20 / 20 / 2
Регистрация: 27.01.2014
Сообщений: 232
16.09.2014, 15:37 12
Можно передать функцию в функцию, которая считает например приближенное значение определенного интеграла. Таким образом у тебя будет одна функция для вычисления интеграла, в которую ты сможешь передавать разные функции. ..... PROFIT!
0
Don't worry, be happy
16987 / 9865 / 1900
Регистрация: 27.09.2012
Сообщений: 24,466
Записей в блоге: 1
16.09.2014, 15:58 13
Цитата Сообщение от Mit Посмотреть сообщение
где у меня ошибка?
а что не так?
http://ideone.com/7yd94Q
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 7
16.09.2014, 20:08 14
да, верно, а ошибка была в другом месте
0
14 / 14 / 3
Регистрация: 27.06.2016
Сообщений: 177
03.06.2020, 00:22 15
Всё же остался открытым вопрос какое преимущество дает возможность отправлять для одной функции аргумент являющийся другой функцией?

Может мы делаем проще код?

А может наша программа работает эффективнее и мы экономим какие-то ресурсы?

Или может есть такие случаи когда выполнить алгоритм по-другому, НЕ используя ЭТОТ самый метод , вообще невозможно или очень затруднительно получить результат?

В приведённых примерах я вижу что вместо двух функций перебора и сравнения мы написали ТРИ функции- две функции сравнения и одну "общую" для переборки элементов массива.

Что это дало? Ну разве что эти функции немного проще чем если бы мы в каждой из них перебирали массив.
не очень уверен что оно того стоит.
0
С чаем беда...
Эксперт CЭксперт С++
8654 / 4324 / 1190
Регистрация: 18.10.2014
Сообщений: 9,399
03.06.2020, 00:55 16
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Для чего нужны callback-функции?
Callback-функции нужны для реализации полиморфизма времени выполнения.

Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
какой-нибуль пример по их использованию.
Функция qsort стандартной библиотеки в качестве одного из своих параметров принимает указатель на callback функцию - предикат сравнения.

Добавлено через 3 минуты
Цитата Сообщение от Святогор Посмотреть сообщение
Всё же остался открытым вопрос какое преимущество дает возможность отправлять для одной функции аргумент являющийся другой функцией?
Снова смотрим на пример с qsort.

Благодаря тому, что это функция реализует полиморфизм времени выполнения через callback, она может использоваться для сортировки массивов любых пользовательских данных. То есть функция qsort реализована всего один раз, но является универсальной: при правильной параметризации она применима к любым массивам данных.

Во в этом и заключается преимущество реализации через callback.

Фактически то же самое вам уже проиллюстрировал ISergey в ответе #3.
0
14 / 14 / 3
Регистрация: 27.06.2016
Сообщений: 177
03.06.2020, 13:13 17
Очень интересный ответ. Вы обьясняете непонятное через непонятное. Видимо дя выражения "полиморфизм по времени" очень трудно найти простые слова. Полиморфизм означает множество форм, у времени нет форм. Может это укладывается в историю терминов программирования но чистая содержательная корректность названия вызывает сомнения.
По сути дела в приведённом коде одна нить выполнения кода, какие там можно штуки со временем выполнять если нет никаких дополнительных потоков? Как только функция получила аргументы так она и выполняет код и все остальные части программы не работают. Где же тут магия перемещения во времени?
0
Don't worry, be happy
16987 / 9865 / 1900
Регистрация: 27.09.2012
Сообщений: 24,466
Записей в блоге: 1
03.06.2020, 13:23 18
Цитата Сообщение от Святогор Посмотреть сообщение
Видимо дя выражения "полиморфизм по времени" очень трудно найти простые слова.
А где вы видите фразу "полиморфизм по времени"?
Я вижу лишь "полиморфизм времени выполнения".

Полиморфизм может быть статическим - полиморфизм времени компиляции,
либо динамическим - полиморфизм времени выполнения.

Как сказано выше, с помощь callback'ов можно реализовать динамический полиморфизм. Также это можно сделать, например, с помощью виртуальных функций (если не вдаваться в реализацию механизма вызова этих самых функций).

К статическому полиморфизму можно отнести шаблоны, перегрузку функций.
1
"C with Classes"
1640 / 1262 / 476
Регистрация: 16.08.2014
Сообщений: 5,267
Записей в блоге: 1
03.06.2020, 13:27 19
Святогор, один и тот же код получая разные адреса может делать разные вещи, это на самом деле очень выгодая гибкость, когда что то одинаковое делает разное.
0
14147 / 7603 / 1807
Регистрация: 30.01.2014
Сообщений: 12,725
03.06.2020, 13:31 20
Святогор, знаете, иногда можно наблюдать в кино, или может кто-то в жизни так делает, когда мама, или папа оставляют записки для детей на холодильнике.
Например "обед на плите, купи хлеб".
Вот эта записка - это callback.

Если еще чуть-чуть формализовать это, то мама - это вызывающая функция, ребенок - вызываемая. а "купи хлеб" - это callback, который вызываемая функция, то есть ребенок, должна исполнить на свой стороне.

В программировании все несколько более абстрактно, поэтому вызываемая функция может вообще не знать (в отличии от ребенка из аналогии) что именно надо сделать. Главное, чтобы входные данные и выходные данные этого действия удовлетворяли некоему соглашению.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2020, 13:31

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В...

callback функции не для кнопок на экране, а для клавиш на клав. и мышке. Как?
Я так понимаю, что в WIN API все действия делаются асинхронно через callback функции. Но как...

Для чего нужны интерфейсы?
Объясните на пальцах для чего нужны интерфейсы, как я понял они описывают методы и свойства,...

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.