Подтвердить что ты не робот

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

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

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

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

Мне нужно знать, как это будет выглядеть в основной функции.

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

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

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

ошибки компилятора: C2037: слева от 'someitem' указывает undefined struct/union 'library' C2065: MOVIE: необъявленный идентификатор

Я все еще новичок на ANSI C, поэтому не стреляйте в меня нормально;)

4b9b3361

Ответ 1

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

т. 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;
}

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

Ответ 2

biglist.someitem.itemType = MOVIE; /* or = MUSIC */

Или, если someitem - указатель,

biglist.someitem->itemType = MOVIE; /* or = MUSIC */

Ответ 3

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

Ответ 4

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

проверить, помогает ли она любому хорошему,