2012-02-28 2 views
4

いくつかの選択肢がある場合、どのようなタイプの組み合わせが含まれているのか判断できますか?ユニオンでどのようなタイプが使用されているかを調べる方法は?

typedef union 
{ 
    char  charArr[SIZE]; 
    int  intVal; 
    float floatVal; 
} VALUE_TYPE; 

VALUE_TYPE number; 
number.intVal = 8; 

値が別の場所から設定されていた場合、ここに組合が含まれていることを知る方法を教えてください。

答えて

5

あなたはこの種のことを箱から出すことはできません。

これを回避する一般的な方法は、ユニオンとともにタイプを追加できるということです。たとえば、それができる:

my_value number; 
number.val.intVal = 8; 
number.val.val_type = is_int 

あなたは一般的なタイプを持っている必要がある場合には、一般的な近代的なパターンです:

enum { charArr_type, float_type, int_type } VALUE_TYPE; 
typedef union 
{ 
    char  charArr[SIZE]; 
    int  intVal; 
    float floatVal; 
} VALUE; 
struct my_value { 
    VALUE val, 
    VALUE_TYPE val_type 
} 

をした後、あなたはちょうどあなたがあなたの構造体を割り当てるときのタイプを更新する必要がありますほぼ何でも保管することができます。

例えば、PHPソースコードのどこにでも見つけることができます。これは、同じオブジェクトに異なる値の型を格納する方法です。詳細については、this pageを参照してください。

+0

はい、彼がメモリを節約しようとするならば、これはそれぞれの 'VALUE'に対して追加の' enum'(整数?)を格納する必要があります。また、一貫性のある値を格納するようにユーザーを強制することはできません。つまり、 'my_value.val = 10; my_value.val_type = is_charArr; '! – vulkanino

+0

@vulkaninoこの構造体を適切に設定して取得するためのラッパーを作成できます。 PHPでは、store-everything構造体を保護するためにたくさんのマクロを使用し、型をucharに格納します。 – Coren

1

いいえ、あなたには言えませんが、その言語にはそのための機能はありません。

この情報が必要な場合は、自分で追跡する必要があります。

0

ユニオンを使用すると、タイプを入れておくことができます。適切なタイプを適切なタイミングで取得することができます。

ユニオンは使用しないでください。スペースを節約するために必要なメモリの問題は本当にありますか?

関連する問題