لماذا يقوم هذا الاتحاد بحذف السجلات الأولى في المصفوفات في كود 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;

هدفي هو الحصول على اسم الشخص وجنسه وتخزين أسلافه الثلاثة من الذكور/الإناث وفقًا لجنس الشخص وحالته الاجتماعية على النحو التالي.

انا اعني هذا MAX سيكون لديهم 3 أعضاء وسيكون لكل منهم 3 أسلاف.وسيتم تحديد هؤلاء الأسلاف حسب جنس العضو المقابل حسب الشروط التالية:

  • إذا ذكر فاستخدمه struct male
  • إذا كانت الأنثى استخدام غير متزوجة struct unmarry
  • إذا استخدمت أنثى متزوجة struct marry

struct name هو لاسم العضو والجنس الذي يتعين علينا أن نأخذ أسلافه ونشير إليه *ptr_ancestor إلى مجموعة السلف المقابلة (الجد أو الجد الأنثى).

الكائن في الذاكرة هو الاتحاد.نعم.في الواقع، سيكون لبرنامجي مجموعة واسعة من النقابات.قد يستخدم كل عنصر في المصفوفة بنية مختلفة في الاتحاد.هنا يجب أن نكون حذرين في تعيين المؤشر وإلا فقد نفقد سجلات كبار السن لدينا في وقت التشغيل.

إذا كان ذلك ممكنا من فضلك قل لي كيفية الحصول على تفاصيل العنصر الأول، أي. 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 و أ union غير أن struct عبارة عن تجميع للعديد من أجزاء البيانات، ولكن أ union هو تراكب:يمكنك تخزين فقط واحد العناصر لأنها جميعا تشترك في نفس الذاكرة.في المثال أعلاه، كل عنصر في employees[] تتكون المصفوفة من 10 بايت، وهي أصغر كمية من الذاكرة يمكن استيعابها أيضاً 10 charس أو 1 int.إذا قمت بالإشارة إلى name عنصر، يمكنك تخزين 10 charس.إذا قمت بالإشارة إلى serialNum العنصر، يمكنك تخزين 1 int (على سبيل المثال 4 بايت) ولا يمكن الوصول إلى البايتات الستة المتبقية.

لذلك أعتقد أنك تريد استخدام هياكل مختلفة ومنفصلة لتمثيل أفراد الأسرة.يبدو أن ما قمت به هو حشر عدة أوتاد مربعة في واجب منزلي واحد.:-)

ملاحظة للقراء المتقدمين:من فضلك لا تذكر الحشو ومحاذاة الكلمات.من المحتمل أن يتم تغطيتهم في الفصل الدراسي القادم.:-)

هل تعرف ماذا يعني الاتحاد في لغة C؟نقابتك لا تحتوي على 3 أعضاء.اتحادك لديه 4 أعضاء.من بين هؤلاء الأعضاء الأربعة، كم عدد الأشخاص الذين تريد تخزين القيم لديهم؟

لماذا لم تسأل TA الخاص بك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top