VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 177|回复: 4

[已解决]c语言longjmp报错!

[复制链接]
12_avatar_middle
最佳答案
0 
在线会员 发表于 2020-2-19 18:55:59 | 显示全部楼层 |阅读模式
刚入门的菜鸟,在练习跳转时出现问题:
错误:0x031CCCE0 处有未经处理的异常(在 goto和函数.exe 中): 0x80000026: 一个长跳转已经运行。。
代码如下:
  1. #define _CRT_SECURE_NO_WARNINGS//scanf
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <setjmp.h>
  5. jmp_buf eee;

  6. float a(void);
  7. int main()
  8. {
  9.         printf("请输入");
  10.         int ab;
  11.         scanf("%d", &ab);
  12.         if (ab == 0)
  13.         {
  14.                 longjmp(eee, 0);
  15.         }
  16.         else
  17.         printf("输入合法");
  18.         system("pause");
  19.         return 0;
  20. }
  21. float a(void)
  22. {
  23.         setjmp(eee);
  24.         printf("输入不合法");
  25.         return 0.0f;
  26. }
复制代码

输入0后报错0x031CCCE0 处有未经处理的异常(在 goto和函数.exe 中): 0x80000026: 一个长跳转已经运行。。
求助!help!谢谢了
最佳答案
31_avatar_small
2020-2-20 14:06:07
  1. #define _CRT_SECURE_NO_WARNINGS//scanf
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <setjmp.h>

  5. void a(void);
  6. int main()
  7. {
  8.     flag2:                  //跳转标志2
  9.     printf("请输入");
  10.     int ab = 0;
  11.     scanf("%d", &ab);
  12.     if (ab == 0)
  13.     {
  14.         goto flag1;          //跳转
  15.     }
  16.     else
  17.         printf("输入合法");


  18.     system("pause");
  19.     return 0;

  20.     {
  21.     flag1:                        //跳转标志1
  22.         a();
  23.         goto flag2;               //跳转
  24.     }
  25. }
  26. void a(void)
  27. {
  28.     printf("输入不合法\n");
  29. }
复制代码



setjmp longjmp不存在从前面往后跳的情况:https://www.runoob.com/cprogramm ... brary-setjmp-h.html
如果真的要强跳建议使用 goto 语句
无论如何跳转语句和跳转标志都要在同一个代码段里,放在其他函数里面是不行的




上一篇:字符串排列问题
下一篇:VS2010 VC++输入小写代码大小写匹配
31_avatar_middle
最佳答案
6 
donate_vip 发表于 2020-2-19 21:46:48 | 显示全部楼层
  1. #define _CRT_SECURE_NO_WARNINGS//scanf
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <setjmp.h>

  5. //跳转标志
  6. jmp_buf jmpflag1 = { 0 };
  7. jmp_buf jmpflag2 = { 0 };


  8. int main(void)
  9. {
  10.         int num = 0;

  11.         num = setjmp(jmpflag1);                //在 longjmp 前设置跳转标志1

  12.         if (num == 0)
  13.         {
  14.                 longjmp(jmpflag1, 1);        //看得到跳转标志1  跳转到标志1
  15.         }

  16.         else if (num == 1)
  17.         {
  18.                 longjmp(jmpflag2, 0);        //看不到跳转标志2
  19.         }

  20.         setjmp(jmpflag2);                        //在 longjmp 后设置跳转标志2

  21.         system("pause");

  22.         return 0;
  23. }
复制代码



问题: 找不到跳转标志
总结: 在执行跳转前设置跳转标志

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
82_avatar_small love_cctry + 1 + 1 很给力!

查看全部评分

31_avatar_middle
最佳答案
6 
donate_vip 发表于 2020-2-19 21:44:15 | 显示全部楼层
#define _CRT_SECURE_NO_WARNINGS//scanf
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

//跳转标志
jmp_buf jmpflag1 = { 0 };
jmp_buf jmpflag2 = { 0 };


int main(void)
{
        int num = 0;

        num = setjmp(jmpflag1);                //在 longjmp 前设置跳转标志1

        if (num == 0)
        {
                longjmp(jmpflag1, 1);        //看得到跳转标志1  跳转到标志1
        }

        else if (num == 1)
        {
                longjmp(jmpflag2, 0);        //看不到跳转标志2
        }

        setjmp(jmpflag2);                        //在 longjmp 后设置跳转标志2

        system("pause");

        return 0;
}

问题: 找不到跳转标志 eee
总结: 要在跳转前设置跳转标志
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-2-20 08:03:20 | 显示全部楼层
Dandy 发表于 2020-2-19 21:46
问题: 找不到跳转标志
总结: 在执行跳转前设置跳转标志

那如果我需要从前往后跳转呢?就像我的代码一样,怎么改?
31_avatar_middle
最佳答案
6 
donate_vip 发表于 2020-2-20 14:06:07 | 显示全部楼层    本楼为最佳答案   
bestAnswer
  1. #define _CRT_SECURE_NO_WARNINGS//scanf
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <setjmp.h>

  5. void a(void);
  6. int main()
  7. {
  8.     flag2:                  //跳转标志2
  9.     printf("请输入");
  10.     int ab = 0;
  11.     scanf("%d", &ab);
  12.     if (ab == 0)
  13.     {
  14.         goto flag1;          //跳转
  15.     }
  16.     else
  17.         printf("输入合法");


  18.     system("pause");
  19.     return 0;

  20.     {
  21.     flag1:                        //跳转标志1
  22.         a();
  23.         goto flag2;               //跳转
  24.     }
  25. }
  26. void a(void)
  27. {
  28.     printf("输入不合法\n");
  29. }
复制代码



setjmp longjmp不存在从前面往后跳的情况:https://www.runoob.com/cprogramm ... brary-setjmp-h.html
如果真的要强跳建议使用 goto 语句
无论如何跳转语句和跳转标志都要在同一个代码段里,放在其他函数里面是不行的
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-22 23:44

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表