Как создайтся функция обратного вызова? - 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);
}

Объяснение кода листинга программы

  1. В функции map_int_array используется тип callback_t, который представляет собой указатель на функцию, принимающую два аргумента типа int и произвольное количество аргументов, переданных через va_list.
  2. Функция map_int_array применяет функцию обратного вызова к каждому элементу массива.
  3. Функция identity является функцией обратного вызова, которая просто возвращает переданный ей аргумент.
  4. Функция add является функцией обратного вызова, которая принимает два аргумента и возвращает их сумму.
  5. Функция add_two_numbers является функцией обратного вызова, которая принимает три аргумента и возвращает их сумму.
  6. Функция constantly является функцией обратного вызова, которая принимает два аргумента и возвращает переданное значение.
  7. Функция print_array является функцией обратного вызова, которая принимает два аргумента и выводит переданное значение.
  8. Функция find_max является функцией обратного вызова, которая находит максимальное значение в массиве.
  9. В функции main определен массив numbers и его размер n.
  10. Затем функция map_int_array применяется к массиву numbers с функцией обратного вызова print_array, чтобы вывести значения массива.
  11. Затем функция find_max применяется к массиву numbers с функцией обратного вызова print_array и переменной max, чтобы найти максимальное значение.
  12. Затем функция identity применяется к массиву numbers с функцией обратного вызова print_array, чтобы применить функцию обратного вызова identity к каждому элементу массива.
  13. Затем функция add применяется к массиву numbers с функцией обратного вызова print_array и числом 3, чтобы добавить 3 к каждому элементу массива.
  14. Затем функция add_two_numbers применяется к массиву numbers с функцией обратного вызова print_array и числами -4 и 2, чтобы вычесть 4 и добавить 2 к каждому элементу массива.
  15. Затем функция constantly применяется к массиву numbers с функцией обратного вызова print_array и числом 42, чтобы заменить каждый элемент массива на 42.
  16. В конце программы вызывается функция exit с аргументом EXIT_SUCCESS, чтобы указать, что программа успешно завершилась.
  17. Значение EXIT_SUCCESS является константой, представляющей успешный результат выполнения программы.
  18. Значение n представляет собой размер массива numbers.
  19. Значение sizeof используется для вычисления размера массива numbers.
  20. Значение numbers является массивом целых чисел, используемым в программе.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы