Как создайтся функция обратного вызова? - C (СИ)
Формулировка задачи:
Покажите мастер-класс как создавать функции обратного вызова и использовать их.
Решение задачи: «Как создайтся функция обратного вызова?»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> typedef int (*callback_t)(int, va_list); void map_int_array(int *array, size_t n, callback_t f, ...) { va_list extra; size_t i; va_start(extra, f); for(i = 0; i < n; ++i) array[i] = f(array[i], extra); va_end(extra); } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" int identity(int arg, va_list extra) { return arg; } int add(int arg, va_list extra) { int addend = va_arg(extra, int); return arg + addend; } int add_two_numbers(int arg, va_list extra) { int add1 = va_arg(extra, int); int add2 = va_arg(extra, int); return arg + add1 + add2; } int constantly(int arg, va_list extra) { int value = va_arg(extra, int); return value; } int print_array(int arg, va_list extra) { printf("%d\n", arg); return arg; } int find_max(int arg, va_list extra) { int *max = va_arg(extra, int *); if(arg > *max) *max = arg; return arg; } #pragma GCC diagnostic pop int main(void) { int numbers[] = {5, 8, -2, 3, 6}, max; const size_t n = sizeof numbers / sizeof *numbers; puts("\nNumbers are"); map_int_array(numbers, n, print_array); max = numbers[0]; map_int_array(numbers + 1, n - 1, find_max, &max); printf("\nFind the max number: %d\n", max); puts("\n...then run the identity function:"); map_int_array(numbers, n, identity); map_int_array(numbers, n, print_array); puts("\n...then add 3 to each number:"); map_int_array(numbers, n, add, 3); map_int_array(numbers, n, print_array); puts("\n...then subtract 4 and add 2:"); map_int_array(numbers, n, add_two_numbers, -4, 2); map_int_array(numbers, n, print_array); puts("\n...then replace each number with 42:"); map_int_array(numbers, n, constantly, 42); map_int_array(numbers, n, print_array); exit(EXIT_SUCCESS); }
Объяснение кода листинга программы
- В функции
map_int_array
используется типcallback_t
, который представляет собой указатель на функцию, принимающую два аргумента типаint
и произвольное количество аргументов, переданных черезva_list
. - Функция
map_int_array
применяет функцию обратного вызова к каждому элементу массива. - Функция
identity
является функцией обратного вызова, которая просто возвращает переданный ей аргумент. - Функция
add
является функцией обратного вызова, которая принимает два аргумента и возвращает их сумму. - Функция
add_two_numbers
является функцией обратного вызова, которая принимает три аргумента и возвращает их сумму. - Функция
constantly
является функцией обратного вызова, которая принимает два аргумента и возвращает переданное значение. - Функция
print_array
является функцией обратного вызова, которая принимает два аргумента и выводит переданное значение. - Функция
find_max
является функцией обратного вызова, которая находит максимальное значение в массиве. - В функции
main
определен массивnumbers
и его размерn
. - Затем функция
map_int_array
применяется к массивуnumbers
с функцией обратного вызоваprint_array
, чтобы вывести значения массива. - Затем функция
find_max
применяется к массивуnumbers
с функцией обратного вызоваprint_array
и переменнойmax
, чтобы найти максимальное значение. - Затем функция
identity
применяется к массивуnumbers
с функцией обратного вызоваprint_array
, чтобы применить функцию обратного вызоваidentity
к каждому элементу массива. - Затем функция
add
применяется к массивуnumbers
с функцией обратного вызоваprint_array
и числом 3, чтобы добавить 3 к каждому элементу массива. - Затем функция
add_two_numbers
применяется к массивуnumbers
с функцией обратного вызоваprint_array
и числами -4 и 2, чтобы вычесть 4 и добавить 2 к каждому элементу массива. - Затем функция
constantly
применяется к массивуnumbers
с функцией обратного вызоваprint_array
и числом 42, чтобы заменить каждый элемент массива на 42. - В конце программы вызывается функция
exit
с аргументомEXIT_SUCCESS
, чтобы указать, что программа успешно завершилась. - Значение
EXIT_SUCCESS
является константой, представляющей успешный результат выполнения программы. - Значение
n
представляет собой размер массиваnumbers
. - Значение
sizeof
используется для вычисления размера массиваnumbers
. - Значение
numbers
является массивом целых чисел, используемым в программе.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д