作者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