miércoles, 20 de enero de 2010

Uniones

Una uniòn consiste eb una variable que puede contener valores "normales". Las uniones son una de las alternativas para solventar la falta de comprobaciones de tipo del lenguaje C en tiempo de ejecución.

La sintaxis de la declaraciòn de una unión es semejante a la declaración de una estructura sin más que cambiar la palabra estructura por unión.

struct { /* entrada en la tabla de símbolos */

char *name;
int type;
union {
int u_ival;
float u_fval;
char *_sval;
} uval;
}symtab [NSYMJ;

Las variables symtab[i].uval tienen capacidad suficiente para contener variables de cualquiera de los tipos int, float o char, siendo responsabilidad del programador tener el cuidado necesario para controlar los tipos adecuados de las variables contenidas en una unión.

La unión definida anteriormente permitiría el acceso a susjdis-tintos elementos como:

switch (symtab[i].type) {

case INT:

printf ("%d\n", symtab[i].uval.u_ival);

break;

case STRING:

printf ("%s\n", symtab[i].uval_sval);

break

case FLOAT

printf ("%s\n", symtab[i].uval_fval);

break;

}

siendo similar al programa en Pascal:

type symtab =

record

name ; array[1..10] of char;

case stype : integer of

int : ( ival : integer );

float: (fval : real );

string : (svai . array[1..20] of char );

end;

var

symtab : array [1..nsymbols] of symtab;

...

case symtab[i].stype of

int : writeln(symtab[i].ival);

float : writeln(symtab[i].fval);

string : writeln(symtab[i].sval);

end


La enorme similitud entre ambos programas puede aún aumentarse mediante el empleo del preprocesador de C, empleando #defines que hagan más manejables los nombres de variables:

#define ival uval.u_ival
#define ival uval.u_fval
#define ival uval.u_sval

Las operaciones que pueden realizarse sobre las uniones las mismas que las permitidas sobre las estructuras, acceder a uno de sus miembros y acceder a la dirección de la unión.