Re: [閒聊] VC2005 的 qsort 好像有bug...

看板C_and_CPP作者 (zhim)時間14年前 (2009/12/03 04:57), 編輯推噓6(6015)
留言21則, 7人參與, 最新討論串2/3 (看更多)
謝謝回應 本人回應太慢 對不起 我也不是很有把握 我用內建的IDE 測了不同的 data type, int, float, double 只有double 20個時 發生問題 ( 測試個數 5, 6, 8, 10, 20) 我把code貼上來 請各位指教一下 typedef struct _record_ { double value; int position; } s_reorder; int compare_record( const void *arg1, const void *arg2 ) { return (int) ( (*(s_reorder *)arg2).value> (*(s_reorder *)arg1).value); } int main(void) { // reorder 是一維陣列 , size= m> 20, 沒有相同的element qsort( (void *)( reorder), (size_t) m, sizeof( s_reorder), compare_record ); } 我用相同的資料結構 自己寫一個 _qsort_ 沒再多呼叫compare 是正確的結果 我記得當初debug時 有把structure 拿掉 還是相同的情形 一兩個月前了 又因為自己寫了_qsort_也還好 就沒再多做實驗 也有些情況沒記那麼清楚 好像 30, 40, 50 個double 都有錯 最近程式告一段落 才想來問看看... 以下是錯的結果 0 121.714397 1 -0.785398 2 -2.520560 3 -0.791447 4 -0.855704 5 -1.695513 6 -1.455394 7 -1.857532 8 -2.066145 9 -3.284361 10 -2.275599 11 -3.423782 12 -3.641737 13 -5.068104 14 -6.149263 15 -7.107637 16 -10.794325 17 -15.191077 18 -17.749103 19 -35.001716 謝謝囉 ※ 引述《zhim (zhim)》之銘言: : 標題: [閒聊] VC2005 的 qsort 好像有bug... : 時間: Wed Dec 2 06:08:56 2009 : : 用VC2005內建的qsort : : 幫20個 double排序 好像會得出錯的順序 : : 不知是否有人有相同的經驗? : : 還是MS 已經有patch了... : : : 希望 patch != VC2008 .... : : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.115.51.64 : → sunneo:你有在別的IDE測試嗎 12/02 08:38 : 推 LPH66:你是怎麼寫的...? 12/02 08:39 : 推 ledia:通常是自己寫錯 12/02 09:18 : → ledia:(這裡的通常, 大約是 99.99%) 12/02 09:18 : → VictorTom:寫程式結果有錯都不會先懷疑自己寫錯就覺得是環境給的 12/02 09:30 : → VictorTom:lib有錯嗎Orz 這麼有自信的話直接貼code來看就知道了XD 12/02 09:30 : → tomnelson:(99.9% + 0.1%)寫錯... 12/02 10:51 : → tomnelson:我敢猜問題出在那個傳入qsort的cmpfunc(比較函式)... 12/02 10:55 : → tomnelson:題外話,寫程式出問題就怪罪到IDE或compiler,不是好事,雖 12/02 10:57 : → tomnelson:然這種事也真的有,但是在已經成熟而且在市面上的產品上 12/02 10:58 : → tomnelson:來說,真的少見,頂多是在compiler最佳化那邊出問題,這種 12/02 11:00 : → tomnelson:內建functions出問題的,還沒遇過. 12/02 11:00 : → tomnelson:請參考別人"犯錯心得"如下兩網址: 12/02 11:12 : → tomnelson:http://ppt.cc/kPN0 12/02 11:13 : → tomnelson:http://ppt.cc/Ctst 12/02 11:13 : 推 ledia:我隔空抓藥一下, 他大概回傳 *(double*)x-*(double*)y; 12/02 13:22 : → ledia:當 x, y 差距太小, 回傳又 cast 成 int 就會變為 0 ... 12/02 13:22 : → bugmens:原po都不吭聲,大家debug倒是解的很高興 12/02 18:07 : 推 walker2009:樓上是bug, 抓到了 XD 12/02 18:44 : → sunneo:大家都講得太明了 -.- 我反倒想看看他測了幾個IDE來下結論 12/02 22:27 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.51.64

12/03 05:05, , 1F

12/03 05:09, , 2F
我在自己的電腦編譯也會跑錯,改成這樣就不會錯了
12/03 05:09, 2F

12/03 05:09, , 3F

12/03 05:10, , 4F
上面有人提示了,因為它有 3 種 return value
12/03 05:10, 4F

12/03 05:33, , 5F
謝謝您 VC要3種value不是變慢了, 我以前用BC3都沒注意到這個
12/03 05:33, 5F

12/03 09:13, , 6F
果然被人抓藥抓對了, 應該回傳三態你只回傳兩態....
12/03 09:13, 6F

12/03 09:14, , 7F
12/03 09:14, 7F

12/03 09:15, , 8F
只能說你以前沒遇到錯誤大概只是運氣好....
12/03 09:15, 8F

12/03 09:18, , 9F
效率會不會變差要看lib內部怎麼實作, 如果它本來就需要
12/03 09:18, 9F

12/03 09:19, , 10F
三態你只給兩態, 結果錯了就更不用討論效率了XD
12/03 09:19, 10F

12/03 11:38, , 11F
哈哈哈~~~
12/03 11:38, 11F

12/03 13:36, , 12F
它的定義本來就有三種回傳啊 順便告訴你我編譯器是gcc
12/03 13:36, 12F

12/03 15:33, , 13F
下次先看document會比較好... C的標準qsort本來就要三態
12/03 15:33, 13F

12/03 17:48, , 14F
"man 3 qsort" for Linux/Unix/FreeBSD and etc. !
12/03 17:48, 14F

12/03 21:52, , 15F
數字三態最簡單就是直接a-b了
12/03 21:52, 15F

12/04 14:11, , 16F
這樣就會發生 a-b -> 0 的 round off error
12/04 14:11, 16F

12/04 14:14, , 17F
雙態就夠了 把qsort.c 檢查 ==0 的去掉
12/04 14:14, 17F

12/04 14:18, , 18F
其他改成 bool 邏輯
12/04 14:18, 18F

12/04 14:59, , 19F
bool ? 回傳 0, 1 就是會錯呀...
12/04 14:59, 19F

12/04 14:59, , 20F
你可以只傳 -1, 1 啦, 我想沒有 0 大概不會有太大問題
12/04 14:59, 20F

12/04 14:59, , 21F
只回傳 0, 1 就註定會錯了
12/04 14:59, 21F
文章代碼(AID): #1B5jJL__ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1B5jJL__ (C_and_CPP)