線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:880
推到 Plurk!
推到 Facebook!

請問寫程式時結構的問題

尚未結案
uj
一般會員


發表:14
回覆:25
積分:7
註冊:2003-03-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-16 19:59:36 IP:210.64.xxx.xxx 未訂閱
假設在一函式中宣告了一塊記憶體, 接著在運算過程中某些狀況就終止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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-16 20:41:48 IP:61.221.xxx.xxx 未訂閱
引言: 假設在一函式中宣告了一塊記憶體, 接著在運算過程中某些狀況就終止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 那就很多層... 想不到好一點的寫法 請提供意見囉 謝謝
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 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
uj
一般會員


發表:14
回覆:25
積分:7
註冊:2003-03-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-17 10:29:14 IP:210.64.xxx.xxx 未訂閱
有一陣子沒來了, 記的您是包子大大吧, 謝謝您的回覆    可是我的情況是依序而下 假如有其中有一個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-17 11:00:25 IP:203.73.xxx.xxx 未訂閱
引言: 有一陣子沒來了, 記的您是包子大大吧, 謝謝您的回覆 可是我的情況是依序而下 假如有其中有一個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 你好:
(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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-17 12:04:39 IP:210.64.xxx.xxx 未訂閱
謝謝 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-17 15:50:13 IP:218.160.xxx.xxx 未訂閱
也可考慮把malloc和free拿到function之外.
 
int Test(BYTE *ba){
   if(...){
      ...
      return -1;
   }
   if(...){
      ...
      return -2;
   }
   if(...){
      ...
      return -3;
   }
   return 0;
}    BYTE *ba = (byte *)malloc(iLen);
if (ba)
{
  Test(ba);
  free(ba);
}
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-17 16:58:56 IP:61.230.xxx.xxx 未訂閱
uj 你好,  我的做法是 利用 STL 的 auto_ptr 類別來做,  但是如果是釋放 陣列型記憶體的話, auto_ptr  會出點問題(用 codeguard測就知道了)...  所以  可以定義 簡單的類別來幫助你...    道理是利用 local object 會執行 dtor, 所以把  釋放資源動作寫在哪裡... 以下是範例:    
template 
struct FreeArrayedRes {
    const _Tp *m_pArrayedRes;       FreeArrayedRes (_Tp * ARes)
      { m_pArrayedRes = ARes; }
   virtual ~FreeArrayedRes ()
      { delete[] m_pArrayedRes; }
};    void funcA()
{
 char *p = new [MAX_PATH];
 FreeArrayedRes auto_free(p);     if(...){
      ...
      // free(ba); 不需要了
      return -1;
   }     if(...){
      ...
      // free(ba);
      return -2;
   }
  ... 
}
所以, 你可以利用這個觀念來做, 如果你是純C的話 還有另外一些做法 麻煩一些 *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
uj
一般會員


發表:14
回覆:25
積分:7
註冊:2003-03-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-17 20:06:18 IP:210.64.xxx.xxx 未訂閱
謝謝 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-18 03:23:13 IP:61.230.xxx.xxx 未訂閱
uj 你好,   sorry 寫簡寫讓你看不出來...  class="code"> Header File stdlib.h Category Process Control Routines Prototype int atexit(void (_USERENTRY * func)(void)); BCB 中的範例: #include #include void exit_fn1(void) { printf("Exit function #1 called\n"); } void exit_fn2(void) { printf("Exit function #2 called\n"); } int main(void) { /* post exit function #1 */ atexit(exit_fn1); /* post exit function #2 */ atexit(exit_fn2); return 0; } 相信 你是一看就懂... ps. 個人覺得 這個方法 並不是很好用 我覺得比較好的方式是 local object 這個方法 你可以建立一些這類類別 以後還可以常常用到 *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
uj
一般會員


發表:14
回覆:25
積分:7
註冊:2003-03-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-02-18 11:05:49 IP:210.64.xxx.xxx 未訂閱
謝謝 Royce520 多學了一招, atexit
系統時間:2024-05-18 13:07:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!