07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union
-
Upload
diego-andres-alvarez-marin -
Category
Documents
-
view
151 -
download
2
description
Transcript of 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union
![Page 1: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/1.jpg)
1
07 - Tipos de datos definidos por el programador
Diego Andrés Alvarez MarínProfesor Asociado
Universidad Nacional de ColombiaSede Manizales
![Page 2: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/2.jpg)
2
Temario● Definición de tipos (typedef)● Estructuras (struct)● Uniones (union)● Enumeraciones (enum)● Campos de bits
![Page 3: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/3.jpg)
3
typedefSe utiliza para asignar nombres (alternos) a los tipos de datos. La forma general de uso de este comando es:
Ejemplo:
El standard POSIX (http://en.wikipedia.org/wiki/POSIX) solicita que el nombre de un typedef no termine en _t, ya que ellos lo usan en sus declaraciones (recuerde a clock_t, size_t).
![Page 4: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/4.jpg)
4
Enumeraciones
Es un tipo de dato especial que sirve para guardar constantes enteras y asignarles un nombre.
0 1 2
3 4 5 6
6 7 8 14
-5 -4 -3
![Page 5: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/5.jpg)
5
Declaración de variables tipo enum
![Page 6: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/6.jpg)
6
![Page 7: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/7.jpg)
7
enum + switch + warning
No hay default, ni una opción para Guardar ni para Cerrar
![Page 8: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/8.jpg)
8
Utilizando enumeraciones en un ciclo for
![Page 9: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/9.jpg)
9
Estructuras (struct)Una estructura es un conjuto de variables de diferentes tipos relacionadas bajo un mismo nombre
![Page 10: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/10.jpg)
10
Declaración de variables tipo struct
![Page 11: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/11.jpg)
11
Inicialización de estructuras
(gcc GNU extension)
![Page 12: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/12.jpg)
12
Inicialización de arreglos de estructuras
![Page 13: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/13.jpg)
13
Accediendo a los miembros de una estructura
Usando el operador punto “.”
Utilizando punteros: el operador flecha
“->”(NOTA: ver definiciones de struct punto y struct circulo en las diapositivas anteriores)
![Page 14: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/14.jpg)
14
Ejemplo con estructuras
Ver:http://programaciondecomputadoresunalmzl.wikispaces.com/file/detail/07_struct.c
![Page 15: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/15.jpg)
15
Compound literals
Note que p1 y p2 no se inicializaron; en la líneas 15 y 16 se está separando y a la vez asignando el espacio de memoria para p1 y p2 respectivamente. Esta asignación sólo es válida en el bloque { } en el cual se utilizó el compound literal.
a los campos no inicializados se les asigna ceros
![Page 16: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/16.jpg)
16
Structures get copied, arrays get aliased
Aliasing: <programming> Two names (identifiers), usually of local or global variables, that refer to the same resource (memory location) are said to be aliased. Although names introduced in programming languages are typically mapped to different memory locations, aliasing can be introduced by the use of address arithmetic and pointers or language-specific features, like C/C++ references.
d1.x and d2.x are aliased.
![Page 17: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/17.jpg)
17
El tamaño de una estructura
Es igual o mayor al tamaño de la suma de sus miembros; esto puede ser debido a que el computador agrega bytes de más a la estructura (padding) para acelerar el acceso del computador a la memoria. Varía con respecto al computador y al sistema operativo.
En el gcc se puede desactivar el padding con opción del compilador -fpack-struct Tenga en cuenta que esto disminuye la velocidad de acceso a la memoria
![Page 18: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/18.jpg)
18
Padding, alignment, packing
Hecho en GNU/Linux de 32 bits
![Page 19: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/19.jpg)
19
Padding
Padding hace un alineamiento de los miembros de la estructura de modo que las direcciones de memoria se alineen a 4 bytes o a 8 bytes, dependiendo si se tiene un sistema operativo de 32 o de 64 bits. Observe que las direcciones de memoria asignadas son divisibles entre 4 u 8 dependiendo del sistema operativo: ej: 0x80496ac == 134518444, el cual es un número divisible entre cuatro (ejecutado en GNU/Linux de 32 bits).
![Page 20: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/20.jpg)
20
![Page 21: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/21.jpg)
21
PackingEmpaqueta todo sin dejar espacios. El packing se debe hacer en los siguientes casos:
1) Cuando se debe sacrificar la velocidad del código a cambio de utilizar mejor la memoria RAM, en el caso que la memoria esté escasa.
2) Cuando se estén grabando estructuras a un archivo. En este caso el PADDING se debe desactivar y utilizar PACKING ya que si el archivo se lee en un computador con un sistema operativo diferente al sistema operativo que escribió el archivo podrían haber errores en la lectura de la estructura.
![Page 22: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/22.jpg)
22
![Page 23: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/23.jpg)
23
Offset de un elemento: offsetof()
offsetof(tipo,miembro)Este macro, definido en stddef.h, retorna el desplazamiento (“offset”) en bytes del elemento miembro de una struct, o union tipo, contado a partir del principio de la estructura.
![Page 24: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/24.jpg)
24
Los operadores == y != no funcionan con estructuras. Si se quieren comparar dos estructuras, la comparación debe hacerse miembro a miembro.
Comparación de estructuras
![Page 25: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/25.jpg)
25
No compare estructuras con memcmp()
Algunos programadores incorrectamente comparan estructuras utilizando:memcmp(&struct1, &struct2, sizeof(struct1));
Esto es incorrecto, ya que no se está teniendo encuenta que el padding entre los campos de las estructuras tiene un valor indeterminado. De otro, lado, en el caso que existan estructuras sin el padding, habrían problemas comparando punteros, doubles, floats, valores NAN, etc.
Por esta razón es preferible crear una función que compare dos estructuras miembro a miembro.
![Page 26: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/26.jpg)
26
Como hacer una función que devuelva más de dos variables?
1. Pasando punteros
![Page 27: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/27.jpg)
27
Como hacer una función que devuelva más de dos variables?
2. Retornando una estructura que contiene los valores deseados:
![Page 28: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/28.jpg)
28
Como hacer una función que devuelva más de dos variables?
3. Utilizar un híbrido: pasar un puntero a una estructura, que posteriormente es llenada:
void
![Page 29: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/29.jpg)
29
Arrays de estructuras
struct punto{ int x, y;};struct punto p[3];
Los elementos se pueden inicializar así:struct punto p[3] = { {2, 3}, {4, 5}, {6, 7} };
Para acceder a los elementos se hace lo siguiente:struct punto p[3];p[0].x = 2;p[0].y = 3;
![Page 30: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/30.jpg)
30
Funciones que retornan vectoresSi se utiliza esta técnica se debe tener en cuenta que “vector” se está creando en la memoria de pila y el tamaño de esta es limitada.
![Page 31: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/31.jpg)
31
Uniones (union)
● Se utilizan para guardar varias variables de diferentes tipos en el mismo espacio de memoria, por lo tanto si se asigna un valor a una variable, se sobreescribe el valor en las otras.
● Su tamaño es igual al tamaño de su elemento más grande: sizeof(mi_union) = sizeof(double)
● El compilador no verifica si los datos se están leyendo de la forma correcta.
![Page 32: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/32.jpg)
32
Declaración de variables tipo union
![Page 33: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/33.jpg)
33
Inicialización de uniones
Se puede inicializar la primera variable de la unión cuando se declara:
En este ejemplo el primer elemento (u1.c) se inicializa a 'm', pero union.x se deja "quieto".
También se puede inicializar cualquier otro miembro de la unión:
![Page 34: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/34.jpg)
34
Accediendo a los miembros de una unión
Se hace utilizando el operador punto "."
Aquí u1.x sobreescribe u1.c
![Page 35: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/35.jpg)
35
En este caso la unión nos permite crear un truco que permite devolver cualquier tipo de dato
unión anónima
![Page 36: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/36.jpg)
36
Ejemplo uniones para entender la representación interna de un
número float
Ver un buen ejemplo de uniones en:http://tipsparaisc.blogspot.com/2012/12/representacion-interna-de-un-flotante.html
![Page 37: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/37.jpg)
37
Arrays de unionesunion u{ int i; float f;};union u x[3];
Los tres primeros miembros de x se pueden inicializar como:
union u x[3] = { {3}, {4}, {5} };
(los brackets internos son opcionales)
Los elementos se acceden así:x[0].i = 2;
![Page 38: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/38.jpg)
38
Campos de bits
Son estructuras cuyos miembros son paquetes de bits. Se utilizan para representar enteros de tamaño conocido. Se utilizan especialmente para "comprimir datos", o para representar series de bits en paquetes llamados "banderas" (flags). Se pueden crear utilizando unsigned int, signed int o _Bool.
![Page 39: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/39.jpg)
39
![Page 40: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/40.jpg)
40
Falta explicar estos comandos definidos en el C11
_Alignas_Alignof_Atomic_Generic_Noreturn
_Static_assert_Thread_local
![Page 41: 07 - Tipos de datos definidos por el programador en lenguaje C: struct, typedef, union](https://reader034.fdocuments.es/reader034/viewer/2022052207/549cc016ac7959ba2a8b47cd/html5/thumbnails/41.jpg)
Material basado en:
http://www.slideshare.net/amraldo/introduction-to-c-programming-7898353
http://www.slideshare.net/petdance/just-enough-c-for-open-source-programmers
http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
Wikipedia