作者zhim (zhim)
看板C_and_CPP
標題Re: [閒聊] VC2005 的 qsort 好像有bug...
時間Thu Dec 3 04:57:53 2009
謝謝回應
本人回應太慢 對不起
我也不是很有把握
我用內建的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
2F:推 ducksteven:我在自己的電腦編譯也會跑錯,改成這樣就不會錯了 12/03 05:09
4F:→ ducksteven:上面有人提示了,因為它有 3 種 return value 12/03 05:10
5F:→ zhim:謝謝您 VC要3種value不是變慢了, 我以前用BC3都沒注意到這個 12/03 05:33
6F:推 VictorTom:果然被人抓藥抓對了, 應該回傳三態你只回傳兩態.... 12/03 09:13
8F:→ VictorTom:只能說你以前沒遇到錯誤大概只是運氣好.... 12/03 09:15
9F:→ VictorTom:效率會不會變差要看lib內部怎麼實作, 如果它本來就需要 12/03 09:18
10F:→ VictorTom:三態你只給兩態, 結果錯了就更不用討論效率了XD 12/03 09:19
11F:→ tomnelson:哈哈哈~~~ 12/03 11:38
12F:推 ducksteven:它的定義本來就有三種回傳啊 順便告訴你我編譯器是gcc 12/03 13:36
13F:推 cplusplus:下次先看document會比較好... C的標準qsort本來就要三態 12/03 15:33
14F:→ tomnelson:"man 3 qsort" for Linux/Unix/FreeBSD and etc. ! 12/03 17:48
15F:→ sunneo:數字三態最簡單就是直接a-b了 12/03 21:52
16F:→ zhim:這樣就會發生 a-b -> 0 的 round off error 12/04 14:11
17F:→ zhim:雙態就夠了 把qsort.c 檢查 ==0 的去掉 12/04 14:14
18F:→ zhim:其他改成 bool 邏輯 12/04 14:18
19F:推 ledia:bool ? 回傳 0, 1 就是會錯呀... 12/04 14:59
20F:→ ledia:你可以只傳 -1, 1 啦, 我想沒有 0 大概不會有太大問題 12/04 14:59
21F:→ ledia:只回傳 0, 1 就註定會錯了 12/04 14:59