我想在qsort中的比较器之间切换,而不是创建5个不同的比较器,但是由于某种原因程序不工作。我不知道为什么会发生这种情况。有人能解释一下吗?谢谢!
struct propertySales{
unsigned int tanggal[3];
char pelanggan[30];
char jenisProperty[30];
char namaProperty[30];
int jumlahProperty;
double hargaProperty;
double totalPembayaran;
}Arr[100], compare[100], temp;
typedef int (*compfn)(const void*, const void*);
int compare_harga(struct propertySales *, struct propertySales *);
int compare_pembayaran(struct propertySales *, struct propertySales *);
int compare_harga(struct propertySales *elem1, struct propertySales *elem2){
if( elem1->hargaProperty < elem2->hargaProperty){
return -1;
}
else if(elem1->hargaProperty > elem2->hargaProperty){
return 1;
}
else{
return 0;
}
}
int compare_pembayaran(struct propertySales *elem1, struct propertySales *elem2){
if( elem1->totalPembayaran < elem2->totalPembayaran){
return -1;
}
else if(elem1->totalPembayaran > elem2->totalPembayaran){
return 1;
}
else{
return 0;
}
}
编译器抛出警告---[警告]从不同大小的整数转换为指针[-Wint-to-pointer-cast]
2条答案
按热度按时间lbsnaicq1#
短代码
让我们从我们的结构开始,我将把它们弄乱,只是为了在里面有更多种类的对象类型。
现在来看比较器功能。
就是这样!现在要对数据进行排序,您只需要使用适当的比较器函数!
英文:
* 较短 * 的代码(带X宏)
使用某些宏可以大大减少重复输入,但这里真正的好处是ODR,它在C和C++中都是一个有用的概念。
这个想法是创建一个单一的信息"表",我们以后将使用它来"构造"我们的对象。
哇!是的!现在生成比较器函数:
这是......令人惊讶的短,对吗?即使有所有的额外代码doign的东西,原来的代码不能,和 * 完整 * 代码为 * 所有 * 比较器函数(因为我们离开了他们都在第一个例子)。
显而易见的代价是,现在我们正处在一个棘手的代码领域。
原始代码非常清晰易读。这东西需要额外的脑力。
它是否值得是其他地方的争论。现在,我们可以很容易地根据任何成员对Property_Sales数组进行排序。
英文:
如果Client结构存在,并且设置为通过特定的成员比较器函数对Client进行排序,那么您也可以通过客户端进行排序:
英文:
就是这样!
所有的代码仍然是重复的,但是我们把所有的重复放入一些宏中,从一个表中为我们 * 生成 * 代码,这个技巧被称为X-macro trick。
从上文中注意到:我们通过简单地返回一个
0
值,使这个地区实际上是不可排序的。2我们本应该像它周围的所有其他元素一样,赋予它排序能力。3重点只是提供一个例子!我需要指出的是,我还使用了著名的
offsetof()
宏来使事情变得更好,在排序函数中,a
和b
现在是指向要比较的成员元素的直接指针(而不是像以前那样指向结构本身),请注意这对PENJUALAN_PROPERTI
表中的比较代码有何直接影响:注意你所处的间接层。2例如,注意在成员字符串 * array * 和成员字符串 * pointer * 上使用strcmp()
的区别。还要记住
qsort()
既不是可重入的也不是稳定的,像我们这样使用全局状态意味着我们需要小心线程化和递归使用。哦,在这里找到
ARRAY_SIZE macro
(名称略有不同)。记住,权力越大,责任越大!
ddrv8njm2#
OP要求提供较长代码块的示例来说明用法。
(No保证这是适合的。)