Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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函数中的比较函数_C_Sorting_Qsort - Fatal编程技术网

C 内置qsort函数中的比较函数

C 内置qsort函数中的比较函数,c,sorting,qsort,C,Sorting,Qsort,我试图使用C中内置的qsort函数对结构进行排序 typedef struct abc{ long long int fir; long long int sec; }abc; 在比较函数中,我使用了下面的代码,因此如果结构abc数组中任意两个元素之间的变量“fir”相同,则排序条件将取决于变量“sec” 代码似乎工作不正常。 正确的方法是什么?您正在使用的内置qsort可能需要一个“低于”(lower-by)运算符 没有qsort比较函数的正确签名,因此您的程序具有未定义的行为。您应

我试图使用C中内置的qsort函数对结构进行排序

typedef struct abc{
  long long int fir;
  long long int sec;
}abc;
在比较函数中,我使用了下面的代码,因此如果结构abc数组中任意两个元素之间的变量“fir”相同,则排序条件将取决于变量“sec”

代码似乎工作不正常。
正确的方法是什么?

您正在使用的内置qsort可能需要一个“低于”(lower-by)运算符 没有qsort比较函数的正确签名,因此您的程序具有未定义的行为。您应该将编译器警告标志设置为高,它将警告您此类情况

只要减法不能溢出,您的实际测试就可以了,这在很长时间内可能不是问题。Edit这里的减法不好,正是因为
cmp
的返回值必须是
int
。减法的结果
long
,因此,如果您有大的值,则返回结果t太大,无法放入
int
中,
qsort
肯定会产生错误的顺序

但更一般地说,这更准确:

int cmp(const void* v1, const void* v2)
{
    const struct abc* p1 = v1;
    const struct abc* p2 = v2;

    if (p1->fir < p2->fir)
        return -1;
    else if (p1->fir > p2->fir)
        return 1;
    else
        return p1->sec < p2->sec? -1 : p1->sec > p2->sec? 1 : 0;       
}
int-cmp(常数无效*v1,常数无效*v2)
{
常量结构abc*p1=v1;
常量结构abc*p2=v2;
如果(p1->firfir)
返回-1;
否则如果(p1->fir>p2->fir)
返回1;
其他的
返回p1->secsec-1:p1->sec>p2->sec-1:0;
}

好的。这里的问题是什么?它怎么不起作用?你能发布调用代码,还是一个完整的小程序?让你的比较函数匹配qsort指定的签名将是一个好的开始。它应该是int(*compar)(const void*,const void*)。取决于您的平台以及它处理参数和返回值的方式,这可能无关紧要,但也可能无关紧要。从发布的代码中可以看出,这里的问题很明显……请参阅我的答案。“您使用的内置qsort可能要求“低于”(operator@JimBalter你说得对,我没有注意到C -我的道歉。我已经投票赞成你的回复,所以首先,我会让我留下来…也许他会升级到C++的某个时候:的确。我写C已经35年了,并且是C语言标准委员会的成员……今天用它来写是一个严重的错误,除非它的遗留代码。人们教初学者这些东西是可恶的,特别是当有类似的东西可用的时候。我快速编写了一个代码来测试它,但它似乎不起作用-:@learner主要问题您正在排序的数组是一个由
abc*
组成的数组,但您的cmp例程需要
abc
s…cmp的参数指向数组的元素,它们本身不是元素。请使用数组
abc
或在cmp例程中执行另一个解引用,例如
abc*e1=*(abc**)v1
等等。除此之外,你还得靠自己……在这些评论中,我做不到更多
long long int cmp(const abc*  e1, const abc* e2)
int cmp(const void* v1, const void* v2)
{
    const struct abc* p1 = v1;
    const struct abc* p2 = v2;

    if (p1->fir < p2->fir)
        return -1;
    else if (p1->fir > p2->fir)
        return 1;
    else
        return p1->sec < p2->sec? -1 : p1->sec > p2->sec? 1 : 0;       
}