免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

让我欢喜让我忧——我的C++之路 [复制链接]

论坛徽章:
0
581 [报告]
发表于 2012-04-18 16:21 |只看该作者
陈良乔 发表于 2012-04-18 15:20
我只想找一个反例,来说明必须返回=0,否则会出现问题
可是遗憾的是,我现在还没有找到,能举一个例子 ...


你贴出来的代码是有问题的,而且已经给你指出症结所在了,
至少说明两个问题:
1、你对写书的态度不严谨
2、你对不稳定排序没有什么概念

论坛徽章:
0
582 [报告]
发表于 2012-04-18 16:32 |只看该作者
陈良乔 发表于 2012-04-18 15:20
我只想找一个反例,来说明必须返回=0,否则会出现问题
可是遗憾的是,我现在还没有找到,能举一个例子 ...

// 比较规则函数
int cmp(const void* a,const void* b)
{
        // 将void*类型的参数转换为实际的txtfile*类型
const txtfile* file1 = a;
        const txtfile* file2 = b;

        // 比较txtfile结构体的词频
return file1->correlation > file2->correlation ? 0 : 1;


}

// 文件排序模块的实现
void sortfiles(txtfile* files,int count)
{
        // 调用qsort()函数对数组进行排序
qsort(files,count,sizeof(txtfile),cmp);        
}


给你代码拍个照

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
583 [报告]
发表于 2012-04-18 16:39 |只看该作者
本帖最后由 gvim 于 2012-04-18 16:44 编辑

回复 568# 陈良乔


真不敢相信你是写书的MVP,最基本的算法啊。。。
FreeBSD

  1. static inline char *
  2. med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk
  3. #ifndef I_AM_QSORT_R
  4. __unused
  5. #endif
  6. )
  7. {
  8.         return CMP(thunk, a, b) < 0 ?
  9.                (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a ))
  10.               :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c ));
  11. }
复制代码
GLIBC

  1.            if ((*cmp) ((void *) mid, (void *) lo) < 0)
  2.              SWAP (mid, lo, size);
  3.            if ((*cmp) ((void *) hi, (void *) mid) < 0)
  4.              SWAP (mid, hi, size);
  5.            else
  6.              goto jump_over;
  7.            if ((*cmp) ((void *) mid, (void *) lo) < 0)
  8.              SWAP (mid, lo, size);
  9.          jump_over:;
复制代码
MS VC9
  1.       
  2. if (__COMPARE(context, lo, mid) > 0) {
  3.             swap(lo, mid, width);
  4.         }
  5.         if (__COMPARE(context, lo, hi) > 0) {
  6.             swap(lo, hi, width);
  7.         }
  8.         if (__COMPARE(context, mid, hi) > 0) {
  9.             swap(mid, hi, width);
  10.         }
复制代码
我只是初略看了下,没仔细看。
你用vc,它只比较>0,当然看起来不会出问题。像你549楼
  1. return file1->correlation > file2->correlation ? 0 : 1;
复制代码
不给 <0 的,放在freebsd和glibc里面试试看呢?

ps: 写书的时候先使自己有这个实力写书吧哥,我替那些看你书的人先谢谢你了。本不想再回你的低级问题,只是担心那些可能被你写书误导的人。。。作孽

论坛徽章:
0
584 [报告]
发表于 2012-04-18 16:49 |只看该作者
gvim 发表于 2012-04-18 16:39
回复 568# 陈良乔


难道他那个代码在VC里面不会出错?

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
585 [报告]
发表于 2012-04-18 16:53 |只看该作者
本帖最后由 gvim 于 2012-04-18 16:55 编辑

回复 586# 0xC1988


上面我也说过,< 的情况可以通过 > 和 = 来处理,依据实现不同而不同。MVP写的本来就是个错误的东西,我没那么无聊跑去验证VC的是不是不要 < 也可以,MVP说没问题,那就没问题嘛

论坛徽章:
0
586 [报告]
发表于 2012-04-18 17:01 |只看该作者
gvim 发表于 2012-04-18 16:53
回复 586# 0xC1988


论坛徽章:
0
587 [报告]
发表于 2012-04-18 17:10 |只看该作者
让我感到奇怪的是,为什么下面这段代码在MinGW下没有问题呢?
谁来帮我解答一下?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. static int
  5. cmp(const void *p1, const void *p2)
  6. {
  7.     int a = *(int*)p1;
  8.         int b = *(int*)p2;
  9.         if(a>b)
  10.                 return 1;
  11.         else
  12.                 return -1;

  13. }
  14. int
  15. main(int argc, char *argv[])
  16. {
  17.     int arr[6] = {2,3,2,2,3,3};
  18.     qsort(arr, 6, sizeof(int), cmp);
  19.     for (int j = 0; j < 6; j++)
  20.         printf("%d\n",arr[j]);
  21.     return 0;
  22. }
复制代码

论坛徽章:
0
588 [报告]
发表于 2012-04-18 17:14 |只看该作者
gvim 发表于 2012-04-18 16:39
回复 568# 陈良乔


return file1->correlation > file2->correlation ? 0 : 1;
确实是一个错误,谢谢你的提醒

论坛徽章:
0
589 [报告]
发表于 2012-04-18 17:22 |只看该作者
对比较作了一些修改
这样是否可以了呢?

  1. // 比较txtfile结构体的词频
  2. const double fEpsilon = 0.00001;  // 定义相等比较的误差
  3. if(fabs(file1->correlation – file2->correlation) < fEpsilon)
  4. {
  5.         return 0;
  6. }
  7. else if(file1->correlation > file2->correlation)
  8. {
  9.         return 1;
  10. }
  11. else
  12. {
  13.         return -1;
  14. }

复制代码

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
590 [报告]
发表于 2012-04-18 17:26 |只看该作者
陈良乔 发表于 2012-04-18 17:10
让我感到奇怪的是,为什么下面这段代码在MinGW下没有问题呢?
谁来帮我解答一下?


不知道说你什么好,错了还不肯承认。

结果正确,不表明代码没错误,这道理你应该懂。

从返回值1和0,后来变成1和-1,说明你有点随心所欲,没有理解透qsort。
从一般来说,qsort的实现是没有对返回值0做特别处理,一般分成>、<=或者>=、<两种情况处理就够了,因为一般qsort都不是稳定排序。
标准这么要求返回三种情况,我想一个重要的原因是考虑bsearch这个函数,其中的比较函数原型是一样的,这里=0就有用了。

有标准不遵循,非要来点另类的,这有什么好处呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP