Передать в 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, что приводит к выполнению всех описанных выше действий.