このユニオンがcコードの配列の最初のレコードを削除しているのはなぜですか?
質問
4つの異なる構造を持つユニオンテンプレートで構成されるヘッダーファイルの1つです。
#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)にポイントする必要があるメンバー名と性別のためのものです。
メモリ内のオブジェクトは結合です。 OK。実際、私のプログラムには多数の組合があります。配列の各要素は、ユニオンで異なる構造を使用している場合があります。 ここでは、ポインターの割り当てに注意する必要があります。そうしないと、実行時に高齢者のレコードが失われる可能性があります。
可能であれば、最初の要素の詳細を取得する方法を教えてください。 original [0]
は、 original [1]
を取得した後でも使用できます。ここでは、配列の最後の要素を取得しているだけで、以前のレコードはすべて実行時に消えます。他のデータ構造やファイルを使用していません。
私の環境はWindowsのTurbo Cです。
解決
組合に関する質問を読む必要があります。次のようなものが必要です:
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をテストして、使用する組合員を決定できます。
他のヒント
組合の目的を誤解している可能性があります。
通常、ユニオンは、いくつかの形式のいずれかにある可能性のある 1つのアイテムを格納するために使用されます。例:
// 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
はオーバーレイです。要素はすべて同じメモリを共有するため、 1つの要素のみを保存できます。上記の例では、 employees []
配列の各要素は10バイトで構成され、これは either 10 char を保持できる最小メモリ量です。 code> s または 1
int
。 name
要素を参照する場合、10個の char
を保存できます。 serialNum
要素を参照する場合、1つの int
(4バイトなど)を保存でき、残りの6バイトにはアクセスできません。
だから、あなたは家族のメンバーを表すために、異なる別個の構造を使用したいと思うと思います。あなたがしたことは、いくつかの四角い杭を1つのラウンドの宿題に詰め込んでいるように見えます。 :-)
上級読者向けの注意:パディングとワードアラインメントについては言及しないでください。彼らはおそらく次の学期をカバーしています。 :-)
Cでのユニオンの意味を知っていますか?組合には3人のメンバーがいません。組合には4人のメンバーがいます。これら4人のメンバーのうち、いくつの値を保存しますか?
TAに尋ねなかったのはなぜですか?