如何一起处理位域和qsorting?

时间:2016-09-25 16:42:52

标签: c bit-fields qsort

语言是C. 最近我在这里请求并获得帮助,使qsort函数适用于一组结构。

我现在正在研究位字段并试图制作一个程序,该程序使用一个结构,该结构使用另一个结构使用位域然后将其排序。但是当我编译它时,我在比较函数中得到错误“解除指向不完整类型的指针”并且我再次进行了许多试验但仍然无法使其工作。你能帮帮我吗?

以下是代码:

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

int compare(const void * a, const void * b)
{
    struct emp *orderA = (struct emp *)a;
    struct emp *orderB = (struct emp *)b;

    return (orderA->d.year - orderB->d.year);
}

int main()
{
    int i;
    struct date{
        unsigned day : 5;
        unsigned month : 4;
        unsigned year : 12;
    };

    struct emp {
        char name[10];
        struct date d;
    };

    struct emp e[5];
    for(i = 0; i < 5; i++)
    {
        scanf("%s %d %d %d", e[i].name, e[i].d.day, e[i].d.month, e[i].d.year);
    }
    qsort(e, 5, sizeof(struct emp), compare);

    for(i = 0; i < 5; i++)
    {
        printf("%s %d %d %d\n", e[i].name, e[i].d.day, e[i].d.month, e[i].d.year);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:4)

为什么这不起作用

由于您已在struct emp函数中定义了main,因此它仅存在于您的main函数中。

因此,当您尝试在struct emp*函数中转换为compare时,该类型不存在。

如果您希望此代码有效,则应移动

struct emp {
    char name[10];
    struct date d;
};

超出主要功能,位于比较功能之上。

理想情况下,您应该将其移动到自己的头文件中并包含它。

同样适用于您的struct date,因为它在struct emp中使用。所以移动

struct date{
    unsigned day : 5;
    unsigned month : 4;
    unsigned year : 12;
};

也来自main功能。

C中的范围

请记住,作为C中的一般规则,在范围内声明或定义的任何非静态标识符(意味着在一组{}之间)对于该范围是本地的,并且不能在该范围之外访问。