【问题标题】:Why this union is deleting the 1st records in arrays in the c code?为什么这个联合会删除 c 代码中数组中的第一条记录?
【发布时间】:2010-09-20 03:21:32
【问题描述】:

这是我的头文件之一,它由具有 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。

【问题讨论】:

    标签: c arrays structure unions


    【解决方案1】:

    您需要阅读此question about 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 以确定使用哪个工会成员。

    【讨论】:

    • yeap.thank u mann.this 是我一直在寻找的答案。你有理解能力吗?绝对地。你是个天才。在理解问题后,以上所有答案都没有给出。再次非常感谢你。
    • 好的,从现在开始我会尊敬你为我的老师。但是先生,我的导师告诉我尝试使用相同的旧联合并尝试使用不同的变量和数组访问它们并尝试获取旧记录。她告诉我检查是否有任何其他方式使用相同的旧联合。如何去做。 .?
    【解决方案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");
    

    structunion 之间的关键区别在于 struct 是许多数据的聚合,但 union 是一个叠加层:您可以存储只有一个元素,因为它们都共享相同的内存。在上面的示例中,employees[] 数组中的每个元素由 10 个字节组成,这是可以容纳 either 10 chars 1 的最小内存量int。如果引用name 元素,则可以存储10 个chars。如果引用 serialNum 元素,则可以存储 1 个 int(比如 4 个字节)而无法访问剩余的 6 个字节。

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

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

    【讨论】:

    • 我的意思是 MAX 将有 3 个成员。每个成员将有 3 个祖先。这些祖先将由相应成员的性别决定,如下所示。如果是男性,则使用 struct male.if未婚女性使用 struct unmarry.if 女性已婚使用 struct infant.name 为 4 成员
    【解决方案3】:

    你知道联合在 C 中是什么意思吗?您的工会没有 3 个成员。您的工会有 4 名成员。在这 4 个成员中,您要存储多少个值?

    你为什么不问你的助教?

    【讨论】:

    • 我的意思是 MAX 将有 3 个成员。每个成员将有 3 个祖先。这些祖先将由相应成员的性别决定,如下所示。如果是男性,则使用 struct male.if未婚女性使用 struct unmarry.if 女性已婚使用 struct infant.name 为 4 成员
    • 既然您已经更改了代码,那么声明这些联合的方式根本没有任何好处。另一方面,所有六个结构都存在:original[0]、original[1]、ancest_male[0] 等。没有 original[2]。向你的助教询问数组和联合。
    • ok 让我们把 MAX 作为一些 3 那么它不会显示 original[0..1] 如果在上述情况下我也无法打印第一个我的意思是 original[0] 祖先.如果你有兴趣,我可以在这里发送或复制代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多