[问题] 在副函数的副函数中跳回main function

楼主: ponwar87123 (干我屁事喔北七)   2020-06-28 21:45:46
开发平台(Platform): (Ex: Win10, Linux, ...)
visual studio 2017
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
C语言
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)

问题(Question):
如何在副函数的副函数中,跳回main function
喂入的资料(Input):

预期的正确结果(Expected Output):

错误结果(Wrong Output):

补充说明(Supplement):
因为在做的程式会有很多副程式,
副程式里面也有副程式,
而使用者的input有可能会有错误,
想要达成的目的是,如果在副程式中发现有误时,print出错误资讯并跳回main
不再继续执行下去
我知道可以return;
但如果是 main()->A(),这样在A里写return;会是回到main没错
但如果是main()->A()->B(),这样在B里写return;会是回到A(),而我想回到main
想问有什么方法,谢谢
作者: chuegou (chuegou)   2020-06-28 22:00:00
完全不能经过A吗 那只能去stack里面找返回位址
作者: w0005151 (蓝厅)   2020-06-28 22:15:00
同样原因的错误建议集中处理, 你应该重新思考函数怎么切
作者: Lipraxde (Lipraxde)   2020-06-28 22:17:00
直接 exit 不好吗?
作者: LPH66 (-6.2598534e+18f)   2020-06-28 22:57:00
同意二楼, 你应该思考函数的功能分类法什么函数负责什么功能该回报什么由于你提到了“使用者的 input 有可能会有错误”你应该思考这个“检查错误”的功能该由谁负责由谁叫起
作者: Dracarys (MayShowGunMore)   2020-06-28 23:08:00
longjmp?
作者: hsnuyi (羊咩咩~)   2020-06-28 23:15:00
丢exception
作者: james732 (好人超)   2020-06-29 00:15:00
setjump与longjump应该可以做到,但可能不是好的做法
作者: firejox (Tangent)   2020-06-29 03:51:00
虽然setjump longjump 是允许你这样做,实务上不建议你用它们
作者: CoNsTaR ((const *))   2020-06-29 04:37:00
option, result
作者: Gway (我爱的你 也爱我 好吗?)   2020-06-29 04:50:00
用global function pointer把main address储存起来 然后在sub-fun执行error check时 若有需要跳回main 则直接调用此funtion pointer?
作者: petercoin (彼得币)   2020-06-29 09:13:00
B() return error code回A A再判断error code也是一种作法吧
作者: Killercat (杀人猫™)   2020-06-29 13:09:00
你是想问 如何在C底下达成类似exception的效果吗?如果是的话 标准做法就是setjmp跟longjmpC天生就没办法像go传回err 不是所有func都有空间给你塞err code,硬要写成这样(如一堆HRESULT开头的W32API)其实也满痛苦的,生活没必要这样悲惨的过(诶)另用Gway你提到的作法基本上跟setjmp/longjmp没两样啊而且你这样还会有堆叠的问题 XD
作者: petercoin (彼得币)   2020-06-29 19:42:00
其实他如果是只跑在Windows系统上,SetLastError跟GetLastError也可以用啊function回传bool判断有没有成功,失败就捞last errorcode就好
作者: kingofsdtw (不能閒下來!!)   2020-06-29 20:01:00
全域变量,sleep ,and kill不过是同一只程式吗?
作者: loveme00835 (发箍)   2020-06-30 00:27:00
先厘清你的责任吧
作者: Golven (五代裕作)   2020-06-30 18:54:00
用goto? (误)
作者: hongsiangfu   2020-07-01 00:00:00
reset?
作者: sunneo (艾斯寇德)   2020-07-01 01:10:00
做一只interpreter 把全部function存到function pointer这样就可以用间接的方式setjmp/longjmp (误
作者: Killercat (杀人猫™)   2020-07-01 20:31:00
setjmp/longjmp应该有靠AR处理stack问题 会放掉stack其他所有的办法应该都会碰到堆叠残留的问题...这个我没有非常确定 有高手的话请指正一下.. orz
作者: stupid0319 (征女友)   2020-07-04 21:40:00
call A()之前呼叫 pushad ,回到 main 呼叫 popad

Links booklink

Contact Us: admin [ a t ] ucptt.com