Ing. Informática Programación I Bloque 6 Declaración de tipos propios Bloque 6 Ing. Informática Programación I Bloque 6 Los tipos de las estructuras Si necesitamos pasar una estructura como parámetro de una función no podemos hacerlo así, ya que daría un error de compilación: void funcion (struct {short int R;short int G;short int B;} color) { ... }; Ing. Informática Programación I Bloque 6 Los tipos de las estructuras La forma correcta es definir un nuevo tipo de datos (colorRGB): struct ColorRGB { short int R; short int G; short int B; }; Nuevo tipo de datos (llamado struct ColorRGB) y de esta forma ya podremos declarar variables y parámetros de dicho tipo: struct ColorRGB color1, color2; struct ColorRGB colores[10]; Variables (color1, color2 y colores) Ing. Informática Programación I Bloque 6 Visibilidad de los tipos de estructuras Si la declaración del tipo se hace dentro de una función, sólo es visible en esa función void f1() { struct ColorRGB { short int R; short int G; short int B; }; ... } main() { ... } Sólo podemos declarar variables del tipo struct ColorRGB dentro de la función f1, pero no en otras (por ejemplo main) Ing. Informática Programación I Bloque 6 Visibilidad de los tipos de estructuras Si la declaración del tipo se hace al principio del fichero, fuera de las funciones, es visible en todas las funciones struct ColorRGB { short int R; short int G; short int B; Podemos tipo strut ColorRGB dentro de cualquier función (y también como parámetro) }; void f1(struct ColorRGB color) { ... } main() { struct ColorRGB c; ... } Ing. Informática Programación I Bloque 6 Definición de tipos con typedef Otra forma de definir tipos es mediante typedef, que crea un sinónimo para un tipo existente: typedef tipos_original tipus_nuevo; Ejemplo: typedef float Temperatura; Temperatura temp1, temp2, temperatures[12]; typedef struct { short int R; short int G; short int B; } ColorRGB; ColorRGB color1; typedef char Dni[10]; Dni dni1 = "12345678A"; También sigue la regla de visibilidad antes citada Ing. Informática Programación I Conversiones de tipos Automáticas entre tipos numéricos: int x=2; float y=3.5; y=x; printf("%f",y); int x=2; float y=3.5; x=y; printf("%d",x); Escribe 2.000000 Escribe 3 Bloque 6 Ing. Informática Programación I Bloque 6 Conversiones de tipos Ya que los caracteres se representan mediante un entero entre 0 y 255, en C los tipos entero y carácter se pueden usar indistintamente void main() void main() { { int c; char c; c='A'; c=66; c=c+1; printf("%c",c); } Escribe B void main() { char c=’B’; printf(“%d”,c); } printf("%c",c); } Escribe B Escribe 66 Ing. Informática Programación I Conversiones de tipos Si el entero es mayor que 255, se toma el byte menos significativo para hacer la convesión. Por ejemplo, si el entero es 365, su representación en binario es 00000001 01101101 Se toma el byte de la derecha (109), que se corresponde con el carácter ‘m’ Bloque 6 Ing. Informática Programación I Conversiones de tipos Casts: forzar a un cambio de tipo (tipo) variable Ejemplo: int x=3,y=2; float f; f = (float)x / (float)y; El resultado es 1.5 Sin casts sería 1 Bloque 6 Ing. Informática Programación I Bloque 6 Conversión de tipos Funciones de conversión. Por ejemplo, para convertir una cadena de caracteres que contiene un número en el tipo numérico correspondiente: atoi(cadena) retorna el int representado por la cadena de caracteres cadena atof(cadena) retorna el float representado per cadena Ejemplo: #include <stdlib.h> #include <stdio.h> void main() { char cadena[6]=”12345”; int x; x=atoi(cadena); printf(“%d”,x); }