Pourquoi cette union supprime-t-elle les premiers enregistrements des tableaux dans le code c?

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

  •  05-07-2019
  •  | 
  •  

Question

Voici l'un de mes fichiers d'en-tête qui consiste en un modèle d'union avec 4 structures différentes.

#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;

Mon objectif est d'obtenir le nom et le sexe d'une personne et de stocker ses 3 ancêtres (hommes / femmes) en fonction de son sexe et de son statut matrimonial, comme suit.

Je veux dire que MAX aura 3 membres et chacun aura 3 ancêtres. Ces ancêtres seront déterminés par le sexe du membre correspondant ainsi que des conditions suivantes:

  • si un homme utilise alors struct male
  • si la femme non mariée utilise struct unmarry
  • si une femme mariée utilise struct marry

nom de structure correspond au nom et au sexe du membre pour lequel nous devons prendre des ancêtres et pointer le * ptr_ancestor sur le tableau d'ancêtres correspondant (ancestormale ou ancestorfemale).

L'objet en mémoire est une union. D'accord. En fait, mon programme comportera un éventail de syndicats. Chaque élément du tableau peut utiliser une structure différente dans l'union. Ici, nous devons faire attention en assignant le pointeur, sinon nous risquons de perdre nos enregistrements de personnes plus âgées au moment de l'exécution.

Si possible, dites-moi comment obtenir les détails du 1er élément, par exemple. original [0] même après avoir pris le original [1] . Ici, je ne fais que récupérer le dernier élément du tableau et tous les enregistrements précédents ont disparu au moment de l'exécution. Je n'utilise aucune autre structure de données ou fichier.

Mon environnement est Turbo C sous Windows.

Était-ce utile?

La solution

Vous devez lire cette question sur les syndicats . Vous voulez quelque chose de plus semblable à:

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;
    };
}

Ensuite, vous pouvez tester family.names.gender et family.names.married pour déterminer le membre du syndicat à utiliser.

Autres conseils

Vous ne comprenez peut-être pas l'objectif d'un syndicat.

Une union est généralement utilisée pour stocker un élément pouvant figurer sous plusieurs formes. Par exemple:

// 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");

La différence critique entre une struct et une union est qu'une struct est un agrégat de nombreuses données, mais un union est une superposition : vous ne pouvez stocker que un des éléments car ils partagent tous la même mémoire. Dans l'exemple ci-dessus, chaque élément du tableau employés [] est constitué de 10 octets, ce qui représente la plus petite quantité de mémoire pouvant contenir soit 10 char s ou 1 int . Si vous faites référence à l'élément name , vous pouvez stocker 10 char s. Si vous faites référence à l'élément serialNum , vous pouvez stocker 1 int (disons 4 octets) et vous ne pouvez pas accéder aux 6 octets restants.

Je pense donc que vous souhaitez utiliser différentes structures distinctes pour représenter les membres de la famille. Ce que vous avez fait semble mettre plusieurs piquets carrés dans un même devoir. : -)

Note pour les lecteurs avancés: veuillez ne pas mentionner le remplissage et l'alignement des mots. Ils sont probablement couverts le prochain semestre. : -)

Savez-vous ce que l’union signifie en C? Votre syndicat n'a pas 3 membres. Votre syndicat compte 4 membres. Parmi ces 4 membres, combien souhaitez-vous stocker des valeurs?

Pourquoi n'avez-vous pas demandé à votre TA?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top