看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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 想問有甚麼方法,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.216.106.189 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1593351951.A.FFF.html
chuegou: 完全不能經過A嗎 那只能去stack裡面找返回位址 06/28 22:00
w0005151: 同樣原因的錯誤建議集中處理, 你應該重新思考函數怎麼切 06/28 22:15
Lipraxde: 直接 exit 不好嗎? 06/28 22:17
LPH66: 同意二樓, 你應該思考函數的功能分類法 06/28 22:57
LPH66: 什麼函數負責什麼功能該回報什麼 06/28 22:58
LPH66: 由於你提到了「使用者的 input 有可能會有錯誤」 06/28 22:59
LPH66: 你應該思考這個「檢查錯誤」的功能該由誰負責由誰叫起 06/28 22:59
Dracarys: longjmp? 06/28 23:08
hsnuyi: 丟exception 06/28 23:15
james732: setjump與longjump應該可以做到,但可能不是好的做法 06/29 00:15
firejox: 雖然setjump longjump 是允許你這樣做,實務上不建議你 06/29 03:51
firejox: 用它們 06/29 03:51
CoNsTaR: option, result 06/29 04:37
Gway: 用global function pointer把main address儲存起來 然後在su 06/29 04:50
Gway: b-fun執行error check時 若有需要跳回main 則直接調用此funt 06/29 04:50
Gway: ion pointer? 06/29 04:50
petercoin: B() return error code回A A再判斷error code也是一種 06/29 09:13
petercoin: 作法吧 06/29 09:14
Killercat: 你是想問 如何在C底下達成類似exception的效果嗎? 06/29 13:09
Killercat: 如果是的話 標準做法就是setjmp跟longjmp 06/29 13:09
Killercat: C天生就沒辦法像go傳回err 不是所有func都有空間給你塞 06/29 13:10
Killercat: err code,硬要寫成這樣(如一堆HRESULT開頭的W32API)其 06/29 13:11
Killercat: 實也滿痛苦的,生活沒必要這樣悲慘的過(誒) 06/29 13:11
Killercat: 另用Gway你提到的作法基本上跟setjmp/longjmp沒兩樣啊 06/29 13:12
Killercat: 而且你這樣還會有堆疊的問題 XD 06/29 13:12
petercoin: 其實他如果是只跑在Windows系統上,SetLastError跟 06/29 19:42
petercoin: GetLastError也可以用啊 06/29 19:42
petercoin: function回傳bool判斷有沒有成功,失敗就撈last error 06/29 19:42
petercoin: code就好 06/29 19:42
kingofsdtw: 全域變數,sleep ,and kill 06/29 20:01
kingofsdtw: 不過是同一隻程式嗎? 06/29 20:02
loveme00835: 先釐清你的責任吧 06/30 00:27
Golven: 用goto? (誤) 06/30 18:54
hongsiangfu: reset? 07/01 00:00
sunneo: 做一隻interpreter 把全部function存到function pointer 07/01 01:10
sunneo: 這樣就可以用間接的方式setjmp/longjmp (誤 07/01 01:10
Killercat: setjmp/longjmp應該有靠AR處理stack問題 會放掉stack 07/01 20:31
Killercat: 其他所有的辦法應該都會碰到堆疊殘留的問題... 07/01 20:31
Killercat: 這個我沒有非常確定 有高手的話請指正一下.. orz 07/01 20:32
stupid0319: call A()之前呼叫 pushad ,回到 main 呼叫 popad 07/04 21:40