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.

miércoles, 6 de enero de 2010

Entrada/Salida en lenguaje C

El lenguaje C no incorpora directamente instrucciones para la realización de las operaciones de Entrada/Salida, implementándola a través de librerías y funciones.

Existe un conjunto de funciones de E/S que es portable a un gran número de sistemas operativos (UNIX, VMS, MS-DOS, CP/M, ...), imple-mentadas en la denominada librería de E/S estándar. Cualquier programador de C debe conocer los nombres y argumentos de estas funciones, considerando que van a ser las mismas en cualquiera de los sistemas operativos mencionados.

Además se incluyen funciones para permitir el interface directo con las propias funciones de E/S del sistema operativo.


Los ficheros en la librería estándar de E/S:

Las declaraciones necesarias para el manejo de la librerìa estàndar de E/S son accesibles mediante el empleo de un #include;

#include

En algunos sistemas puede llegar a ser necesario notificar expresamente al compilador la inclusión de la librería estándar. Por ejemplo, en los antiguos sistemas Unix Versión 6 se requería la inclusión de la opción "-1S" al compilar. Esto ya no es necesario en los sistemas Unix Versión 7 actuales o en sus derivados.

Internamente, la librería estándar de E/S almacena la información correspondiente a cada fichero abierto en una estructura, identificando a los ficheros por medio de punteros a estructuras. El fichero define FILE como una de estas estructuras.