Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/449: Рейтинг темы: голосов - 449, средняя оценка - 4.76
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782

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

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

Студворк — интернет-сервис помощи студентам
Для чего нужны callback-функции? И можно привести какой-нибуль пример по их использованию.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2009, 17:55
Ответы с готовыми решениями:

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

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

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

103
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
10.04.2009, 18:09
Цитата Сообщение от qwert Посмотреть сообщение
Для чего нужны callback-функции?
Так это же обработчик событий проги!
Это тот код, который реагирует внешние и внутрение воздействия, наример, выбор пункта меню или щелчок по кнопке.
1
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
10.04.2009, 18:10
Лучший ответ Сообщение было отмечено как решение

Решение

Ну вот пример
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;
}
разбирайтесь
9
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
10.04.2009, 20:03
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
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
11.04.2009, 01:19
log, Вы только запутаете ТС таким примером(хотя может и мой не лучше).
В вики написано(сами предложили):
Callback ( обратный вызов ) — передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет внутри отдельных процедур исполнять код, определённый в других контекстах программного кода, то есть код недоступный в этих процедурах для прямого вызова. Кроме того, некоторые алгоритмические задачи в качестве своих входных данных имеют не только числа или объекты, но и действия (алгоритмы). Например, задача обхода двоичного дерева с применением некоторого действия к каждому узлу дерева. Обратный вызов в этих задачах может выступать в роли этого действия (алгоритма)
Ещё в стандарте не дочитал( проблема переводить с анг. на рус.) как оно там должно бить....

Цитата Сообщение от PB Посмотреть сообщение
Так это же обработчик событий проги!
Вот вы не правы.
1
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
11.04.2009, 13:40
Цитата Сообщение от ISergey Посмотреть сообщение
log, Вы только запутаете ТС таким примером
норм пример...Callback-Функция это функция которая передается ввиде параметра в функцию.че не ясно?
1
Деструктор ума
 Аватар для log
22 / 22 / 0
Регистрация: 07.03.2009
Сообщений: 326
11.04.2009, 14:56
ISergey, может и прав,я просто особо дело не имел с такой функцией, а привиденные примеры, могут qwert куда нибудь подтолкнут
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
12.04.2009, 01:44  [ТС]
Спасибо! Ну, принцип и для чего нужны я понял, не так всё и сложно.
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 7
16.09.2014, 14:56
а по человечески никто объяснять не умеет??
примеры полные хотяб привел кто, а то хрень поймешь как работать на вызывающей стороне.
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.09.2014, 15:04
Mit, вот адекватный пример.
Цитата Сообщение от ISergey Посмотреть сообщение
Ну вот пример...
то, что тебе может что-то не понятно, это не значит, что плохие примеры. Есть вопросы, пиши, получишь ответ.
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 7
16.09.2014, 15:27
вот небольшой кусок кода, где у меня ошибка?
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
Можно передать функцию в функцию, которая считает например приближенное значение определенного интеграла. Таким образом у тебя будет одна функция для вычисления интеграла, в которую ты сможешь передавать разные функции. ..... PROFIT!
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
16.09.2014, 15:58
Цитата Сообщение от Mit Посмотреть сообщение
где у меня ошибка?
а что не так?
http://ideone.com/7yd94Q
0
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 7
16.09.2014, 20:08
да, верно, а ошибка была в другом месте
0
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
03.06.2020, 00:22
Всё же остался открытым вопрос какое преимущество дает возможность отправлять для одной функции аргумент являющийся другой функцией?

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

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

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

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

Что это дало? Ну разве что эти функции немного проще чем если бы мы в каждой из них перебирали массив.
не очень уверен что оно того стоит.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,214
03.06.2020, 00:55
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Для чего нужны callback-функции?
Callback-функции нужны для реализации полиморфизма времени выполнения.

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

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

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

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

Фактически то же самое вам уже проиллюстрировал ISergey в ответе #3.
0
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
03.06.2020, 13:13
Очень интересный ответ. Вы обьясняете непонятное через непонятное. Видимо дя выражения "полиморфизм по времени" очень трудно найти простые слова. Полиморфизм означает множество форм, у времени нет форм. Может это укладывается в историю терминов программирования но чистая содержательная корректность названия вызывает сомнения.
По сути дела в приведённом коде одна нить выполнения кода, какие там можно штуки со временем выполнять если нет никаких дополнительных потоков? Как только функция получила аргументы так она и выполняет код и все остальные части программы не работают. Где же тут магия перемещения во времени?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
03.06.2020, 13:23
Цитата Сообщение от Святогор Посмотреть сообщение
Видимо дя выражения "полиморфизм по времени" очень трудно найти простые слова.
А где вы видите фразу "полиморфизм по времени"?
Я вижу лишь "полиморфизм времени выполнения".

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

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

К статическому полиморфизму можно отнести шаблоны, перегрузку функций.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
03.06.2020, 13:27
Святогор, один и тот же код получая разные адреса может делать разные вещи, это на самом деле очень выгодая гибкость, когда что то одинаковое делает разное.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
03.06.2020, 13:31
Святогор, знаете, иногда можно наблюдать в кино, или может кто-то в жизни так делает, когда мама, или папа оставляют записки для детей на холодильнике.
Например "обед на плите, купи хлеб".
Вот эта записка - это callback.

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

В программировании все несколько более абстрактно, поэтому вызываемая функция может вообще не знать (в отличии от ребенка из аналогии) что именно надо сделать. Главное, чтобы входные данные и выходные данные этого действия удовлетворяли некоему соглашению.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2020, 13:31
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru