Título: [C] Tratando de crear array de strings Publicado por: huchoko en 8 Junio 2019, 20:54 pm Buenas, he estado tratando de crear un array de strings, para luego leer todas sus strings.
Código El tema es que funciona, pero luego de imprimir la string correctamente le sigue basura. por ejemplo, file_names_in_dir[0] es "HELLO TXT", pero luego la string sigue, pero con basura. Alguna idea? Gracias. Título: Re: [C] Tratando de crear array de strings Publicado por: @XSStringManolo en 8 Junio 2019, 21:16 pm Puedes publicar todo el código?
Estás usando variables como ++files_in_directory; Qué no sé exactamente lo que hace. Qué es la basura? Direcciones de memoria? Espacios? El caracter null terminator \o? Título: Re: [C] Tratando de crear array de strings Publicado por: K-YreX en 8 Junio 2019, 21:33 pm Ten en cuenta que no estás copiando los datos de <drce[indice].file_name> en <file_names_in_dir[indice]>... Lo que estás haciendo es que el puntero del array de punteros que has creado apunte al mismo lugar que el otro <char*>. Entonces si se modifica el valor de <drce[indice].file_name> antes de mostrar tu array, éste último mostrará el nuevo contenido que puede no ser lo que tú esperabas.
Y como bien dice @string Manolo, con ese trocillo de código no podemos ayudar mucho más. Recordarte también que para que la cadena termine necesitas el caracter '\0' que igual no aparece y por eso la cadena no termina donde debería. Título: Re: [C] Tratando de crear array de strings Publicado por: huchoko en 8 Junio 2019, 21:40 pm Puedes publicar todo el código? El files_in_directory no esta relacionado. Creo que la basura es un salto extraño de memoria, ya que de ahi me imprime una string que no tiene nada que ver. Ese string basura no se relaciona de ninguna manera con el array de string que trato de imprimir.Estás usando variables como ++files_in_directory; Qué no sé exactamente lo que hace. Qué es la basura? Direcciones de memoria? Espacios? El caracter null terminator \o? Ah y el código completo (comentarios en ingles, pero los traduzco): Código
Título: Re: [C] Tratando de crear array de strings Publicado por: K-YreX en 8 Junio 2019, 22:06 pm Diría que el error son los <continue>...
Piensa en una iteración <i = 0> y se cumple una condición y por tanto un <continue>. Ahora <i = 1> pero no se han ejecutado las líneas siguientes al <continue> en esa iteración por lo que no se ha ejecutado la línea 28. Ahora no se ejecuta ningún <continue> (recordemos i = 1). Estás guardando <drce[1].file_name> pero lo estás guardando en <files_names_in_dir[1]>... Qué hay en <files_names_in_dir[0]>??? Basura. Tienes que usar una variable auxiliar que sólo se incremente si se ejecuta la línea 28 para guardar siempre en posiciones consecutivas. Por algo no se recomiendan usar ese tipo de sentencias <continue>, <break>, etc. Yo cambiaría eso e implementaría el mismo comportamiento con un <bool> o <int> si no quieres usar <bool>, pero vamos, evitando sentencias de salto. Título: Re: [C] Tratando de crear array de strings Publicado por: huchoko en 8 Junio 2019, 22:37 pm He tratado esto, pero sigue igual, imprime 16 veces la string correctamente y otras 16 basura.
Código O es que soy tonto o no he dormido nada que estoy bien palurdo. :P Título: Re: [C] Tratando de crear array de strings Publicado por: K-YreX en 8 Junio 2019, 23:00 pm La nueva variable <aaa> (que espero que le pongas un nombre mejor :xD) controla sólo <files_names_in_dir>. Es decir que tendría que ser:
Código
De todas formas, por si el error no es sólo ese y no consigues solucionarlo, para la próxima pon la salida que obtienes literalmente para que veamos mejor a qué se puede deber. Yo quitaría los <continue> de todas formas y los <break> como ya te he comentado... :silbar: Título: Re: [C] Tratando de crear array de strings Publicado por: huchoko en 8 Junio 2019, 23:16 pm La nueva variable <aaa> (que espero que le pongas un nombre mejor :xD) controla sólo <files_names_in_dir>. Es decir que tendría que ser: El resultado es el mismo, sobre los continue después lo arreglo...Código
De todas formas, por si el error no es sólo ese y no consigues solucionarlo, para la próxima pon la salida que obtienes literalmente para que veamos mejor a qué se puede deber. Yo quitaría los <continue> de todas formas y los <break> como ya te he comentado... :silbar: Bueno, aca la salida literal: Código: HELLO TXT (16 veces) Título: Re: [C] Tratando de crear array de strings Publicado por: K-YreX en 8 Junio 2019, 23:35 pm Es posible que esa segunda línea sea el contenido de alguno de los ficheros.
He de decir que no sé cómo funciona la siguiente instrucción por lo que doy por hecho que su funcionamiento es correcto: Código
Tampoco sé si la salida que obtienes es a partir de los <printf()> y <kputs()> que se ven en la función o la obtienes mostrando después el contenido de <files_names_in_dir>. Además la variable <aaa> la has declarado globalmente por lo que puede que estés modificando su valor en otro punto del programa o estés llamando más de una vez a esa función. Y si de paso puedo conocer la estructura de directorios y ficheros con los que estás trabajando, es decir, su nombre. Y que compruebes que esa segunda salida no sea el contenido de alguno de los ficheros. Lo siento pero es que hay demasiadas cosas que me estoy teniendo que imaginar... Título: Re: [C] Tratando de crear array de strings Publicado por: huchoko en 8 Junio 2019, 23:39 pm Igualmente gracias. Es raro por que antes si funcionaba sin problemas, y se rompio todo de la nada.
Saludos :) Título: Re: [C] Tratando de crear array de strings Publicado por: RayR en 9 Junio 2019, 00:08 am Serviría tener más datos, como ya te indicaron. Sin embargo, hay unas cuantas cosas claramente incorrectas. Por ejemplo, ¿cómo vas a saber cuántos elementos termina teniendo file_names_in_dir? Lo declaraste con tamaño de 16, pero podría terminar con menos. Por ejemplo, si el directorio que estás explorando sólo tiene 10 entradas válidas, a partir de esa posición, el arreglo contendrá punteros inválidos. Si intentas imprimir 16, obviamente se van a producir errores. Peor aún, si esta línea resulta ser true cuando i vale 0:
Código
Se ejecutará el break, con lo que file_names_in_dir estará vacío, así que en cuanto trates de imprimir cualquiera de sus elementos habrá problemas. Finalmente, ¿qué pasa si el directorio contiene, digamos, 30 archivos? Vas a estar almacenando datos en file_names_in_dir[16] hasta file_names_in_dir[29], que no son posiciones válidas, por lo que estarás sobrescribiendo memoria ocupada probablemente por otras variables del programa. Para empezar deberías hacer cambios como que read_directory devuelva un int (o size_t, o lo que quieras) indicando el número de elementos que realmente termina teniendo file_names_in_dir. Y verifica que no te pases del límite. En esencia, haz estos cambios: Código
Código: Ni idea de donde salio la ultima string, talvez sucedio la gran casualidad que entre en la memoria de otro proceso que tiene ese string. Imposible. Todos los sistemas operativos modernos aíslan los procesos, por lo que no hay manera de acceder a la de otro de forma accidental. Título: Re: [C] Tratando de crear array de strings Publicado por: huchoko en 9 Junio 2019, 00:33 am Bien, ha vuelto a funcionar otra vez milagrosamente y espero que no se vuelva a romper.
El tema es este ahora: Código Se ejecuta 3 veces mas sin razón aparente, sin estar dentro de ningún ciclo (for, while, do-while...) Cuando se ejecuta esas 3 veces mas no imprime el elemento que está en s[2], pero la primera vez si. No es el problema que no se imprima las tres veces, es por que se ejecuta tres veces esa línea sin razón aparente Código
Título: Re: [C] Tratando de crear array de strings Publicado por: RayR en 9 Junio 2019, 00:53 am Bien, ha vuelto a funcionar otra vez milagrosamente Ése es el sello distintivo de un error de memoria. Un programa con un problema así a veces funciona y a veces no. Las cosas no se arreglan por arte de magia. Si el programa no funciona siempre, tiene un error. No hay más. Esto: Código
No soluciona nada. De hecho, no cambia nada. Las variables globales no inicializadas explícitamente, son automáticamente inicializadas a 0 (en el caso de los arreglos, todos sus elementos son inicializados a 0). Es decir, exactamente eso que hiciste ahí, el compilador ya lo hacía por ti antes. Y ya te mencioné al menos 3 casos en los que tienes garantizado que tu programa fallará, y es probable que alguno de ellos se esté dando y es lo que te está causando problemas., por lo que hay la posibilidad de que las modificaciones que te puse lo solucionen. No lo garantizo, obviamente, pero es posible. Si no lo intentas ni sigues nuestras sugerencias, no hay mucho más que hacer. Título: Re: [C] Tratando de crear array de strings Publicado por: huchoko en 9 Junio 2019, 02:22 am No es que no lo haya tratado, publicaste tu respuesta cuando estaba escribiendo la mía, perdón por eso.
La razón de por que se repite cuatro veces es por que la función read_bpb se ejecutaba 4 veces por un for. Problema solucionado, gracias y perdón por gastar su tiempo. Saludos. Título: Re: [C] Tratando de crear array de strings Publicado por: RayR en 9 Junio 2019, 02:30 am Nah, no pasa nada. Los que estamos aquí es porque nos gusta tratar de ayudar/colaborar. Es sólo que a veces hay gente que pida ayuda, y cuando se les da una opción la rechazan sin probar. Me ha tocado ver usuarios a los que les dan una solución que claramente es correcta, y responden: "mmm, no, no creo que sea eso. Mejor intentaré hacer esto otro...", y dices: ¿entonces para qué #%& piden ayuda? :P. Pero no es tu caso.
Saludos, y si tienes más preguntas, no dudes en postearlas. |