[問題] 在副函數的副函數中跳回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