Как мне обрабатывать битовые поля и qsorting вместе?
Я использую язык 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 ответ
Почему это не работает
Так как вы определили 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, что любой нестатический идентификатор, объявленный или определенный в области видимости (то есть между набором {}
) является локальным для этой области и недоступен за пределами этой области.