Я знаю, что такое функция батута, но у меня были проблемы с предотвращением переполнения стека с помощью батутов. Пока что единственный способ, который я могу придумать, - это использовать глобальные переменные, которые не поощряют и могут усложнить программы.
Функция батута, которую я хочу использовать, показана ниже.
void trampoline(void *(*fun)()) {
while (fun != NULL) {
void *callback = fun();
fun = (void *(*)())callback;
}
}
Когда я пытаюсь передать функции с параметрами, такими как приведенные ниже во фрагменте кода, я получаю стеки, а это не то, что мне нужно. Мне было интересно, есть ли способ использовать мою функцию батута без использования глобальных переменных или передачи каких-либо дополнительных аргументов?
void *f1();
void *f2();
void *f1(int *n) {
if (*n == 0) {
return NULL;
} else {
return f2(n);
}
}
void *f2(int *n) {
--*n;
return f1(n);
}
int main() {
int a = 1000000;
trampoline(f1(&a));
return 0;
}
Программа ниже ведет себя так, как я хочу, но она использует глобальную переменную, что не приветствуется.
#include <stdio.h>
int a = 1000;
void trampoline(void *(*f)()) {
while (f) {
void *g = f();
f = (void *(*)())g;
}
}
void *f1();
void *f2();
void *f1() {
if (a == 0) {
return NULL;
} else {
return f2;
}
}
void *f2() {
--a;
return f1;
}
int main() {
trampoline(f1);
return 0;
}
Пояснение: я не хочу модифицировать вышеприведенную функцию батута, но я хочу уменьшить создание стека.