1

これは、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 つの男性/女性の祖先を保存することです..

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

  • 男性なら使うstruct male
  • 女性未婚の場合struct unmarry
  • 女性既婚の場合struct marry

struct name*ptr_ancestorは、祖先を取得し、対応する祖先配列 (ancestomale か祖先女性)を指す必要があるメンバーの名前と性別用です。

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

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

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

4

3 に答える 3

2

ユニオンの目的を誤解している可能性があります。

通常、共用体は、いくつかの形式のいずれかである可能性がある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");

structaと aの重要な違いは、unionastructは多くのデータの集合体ですが、aunionオーバーレイであるということです。要素はすべて同じメモリを共有するため、要素の1 つだけを保存できます。上記の例では、配列の各要素は 10 バイトで構成されています。これは 10または1を保持できるメモリのemployees[]最小量です。要素を参照すると、10 s格納できます。要素を参照する場合、1 (たとえば 4 バイト) を格納でき、残りの 6 バイトにはアクセスできません。charintnamecharserialNumint

ですから、家族のメンバーを表すために、さまざまな別々の構造を使用したいと思います。あなたがやったことは、いくつかの四角いペグを 1 つの丸い宿題に詰め込んだようです。:-)

上級読者向けの注意: パディングと単語の配置については言及しないでください。彼らはおそらく次の学期で取り上げられます。:-)

于 2008-10-31T05:23:06.363 に答える
2

ユニオンに関するこの質問を読む必要があります。次のようなものが必要です。

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 をテストして、組合のどのメンバーを使用するかを決定できます。

于 2008-10-31T06:07:57.037 に答える
0

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

なんでTAに聞かなかったの?

于 2008-10-31T05:13:53.887 に答える