原始問題是我問的,發問於 ptt   [問題] 檔案深度搜尋 BFS / DFS ,這裡先做個 note。

 

先強調一下,裡面的資料夾搜尋原始碼是有點問題的,沒做好防呆措施。

原主題蠻快就解決疑問了,檔案深度搜尋,BFS / DFS 效能哪個優沒說得準。

 

重點是在於裡面的「衍生問題」,  留下不少作法討論,

主要是想將 printf / puts / putchar 之類的函式,以 #define 方式消掉,

一開始筆者很天兵的作法

 

#ifdef NO_OUTPUT

#define printf //
#define puts //
#define putchar // 

#endif

 

當然是有問題的,而且蠻多情況會出包。

推文裡有得到不少解答,有時間的時候再想一下是不是有其它較好的作法,

當然再下去又回到之前的 dprintf 問題,這裡單純先做個 note。

edisonx 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • novus
  • 比較不會出問題的做法:
    #define printf (1)? 0 : printf
    而且在執行期不會有額外開銷。
    http://novus.pixnet.net/blog/post/27504600

    另naive BFS/DFS 的時間純粹看問題特性+運氣,沒什麼好比的
  • blog 我連上去看了,中後半段的 macro 還真的是讓我繳盡腦汁。
    BFS / DFS 在這問題一度讓我思考是不是太過頻繁做記憶體配置(malloc) 與字串複製,不過不複製的話也沒辦法保留資訊下來,後來認為應是運氣成份居多了,再次感謝您的回答。

    edisonx 於 2012/11/02 23:57 回覆

  • novus
  • 不好意思,剛剛一直沒有閱讀大作,直到看到樓上回覆,才想點進去看一下程式碼。雖然沒有詳細追蹤流程,不過立刻查覺一個潛在問題。

    FString *Queue = (FString*)malloc(sizeof(*Queue) * QSize);

    if(hFind==INVALID_HANDLE_VALUE){
    printf("FindFirstFile Error %d\n", GetLastError());
    return ;
    }

    free(Queue);

    不知道你有沒有發現,只要 hFind 有錯,馬上就會 memory leak。資源釋放一定要涵蓋全部路徑。有一個簡單的 idiom 專門解決這種問題,名字我忘了。

    void Algo(..whatever..)
    {
    res = malloc(..);
    AlgoImpl(..whatever.., res);
    free(res);
    }


  • 這個 leak 還真的是忘了清。模型讓我想了一下才想到是什麼意思。

    應是會先 call Algo, 裡面專門做 heap 管理, 而 AlgoImpl 就不管 heap (除了不夠用 realloc 之外), 專職在演算法之重心。

    最後謝謝指正與建議 :)

    edisonx 於 2012/11/03 01:16 回覆

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼