0

この組合とスタッキーを持つ:

tydef union{
  TYPE1 t1;
  TYPE2 t2;
  TYPE3 t3;
}myunion;

typedef struct{
   uint8 ID;
   uint8 value;
}TYPE1;

typedef struct{
   uint8 ID;
   uint8 flag;
   long value;
}TYPE2;

次のような関数を実行したいと思います。

CheckIfSet(&myunion.t1);

これは次のように機能します。

CheckIfSet(void *test){
  if (test.ID != NULL) then{
   return TRUE;
  }
  return FALSE;
}

このチェックを実行する前に、別の関数を実行しています。これにより、myunion.t1がセットアップされますが、それが行われたかどうかをチェックする必要があります。

4

3 に答える 3

4

いいえ。ユニオンのどのフィールドがアクティブであるかを追跡する必要があります。ユニオンのバッキングメモリはフィールド間で共有されるため、一方を設定すると、もう一方の値に影響を与える可能性があります。

また、ユニオンの非アクティブなフィールドにアクセスすると、未定義の動作が発生することを忘れないでください。

于 2012-11-28T12:48:40.733 に答える
2

いいえ、それはできません。C純粋な言葉で「設定」されるようなものはありません。変数を初期化していない場合でも、その変数タイプのすべての可能な値のセットに属するガベージ値が含まれています。これが有効な値なのかガベージな値なのかを区別する方法はありません。

初期化状態をチェックするために使用されるある種のフラグを導入する必要があります。たとえば、フラグはFALSE最初に初期化でき、ユニオンを設定すると、に変更されTRUEます。

于 2012-11-28T12:50:54.507 に答える
0

IDの値を使用しない値に初期化し、テストします。

于 2012-11-28T12:49:05.937 に答える