Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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_Struct_Union_Qsort - Fatal编程技术网

C 为什么qsort不';在对一组结构进行排序时,不工作

C 为什么qsort不';在对一组结构进行排序时,不工作,c,struct,union,qsort,C,Struct,Union,Qsort,我有一个这样的结构数组 typedef union value_ { double d; int i; } value; typedef struct number_ { char type; value val; }number; 类型可以是'i'或'd',具体取决于union字段中存储的是整数值还是双数值。 该数组如下所示: Integer value: -3 Double value: 4.84 Integer value

我有一个这样的结构数组

typedef union value_
    {
        double d;
        int i;
    } value;

typedef struct number_
{
    char type;
    value val;
}number;
类型可以是
'i'
'd'
,具体取决于union字段中存储的是整数值还是双数值。 该数组如下所示:

Integer value: -3
Double value: 4.84
Integer value: -4
Double value: 1.65
Integer value: 1
Double value: 2.54
Integer value: 2
Double value: -0.09
Integer value: -1
Integer value: -5
Double value: 0.20
Integer value: 2
Double value: -0.04
Double value: -2.69
Integer value: 4
Integer value: 5
Double value: 2.04
Integer value: 3
最重要的是,整数和double是一个接一个的。我需要以下一种方式使用qsort对这个数组进行排序:整数应该从低到高排序,反之亦然。 我使用以下函数进行比较:

int compare(const void *A, const void *B){

    number *a = (number*)A;
    number *b = (number*)B;
    
    if (a->type == b->type) {
        if (a->type =='i') {
            return a->val.i - b->val.i;
        } else {
            if (a->val.d > b->val.d) return -1;
            if (a->val.d < b->val.d) return 1;
            else return 0;
        }
    } else {
        return 0;
    }
}

如果在这种情况下它应该返回0,为什么它会用整数来更改double?如果您需要保留原始列表的
int
double
类型的“联锁模式”,同时对每组
int
double
值进行排序,那么您就不能使用完整列表中的标准
qsort
功能

但是,您可以做的是将
int
double
条目分离到新列表中,分别对它们进行排序,然后将两个排序的列表合并回原始列表中,根据原始列表中条目的类型,从相关排序列表中提取
int
double
条目

下面是一个可能的实现(在代码中使用
compare
函数,但不作任何更改–如果您为分隔的列表使用两个特定于类型的比较函数,则对于大型列表,您会获得更好的性能):

void打印列表(编号*列表,大小)
{
对于(尺寸i=0;i
如果您需要保留原始列表的
int
double
类型的“联锁模式”,但对每组
int
double
值进行排序,那么您就不能使用完整列表中的标准
qsort
功能

但是,您可以做的是将
int
double
条目分离到新列表中,分别对它们进行排序,然后将两个排序的列表合并回原始列表中,根据原始列表中条目的类型,从相关排序列表中提取
int
double
条目

下面是一个可能的实现(在代码中使用
compare
函数,但不作任何更改–如果您为分隔的列表使用两个特定于类型的比较函数,则对于大型列表,您会获得更好的性能):

void打印列表(编号*列表,大小)
{
对于(尺寸i=0;i
由于您的
compare
函数返回两种不同类型的
equal
,因此最终结果将是不可预测的。您可以更改它,使所有整数都小于所有双精度值,反之亦然。谢谢,我怀疑,这样的比较是一个糟糕的想法。我不认为您可以使用标准的
qsort
函数来做您想做的事情。如果您的
compare
函数针对不同类型返回
0
,那么正如@500 InternalServerError指出的那样,您有不可预测/未定义的行为;然而,如果