如何在c中将比较函数与typedef进行比较

时间:2014-07-05 16:52:59

标签: c struct qsort

我正在创建一个比较函数来使用qsort()但我无法正确地转换元素。我试过不同的东西,但它永远不会奏效。有人可以解释一下这样做的正确逻辑吗?提前谢谢!

typedef struct _stringa {
    char* string;
    int freq;
} stringa;


int compare(const void *elem1, const void *elem2) {

    if (*(stringa*)elem1.freq < *(stringa*)elem2.freq) {
        return -1;
    } else if (*(stringa*)elem1.freq > *(stringa*)elem2.freq) {
        return 1;
    }

    return 0;
}

编辑: 抱歉第二个问题,但我的排序不起作用,似乎“删除”了#39;元素。这是调用qsort的正确方法吗?

qsort(ARRAY, ARRAY_DIMENSION, sizeof(struct _stringa), compare);

2 个答案:

答案 0 :(得分:7)

看起来你被操作订单问题困住了。为了防止这种情况并使代码更具可读性,您可以在一个操作中进行转换,然后进行比较:

int compare(const void *elem1, const void *elem2) {
    stringa *first = (stringa *)elem1;
    stringa *second = (stringa *)elem2;

    if (first->freq < second->freq) {
        return -1;
    } else if (first->freq > second->freq) {
        return 1;
    }

    return 0;
}

答案 1 :(得分:2)

您还需要一个级别的括号

int compare(const void *elem1, const void *elem2) {

    if ( (*(stringa*)elem1 ).freq < ( *(stringa*)elem2 ).freq) ) {
        return -1;
    } else if ( (*(stringa*)elem1 ).freq > ( *(stringa*)elem2 ).freq) ) {
        return 1;
    }

    return 0;
}

如果没有(*(stringa*)elem1 ),编译器会将elem1.freq强制转换为stringa*,然后尝试取消引用elem1.freq

编辑:由于您将ARRAY声明为指向_stringa的指针,因此您需要将指针的大小传递给_stringa到{{1}作为他们的论点:

qsort