2010-07-27 14 views
16

Il seguente codice deve essere utilizzato nella funzione principale, ma non so come viene utilizzato.Come utilizzare enum all'interno di una struttura in ANSI C?

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

questa struct è utilizzato in una lista collegata dinamica con precedente/item/prossimo puntatore, ma non so come si può impostare l'enum. O come inizializzarlo.

Ho bisogno di sapere come sarebbe la funzione principale.

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

altro codice per capire cosa sto cercando di fare.

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

errori di compilazione: C2037: a sinistra del 'someitem' specifica indefinito struct/union 'biblioteca' C2065: FILM: identificatore non dichiarato

Im ancora un rookie in ANSI C, modo da non fa spararmi ok ;)

+0

C'è una ragione per cui non voglio usare 'typedef enum' al di fuori della dichiarazione della struct? – nmichaels

+3

Quindi su quale riga del codice il compilatore fallisce effettivamente ??? http://catb.org/esr/faqs/smart-questions.html – Dummy00001

+0

Per il primo errore, non stai mostrando la linea di cui il compilatore si lamenta. Per il secondo errore, la definizione di 'struct' non è visibile a quel punto, o stai cercando di creare il codice C con un compilatore C++. Pubblica più del tuo programma, per favore. È difficile fare il debug psichico. –

risposta

13

Si stanno utilizzando i puntatori ovunque, quindi è necessario utilizzare -> per fare riferimento agli articoli.

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

Il codice di seguito compila bene con 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; 
} 

(Anche se questo codice non verrà eseguito, naturalmente, come io non sono l'allocazione di memoria per qualsiasi biglist e someitem!)

+0

Grazie! entrambi! – TheDudeAbides

+0

È necessario assegnare un nome all'unione nella struttura per essere utile? Come la risposta di Siddique. – user982671

+0

@ user982671 Sì, buon punto, l'ho aggiornato.(Per riferimento, le unioni anonime sono permesse in gcc e anche in ANSI C a partire da C11.) – JosephH

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

Oppure, se someitem è un puntatore,

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

Grazie Tyler, ho provato a farlo, ma il programma non verrà compilato. Sento che devo fornire un codice aggiuntivo .. – TheDudeAbides

+0

Dovresti pubblicare il codice che stai utilizzando per tentare di impostare il valore (incluse le dichiarazioni per tutte le variabili coinvolte) e il messaggio di errore esatto prodotto dal compilatore. E modifica questa roba nella tua domanda; non rispondere come commento. –

+0

L'ho fatto proprio ora. – TheDudeAbides

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

È possibile inizializzare l'enumerazione in modo biglist-> someitem = MOVIE; ma il compilatore assegna valori interi a partire da 0. Quindi: biglist-> someitem = FILM restituisce 0 o biglist-> someitem = MUSIC ritorno 1

controllo se aiuta nulla di buono,