我正在创建一个比较函数来使用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);
答案 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