2010-07-27 9 views
16

Poniższy kod musi być użyty w funkcji głównej, ale nie wiem, w jaki sposób jest używany.Jak używać wyliczenia wewnątrz struktury w ANSI C?

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

tej struktury jest używany w dynamicznej listy połączonej z poprzedniej/następnej pozycji/wskaźnik, ale nie wiem, jak można ustawić enum. Lub jak go zainicjować.

Muszę wiedzieć, jak to będzie wyglądać w funkcji głównej.

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

więcej kodu, aby zrozumieć, co próbuję zrobić.

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

błędy kompilatora: C2037: left of 'someitem' określa niezdefiniowany struct/Unii 'bibliotekę' C2065: Film: identyfikator nielegalna

Im jeszcze żółtodziobem na ANSI C, więc nie zastrzel mnie ok ;)

+0

Czy istnieje powód, dla którego nie chcesz używać "typedef enum" poza deklaracją struct? – nmichaels

+3

Więc na jakiej linii kodu kompilator faktycznie zawiedzie ??? http://catb.org/esr/faqs/smart-questions.html – Dummy00001

+0

W przypadku pierwszego błędu nie pokazano linii, na którą kompiluje się skarga. W przypadku drugiego błędu albo definicja 'struct' nie jest widoczna w tym momencie, albo próbujesz zbudować kod C z kompilatorem C++. Opublikuj więcej swojego programu, proszę. Ciężko jest przeprowadzić debugowanie psychiczne. –

Odpowiedz

13

Używasz wskaźników wszędzie, więc musisz użyć -> do odniesienia się do przedmiotów.

tj. biglist->someitem->itemType = MOVIE;

Poniższy kod kompiluje grzywny z 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; 
} 

(Choć ten kod nie będzie działał oczywiście, jak nie mam żadnej alokacji pamięci dla biglist i someitem!)

+0

Dzięki! obydwoje z was! – TheDudeAbides

+0

Musisz nazwać związek w strukturze, aby był przydatny? Jak odpowiedź Siddique. – user982671

+0

@ user982671 Tak, dobra uwaga, zaktualizowałem to.(Dla odniesienia, anonimowe związki są dozwolone w gcc, a także w ANSI C od C11.) – JosephH

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

Lub, jeśli someitem jest wskaźnikiem,

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

Dzięki Tyler, próbowałem to zrobić, ale program nadal się nie skompiluje. Czuję, że muszę podać dodatkowy kod. – TheDudeAbides

+0

Powinieneś opublikować kod, którego używasz, aby spróbować ustawić wartość (w tym deklaracje dla wszystkich zmiennych, których dotyczy) i dokładny komunikat o błędzie wygenerowany przez kompilator. I edytuj te rzeczy na swoje pytanie; nie odpowiadaj jako komentarz. –

+0

Zrobiłem to właśnie teraz. – TheDudeAbides

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

Możesz zainicjować wyliczenie w taki sposób biglist-> someitem = MOVIE; ale kompilator przydziela wartości całkowitych począwszy od 0. Tak więc: biglist-> someitem = FILM zwraca 0 lub biglist-> someitem = MUSIC powrót 1

sprawdzić, czy to pomaga jakieś dobre,