Передать в callback дополнительную информацию - C (СИ)
Формулировка задачи:
В общем, столкнулся с такой проблемой:
Скажем, есть три функции - f1, f2, f3. Тело функции f1 недоступно для изменения. Ей на вход в качестве одного из параметров подаётся адрес callback-функции с одним параметром (число, что-то в стиле ). Пусть в качестве таковой будет функция , которую я определяю сам, равно как и f3.
Собсна, суть: в функции f2 мне нужно значение value занести в стек, причем стек должен быть или создан в функции f3, или каким-либо образом возвращён в f3 (дополнительно: вызов f1 происходит из f3) для дальнейшей работы с ним.
Без использования глобальных и static переменных.
Вложенные функции намного упростили бы жизнь, но, увы, их нет
int(*callback)(const size_t)
int f2(const size_t value)
Решение задачи: «Передать в callback дополнительную информацию»
textual
Листинг программы
typedef struct { char x; int y; double z; } data; int f2(const size_t value) { data *d = (data*) value; d->x -= 10; d->y += 100; d->z *= 1000; } int f3() { data d = {10, 300, 700000}; f1(f2, (size_t) &d); // здесь содержимое d изменено вызовом f2, который выполнила f1. } int main(void) { f3(); }
Объяснение кода листинга программы
Описание действий в коде:
- В функции
f2
происходит изменение значений полей структурыdata
на основе переданного значения. - В функции
f3
создается экземпляр структурыdata
с полями, содержащими значения 10, 300 и 700000. - Функция
f1
вызывается с двумя аргументами:f2
и адрес экземпляра структурыdata
из функцииf3
. - В результате вызова функции
f1
происходит передача управления в функциюf2
, где изменяются значения полей структурыdata
. - После выхода из функции
f1
измененный экземпляр структурыdata
доступен для использования в функцииf3
. - Значения полей структуры
data
после вызова функцииf2
можно проверить, например, с помощью дополнительного кода в функцииf3
. - В функции
main
вызывается функцияf3
, что приводит к выполнению всех описанных выше действий.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д