[問題] 在副函數的副函數中跳回main function

看板C_and_CPP (C/C++)作者 (我愛陰屍路2)時間5年前 (2020/06/28 21:45), 編輯推噓9(9031)
留言40則, 18人參與, 5年前最新討論串1/1
開發平台(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

06/28 22:00, 5年前 , 1F
完全不能經過A嗎 那只能去stack裡面找返回位址
06/28 22:00, 1F

06/28 22:15, 5年前 , 2F
同樣原因的錯誤建議集中處理, 你應該重新思考函數怎麼切
06/28 22:15, 2F

06/28 22:17, 5年前 , 3F
直接 exit 不好嗎?
06/28 22:17, 3F

06/28 22:57, 5年前 , 4F
同意二樓, 你應該思考函數的功能分類法
06/28 22:57, 4F

06/28 22:58, 5年前 , 5F
什麼函數負責什麼功能該回報什麼
06/28 22:58, 5F

06/28 22:59, 5年前 , 6F
由於你提到了「使用者的 input 有可能會有錯誤」
06/28 22:59, 6F

06/28 22:59, 5年前 , 7F
你應該思考這個「檢查錯誤」的功能該由誰負責由誰叫起
06/28 22:59, 7F

06/28 23:08, 5年前 , 8F
longjmp?
06/28 23:08, 8F

06/28 23:15, 5年前 , 9F
丟exception
06/28 23:15, 9F

06/29 00:15, 5年前 , 10F
setjump與longjump應該可以做到,但可能不是好的做法
06/29 00:15, 10F

06/29 03:51, 5年前 , 11F
雖然setjump longjump 是允許你這樣做,實務上不建議你
06/29 03:51, 11F

06/29 03:51, 5年前 , 12F
用它們
06/29 03:51, 12F

06/29 04:37, 5年前 , 13F
option, result
06/29 04:37, 13F

06/29 04:50, 5年前 , 14F
用global function pointer把main address儲存起來 然後在su
06/29 04:50, 14F

06/29 04:50, 5年前 , 15F
b-fun執行error check時 若有需要跳回main 則直接調用此funt
06/29 04:50, 15F

06/29 04:50, 5年前 , 16F
ion pointer?
06/29 04:50, 16F

06/29 09:13, 5年前 , 17F
B() return error code回A A再判斷error code也是一種
06/29 09:13, 17F

06/29 09:14, 5年前 , 18F
作法吧
06/29 09:14, 18F

06/29 13:09, 5年前 , 19F
你是想問 如何在C底下達成類似exception的效果嗎?
06/29 13:09, 19F

06/29 13:09, 5年前 , 20F
如果是的話 標準做法就是setjmp跟longjmp
06/29 13:09, 20F

06/29 13:10, 5年前 , 21F
C天生就沒辦法像go傳回err 不是所有func都有空間給你塞
06/29 13:10, 21F

06/29 13:11, 5年前 , 22F
err code,硬要寫成這樣(如一堆HRESULT開頭的W32API)其
06/29 13:11, 22F

06/29 13:11, 5年前 , 23F
實也滿痛苦的,生活沒必要這樣悲慘的過(誒)
06/29 13:11, 23F

06/29 13:12, 5年前 , 24F
另用Gway你提到的作法基本上跟setjmp/longjmp沒兩樣啊
06/29 13:12, 24F

06/29 13:12, 5年前 , 25F
而且你這樣還會有堆疊的問題 XD
06/29 13:12, 25F

06/29 19:42, 5年前 , 26F
其實他如果是只跑在Windows系統上,SetLastError跟
06/29 19:42, 26F

06/29 19:42, 5年前 , 27F
GetLastError也可以用啊
06/29 19:42, 27F

06/29 19:42, 5年前 , 28F
function回傳bool判斷有沒有成功,失敗就撈last error
06/29 19:42, 28F

06/29 19:42, 5年前 , 29F
code就好
06/29 19:42, 29F

06/29 20:01, 5年前 , 30F
全域變數,sleep ,and kill
06/29 20:01, 30F

06/29 20:02, 5年前 , 31F
不過是同一隻程式嗎?
06/29 20:02, 31F

06/30 00:27, 5年前 , 32F
先釐清你的責任吧
06/30 00:27, 32F

06/30 18:54, 5年前 , 33F
用goto? (誤)
06/30 18:54, 33F

07/01 00:00, 5年前 , 34F
reset?
07/01 00:00, 34F

07/01 01:10, 5年前 , 35F
做一隻interpreter 把全部function存到function pointer
07/01 01:10, 35F

07/01 01:10, 5年前 , 36F
這樣就可以用間接的方式setjmp/longjmp (誤
07/01 01:10, 36F

07/01 20:31, 5年前 , 37F
setjmp/longjmp應該有靠AR處理stack問題 會放掉stack
07/01 20:31, 37F

07/01 20:31, 5年前 , 38F
其他所有的辦法應該都會碰到堆疊殘留的問題...
07/01 20:31, 38F

07/01 20:32, 5年前 , 39F
這個我沒有非常確定 有高手的話請指正一下.. orz
07/01 20:32, 39F

07/04 21:40, 5年前 , 40F
call A()之前呼叫 pushad ,回到 main 呼叫 popad
07/04 21:40, 40F
文章代碼(AID): #1U-9yF__ (C_and_CPP)
文章代碼(AID): #1U-9yF__ (C_and_CPP)