Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用qsort()对结构数组中的double进行排序_C_Qsort - Fatal编程技术网

C 使用qsort()对结构数组中的double进行排序

C 使用qsort()对结构数组中的double进行排序,c,qsort,C,Qsort,我正在使用qsort()对结构数组中的双值按降序排序。我有以下代码: #include <stdio.h> #include <stdlib.h> typedef struct page { double val; int id; } page; int cmpfunc(const void *a, const void *b) { const page *pageA = (page*)a; const page *pageB = (page*)b

我正在使用
qsort()
对结构数组中的双值按降序排序。我有以下代码:

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

typedef struct page {
   double val;
   int id;
} page;

int cmpfunc(const void *a, const void *b) {
  const page *pageA = (page*)a;
  const page *pageB = (page*)b;
  return -(pageA->val - pageB->val);
}

int main(void) {
  page array[5];
  int n;
  int i = 1;

for(n = 0; n < 5; n++) {
    array[n].id = i;
    i++;
}

array[0].val = 0.0608;
array[1].val = 0.2230; 
array[2].val = 0.1673;
array[3].val = 0.1442;
array[4].val = 0.2499;

printf("Before sorting\n");

for(n = 0; n < 5; n++) {
    printf("page id = %d, val = %lf \n", array[n].id, array[n].val);
}

qsort(array, 5, sizeof(page), cmpfunc);

printf("\nAfter sorting\n");

for(n = 0; n < 5; n++) {
    printf("page id = %d, val = %lf \n", array[n].id, array[n].val);
}

return 0;
}
#包括
#包括
类型定义结构页{
双val;
int-id;
}页面;
int cmpfunc(常数无效*a,常数无效*b){
常数页*页a=(页*)a;
常数页*pageB=(第*)页b;
返回-(pageA->val-pageB->val);
}
内部主(空){
页面数组[5];
int n;
int i=1;
对于(n=0;n<5;n++){
数组[n].id=i;
i++;
}
数组[0].val=0.0608;
数组[1].val=0.2230;
数组[2],val=0.1673;
数组[3],val=0.1442;
数组[4].val=0.2499;
printf(“排序前”);
对于(n=0;n<5;n++){
printf(“页面id=%d,val=%lf\n”,数组[n].id,数组[n].val);
}
qsort(数组,5,sizeof(第页),cmpfunc);
printf(“\n排序后\n”);
对于(n=0;n<5;n++){
printf(“页面id=%d,val=%lf\n”,数组[n].id,数组[n].val);
}
返回0;
}
我曾尝试使用qsort()对整数进行排序,但效果不错。但是,当尝试对双精度排序时,我的输出未排序:

排序后:

页面id=2,val=0.223000

页码id=3,val=0.167300

页面id=4,val=0.144200

页面id=5,val=0.249900

页面id=1,val=0.060800


我不知道为什么输出没有正确排序。我在网上读过关于在结构数组中排序值的帖子,我相信我的比较函数是正确的。任何洞察都将不胜感激。

这是因为compare函数返回一个整数。
-(pageA->val-pageB->val)
的结果将四舍五入

切换到

if (pageA->val == pageB->val)
    return 0;
else if(pageA->val > pageB->val)
    return 1;
else
    return -1;
我相信我的比较函数是正确的


普罗蒂普在这里。如果您只相信某个函数是正确的,那么请测试它以确保正确。您已通过打印结果验证排序不起作用。您还可以打印比较函数的输出。

这样我们就可以看到数组正在排序(那些ID已经移动了)。id和值仍然正确匹配,因此
qsort
正确地移动数据(我们没有
sizeof
错误)

所以我们的问题一定是我们传递的比较函数。我们来看看,

int cmpfunc(const void *a, const void *b) {
  const page *pageA = (page*)a;
  const page *pageB = (page*)b;
  return -(pageA->val - pageB->val);
}
返回一个int,我们正在比较double。
pageA->val-pageB->val
的结果是一个双精度,然后四舍五入为
int
。这意味着当它们不相等时,它有时会四舍五入到零(意思是相等)

因此,更好的做法是:

int cmpfunc(const void *a, const void *b) {
  const page *pageA = (page*)a;
  const page *pageB = (page*)b;
  if (pageA->val == pageB->val)
      return 0;
  else
      return (pageA->val > pageB->val ? 1 : -1);
}

我读过,当用qsort()比较两个值“a”和“b”时,如果“a”放在“b”之前,函数必须返回负值;如果“a”放在“b”之后,函数必须返回正值;如果“a”和“b”相等,函数必须返回零。如果'a'>'b',则比较函数将返回1,但如果'a'<'b',则比较函数将返回0。我对“a”<“b”的情况感到困惑,因为在这种情况下,“a”将放在“b”之前,但compare函数将返回0而不是-1。如果函数不返回-1,qsort()如何知道将“a”放在“b”之前?我已经解决了这个问题。注意:各种编译器在创建高效代码时都认识到的一个常见代码习惯用法是
return(A>b)-(A