web-dev-qa-db-ja.com

ANSI Cの構造体内で列挙型を使用するにはどうすればよいですか?

Main関数では次のコードを使用する必要がありますが、どのように使用するのかわかりません。

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

この構造体は、previous/item/nextポインターを持つ動的リンクリストで使用されますが、列挙型を設定する方法がわかりません。またはそれを初期化する方法。

Main-functionでどのように表示されるかを知る必要があります。

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

imがやろうとしていることを理解するためのより多くのコード。

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

コンパイラエラー:C2037:「someitem」の左側に未定義の構造体/ユニオン「ライブラリ」が指定されていますC2065:MOVIE:宣言されていない識別子

私はまだANSICの新人なので、私を撃ってはいけません;)

16
TheDudeAbides

どこでもポインタを使用しているので、アイテムを参照するには->を使用する必要があります。

すなわち。 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にメモリを割り当てていないためです!)

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

または、someitemがポインタの場合、

biglist.someitem->itemType = MOVIE; /* or = MUSIC */
4
Tyler McHenry
struct SomeItem 
{ 
    enum {MOVIE, MUSIC} itemType; 
    union { 
        struct Movie* movie; 
        struct Music* music; 
    } item;
    struct SomeItem *next;
}; 
0
Siddique

このように列挙型を初期化できますbiglist-> someitem = MOVIE;ただし、コンパイラは0から始まる整数値を割り当てます。したがって、biglist-> someitem = MOVIEは0を返すか、biglist-> someitem = MUSICは1を返します。

それが何か良いことをするかどうかチェックしてください、

0
deepseefan