Bienvenidos sean a este post, hoy veremos como se integran estos tres elementos.
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;
}
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.
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$
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;
}
En este caso hicimos dos cambios minimos, simplemente agregamos una linea para definir un typedef, veamos como es su estructura:
typedef enum Mamifero Mamifero;
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;
Por esta linea:
Mamifero mamifero;
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;
}
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};
De la siguiente manera:
Animal animal_1 = {Perro, 8, 25};
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)
Por esta otra:
void mostrar_datos(Animal a)
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;
}
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$
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.
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;
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;
typedef struct nombre { elementos } alias;
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.
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.


Donación
Es para mantenimento del sitio, gracias!
$1.50
