语言是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;
}
答案 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中的一般规则,在范围内声明或定义的任何非静态标识符(意味着在一组{}
之间)对于该范围是本地的,并且不能在该范围之外访问。