c - qsort() 比较结构数组 : very strange behaviour

标签 c arrays struct qsort

我试图通过增加一个字段(双数)来对结构数组进行排序,但 qsort() 似乎以某种方式破坏了该数组中的数据(调用后打印数组显示字段填充了一些随机值) 。此外,如果我将比较器更改为按后代顺序对数组进行排序,qsort 不会再破坏数据,但也不会对数组进行排序 - 调用后一切都是一样的。 这个小程序演示了这个问题:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

/* Macro for comparing floats. */
#define CMP_PREC 0.000001
#define dbl_eq(x, y) (fabs((x) - (y)) < CMP_PREC)

/* Structure for testing. */
struct level {
    double alt;
    double volume;
    double area;
};

/* Create array of levels with random alts. 
 * (Other fields are unimportant for this demo). */
struct level *create_random_arr(size_t size) {
    size_t i;
    struct level *lev = NULL;
    lev = calloc(sizeof(*lev), size);
    srand(time(NULL));
    for (i = 0; i < size; i++) {
        lev[i].alt = (double) rand() / 1000.0;
        lev[i].volume = lev[i].area = 0.0;
    }
    return lev;
}

/* Prints array in format:
 * [index]: alt=[alt], volume=[volume], area=[area]\n */
void print_levels(struct level *lev, int lev_cnt) {
    int i;
    for (i = 0; i < lev_cnt; i++) {
        printf("%d: alt=%g, volume=%g, area=%g\n",
            i, lev[i].alt, lev[i].volume, lev[i].area);
    }
}

/* Comparator for sorting by increasing of alt. */
static int levels_compar(const void *a, const void *b) {
    const struct level *al = (const struct level *) a;
    const struct level *bl = (const struct level *) b;
    if dbl_eq(al->alt, bl->alt) {
        return 0;
    } else if (al->alt < bl->alt) {
        return -1;
    } else {
        return 1;
    }
}

int main(void) {
    int size = 10;
    struct level *lev = NULL;
    lev = create_random_arr(size);
    /* Print generated array. */
    print_levels(lev, size);
    /* Sort array by increase. */
    qsort(lev, sizeof(*lev), size, levels_compar);
    /* Print result... very surprising, isn't it? */
    printf("----------\n");
    print_levels(lev, size);
    free(lev);
    return 0;
}

最佳答案

您混淆了 qsort 的元素数量和元素大小参数。这样就可以了:

qsort(lev, size, sizeof(*lev), levels_compar);

如上所述,您还应该在比较宏中使用 fabs。然而,我真的不认为您需要与排序容差进行比较,因为您并不是真正在寻找相等性,而是在寻找升序。我只是选择 == 并将其作为最后一个分支,因为它实际上永远不会发生。

关于c - qsort() 比较结构数组 : very strange behaviour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20154133/

相关文章:

C 二维数组结构比较问题

c++ - 如果直接跟随形成有效标识符的字符,则宏变量不会扩展

c - 如何打印一个汉字?

c - 需要 scanf "extra input"

c++ - 简单数组查找最高值和最低值的索引位置

c - C 编程中的结构指针有问题

json - Golang/Go - 如果结构没有字段,如何将结构编码(marshal)为 null?

struct - 初始化嵌套结构定义

C 编程结构体运行时错误

Java整数数组,我似乎无法做简单的数学运算