Posteado por: wozgeass | noviembre 13, 2009

Programando en C para linux(Sexta parte).


MAS TIPOS DE DATOS.

ESTRUCTURAS.

En C una estructura es una coleccion de variable que se referencian bajo el mismo nombre. Una estructura proporciona un medio conveniente para mantener junta informacion que se relaciona. Una definicion estructura forma de una plantilla que se puede usar para crear variable de estructura. Las variables que forman la estructura son llamados elementos estucturados.

Generalmente, todos los elementos en la estructura estan relacionados logicamente unos con otros. Por ejemplo, se puede representar una lista de nombres de correo en una estructura. Mediante la palabra clave struct se le indica al compilador que defina una plantilla de estructura.

struct direccion{

char nombre[30];

char calle[40];

char ciudad[20];

char estado[3];

unsigned int codigo;

}

Con el codigo anterior no ha sido declarada ninguna variable, tan solo se ha definido el formato. Para declarar una variable, se hara como sigue:

struct direccion informacion;

Se pueden declarar una o mas variables cuando se define una estructura entre ) y ;.

ejemplo.

struct direccion{

char nombre[30];

char calle[40];

char ciudad[20];

char estado[3];

unsigned int codigo;

}informacion, personal_informacion, alumno_informacion;

Observar que direccion es una etiqueta para la estructura que sirve como una forma breve para futuras declaraciones. Como en esta ultima declaracion se indican las variables con esta estructura, se puede omitir el nombre de la estructura tipo.

Las estructuras pueden ser tambien preinicializadas en la declaracion:

struct direccion informacion= {“Linus Benedict Torvalds”,”muy muy lejos”, “Algun estado”, “USA”, 912009};

Para referenciar o accesar un miembro(o campo) de una estructura, C proporciona el operador punto ‘.’ , por ejemplo, para asignar a informacion_personal otro codigo, lo hacemos como:

informacion_personal.codigo=54321;

DEFINIR TIPOS DE DATOS.

typedef se puede usar para definir nuevos nombres de datos explicitamente, usando algunos de los tipos de datos de C, donde su formato es:

typedef   <typo>  <nombre>

Se puede usar typedef para crear nombres para tipos mas complejos como una estructura:

typedef  struct direccion{

char nombre[30];

char calle[40];

char ciudad[20];

unsigned int codigo;

} informacion_personal;

En este caso direccion sirve como una etiqueta a la estructura y es opcional, ya que ha sido definido un nuevo tipo de dato, por lo que la etiqueta no tiene mucho uso, en donde informacion_personal es un nuevo tipo de dato en info_direc es una variable del tipo direccion, la cual es una estructura.

Tambien podemos tener arreglos de estructuras:

typedef struct direccion{

char nombre[30];

char calle[40];

char ciudad[20];

char estado[20];

unsigned int codigo;

}informacion;

informacion personal[1000];

Para lo anterior, personal tiene 1000 elementos del tipo informacion. Lo anterior podria ser accesado:

personal[50].codigo=3453;

UNIONES.

Es una variable la cual podria guardar(en momento diferentes) objetos de diferentes tamaños y tipos. C emplea la sentencia union para crear uniones:

union numero{

short corto;

long largo;

float flotante;

double flotante_largo;

}u_numero;

Con lo anterior se define una union llamada numero y una instancia de esta llamada u_numero y una instancia de esta llamada u_numero, numero es la etiqueta de la union y tiene el mismo comportamiento que la etiqueta en la estructura.

Los miembros pueden ser accesados de la siguiente forma:

printf(“%ld\n”, u_numero.flotante_largo);

Con la llamada a la funcion se muestra el valor de flotante_largo.

Cuando el compilador de C esta reservando memoria para las uniones, siempre creara una variable lo suficientemente grande para que quepa el tipo de variable mas largo de la union.

Con la finalidad de que el programa pueda llevar el registro del tipo de la variable union usada en un momento dado, es comun tener una estructura(con una union anidada) y una variable que indica el tipo de union.

Por ejemplo:

typedef struct{

int max_pasajeros;

}jet;

typedef struct{

int capacidad;

}helicoptero;

typedef struct{

int pasajeros;

}avioncarga;

typedef union{

jet jetsu;

helicoptero heli;

avioncarga avion;

}transporteaereo;

En el ejmplo anterior se define una union base de transporteaereo el cual puede ser un jet, helicoptero o un avioncarga. En la estructura transporteaereo hay un miembro para el tipo, que indica cual es la estructura manejada en ese momento.

CONVERSION DE TIPOS (cast).

C es uno de los pocos lenguajes que permiten la conversion de tipos, esto es, forzar una variable de un tipo a ser de otro tipo. Lo anterior se presenta cuando variables de un tipo se mezcan con las de otro tipo. Lo anterior se presenta cuando variables de un tipo se mezclan  con las de otro tipo. Para llevar a cabo lo anterior se usa el operador de convercion(cast) ( ). Por ejemplo:

int numeroentero;

float numero_flotante = 9.87;

numero_entero = ( int )  numero_flotante;

Con lo cual se asigna 9 a la variable numero_entero y la fraccion es desechada.

El siguiente codigo:

int numero_entero = 10;

float numero_flotante;

numero_flotante = (float) numero_entero;

Asigna 10.0 a numero_flotante. Como se observa C convierte el valor del lado derecho de la asignacion al tipo del lado izquierdo.

La conversion de tipos puede ser tambien usada con cualqueir tipo simple de dato incluyendo char, por lo tanto:

#include <stdio.h>
main(){
char caracter;
int entero = 65;
caracter = (char) entero;
printf(“EL resultado es: %c”, caracter);
}

Asignamos 65(que es el ASCII de ‘A’) a entero.

Algunas conversiones de tipos son hechas automaticamente – esto es principalmente por l caracteristca de compatibilidad de tipos.

Otro uso es asegurar que la division de numeros se comporta como se requiere, ya que si se tienen dos enteros la forma de forzar el resultado a un numero es:

numero_flotante = (float) num_ent / (float) den_ent;

Con lo que aseguramos que la divicion regresara un numero flotante.

ENUMERACIONES.

Es un conjunto de constantes enteras con nombre y especifica todos los valores legales que puede tener una variable del tipo enum.

La forma cmo se define una enumeracion es de forma parecida a como se hace con las estructuras, usando la palabra clave enum para el comienzo de un tipo de enumeracion. Su formato es:

enum <nombre enum> {lista de enumeracione}lista_de_variables;

Es opcional nombre_enum y lista_de_variables. La primera se usa para declarar las variables de su tipo. El siguiente codigo define una enumeracion llamada disco que declara almacenamiento para ser de ese tipo.

enum almacenamiento{disketter, dd, cd, dvd, cinta};

enum almacenamiento disco;

Con la siguiente definicion y declaracion son validas  las siguientes sentencias:

disco =  cd;

if(disco == diskette)

printf(“el valor de 1440kb\n”);

Se inicia el primer simbolo de enumeracion a cero, el valor del segundo simbolo a 1 y asi sucesivamente, a menos que se inicialice de otra manera.

Por lo tanto,

printf(“%d %d\n”, dd, cinta);

imprime en pantalla:

1  4

Se puede especificar el valor de uno o mas simbolos usando un inicializador. Para hacerlo, poner un signo igual y un valor entero despues del simbolo.

Por ejemplo, lo siguiente asigna el valor de 250 a cd.

enum disco {diskette, duro, cd = 250, dvd, cinta};

Por lo tanto los valores de las variables son:

Disco valor
diskette 0
Duro 1
cd 250
dvd 251
cinta 252

VARIABLES ESTATICAS.

Soporta 4 especificadores de clase de almacenamiento:

auto

extern

static

register

Estos especificadores le dicen al compilador como almacenar la variable que sigue. El especificador de almacenamiento precede a la declaracion de variable que tiene el formato general:

<especificador> <tipo de variable> <nombre>;

Se usa el especificador auto para declarar variables locales. Sin embargo raramente se usa porque las variables locales son auto por defecto.

Las variables static son variables permanentes en su propia funcion o archivo. Se diferencian de las variables globales porque son desconocidas fuera de sus funciones o archivo, pero mantienen sus valores entre llamadas. Esta caracteristica las hace utilies cuando se escriben funciones generales y bibliotes de funciones.

Variables static locales. Una variable estatica local es una variable local que retiene su valor entre llamadas de funcion, ya que C les crea un almacenamiento permanente. Si lo anterior no se pudiera hacer, entonces se tendrian que usar variables globales  que abriran la puerta a posibles efectos laterales. Un ejemplo de una funcion que requerian tales variables es un generador de series de numeros que produce un numero nuevo basados en el ultimo.

A continuacion se muesttra un ejemplo en donde se analiza el comportamiento de una variable auto y una variable static.

#include<stdio.h>

void stat(); //prototipo de una funcion

main(){

int indice;

for(indice = 0; indice < 5; indice ++)

stat();

}

void stat(){

auto int a_var = 0;

static int s_var = 0;

printf(“auto = %d, static = %d\n”, a_var, s_var);

++a_var;

++s_var;

}

La salida del codigo anterior es:

auto = 0, static = 0
auto = 0, static = 1
auto = 0, static = 2
auto = 0, static = 3
auto = 0, static = 4

Como se puede observar la variable a_var es creada cada vez que se llama a la funcion. La variable s_var es creada en la primera llamada y despues recuerda su valor, es decir, no se destruye cuando termina la funcion.

wozgeass: push eax, 1

int 80h

EOF!!!

hasta el proximo post…

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: