Anuncios

Bienvenidos sean a este post, hoy veremos como se integran estos tres elementos.

Anuncios
Anuncios

En el post anterior vimos que es un typedef, en este post hablamos sobre los struct y en este otro post hablamos sobre los enum, estos tres tienen un factor en comun: podemos crear nuevos tipos de datos a partir de ellos, no lo mencionamos en su momento para enum pero tambien podemos, aunque de los tres el mas especifico para ello es struct, en este caso typedef nos permitira facilitar la creacion de los objetos derivados de estos, vamos a ver primero como hacerlo con enum, para ello implementaremos un nuevo ejemplo, pasemos a crear un nuevo archivo al cual llamaremos ejemplo07.c y le agregaremos el siguiente codigo:

ejemplo07.c

#include <stdio.h>

enum Mamifero
{
	Perro,
	Gato
};

struct Animal
{
	enum Mamifero mamifero;
	int	edad;
	int 	peso;
};

void mostrar_datos(struct Animal a)
{
	printf("Tipo: %s\nPeso: %i\nEdad: %i\n",
		a.mamifero == 0 ? "Perro" : "Gato",
		a.peso,
		a.edad);
}

int main()
{
	struct Animal animal_1 = {Perro, 8, 25};

	mostrar_datos(animal_1);

	return 0;
}
Anuncios

Un ejemplo un poco mas largo pero nos va a venir bien, en este caso todavia no aplicamos a typedef pero ya lo haremos, pero antes analicemos el codigo.

Anuncios
Anuncios

Primero definiremos un enum que sera para identificar el tipo de mamifero, para este caso usamos solo dos como son Perro y Gato, luego tenemos un struct donde primero crearemos un objeto para almacenar un valor de enum, despues almacenaremos dos valores de tipo int para la edad y el peso, nuestro siguiente paso sera una funcion para mostrar los datos del objeto tipo Animal que le pasemos como argumento, de esto hablaremos en breve, dado que no devolvera ningun valor sino que mostrara los valores almacenados en el objeto informado usaremos el tipo void, en la funcion usamos a printf para que muestre cada uno de ellos, la unica curiosidad es el operador condicional donde verifica si el valor de mamifero es igual a 0 y en caso de ser verdadero informaremos que es un Perro de lo contrario correspondera a un Gato, para ir finalizando veamos que en el main tenemos un objeto derivado del struct que llamaremos animal_1 y lo iniciaremos con tres valores, lo siguiente sera llamar a la funcion mostrar_datos y como argumento le pasaremos el objeto que definimos anteriormente, con todo esto comentado podemos pasar a compilarlo y ver su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo07 
Tipo: Perro
Peso: 25
Edad: 8
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Con esto comprobado vamos a modificar el codigo de la siguiente forma:

ejemplo07.c

#include <stdio.h>

enum Mamifero
{
	Perro,
	Gato
};

typedef enum Mamifero Mamifero;

struct Animal
{
	Mamifero mamifero;
	int	edad;
	int 	peso;
};

void mostrar_datos(struct Animal a)
{
	printf("Tipo: %s\nPeso: %i\nEdad: %i\n",
		a.mamifero == 0 ? "Perro" : "Gato",
		a.peso,
		a.edad);
}

int main()
{
	struct Animal animal_1 = {Perro, 8, 25};

	mostrar_datos(animal_1);

	return 0;
}
Anuncios

En este caso hicimos dos cambios minimos, simplemente agregamos una linea para definir un typedef, veamos como es su estructura:

typedef enum Mamifero Mamifero;
Anuncios

Observen que lo realizado es simplemente asociar toda la declaracion del enum a otro alias para facilitarnos la creacion de objetos derivados de este enum, por eso en el struct ahora tenemos la posibilidad de cambiar esta linea:

enum	Mamifero mamifero;
Anuncios

Por esta linea:

Mamifero mamifero;
Anuncios

El resto sigue igual que antes, si lo compilan y ejecutan deberan volver a tener la misma salida, con esto ccomentado pasemos a modificar el codigo de la siguiente manera para poder ver como trabaja typedef con struct:

ejemplo07.c

#include <stdio.h>

enum Mamifero
{
	Perro,
	Gato
};

typedef enum Mamifero Mamifero;

struct Animal
{
	Mamifero mamifero;
	int	edad;
	int 	peso;
};

typedef struct Animal Animal;

void mostrar_datos(Animal a)
{
	printf("Tipo: %s\nPeso: %i\nEdad: %i\n",
		a.mamifero == 0 ? "Perro" : "Gato",
		a.peso,
		a.edad);
}

int main()
{
	Animal animal_1 = {Perro, 8, 25};

	mostrar_datos(animal_1);

	return 0;
}
Anuncios

Observen que hicimos minimos cambios, para ello el primero que implementamos es un typedef del struct que es muy similar a lo visto en enum, donde ahora toda la definicion del struct se asocio a un alias y en lugar de usar toda la definicion para crear los objetos nos permitira usar solamente el nuevo alias y con esto comentado podemos cambiar esta linea:

struct Animal animal_1 = {Perro, 8, 25};
Anuncios

De la siguiente manera:

Animal animal_1 = {Perro, 8, 25};
Anuncios

Tambien hicimos una modificacion mas porque dado que esto afecta a todo el codigo, esta nuevo cambio fue en la definicion de la funcion donde cambamos esta linea:

void mostrar_datos(struct Animal a)
Anuncios

Por esta otra:

void mostrar_datos(Animal a)
Anuncios

Como pueden observar el typedef nos permite facilitar nuestro codigo a la hora de trabajar con los distintos tipos que vayamos creando, si lo compilan seguira funcionando de la misma forma, ahora hagamos la ultima modificacion del codigo, para ello cambiaran el main por el siguiente:

int main()
{
	Animal animal_1 = {Perro, 8, 25};
	Animal animal_2 = {Gato, 12, 5};

	mostrar_datos(animal_1);
	mostrar_datos(animal_2);

	return 0;
}
Anuncios

En esta modificacion definimos un nuevo objeto del struct, pero en este caso no solo lo llamaremos distinto sino que sera el otro tipo de mamifero con sus respectivos datos, tambien hacemos otro llamado a la funcion mostrar_datos y esta vez le pasamos el nuevo objeto como argumento, compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo07 
Tipo: Perro
Peso: 25
Edad: 8
Tipo: Gato
Peso: 5
Edad: 12
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Como pueden ver de una manera mas facil y simple podemos definir todos los objetos que sean necesarios pero a traves de nuestro nuevo alias nos mejorara esteticamente nuestro codigo, esto nos facilita mucho especialmente a la hora que debamos hacer una depuracion del codigo por algun error.

Anuncios

Para ir finalizando una forma alternativa de poder utilizar a typedef, para ello vamos a modificar tanto al enum como al struct de la siguiente forma:

typedef enum Mamifero
{
        Perro,
        Gato
} Mamifero;

typedef struct Animal
{
        Mamifero mamifero;
        int     edad;
        int     peso;
} Animal;
Anuncios

En lugar de utilizar las dos lineas para cada typedef pasamos a agregarlo tanto al enum como al struct pero al final del mismo antes del punto y coma debemos agregar el alias que le asignaremos para cada typedef. si lo compilan y lo prueban deberan obtener la misma salida que vimos anteriormente, entonce para sir concluyendo veamos como es esta sintaxis de typedef:

typedef enum nombre { elementos } alias;
Anuncios
typedef struct nombre { elementos } alias;
Anuncios

Siendo que las dos opciones que vimos son validas dependera con cual se sienten mas comodos para trabajar en sus codigos, si la practicidad o tener un mejor control de lo que estan haciendo.

Anuncios

En resumen, hoy hemos visto como usar typedef con enum primero y luego con struct, como nos ayuda a mejorar la forma de la sintaxis de nuestro codigo y asi como evitar tener que repetir palabras tediosas, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50