【问题标题】:qsort not sorting structure correctlyqsort 没有正确排序结构
【发布时间】:2011-04-30 05:31:24
【问题描述】:

我正在尝试对我通过 qSort 创建的结构进行排序,但它似乎正在按照我的预期进行。

这是我的比较功能

int compare(const void *a, const void *b) {
    const INPUT *p1 = a;
    const INPUT *p2 = b;
    return ((p1->startTime) - (p2->startTime));
}

INPUT 是我的结构,startTime 是其中的一个 int。

我以此调用 qsort

qsort(*global,fileNumber,sizeof(global)/fileNumber,compare);

其中 global 是 INPUT 的变量名,fileNumber 是全局变量中的条目数。

从我写的 printf 语句来看,它似乎什么也没做。

我已经像这样在我的代码全局的开头初始化了

INPUT *global[4];

关于我做错了什么有什么想法吗?

谢谢

【问题讨论】:

  • fileNumberglobal的定义是什么?不确定,但看起来global 是一个指针,所以sizeof(global) 可能不是你想要的,你可能也不想在第一个参数中取消引用它。
  • 你的意思是 qsort 行中的 *global 吗?还是只是全球性的? “全局”的类型是什么?
  • 将这样的差异作为比较函数的返回值几乎总是错误的。它容易受到数字溢出错误的影响。

标签: c struct qsort


【解决方案1】:

当您将*global 发送到qsort 时,我可以想象您将global 定义为:

INPUT **global;

因此,当您将sizeof(global)/fileNumber 作为第三个参数提供给qsort 时,sizeof 可能是 4(或在 64 位系统上为 8)。那么这个参数可能为零。

因此qsort 对零元素数组不执行任何操作,并且从不调用compare

【讨论】:

    【解决方案2】:

    global 数组是指针数组,而不是 INPUT 结构数组。所以你的比较函数应该是这样的:

    int compare(const void *a, const void *b) {
        const INPUT **p1 = a;
        const INPUT **p2 = b;
        return (((*p1)->startTime) - ((*p2)->startTime));
    }
    

    还有你给qsort()的电话:

    qsort(global,fileNumber,sizeof(global)/fileNumber,compare);
    

    当然,所有这些都假设您确实将global 用作指针数组,而不是指向 INPUT 结构数组的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2015-02-23
      • 2021-05-08
      相关资源
      最近更新 更多