Как использовать перечисление в структуре в ANSI C?

Следующий код должен использоваться в основной функции, но я не знаю, как это используется.

struct SomeItem
{
    enum {MOVIE, MUSIC} itemType;
    union {
        struct Movie* movie;
        struct Music* music;
    };
};

эта структура используется в динамическом связанном списке с предыдущим/объектом/прямым указателем, но я не знаю, как можно установить перечисление. Или как инициализировать его.

Я должен знать, как это было бы похоже в основной функции.

biglist.someitem = ???;
/* declaration I use */
struct Library* biglist;

больше кода для понимания то, что я пытаюсь сделать.

struct Library{
struct SomeItem* someitem;
struct SomeItem* previousItem;
struct SomeItem* nextItem;
};

ошибки компилятора: C2037: оставленный 'someitem' указывает неопределенную структуру/объединение 'библиотека' C2065: ФИЛЬМ: необъявленный идентификатор

Я - все еще новобранец на ANSI C, не стреляйте в меня хорошо ;)

16
задан james.garriss 14 January 2015 в 15:36
поделиться

4 ответа

Вы используете указатели везде, поэтому вам нужно использовать -> для ссылки на элементы.

т.е. biglist-> someitem-> itemType = MOVIE;

Приведенный ниже код отлично компилируется с gcc -Wall -strict:

struct SomeItem
{
    enum {MOVIE, MUSIC} itemType;
    union {
        struct Movie* movie;
        struct Music* music;
    } item;
};

struct Library{
   struct SomeItem* someitem;
   struct SomeItem* previousItem;
   struct SomeItem* nextItem;
};

int main(void)
{
   struct Library* biglist;

   biglist->someitem->itemType = MOVIE;

   return 0;
}

(Хотя этот код, конечно, не будет работать, так как я не выделяю память для большого списка и чего-то!)

13
ответ дан 30 November 2019 в 22:37
поделиться
biglist.someitem.itemType = MOVIE; /* or = MUSIC */

Или, если someitem является указателем,

biglist.someitem->itemType = MOVIE; /* or = MUSIC */
4
ответ дан 30 November 2019 в 22:37
поделиться

Вы можете инициализировать перечисление таким образом: biglist-> someitem = MOVIE; но компилятор присваивает целочисленные значения, начиная с 0. Итак: biglist-> someitem = MOVIE возвращает 0 или biglist-> someitem = MUSIC return 1

проверьте, помогает ли это,

0
ответ дан 30 November 2019 в 22:37
поделиться
struct SomeItem 
{ 
    enum {MOVIE, MUSIC} itemType; 
    union { 
        struct Movie* movie; 
        struct Music* music; 
    } item;
    struct SomeItem *next;
}; 
0
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: