Почему этот союз удаляет первые записи в массивах в коде c? - PullRequest
1 голос
/ 31 октября 2008

Вот один из моих заголовочных файлов, который состоит из шаблона объединения с 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-го элемента, т.е. original[0] даже после приема original[1]. Здесь я только что получил последний элемент массива, и все предыдущие записи исчезли во время выполнения. Я не использую другие структуры данных или файлы.

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

Ответы [ 3 ]

2 голосов
/ 31 октября 2008

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

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

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

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

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

2 голосов
/ 31 октября 2008

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

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

0 голосов
/ 31 октября 2008

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

Почему вы не спросили свой TA?

...