Почему это объединение удаляет первые записи в массивах в коде c?

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Вот один из моих заголовочных файлов, который состоит из шаблона объединения с 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 или ancestorfemale).

Объект в памяти - это объединение.ОК.На самом деле, в моей программе будет множество союзов.Каждый элемент массива может использовать различную структуру в объединении.Здесь мы должны быть осторожны при назначении указателя, иначе мы можем потерять наши записи о пожилых людях во время выполнения.

Если возможно, пожалуйста, скажите мне, как получить подробную информацию о 1-м элементе ie. original[0] даже после принятия original[1].Здесь я просто получаю последний элемент массива, и все предыдущие записи исчезают во время выполнения.Я не использую никаких других структур данных или файлов.

Моя среда - Turbo C в Windows.

Это было полезно?

Решение

Вам нужно прочитать это вопрос о профсоюзах.Вы хотите чего-то большего, как:

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, чтобы определить, какого члена союза использовать.

Другие советы

Возможно, вы неправильно понимаете цель профсоюза.

Объединение обычно используется для хранения один элемент, который может быть в одной из нескольких форм.Например:

// 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 и a union это что, struct представляет собой совокупность многих фрагментов данных, но union является верхний слой:вы можете хранить только один из элементов, потому что все они совместно используют одну и ту же память.В приведенном выше примере каждый элемент в employees[] массив состоит из 10 байт, что является наименьшим объемом памяти, который может вместить либо 10 chars или 1 int.Если вы ссылаетесь на name элемент, вы можете хранить 10 chars.Если вы ссылаетесь на serialNum элемент, вы можете сохранить 1 int (скажем, 4 байта) и не может получить доступ к оставшимся 6 байтам.

Поэтому я думаю, что вы хотите использовать разные, отдельные структуры для представления членов семьи.То, что вы сделали, похоже на втискивание нескольких квадратных элементов в одно круглое домашнее задание.:-)

Примечание для продвинутых читателей:пожалуйста, не упоминайте о заполнении и выравнивании слов.Вероятно, они будут охвачены в следующем семестре.:-)

Вы знаете, что означает союз в C?В вашем профсоюзе нет 3 членов.В вашем профсоюзе 4 члена.В скольких из этих 4 участников вы хотите сохранить значения?

Почему ты не спросил своего ТА?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top