我试图用fibonacci
和python
在c
语言中创建类似setjmp()
生成器序列(在longjmp()
中使用yield关键字实现):
#include <setjmp.h>
#include <stdio.h>
jmp_buf mainTask, childTask;
void child(void);
int main(void) {
long i = 1;
if (!setjmp(mainTask)) {
printf("%ldth Parent\n", i++);
child();
}
for (int j = 0;j < 9;j++) {
printf("%ldth Parent\n", i++);
if (!setjmp(mainTask)) {
longjmp(childTask, 1);
}
}
}
void child (void) {
int c = 0;
long i = 1;
long j = 1;
long k = 0;
for (;;) {
printf("i is:%ld j is:%ld\n", i, j);
k = i + j;
if(i <= j)
i = k;
else
j = k;
c++;
printf("%dth fib number:%ld\n", c, k);
if (!setjmp(childTask)) longjmp(mainTask, 1);
}
}
它只对第一个数字起作用。
*更新:
我期望2,3,5,8,13,。。。
但它产生2,nexts是不正确的(15位数的错误数字)
最佳答案
不幸的是你的程序有未定义的行为。
引用ISO 9899:1999,7.13.2.1中的longjmp
函数,第2段:longjmp
函数恢复最近调用
与相应的setjmp
参数。如果没有这样的调用,或者
在此期间,jmp_buf
宏的调用已终止execution208),或者
调用setjmp
宏在标识符的范围内
修改的类型和执行在过渡期间离开了该范围,行为未定义。
[...]
208)例如,通过执行setjmp
语句或因为另一个return
调用导致
转移到嵌套调用集合中前面的函数中的longjmp
调用。
(强调我的。)
你的
longjmp(childTask, 1);
setjmp
中的语句试图将控制转移到main
中的调用,但对setjmp
的调用已返回(通过child
)。这不容易解决。C不允许同时运行两个活动函数。一旦从函数返回(通过使用
child
或longjmp(mainTask, 1)
),就不能重新输入该调用。关于c - 使用setjmp()和longjmp()创建斐波那契生成器序列时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45399521/