¿Por qué esta unión está eliminando los primeros registros en matrices en el código c?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Aquí está uno de mis archivos de encabezado que consta de una plantilla de unión con 4 estructuras diferentes.

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

Mi objetivo es obtener el nombre y el género de una persona y almacenar los 3 ancestros masculinos / femeninos de la persona de acuerdo con el género y el estado civil de la persona de la siguiente manera ...

Quiero decir que MAX tendrá 3 miembros y cada uno tendrá 3 ancestros. Estos ancestros serán determinados por el género, el miembro correspondiente, como las siguientes condiciones:

  • si es hombre, use struct male
  • si una mujer soltera usa struct unsmarry
  • si la mujer casada usa struct marry

struct name es para el nombre del miembro y el género para el que tenemos que tomar ancestros y apuntar * ptr_ancestor a la matriz de ancestros correspondiente (ancestormale o ancestorfemale).

El objeto en memoria es una unión. Okay. Mi programa tendrá una serie de sindicatos, de hecho. Cada elemento de la matriz puede estar utilizando una estructura diferente en la unión. Aquí debemos tener cuidado al asignar el puntero o, de lo contrario, podemos perder los registros de personas mayores en el tiempo de ejecución.

Si es posible, dígame cómo obtener los detalles del primer elemento, es decir. original [0] incluso después de tomar original [1] . Aquí estoy obteniendo el último elemento de la matriz, y todos los registros anteriores se han ido en el tiempo de ejecución. No estoy usando ninguna otra estructura de datos o archivos.

Mi entorno es Turbo C en Windows.

¿Fue útil?

Solución

Debe leer esta pregunta sobre sindicatos . Quieres algo más como:

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

luego puedes probar family.names.gender y family.names.married para determinar qué miembro de la unión usar.

Otros consejos

Puede estar malinterpretando el propósito de una unión.

Una unión normalmente se usa para almacenar un elemento que puede estar en una de varias formas. Por ejemplo:

// 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 diferencia crítica entre una struct y una union es que una struct es un agregado de muchos datos, pero un union es una superposición : puede almacenar solo uno de los elementos porque todos comparten la misma memoria. En el ejemplo anterior, cada elemento de la matriz employee [] consta de 10 bytes, que es la cantidad más pequeña de memoria que puede contener cualquiera de ellos 10 char s o 1 int . Si hace referencia al elemento name , puede almacenar 10 char s. Si hace referencia al elemento serialNum , puede almacenar 1 int (por ejemplo, 4 bytes) y no puede acceder a los 6 bytes restantes.

Entonces, creo que quieres usar estructuras diferentes y separadas para representar a los miembros de la familia. Lo que has hecho parece estar agrupando varios puntos cuadrados en una tarea de tarea redonda. :-)

Nota para lectores avanzados: no mencione el relleno y la alineación de palabras. Probablemente estén cubiertos el próximo semestre. :-)

¿Sabes lo que significa la unión en C? Tu sindicato no tiene 3 miembros. Su sindicato tiene 4 miembros. Entre esos 4 miembros, ¿en cuántos desea almacenar valores?

¿Por qué no le preguntaste a tu AT?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top