Domanda

Ecco uno dei miei file di intestazione che consiste in un modello di unione con 4 diverse strutture.

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

Il mio obiettivo è quello di ottenere il nome e il genere di una persona e memorizzare i 3 antenati maschio / femmina della persona in base al genere e allo stato civile della persona come segue.

Voglio dire che MAX avrà 3 membri e ognuno avrà 3 antenati. Questi antenati saranno determinati dal genere del membro corrispondente come le seguenti condizioni:

  • se maschio utilizza quindi struct male
  • se una donna non sposata usa struct unmarry
  • se una donna sposata usa struct marry

nome struttura è per il nome del membro e il genere per i quali dobbiamo prendere gli antenati e puntare il * ptr_ancestor a quel corrispondente array di antenati (ancestormale o ancestorfemale).

L'oggetto in memoria è un'unione. Ok. Il mio programma avrà una serie di sindacati, in effetti. Ogni elemento dell'array può utilizzare una struttura diversa nell'unione. Qui dovremmo stare attenti nell'assegnare il puntatore, altrimenti potremmo perdere i nostri record di persone anziane in fase di esecuzione.

Se possibile, per favore, dimmi come ottenere i dettagli del primo elemento, ad es. original [0] anche dopo aver preso il original [1] . Qui sto solo ottenendo l'ultimo elemento dell'array e tutti i record precedenti sono andati in fase di esecuzione. Non sto usando altre strutture o file di dati.

Il mio ambiente è Turbo C su Windows.

È stato utile?

Soluzione

Devi leggere questa domanda sui sindacati . Vuoi qualcosa di più simile a:

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

quindi puoi provare family.names.gender e family.names.married per determinare quale membro del sindacato usare.

Altri suggerimenti

Potresti fraintendere lo scopo di un'unione.

Un'unione viene in genere utilizzata per memorizzare un oggetto che può essere in una delle varie forme. Ad esempio:

// 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 differenza critica tra un struct e un union è che un struct è un aggregato di molti pezzi di dati, ma un unione è un overlayment : puoi memorizzare solo uno degli elementi perché condividono tutti la stessa memoria. Nell'esempio sopra, ogni elemento nell'array employee [] è composto da 10 byte, che è la quantità minima di memoria che può contenere o 10 char s o 1 int . Se fai riferimento all'elemento name , puoi memorizzare 10 char . Se fai riferimento all'elemento serialNum , puoi memorizzare 1 int (diciamo 4 byte) e non puoi accedere ai restanti 6 byte.

Quindi penso che tu voglia usare strutture diverse e separate per rappresentare i membri della famiglia. Quello che hai fatto sembra stipare diversi pioli quadrati in un compito a compiti rotondi. : -)

Nota per lettori avanzati: non menzionare il riempimento e l'allineamento delle parole. Probabilmente saranno coperti il ??prossimo semestre. : -)

Sai cosa significa unione in C? La tua unione non ha 3 membri. La tua unione ha 4 membri. Tra questi 4 membri, in quanti desideri archiviare i valori?

Perché non l'hai chiesto al tuo TA?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top