Título: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: dato000 en 20 Enero 2014, 23:46 pm Buenas gente, necesito una mano, ayudenme con este problema
Poco a poco avanzo con memoria dinamica, me gusta más usar calloc :xD :xD ahora mi problema es que en el problema me estan pidiendo un arreglo multidimensional, tratando de leer multiples cadenas dependiendo de cuantas cadenas quiere el usuario, y ahi es donde me quedo corto a la hora de crear la reserva de la memoria. No creo que sea tan dificil, pero realmente los ejercicios que estoy consultando estan un poco enredados y más que ayudarme, me confunden mucho más porque estan mezclando elementos de cadenas con estruturas y cosas así, necesito una aclaración de uds compañeros. Código
Les agradezco cualquier pista slds Título: Re: Problema leyendo cadenas con memoria dinamica Publicado por: rir3760 en 21 Enero 2014, 02:25 am Debes reservar un bloque para cada una de las cadenas, con esto no debes tener problemas. Ademas la dirección donde se almacena cada una ellas la debes almacenar en otro bloque.
Un ejemplo básico sin reajuste ni validaciones: Código Se deben agregar las validaciones de las funciones de reserva de memoria así como E/S y también se debe agregar la lógica necesaria en el caso de una linea que rebase el limite (reajuste mediante realloc). Un saludo Título: Re: Problema leyendo cadenas con memoria dinamica Publicado por: do-while en 21 Enero 2014, 15:34 pm ¡Buenas!
Lo que no debes hacer es asignar una cantidad de memoria predeterminada a una cadena, lo hagas asignando esa memoria de forma dinamica o estatica, ya que si defines, por ejemplo, una longitud de 1000 caracteres puedes estar desaprobechando memoria si se introduce una cadena de menor longitud o puedes estar perdiendo informacion si tiene mayor longitud. Lo que tienes que hacer es leer caracteres con una cadena de un tamaño determinado (por ejemplo 10 caracteres) y mediante realloc añadirlos a la linea que introduzcas. ¿Como sabras cuando has terminado de leer una linea? utiliza fgets, deja de leer cuando detecta un '\n' y lo almacena en la cadena: Código: hacer Creo que es la unica manera que tienes de leer el contenido de una linea sin saber de antemano cual es la longitud maxima que puede tener. ¡Saludos! Título: Re: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: dato000 en 22 Enero 2014, 01:02 am Muchas gracias por la ayuda, me sirvio bastante las pistas, pues aún no se como implementar bien lo de realloc, pero ya voy entendiendo como trabaja esto, finalmente pude sacarlo como queria, dejo el código, pero pues, como podría adaptarse la parte realloc sin tener un máximo constante para el número de caracteres que debe reservarse en memoria sin que se desperdicie??
Código
Título: Re: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: amchacon en 22 Enero 2014, 14:03 pm Ten en cuenta que hoy en día importa más la eficiencia que la memoria, hoy en día nadie se preocupa por 6-7 bytes de más pero sí un progama tarda menos o no. El realloc es una operación costosa (creas un nuevo vector, copias el contenido al nuevo vector byte a byte y borras el antiguo).
No obstante, te presento una versión con realloc "amortiguado": Código
Es "realloc amortiguado" porque aumento la memoria de 5 en 5 en vez de 1 en 1. Así hago mucho menos reallocs y como mucho desperdicio 4 bytes. Título: Re: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: dato000 en 22 Enero 2014, 15:22 pm Cierto es, pero a modo de laboratorio me ayudo bastante, muchas gracias.
Título: Re: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: rir3760 en 24 Enero 2014, 17:55 pm Un comentario: en este momento los caracteres ' ' no se eliminan correctamente (solo se sobrescriben con el siguiente carácter). Para eliminarlos de la cadena hay que utilizar un bucle mas o menos así:
Código
Un saludo Título: Re: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: amchacon en 24 Enero 2014, 18:04 pm Un comentario: en este momento los caracteres ' ' no se eliminan correctamente (solo se sobrescriben con el siguiente carácter). Para eliminarlos de la cadena hay que utilizar un bucle mas o menos así Te refieres a que sobran caracteres al final no?Serviría el mismo código, solo habría que hacer un realloc con el nuevo tamaño de la cadena y listo. Título: Re: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: rir3760 en 24 Enero 2014, 18:28 pm Te refieres a que sobran caracteres al final no? En parte ya que otro problema se presenta si la cadena es "a b c" (dos espacios como separacion) la cadena resultante sera "a bb cc".Un saludo Título: Re: Problema leyendo cadenas con memoria dinamica [solucionado] Publicado por: dato000 en 24 Enero 2014, 18:37 pm Cierto, se sobreescriben al final, pero ya seria el manejo del indice del arreglo, a modo de laboratorio podrian dejarse los espacios sobrantes como un valor cero o '\0' o usar un realloc para eso, pero pues, el objetivo esta cumplido, yo sigo con otro ejercicio.
|