1

这是我的头文件之一,它由一个具有 4 种不同结构的联合模板组成。

#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 或ancestratefemale)。

内存中的对象是一个联合。行。事实上,我的程序将有一系列联合。数组的每个元素可能在联合中使用不同的结构。在这里我们应该小心分配指针,否则我们可能会在运行时丢失我们的老年人记录。

如果可能,请告诉我如何获取第一个元素的详细信息,即。original[0]即使在服用original[1]. 在这里,我只是获取数组的最后一个元素,并且所有以前的记录在运行时都消失了。我没有使用任何其他数据结构或文件。

我的环境是 Windows 上的 Turbo C。

4

3 回答 3

2

您可能误解了工会的目的。

联合通常用于存储可能采用多种形式之一的一项例如:

// 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之间的关键区别在于 aunionstruct多条数据的聚合,但 aunion叠加层:您可以只存储其中一个元素,因为它们都共享相同的内存。在上面的示例中,employees[]数组中的每个元素由 10 个字节组成,这是可以容纳10 schar1的最小内存量int。如果引用该name元素,则可以存储 10 chars。如果引用该serialNum元素,则可以存储 1 int(例如 4 个字节)并且无法访问剩余的 6 个字节。

所以我认为你想使用不同的、独立的结构来代表家庭成员。你所做的似乎是将几个方形钉塞进一个圆形的家庭作业中。:-)

高级读者注意:请不要提及填充和单词对齐。他们可能会在下学期被覆盖。:-)

于 2008-10-31T05:23:06.363 回答
2

你需要阅读这个关于 unions的问题。你想要更多类似的东西:

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 回答