elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Tratando de crear array de strings
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Tratando de crear array de strings  (Leído 4,184 veces)
RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: [C] Tratando de crear array de strings
« Respuesta #10 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
  1. if (drce[i].file_name[0] == 0x00) {

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
  1. int read_directory(void)
  2. {
  3. ...
  4. ...
  5. if (aaa < 16) {
  6.    file_names_in_dir[aaa] = drce[i].file_name;
  7.    ++aaa;
  8. }
  9. }
  10. return aaa;
  11. }

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.


En línea

huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: [C] Tratando de crear array de strings
« Respuesta #11 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
  1. printf("\nFile %s", s[2])
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
  1. /* Problema solucionado con padding */
  2. char* s[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  3. void read_directory(void)
  4. {
  5. /* Read the directory */
  6. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
  7.  
  8. int aaa = 0;
  9. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  10. if (drce[i].file_name[0] == 0x00) {
  11. printf("\n-- END --\n");
  12. break;
  13. }
  14. /* File has a long file name */
  15. if ((drce[i].attributes & 0x0F) == 0x0F) {
  16. s[i] = 0;
  17. continue;
  18. }
  19.  
  20. /* "File" is a directory */
  21. if ((drce[i].attributes & 0x10) == 0x10){
  22. printf("Directory name: %s\n", drce[i].file_name);
  23. s[i] = 0;
  24. continue;
  25. }
  26.  
  27. /* If the first byte of file_name is 0xE5, means that the file is deleted */
  28. if (drce[i].file_name[0] == FAT32_DELETED_FILE)
  29. continue;
  30. /* This should print the names of the files that are in the root directory... */
  31. printf("File name: %s, %i bytes.\n", drce[i].file_name, drce[i].file_size);
  32. s[aaa] = drce[i].file_name;
  33. ++aaa;
  34. ++files_in_directory;
  35. }
  36. }
  37.  
  38. void read_bpb(uint32_t offset)
  39. {
  40. /* Read the BPB (BIOS parameter block) - Lee el BPB (Bloque de parámetros de la BIOS) */
  41. hd_read(offset, FATBPB_SIZE, (uint8_t*)&bpb);
  42.  
  43. fat_start = (offset + bpb.reserved_sectors);
  44. fat_size = bpb.sectors_per_fat;
  45. start_of_data = fat_start + (fat_size * bpb.fats_number);
  46. start_of_root = start_of_data + ((bpb.cluster_root - 2) * bpb.sectors_per_cluster);
  47. root_dir_sects = ((bpb.root_dir_entries * 32) + (bpb.bytes_per_sector - 1) / bpb.bytes_per_sector);
  48. data_sects = (bpb.reserved_sectors + bpb.fats_number * (bpb.sectors_per_fat + root_dir_sects));
  49. cluster_count = data_sects / bpb.sectors_per_cluster;
  50.  
  51. read_directory();
  52. printf("\nFile %s", s[2]); /* Se ejecuta 3 veces sin razon */
  53. }


En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: [C] Tratando de crear array de strings
« Respuesta #12 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
  1. /* Problema solucionado con padding */
  2. char* s[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

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.
En línea

huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: [C] Tratando de crear array de strings
« Respuesta #13 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.
En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: [C] Tratando de crear array de strings
« Respuesta #14 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.
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reordernar array de strings aleatoriamente (Ayuda)
Programación Visual Basic
katanaia 2 1,877 Último mensaje 25 Noviembre 2008, 19:27 pm
por cobein
Separación de caracteres en Strings y guardado en array
Java
Debci 4 6,092 Último mensaje 18 Septiembre 2009, 06:39 am
por Skeletron
FindWindow con array de strings
Programación C/C++
while 4 2,655 Último mensaje 9 Noviembre 2010, 21:56 pm
por while
(Ayuda) Array de strings.
Programación C/C++
S++ 4 2,854 Último mensaje 11 Junio 2015, 03:59 am
por rir3760
Problema con array de strings
Programación C/C++
JaimeGc05 3 1,719 Último mensaje 20 Enero 2019, 20:44 pm
por JaimeGc05
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines