我试图用fibonaccipythonc语言中创建类似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不允许同时运行两个活动函数。一旦从函数返回(通过使用childlongjmp(mainTask, 1)),就不能重新输入该调用。

关于c - 使用setjmp()和longjmp()创建斐波那契生成器序列时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45399521/

10-11 13:32