Apuntadores Avanzados / Soluciones del Capítulo 18
Visitors to VTC.com will be able to view all introductory videos for each training course.
Free Trial Members will gain access to first three chapters for each training course.
Full Access Members have full access to VTC.com’s entire library of video tutorials.
Learn More
Subtitles of the Movie
ÀPudo obtener los resultados? Tal vez no, pues en mi caso tuve muchos problemas, pero la solucion no es demasiado compleja. De hecho, creo que este es un codigo mas sencillo que el anterior; no mas correcto sino mas sencillo. Demosle un vistazo. Aqui tenemos el proyecto del cursoÉ y he modificado el archivo "database.h". Veamos. ÀCuales son los cambios? Los tenemos en la parte inferior. De hecho, el unico cambio es que las funciones "open_file" y "save_file" toman diferentes parametros: en vez de un apuntador a un CD ahora tenemos un apuntador a un apuntador a un CD. Lo mismo ocurre aqui. Ambos cambios se reflejan en el archivo "file.c", asi queÉ este archivo no ha cambiado mucho, contrario al archivo "file.c". Primero veamos el archivo "main.c". Observe que de nuevo tenemos la directiva "MAX_CDS"É porque ahora necesitamos tener 100 CDs. Este es el arregloÉ de 100 elementos, cada uno de los cuales es un apuntadorÉ a una estructura "cd_t". Tenemos 100 apuntadores. De nuevo tenemos las variables "count", "changes" y demas. Modificamos la funcion "reset_everything"É porque debemos liberar cada CD individualmente, asi que dependiendo de la cantidad de los mismos en la lista, liberamos a cada uno. Obviamente, solo lo haremos si existe al menos uno. De hecho, en vez de esta verificacion de la variable "count", simplemente verificamosÉ si "count" es 0, en cuyo caso no ejecutamos el ciclo. El ciclo no se ejecutara si "count" es igual a 0, pero observe que cada uno de los elementos del arreglo es un apuntadorÉ y por lo tanto puede ser pasado a la funcion "free". No modificamos las funciones "are_you_sure" ni "file_new", pero la funcion "general_open"É ahora tiene un arreglo temporal de apuntadores, aunque funciona casi igual que antes. En esta funcion "open_file" leemos los CDs, asi que la veremos mas adelante. Si este proceso es exitoso, llamamos a "reset_everything" para liberar la lista originalÉ y eliminar su contenido si este existe. Configuramos la variable "new_count" y debemos copiar todo el conjunto de apuntadores de un arreglo al otro, es decir, debemos copiar todo el arregloÉ y solo los apuntadoresÉ en vez de los elementos a los cuales apuntan. Solo copiamos los apuntadores en si. Se que esto es un poco complicadoÉ y que esta es probablemente la linea de codigo mas dificil de entender del programa. ÀPor que solo copiamos los apuntadoresÉ y no tambien los elementos a los cuales apuntan, es decir los CDs? No es necesario hacerlo. Los CDs han sido asignados y ubicados en varios lugares de la memoriaÉ y tenemos un arreglo de apuntadoresÉ que apuntan a esas areas de memoria donde se encuentran los CDs, asi que solo tenemos que crear un segundo arreglo de apuntadoresÉ para que apunten a esas mismas ubicaciones de la memoria. Para hacerlo utilizamos la funcion "memcpy"É que es la mejor manera de copiar un arreglo. Podemos utilizar un ciclo "for" para lograr el mismo resultadoÉ siempre y cuando nos aseguremos de copiar los apuntadores y no su contenido. Vamos a continuar. La funcion "general_save"É no ha cambiado en absolutoÉ porque aqui pasamos el elemento "cds"É que es un apuntador a un apuntador. Lo pasamos exactamente igual, asi que no es necesario realizar ningun cambio. Ninguna de estas funciones ha cambiado. Al crear un nuevo CD debemos realizar una accion ligeramente diferente. El siguiente elemento del arreglo, o el siguiente apuntador, debe ser asignadoÉ a esta sencilla funcion ubicada en el archivo "utils.c". Esta llama a la funcion "malloc" y solicita un area de memoria para un CD. Si falla, salimos del programa y aparece un mensaje de error. Esto es todo lo que hace. El valor obtenido de la funcion "malloc" es asignado a uno de los elementos del arreglo. Recuerde que cada uno de los elementos del arreglo es un apuntador. Luego escribimos el contenido de ese apuntador en este CD, es decir, estamos copiando una estructuraÉ e incrementamos la variable "count". Esta funcion ha cambiado un poco. En la funcion "view_display_one"É el unico cambio consisteÉ en que esta toma la direccion del arreglo "cds" para extraer un apuntador de el. Este es un apuntador en si; este es un cambio menor al igual que en la funcion "view_display_all". Las funciones "quit" y "display_menu" no cambiado. Esto es todo. Ahora revisemos el archivo "utils.c" para ver la funcionÉ "allocate_one_cd" y el archivo "file.c". Este es "utils.c". La funcion "allocate_one_cd" es muy sencillaÉ porque no le pasamos parametros. Esta restituye un apuntador a una nueva estructura de CDs asignada. Simplemente solicitamosÉ esa cantidad de bytes de la memoria. Observe que este es el tamano del contenido del apuntador y no el del apuntador en si. Aunque el apuntador aun no apunta a ningun elemento, la expresion "sizeof *ptr" es valida. Le aseguro que es valida. Si no se puede ejecutar la funcion "malloc", desplegamos un mensaje de errorÉ y salimos del programa. De lo contrario restituimos el valor obtenido de la funcion "malloc". Finalmente, el archivo "file.c" ha cambiado un poco en el sentidoÉ de que ahora aqui tenemos un apuntador a un apuntador o un arreglo de apuntadores. Podemos escribirlo de cualquier manera y aun asi funcionara. Aqui igualmente abrimos el archivo de texto y escribimos esa informacion. Este ahora es un apuntador, pues antes debiamos tomar su direccion, y este es el tamano del contenido de uno de ellos. Este es un pequeno cambio casi imperceptible. La funcion "open_file" tiene un cambio muy similar. Este codigo es similar al que se encarga de crear un CD. Simplemente asignamos el espacio para un CD y lo ubicamos en la siguiente posicion del arreglo. Esta expresion que he resaltado es un apuntador. El contenido de ese apuntador, o el contenido de la expresion de la linea anterior, es copiado desde la variable temporal llamada "cd". Este proceso es igual al copiado de una estructura. Estos cambios no son tan complicados si comprendemos bien los apuntadores a apuntadores. Tal vez usted no los comprende completamenteÉ y tuvo problemas al desarrollar este codigo, asi queÉ sugiero que revise el codigo fuente que proveoÉ hasta comprender completamente lo que ocurre. Si esta es un expresion, preguntese a si mismoÉ Àque valor genera?. Este "new_cds" es un arreglo de apuntadores, asi que uno de ellos debe ser un apuntador individual. Una manera de aprender estos procesos es leerlos en un lenguaje comprensible. Con esto concluimos el capitulo de los apuntadores a apuntadores. Solo nos falta un capitulo.
Tutorial Information
| Course: | C Programming (Español) |
| Author: | Mark Virtue |
| SKU: | 33759 |
| ISBN: | 1-933736-81-X |
| Release Date: | 2007-04-16 |
| Duration: | 21.5 hrs / 139 lessons |
| Captions: | Available on CD and Online University |
| Compatibility: |
Vista/XP/2000, OS X, Linux QuickTime 7, Flash 8 |
VTC Sign up & Benefits
- Unlimited Access
- 98,729 Video Tutorials (23,265 free)
- Video Available as Flash or QuickTime
- Over 1026 Courses
- $30 for One Month Access
- Multi-User Discounts Available
United States 