2017-08-24 5 views
3

だから、私はその後、私がコーディネート実行するために列挙型を使用することができるように列挙値として構造体を持つ列挙型?私はC(および一般的なプログラミング)にはかなり新しいです

typedef struct { 
    int x; 
    int y; 
} point; 

// here's what I'd like to do 
enum directions { 
    UP = point {0, 1}, 
    DOWN = point {0, -1}, 
    LEFT = point {-1, 0}, 
    RIGHT = point {1, 0} 
}; 

の値として構造体を使用したいです変換

私が達成しようとしていることを理解していれば、なぜこれがうまくいかないのか、それとも正しい方法があるのか​​説明できますか?

答えて

6

enumは、「マジックナンバー」をテキストと意味のあるものに変換するためにのみ使用されます。それらは整数にしか使用できません。

あなたの例は、それより複雑なものです。あなたが本当に探しているものは構造体で、異なる4つのpointメンバーが含まれているようです。おそらくconstの資格があります。例:

typedef struct { 
    int x; 
    int y; 
} point; 

typedef struct { 
    point UP; 
    point DOWN; 
    point LEFT; 
    point RIGHT; 
} directions; 

... 

{ 
    const directions dir = 
    { 
    .UP = (point) {0, 1}, 
    .DOWN = (point) {0, -1}, 
    .LEFT = (point) {-1, 0}, 
    .RIGHT = (point) {1, 0} 
    }; 
    ... 
} 
3

いいえ、列挙型は整数定数のコレクションのみです。あなたは(小数点型の定数式)欲しいものを近似する一つの方法は、プリプロセッサと化合物リテラルである:

#define UP (point){0, 1} 
#define DOWN (point){0, -1} 
#define LEFT (point){-1, 0} 
#define RIGHT (point){1, 0} 

これは、あなたは、いくつかの愚かな理由でCの時代遅れのバージョンにチェーンされていない場合にのみ動作します、 C99で複合リテラルが追加されたためです。

+0

注用語「ANSI Cは」長い時代遅れと、これらの日混乱の回であったこと。 –

+0

@ P.P。 - それは何らかの理由で現代のCを使うことができないと主張している人々のほとんどのジャブでした – StoryTeller

+1

理由は時々愚かではなく、変更は数百万に影響を及ぼすかもしれないのでコンパイラ/バージョンで固まっています_life_歓声;) – P0W

1

enum sは整数であり、何よりも何も少なく、defintionこともできます。あなたが望むかもしれないものを実装する

可能な方法は次のようになります。

enum directions { 
    DIR_INVALID = -1 
    DIR_UP, 
    DIR_DOWN, 
    DIR_LEFT, 
    DIR_RIGHT, 
    DIR_MAX 
}; 

typedef struct { 
    int x; 
    int y; 
} point; 

const point directions[DIR_MAX] = { 
    {0, 1}, 
    {0, -1}, 
    {-1, 0}, 
    {1, 0} 
}; 

#define UP directions[DIR_UP] 
#define DOWN directions[DIR_DOWN]  
#define LEFT directions[DIR_LEFT] 
#define RIGHT directions[DIR_RIGHT]