Autor Tema: Problema cuando trato de guardar datos de un SD en un array  (Leído 2372 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado diegopuntin

  • PIC10
  • *
  • Mensajes: 3
Problema cuando trato de guardar datos de un SD en un array
« en: 28 de Junio de 2016, 11:23:46 »
Hola amigos, cambié mi usuario xq no recordaba el viejo jeje.

Tengo el siguiente problema que es mas un  error mio por falta de conocimiento profundo de C que un error en el programa.

Tengo el siguiente código:

Código: [Seleccionar]
void file_directory (void)  {
  FINFO info;
struct {char *name;} mensaje[255];
int i = 0;
char *aux;
  info.fileID = 0;                             /* info.fileID must be set to 0 */

  while (ffind ("M:*.bmp", &info) == 0) 
{       /* find whatever is in drive "R0:" */
printf ("\n%-32s %5d bytes, ID: %04d", info.name, info.size, info.fileID);
aux = (char*)info.name;
mensaje[i].name = aux;
i++;
  }
  if (info.fileID == 0)  {
    printf ("\nNo files...");
  }
}

Y obtengo lo siguiente:

mensaje[0] = piripipi.bmp
mensaje[1] = piripipi.bmp
mensaje[2] = piripipi.bmp
etc.

Es decir guarda en todas las posiciones la última imagen que encuentra, es como si hiciera un pase por referencia y no por valor. En el adjunto se ve mas claro lo que digo.
Si alguien puede ayudarme. Saludos

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema cuando trato de guardar datos de un SD en un array
« Respuesta #1 en: 28 de Junio de 2016, 11:46:15 »
Código: C
  1. aux = (char*)info.name;
  2.                 mensaje[i].name = aux;

en aux estas guardando la direccion de memoria del campo name de la estructura info y esa direccion no cambia nunca por lo que siempre se almacenará el mismo dato

lo que deberías hacer es copiar la cadena de caracteres apuntada por info name a un buffer auxiliar

sds
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema cuando trato de guardar datos de un SD en un array
« Respuesta #2 en: 28 de Junio de 2016, 11:53:31 »
aca te dejo un ejeplo de una funcion que tengo para listar los archivos en un directrio

Código: C
  1. /* Search a directory for objects and display it */
  2.  
  3. FRESULT fs_scan_files (
  4.     char* path        /* Start node to be scanned (also used as work area) */
  5. )
  6. {
  7.     FRESULT res;
  8.     FILINFO fno;
  9.     DIR dir;
  10.     int i;
  11.     char *fn;   /* This function assumes non-Unicode configuration */
  12.  
  13.     res = f_opendir(&dir, path);                       /* Open the directory */
  14.     if (res == FR_OK) {
  15.         i = strlen(path);
  16.         for (;;) {
  17.             res = f_readdir(&dir, &fno);                   /* Read a directory item */
  18.             if (res != FR_OK || fno.fname[0] == 0) break;  /* Break on error or end of dir */
  19.             if (fno.fname[0] == '.') continue;             /* Ignore dot entry */
  20.             fn = fno.fname;
  21.             if (fno.fattrib & AM_DIR) {                    /* It is a directory */
  22. //                sprintf(&path[i], "/%s", fn);
  23. //                res = fs_scan_files(path);
  24. //                path[i] = 0;
  25. //                if (res != FR_OK) break;
  26.             } else {                                       /* It is a file. */
  27.                 printf("%s/%s\t", path, fn);
  28.                 printf("%d bytes\n", fno.fsize);
  29.             }
  30.         }
  31. //        f_closedir(&dir);
  32.     }
  33.  
  34.     return res;
  35. }

quizás puedas sacar algo que te sirva
con que uC estas trabajando?


sds
-
Leonardo Garberoglio

Desconectado diegopuntin

  • PIC10
  • *
  • Mensajes: 3
Re:Problema cuando trato de guardar datos de un SD en un array
« Respuesta #3 en: 29 de Junio de 2016, 09:16:34 »
Gracias @elgarbe, probe con funciones strings, y pasa algo extraño.

Con strcpy en lugar de almacenarme el contenido me sigue guardando la dirección  :oops:.
Ahora con strcat, concateno todos nombres de los archivos y los almaceno en un vector sin problemas. Por ahora voy a utilizar esta opción que es un poco mas engorrosa y luego trataré de hacer funcionar el strcpy.


Código: C
  1. void file_directory (void)  {
  2.   FINFO info;
  3.         char mensaje2[25][25];
  4.         char mensaje[256];
  5.         int i = 0;
  6.         int a,b;
  7.         int largo = 0;
  8.         char* posicion = 0;
  9.         char aux[256];
  10.        
  11.   info.fileID = 0;                             /* info.fileID must be set to 0 */
  12.   while (ffind ("M:*.bmp", &info) == 0)  
  13.         {       /* find whatever is in drive "R0:" */
  14.                 printf ("\n%-32s %5d bytes, ID: %04d", info.name, info.size, info.fileID);
  15.                 strcat(mensaje,(const char*)info.name);
  16.                 //strcpy(mensaje2[i],(const char*)info.name);
  17.                 i++;
  18.   }

Por otro lado estoy utilizando un LPC1768 en una placa china mini-DK2, y el Keil uVision 4.

Saludos

Desconectado diegopuntin

  • PIC10
  • *
  • Mensajes: 3
Re:Problema cuando trato de guardar datos de un SD en un array
« Respuesta #4 en: 29 de Junio de 2016, 10:11:09 »
Incriblemente era un problema de espacio, porque achique la matriz mensaje2[256][256] a 25 como se ve en el código y funcionó el strcpy. No entiendo xq el Keil no me avisa ni siquiera con un warning.
Gracias y espero que le sirva alguién .

Código: C
  1. void file_directory (void)  {
  2.   FINFO info;
  3.         char mensaje2[25][25];
  4.         char mensaje[256];
  5.         int i = 0;
  6.         int a,b = 0,c = 0;
  7.         int largo = 0;
  8.         char* posicion = 0;
  9.         char aux[256];
  10.        
  11.   info.fileID = 0;                             /* info.fileID must be set to 0 */
  12.   while (ffind ("M:*.bmp", &info) == 0)  
  13.         {       /* find whatever is in drive "R0:" */
  14.                 printf ("\n%-32s %5d bytes, ID: %04d", info.name, info.size, info.fileID);
  15.                 //strcat(mensaje,(const char*)info.name);
  16.                 strcpy(mensaje2[i],(const char*)info.name);
  17.                 i++;
  18.   }

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema cuando trato de guardar datos de un SD en un array
« Respuesta #5 en: 29 de Junio de 2016, 14:00:48 »
Incriblemente era un problema de espacio, porque achique la matriz mensaje2[256][256] a 25 como se ve en el código y funcionó el strcpy. No entiendo xq el Keil no me avisa ni siquiera con un warning.


Del porque seguro KILLER debe saber por que él ha leido mucho de gcc.
Pero yo puedo decirte que el compilador no lleva la cuenta de las variables locales. Solo cuenta las globales.
Justo hace 15 días estaba con un proyecto que me ocupa casi el límite de mi ram y al crear un array grande dentro de una funcion el compilador pasó sin problemas. si ese array lo ponía como global entonces si saltaba error de que no entraba en la ram.

Al notar eso tuve que revisar todo el código viendo cuanta RAM me agregaba cada funcion para chequear si se iba a poder ejecutar sin problemas el programa. No sé si es una burrada y hay alguna forma de trabajar ese tema, pero que existe, existe!

Saludos

PD: Ojo con ese micro que está discontinuado. Yo arranque con los ARM con el hermano mayor el 1769, una verdadera joya... ahora ando más por el lado de ST.
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema cuando trato de guardar datos de un SD en un array
« Respuesta #6 en: 29 de Junio de 2016, 15:53:05 »
mensaje2[256][256]

Citar
The peripheral complement of the LPC1769/68/67/66/65/64/63 includes up to 512 kB of flash memory, up to 64 kB of data memory

256 * 256 * 1 byte = 65536 bytes = 64Kb , no tendrias espacio para ninguna otra variable, ni siquiera el stack, lo cual es ilogico.

Citar
Pero yo puedo decirte que el compilador no lleva la cuenta de las variables locales. Solo cuenta las globales.

Ahi esta el por que el linker no dio error, tu stack ocuparia toda la memoria y le haria falta mas todavia :P

----------------------------------------------------------------

Pd: Usar strncpy y no strcpy,
Ya que tenes la opcion de ponerle un maximo, y evitar un buffer overflow en el caso que no exista el '\0'
« Última modificación: 29 de Junio de 2016, 16:13:22 por KILLERJC »


 

anything