請問寫程式時結構的問題 |
尚未結案
|
uj
一般會員 發表:14 回覆:25 積分:7 註冊:2003-03-06 發送簡訊給我 |
假設在一函式中宣告了一塊記憶體, 接著在運算過程中某些狀況就終止return,
則在我 return 前應free, 這樣不是我有幾個return 就要有幾個 free, 請問有沒好一點的寫法
int Test(){ BYTE *ba = (byte *)malloc(iLen); if(...){ ... free(ba); return -1; } if(...){ ... free(ba); return -2; } if(...){ ... free(ba); return -3; } free(ba); return 0; }函式中的 if 有時有 8, 9個 要是用 if else 那就很多層... 想不到好一點的寫法 請提供意見囉 謝謝 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 假設在一函式中宣告了一塊記憶體, 接著在運算過程中某些狀況就終止return, 則在我 return 前應free, 這樣不是我有幾個return 就要有幾個 free, 請問有沒好一點的寫法uj 你好: 試試看這樣子寫,不妨參考看看 < class="code"> int Test() { int iR=0; BYTE *ba=NULL; ba=(byte *)malloc(iLen); if(...) { ... iR=-1; } if(...) { ... iR=-2; } if(...) { ... iR=-3; } if(ba!=NULL) free(ba); return iR; } -- Enjoy Researching & Developing --int Test(){ BYTE *ba = (byte *)malloc(iLen); if(...){ ... free(ba); return -1; } if(...){ ... free(ba); return -2; } if(...){ ... free(ba); return -3; } free(ba); return 0; }函式中的 if 有時有 8, 9個 要是用 if else 那就很多層... 想不到好一點的寫法 請提供意見囉 謝謝
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
uj
一般會員 發表:14 回覆:25 積分:7 註冊:2003-03-06 發送簡訊給我 |
有一陣子沒來了, 記的您是包子大大吧, 謝謝您的回覆 可是我的情況是依序而下 假如有其中有一個if成立
就是直接 return error 不要再繼續此 function 了 說起來自己覺得是用 if else 好像比較合邏輯
但有好幾個判斷式, 這樣用又很醜 直接 return 也不錯, 但卡在有 memory 要 free
一個 malloc 要在每個return 之前都要free
總覺得這樣寫...不太順 還有用 goto 的話, 好像還不錯
但記得...應避免使用 goto
int Test() { int iR=0; BYTE *ba=NULL; ba=(byte *)malloc(iLen); if(...) { ... goto FinalFun; iR=-1; } if(...) { ... goto FinalFun; iR=-2; } if(...) { ... goto FinalFun; iR=-3; } FinalFun: if(ba!=NULL) free(ba); return iR; }請指教 謝謝 發表人 - uj 於 2004/02/17 10:40:35 |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 有一陣子沒來了, 記的您是包子大大吧, 謝謝您的回覆 可是我的情況是依序而下 假如有其中有一個if成立 就是直接 return error 不要再繼續此 function 了 說起來自己覺得是用 if else 好像比較合邏輯 但有好幾個判斷式, 這樣用又很醜 直接 return 也不錯, 但卡在有 memory 要 free 一個 malloc 要在每個return 之前都要free 總覺得這樣寫...不太順 還有用 goto 的話, 好像還不錯 但記得...應避免使用 gotoint Test() { int iR=0; BYTE *ba=NULL; ba=(byte *)malloc(iLen); if(...) { ... goto FinalFun; iR=-1; } if(...) { ... goto FinalFun; iR=-2; } if(...) { ... goto FinalFun; iR=-3; } FinalFun: if(ba!=NULL) free(ba); return iR; }請指教 謝謝 uj 你好: (1)如果照你所說的,只要前面那個條件一成立,後面的條件就都忽略的話,那 麼也可以改成這樣子寫的 int Test() { int iR=0; BYTE *ba=NULL; ba=(byte *)malloc(iLen); if(...) { ... iR=-1; } else if(...) { ... iR=-2; } else if(...) { ... iR=-3; } if(ba!=NULL) free(ba); return iR; } (2)其實用 goto 也是可以的,小弟我也常常使用 (3)你會發現一件事情,從一開始到現在我們所討論主要的目的,就在於每一個 function 到底應該有很多出口,還是只保持一個出口?這就見仁見智了,有 的人說,很多個出口 (你第一次的寫法),效率比較好;也有的人說,保持一 個出口 (後來的寫法),比較容易偵錯,不容易出錯。你認為呢? (> < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10003806&CC=223734"> -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
uj
一般會員 發表:14 回覆:25 積分:7 註冊:2003-03-06 發送簡訊給我 |
謝謝 RaynorPao 其實我最早是用多個出口 直接 return
因我寫 malloc 時 接著就打 free
然後中間再來寫...直覺一個 malloc 對一個 free
然後中間寫一寫想說有 error就直接 return 了吧
就這樣...忘了 然後後來想到時... 一時想不到啥寫法
只覺得要在每個 class="code">
if(...)
{
...
iR=-1;
}else{
if(...)
{
...
iR=-2;
}
else{
if(...)
{
...
iR=-3;
}
}
}
所以我會參照包子所說的 else if 的寫法 還有我的 > 其實還有想過用 >
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
uj 你好,
我的做法是 利用 STL 的 auto_ptr 類別來做,
但是如果是釋放 陣列型記憶體的話, auto_ptr
會出點問題(用 codeguard測就知道了)... 所以
可以定義 簡單的類別來幫助你...
道理是利用 local object 會執行 dtor, 所以把
釋放資源動作寫在哪裡... 以下是範例:
template所以, 你可以利用這個觀念來做, 如果你是純C的話 還有另外一些做法 麻煩一些 *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
uj
一般會員 發表:14 回覆:25 積分:7 註冊:2003-03-06 發送簡訊給我 |
謝謝 brook 與 Royce520 指教 brook 的方式有些情況是 ok 的
但因為我是在函式中, 經過運算才知要分派多少記憶體
又某些情況已經先 return error 根本不用 new
所以...要在函式中分派記憶體 (不適合拿到function之外)
不好意思沒說清楚
Royce520 的方式...STL 哈 我還沒用過
有些看不懂, 也有點概念(跟在 class 建構與解構處理感覺頗像)
local object 會執行 dtor (是哪個字的縮寫嗎?)
得自己再去 k 一下書 另外還提到 => 純C的話還有另外一些做法
方便的話請指教
也不一定要寫範例給我看啦
跟我說說概念也好...
謝謝兩位
< > 還有我這問題的標題下的對不對< >
寫程式時結構的問題
覺得有點怪, 但沒想到更好ㄉ 發表人 - uj 於 2004/02/17 20:08:23
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
uj 你好,
sorry 寫簡寫讓你看不出來...
class="code">
Header File stdlib.h Category Process Control Routines Prototype int atexit(void (_USERENTRY * func)(void)); BCB 中的範例:
#include
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
uj
一般會員 發表:14 回覆:25 積分:7 註冊:2003-03-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |