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

Другие вопросы по тегам