このユニオンがcコードの配列の最初のレコードを削除しているのはなぜですか?

StackOverflow https://stackoverflow.com/questions/252644

  •  05-07-2019
  •  | 
  •  

質問

4つの異なる構造を持つユニオンテンプレートで構成されるヘッダーファイルの1つです。

#define MAX 3


union family
{
  struct name      /*for taking the name and gender of original member*/
     {
      unsigned char *namess;
      unsigned int gender;
      union family *ptr_ancestor; /*this is a pointer to his ancestors details*/
     }names;

  struct male /*for taking the above person's 3 male ancestors details if he is male*/
     {
       unsigned char husb_names[3][20];
       unsigned char wife_names[3][20];
       unsigned int wife_status[3];
     }male_ancestor;

  struct unmarry /*for taking the above person's 3 female parental ancestors if she is female and unmarried*/
    {
      unsigned int mar;
      unsigned char parental_fem[3][20];
      unsigned int marit_status[3];
    }fem_un;

  struct marry /*for taking 3 parental-in-laws details if she is female and married*/
    {
      unsigned int mar;
      unsigned char in_law_fem[3][20];
      unsigned int in_marit_status[3];
    }fem_marr;

};
extern union family original[MAX]; /*for original person*/
extern union family ancestor_male[MAX]; /*used if he is male for storing his male ancestor details*/
extern union family ancestor_female[MAX]; /*used if she is female*/



extern int x;

私の目的は、次のように、人の名前と性別を取得し、その人の性別と配偶者の状態に応じて、その人の任意の3人の男性/女性の祖先を保存することです。

MAX には3つのメンバーがあり、それぞれに3つの祖先があることを意味します。これらの祖先は、次の条件のように、対応するメンバーの性別によって決定されます。

  • 男性の場合は、 struct male
  • を使用します
  • 女性の未婚者が struct unmarry
  • を使用する場合
  • 女性の結婚が struct marry
  • を使用する場合

struct name は、先祖を取得し、 * ptr_ancestor をその対応する先祖配列(ancestormaleまたはancestorfemale)にポイントする必要があるメンバー名と性別のためのものです。

メモリ内のオブジェクトは結合です。 OK。実際、私のプログラムには多数の組合があります。配列の各要素は、ユニオンで異なる構造を使用している場合があります。 ここでは、ポインターの割り当てに注意する必要があります。そうしないと、実行時に高齢者のレコードが失われる可能性があります。

可能であれば、最初の要素の詳細を取得する方法を教えてください。 original [0] は、 original [1] を取得した後でも使用できます。ここでは、配列の最後の要素を取得しているだけで、以前のレコードはすべて実行時に消えます。他のデータ構造やファイルを使用していません。

私の環境はWindowsのTurbo Cです。

役に立ちましたか?

解決

組合に関する質問を読む必要があります。次のようなものが必要です:

struct family {
    struct name { 
        int gender;
        int married;
        blah
    } names;
    union {
        struct male { blah } male_ancestor;
        struct female_unmarried { blah } female_unmarried_ancestor;
        struct female_married { blah } female_married_ancestor;
    };
}

それからfamily.names.genderとfamily.names.marriedをテストして、使用する組合員を決定できます。

他のヒント

組合の目的を誤解している可能性があります。

通常、ユニオンは、いくつかの形式のいずれかにある可能性のある 1つのアイテムを格納するために使用されます。例:

// Define an array of 20 employees, each identified either by name or ID.
union ID {
    char name[10];   // ID may be a name up to 10 chars...
    int  serialNum;  // ... or it may be a serial number.
} employees[20];

// Store some data.
employees[0].serialNum = 123;
strcpy(employees[1].name, "Manoj");

struct union の重要な違いは、 struct は多くのデータの集合体ですが、 union オーバーレイです。要素はすべて同じメモリを共有するため、 1つの要素のみを保存できます。上記の例では、 employees [] 配列の各要素は10バイトで構成され、これは either 10 char s または 1 int name 要素を参照する場合、10個の char を保存できます。 serialNum 要素を参照する場合、1つの int (4バイトなど)を保存でき、残りの6バイトにはアクセスできません。

だから、あなたは家族のメンバーを表すために、異なる別個の構造を使用したいと思うと思います。あなたがしたことは、いくつかの四角い杭を1つのラウンドの宿題に詰め込んでいるように見えます。 :-)

上級読者向けの注意:パディングとワードアラインメントについては言及しないでください。彼らはおそらく次の学期をカバーしています。 :-)

Cでのユニオンの意味を知っていますか?組合には3人のメンバーがいません。組合には4人のメンバーがいます。これら4人のメンバーのうち、いくつの値を保存しますか?

TAに尋ねなかったのはなぜですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top