Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use enum within a struct in ANSI C?

Following code has to be used in the main-function, but I don't know how it is used.

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

this struct is used in a dynamic linked list with previous/item/next pointer, but I don't know how you can set the enum. Or how to initialize it.

I need to know how it would look like in the main-function.

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

more code to understand what Im trying to do.

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

compiler errors: C2037: left of 'someitem' specifies undefined struct/union 'library' C2065: MOVIE: undeclared identifier

Im still a rookie on ANSI C, so dont shoot me ok ;)

like image 632
TheDudeAbides Avatar asked Jul 27 '10 14:07

TheDudeAbides


2 Answers

You're using pointers everywhere, so you need to use -> to reference the items.

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

The below code compiles fine with 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;
}

(Though this code won't run of course, as I'm not allocating any memory for biglist and someitem!)

like image 87
JosephH Avatar answered Oct 07 '22 01:10

JosephH


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

Or, if someitem is a pointer,

biglist.someitem->itemType = MOVIE; /* or = MUSIC */
like image 25
Tyler McHenry Avatar answered Oct 07 '22 00:10

Tyler McHenry