1.3 Registros Variantes

Los registros variantes son una especie de sentencia “case” dentro de un registro y son muy útiles cuando tenemos ciertos atributos que sabemos de antemano que sólo usaremos en ciertas situaciones.

Los registros variantes ahorran memoria, porque como sólo una de las estructuras debidas dentro de ellos puede usarse a la vez, el compilador sólo necesita reservar memoria para la mayor de ellas (en vez de tener que hacerlo para todos los componentes del registro).

Registros Variantes Esta propiedad de compartición de espacio en memoria es similar a la de los bloques disjuntos en ALGOL. De hecho, también en el caso de los registros variantes se permite el anidamiento.

Por tanto, los registros variantes son muy eficientes y seguros, porque sólo permiten al programador realizar operaciones que tengan algún significado dentro del contexto dado y que sean permisibles dentro del registro.

Sin embargo, el problema con esta estructura de datos es que no requiere ser inicializada. Esto significa que podríamos tener cualquier valor dentro de un registro variante después de modificar el valor de un campo identificador.

El acceso a variables no inicializadas puede dar lugar a que se usen valores que fueron dejados previamente en el bloque y que compartían la misma zona de memoria. En el caso de los registros variantes, este valor puede incluso ser de un tipo diferente al esperado.

La raíz del problema es que los registros variantes permiten una forma de aliasing, ya que los campos de las diferentes variantes son todos “alias” de las mismas posiciones de memoria.

He aquí un archvivo que nos habla sobre los registros variantes dale click aquí para descargar.

"Proximamente subiremos pequeños programas para ejemplificar mejor lo temas, revisa en la siguiente dirección http://geeksmarts.4shared.com ahí podrás descargar el material que vayamos subiendo."

Leer más...

Programación Multihebra

Dentro de la clase en algún momento requeriremos de la programación multihebra o multihilo, en este blog tenemos publicado un manual que nos habla en especifico de este tema y nos da ejemplos muy sencillos que podemos poner en práctica a continuación se muestra el PDF.

Descarga el archivo dando click aquí.

Por el momento aquí le dejo un la definición y un ejemplo de lo que es un hilo (hebra) en programación:


Hilo de ejecución

Un hilo de ejecución, en sistemas operativos, es una característica que permite a una aplicación realizar varias tareas concurrentemente. Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Los hilos de ejecución que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden e ese dato modificado inmediatamente.

Lo que es propio de cada hilo es el contador de programa, la pila de ejecución y el estado de la CPU (incluyendo el valor de los registros).

El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan, el proceso no existe más y todos sus recursos son liberados.

Algunos lenguajes de programación tienen características de diseño expresamente creadas para permitir a los programadores lidiar con hilos de ejecución (como Java o Delphi). Otros (la mayoría) desconocen la existencia de hilos de ejecución y éstos deben ser creados mediante llamadas de biblioteca especiales que dependen del sistema operativo en el que estos lenguajes están siendo utilizados (como es el caso del C y del C++).

Un ejemplo de la utilización de hilos es tener un hilo atento a la interfaz gráfica (iconos, botones, ventanas), mientras otro hilo hace una larga operación internamente. De esta manera el programa responde de manera más ágil a la interacción con el usuario. También pueden ser utilizados por una aplicación servidora para dar servicio a múltiples clientes.


Diferencias entre hilos y procesos

Los hilos se distinguen de los tradicionales procesos en que los procesos son –generalmente– independientes, llevan bastante información de estados, e interactúan sólo a través de mecanismos de comunicación dados por el sistema. Por otra parte, muchos hilos generalmente comparten otros recursos de forma directa. En muchos de los sistemas operativos que dan facilidades a los hilos, es más rápido cambiar de un hilo a otro dentro del mismo proceso, que cambiar de un proceso a otro. Este fenómeno se debe a que los hilos comparten datos y espacios de direcciones, mientras que los procesos, al ser independientes, no lo hacen. Al cambiar de un proceso a otro el sistema operativo (mediante el dispatcher) genera lo que se conoce como overhead, que es tiempo desperdiciado por el procesador para realizar un cambio de modo (mode switch), en este caso pasar del estado de ejecución (running) al estado de espera (waiting) y colocar el nuevo proceso en ejecución. En los hilos, como pertenecen a un mismo proceso, al realizar un cambio de hilo el tiempo perdido es casi despreciable.

Sistemas operativos como Windows NT, OS/2 y Linux (2.5 o superiores) dicen tener hilos "baratos", y procesos "costosos" mientras que en otros sistemas no hay una gran diferencia.

Fuente Original:
http://es.wikipedia.org/wiki/Hilo_en_sistemas_operativos

Leer más...

1.2- Uniones de Datos

Demasiado sencillo para ser verdad, en si la unión de datos como su nombre lo dice, une o enlaza dos registros de variables para que puedan ser utilizados de una sola forma, pero en distintos métodos y obtener una salida de dos en una.

Las uniones de XDR son diferentes a las de C, ya que tienen un discriminante. Su sintaxis es la siguiente:
union tipo_union switch (int discriminante) {
case valor1: declaración 1;
case valor2: declaración 2;
………………………
default: declaración N;
};
Hay que resaltar que una de las declaraciones de la unión puede ser de tipo void, lo que indica que en ese caso no hay datos asociados, o sea, no se transmitiría nada al enviar esa unión (sólo el valor del discriminante, claro). El único otro lugar donde puede aparecer un void en XDR es en la definición del argumento o del valor devuelto por una función. Este tipo XDR se proyecta en C como un tipo struct que contiene un tipo unión de C:
struct tipo_union {
int discriminante;
union {
declaración 1;
declaración 2;
…………..
declaración N;
} tipo_union_u;
};
Nótese que en el código del cliente y del servidor habría que especificar el campo tipo_union_u para acceder a los campos más internos. Asimismo, si uno de los casos tiene asociada una definición void, en C desaparecería directamente esa declaración. Para aclarar el uso del tipo union de XDR, se presenta, a continuación, un ejemplo. Supóngase que se quiere definir un servicio RPC denominado read, que devuelve un valor Booleano que indica si la operación se realizó con éxito. En caso afirmativo, la función devuelve los datos leídos. El tipo XDR que define el valor devuelto por esa función de servicio podría ser el siguiente:
union read_res switch (bool exito) {
case FALSE: void;
case TRUE: opaque datos<>;
};
Nótese que, suponiendo que tenemos una variable de ese tipo llamada resultado, para acceder a los datos habría que especificar lo siguiente:
resultado.read_res_u.datos
Fuente Original:
http://www.mitecnologico.com/Main/UnionesDeDatosUnion


Leer más...

1.1- Agregacion De Datos Struct

La palabra clave struct define una estructura. Por tratarse de un tipo de datos puede utilizarse directamente para definir una variable. La variable aparece entre corchetes puesto que puede ser omitida. Si se especifica una variable, estaremos definiendo una
variable cuyo tipo será la estructura que la precede.
struct [Nombre_de_la_estructura]
{
tipo1 campo1;
tipo2 campo2;
.
.
tipoN campoN;
} [variable];

Si la variable no es indicada definimos un nuevo tipo de datos (struct Nombre_de_la_estructura), que podremos utilizar posteriormente. Si es el nombre de la estructura lo que se omite, tendremos que especificar obligatoriamente una variable que tendrá esa estructura y no podremos definir otras variables con esa estructura sin tener que volver a especificar todos los campos. Lo que se encuentra dentro de las llaves es una definición típica de variables con su tipo y su identificador.

Todo esto puede parecer un poco confuso pero lo aclararemos con unos ejemplos.
struct punto
{
float x;
float y;
int color;
} punto_de_fuga;
Aquí estamos definiendo una variable llamada punto_de_fuga cuyo tipo es una estructura de datos formada por tres campos y a la que hemos llamado punto. Dos de ellos son de tipo float y representan las coordenadas del punto, el tercer valor es un entero que indica el color de ese punto. En este caso hemos definido una variable y una estructura. Al disponer de un identificador para esta última podemos definir nuevas variables de esta estructura.
struct punto origen1;
struct punto final1;
Donde origen1 y final1 son variables de tipo struct punto que hemos definido anteriormente. Si en la definición de punto_de_fuga no se hubiese incluído un identificador para la estructura (en este caso el identificador es punto), no podríamos definir nuevas variables con esa estructura ya que no estaría identificada por ningún nombre.

También podríamos haber excluído el nombre de la variable (punto_de_fuga). En este caso lo que definiríamos sería una estructura llamada punto que pasaría a ser un nuevo tipo disponible por el usuario. Así los tipos de variables de que dispondríamos ahora serían:
int

float
double
char
struct punto
Por tanto podríamos definir cualquier variable con estos tipos o incluso definir matriz de estos tipos.

struct punto matriz_de_puntos[30];

Así estaríamos definiendo una matriz de 30 elementos en la que cada elemento es una struct punto con sus tres campos.

Lo que ahora nos interesa es saber como referenciar esos campos y acceder o modificar, por tanto la información que contienen. Esto se consigue separando el identificador del campo de la variable mediante un punto.

Fuente Original:

http://www.mitecnologico.com/Main/AgregacionDeDatosStruct

Leer más...

Javascript

No vamos a detenernos mucho en Javascript, por las limitaciones antedichas; si les interesa podemos
dedicarnos un poco a este lenguaje en el futuro. Por ahora, sólo un ejemplo sencillo:
Calculadora en Javascript



Logo_foro_1.gif

Leer más...