2010-07-27 12 views
16

El siguiente código tiene que ser utilizado en la función principal, pero no sé cómo se usa.¿Cómo usar enum dentro de una estructura en ANSI C?

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

esta estructura se utiliza en una lista enlazada dinámica con elemento/puntero siguiente/anterior, pero no sé cómo se puede establecer la enumeración. O cómo inicializarlo.

Necesito saber cómo se vería en la función principal.

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

más código para entender lo que estoy tratando de hacer.

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

errores de compilación: C2037: a la izquierda de 'someitem' especifica indefinido struct/union 'biblioteca' C2065: PELÍCULA: identificador no declarado

Im sigue siendo un novato en ANSI C, por lo que no disparar mí ok ;)

+0

¿Existe una razón por la que No quiero usar 'typedef enum' fuera de la declaración struct? – nmichaels

+3

Entonces, ¿en qué línea de código falla realmente el compilador? http://catb.org/esr/faqs/smart-questions.html – Dummy00001

+0

Para el primer error, no muestra la línea de la que el compilador se queja. Para el segundo error, o la definición de 'struct' no está visible en ese punto, o está tratando de compilar el código C con un compilador de C++. Publique más de su programa, por favor. Es difícil hacer una depuración psíquica. –

Respuesta

13

Está utilizando punteros en todas partes, por lo que debe usar -> para hacer referencia a los elementos.

es decir. biglist->someitem->itemType = MOVIE;

El siguiente código compila bien 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; 
} 

(Aunque este código no se ejecutará por supuesto, ya que no soy cualquier reserva de memoria para biglist y someitem!)

+0

Gracias! ¡Vosotros dos! – TheDudeAbides

+0

¿Debe nombrar la unión en la estructura para ser útil? Como la respuesta de Siddique. – user982671

+0

@ user982671 Sí, buen punto, lo he actualizado.(Como referencia, las uniones anónimas están permitidas en gcc y también en ANSI C a partir de C11). – JosephH

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

O, si someitem es un puntero,

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

Gracias Tyler, he intentado hacer eso, pero el programa aún no se compilará. Siento que tengo que dar código adicional. – TheDudeAbides

+0

Debe publicar el código que está utilizando para intentar establecer el valor (incluidas las declaraciones de todas las variables involucradas) y el mensaje de error exacto producido por el compilador. Y edita esto en tu pregunta; no respondas con eso como un comentario. –

+0

Eso acabo de hacer. – TheDudeAbides

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

Puede inicializar la enumeración de tal manera biglist-> someitem = MOVIE; pero el compilador asigna valores enteros a partir de 0. Por lo tanto: biglist-> someitem = PELÍCULA devuelve 0 o biglist-> = someitem de música volverán 1

cheque si ayuda a ningún bien,

Cuestiones relacionadas