/* kyr6-05.c: estructura de uni¢n */
#include <stdio.h>
#define INT 1
#define FLOAT 2
#define STRING 3

union u_tag {			/* estructura de uni¢n */
  int ival;
  float fval;
  char *sval;
};

void impru(union u_tag, int);

void main()
{

  union u_tag udato;	/* udato es variable de tipo u_tag */
  int utipo;		/* para indicar el tipo de miembro */

  printf("\n\nTipo union. Impresi¢n de distintos tipos de datos.\n");

  utipo = INT;
  udato.ival = 35;
  impru(udato, utipo);

  utipo = FLOAT;
  udato.fval = 5.123;
  impru(udato, utipo);

  utipo = STRING;
  strcpy (udato.sval, "Esto es una cadena");
  impru(udato, utipo);

}

/* imprime seg£n el tipo de par metro */
void impru(union u_tag udato, int utipo)
{
  if (utipo == INT)
    printf("        Valor entero:   %d\n", udato.ival);
  else if (utipo == FLOAT)
    printf("Valor punto flotante:   %f\n", udato.fval);
  else if (utipo == STRING)
    printf("        Valor cadena:   %s\n", udato.sval);
  else
    printf("ERROR: tipo no asignado\n");

  return;
}
