Почему это объединение удаляет первые записи в массивах в коде c?
Вопрос
Вот один из моих заголовочных файлов, который состоит из шаблона объединения с 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 char
s или 1 int
.Если вы ссылаетесь на name
элемент, вы можете хранить 10 char
s.Если вы ссылаетесь на serialNum
элемент, вы можете сохранить 1 int
(скажем, 4 байта) и не может получить доступ к оставшимся 6 байтам.
Поэтому я думаю, что вы хотите использовать разные, отдельные структуры для представления членов семьи.То, что вы сделали, похоже на втискивание нескольких квадратных элементов в одно круглое домашнее задание.:-)
Примечание для продвинутых читателей:пожалуйста, не упоминайте о заполнении и выравнивании слов.Вероятно, они будут охвачены в следующем семестре.:-)
Вы знаете, что означает союз в C?В вашем профсоюзе нет 3 членов.В вашем профсоюзе 4 члена.В скольких из этих 4 участников вы хотите сохранить значения?
Почему ты не спросил своего ТА?