Autor Tema: extraños problemas con calloc y 18F4620  (Leído 1998 veces)

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

Desconectado luisgorris

  • PIC10
  • *
  • Mensajes: 12
    • Mi Web www.luisgorris.es
extraños problemas con calloc y 18F4620
« en: 14 de Abril de 2012, 06:48:28 »
Extraños porque a veces va y otras no.

Estoy trabajando con memoria dinamica (stdlibm.h) que como sabreis dispone de la funcion calloc. Pues bien:

defino una estructura:

typedef struct{
   bool tipo;
   int var;
   char nombre[20];
} opts;

ahora defino otra que tiene, entre otros, un miembro que es un puntero a la anterior (para hacer un array)

typedef struct{
   int n_ops;
   opts *opciones;
} menu;

y ahora hago otra definicion. un puntero a la estructura principal para hacer un array.

menu *mimenu;

reservo memoria para un array de 10 elementos de menu:

mimenu=calloc(10,sizeof(menu));

y hago un bucle que rellena cada elemento, reservando tambien espacio para las opciones del menu  (20).

for (l=0;l<10;l++)
   {
   mimenu[l].opciones=calloc(20,sizeof(opts));
   for (k=0;k<20;k++)
      strcpy(mimenu[l].opciones[k].nombre,"HOLA");
   }
 
He obviado las comprobaciones de que calloc retorna NULL si no hay mas memoria para haceros mas legible el codigo. El codigo es un simple ejemplo que como vereis no sirve para nada.

Pues bien. En ningun momento da error. Hay memoria suficiente, pero observando el espacio de las estructuras con el debugger, una vez rellenadas, se sobreescriben unas encima de otras pero solo a partir de un determinado numero de elementos. Es decir, si en lugar de reservar 20 elementos para opciones, reservo 10, funciona correctamente. Llega un punto en que si aumento este numero, a pesar de haber memoria suficiente y no retornar nunca NULL en calloc, se machacan datos de unas en otras.


¿¿¿¿¿¿ POR QUE ?????

gracias!!!!
La música es la voz del Alma y las notas sus palabras.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: extraños problemas con calloc y 18F4620
« Respuesta #1 en: 14 de Abril de 2012, 12:50:00 »
Hola

Todo tu código se ve bien... talvez la función calloc tenga bugs. Prueba usando malloc:

Código: [Seleccionar]
mimenu = (menu*)malloc(10* sizeof(opts));

Desconectado luisgorris

  • PIC10
  • *
  • Mensajes: 12
    • Mi Web www.luisgorris.es
Re: extraños problemas con calloc y 18F4620
« Respuesta #2 en: 14 de Abril de 2012, 15:16:41 »
Hola!
ya lo probé. De hecho, la funcion calloc es exactamente lo que has puesto tu. Es malloc pero multiplicando el tamaño por el nº de elementos!!!
Lo peor de todo es que con 6 elementos de la estructura principal funciona. Cuando pongo 7 ya no va!!! manda narices!!!!
Ya lo intenté todo aunque he visto una cosa curiosa:

mira la llamada esta:

strcpy(mimenu[l].opciones[k].nombre,"HOLA");

si conviertise el primer argumento a una direccion pura y dura seria algo asi:

offset=(l*sizeof(mimenu))+(k*sizeof(opciones))+offsetof(opciones,nombre);
strcpy(mimenu+offset,"HOLA");

resulta que offset da mas de 255!!!!!

La vez al compilador no le guste añadir offsets de mas de 255 al puntero pero es absurdo.

Lo he probado tambien con ese arduo sistema de punteros+offsets y tampoco funciona!!!!

Gracias.
La música es la voz del Alma y las notas sus palabras.

Desconectado luisgorris

  • PIC10
  • *
  • Mensajes: 12
    • Mi Web www.luisgorris.es
Re: extraños problemas con calloc y 18F4620
« Respuesta #3 en: 14 de Abril de 2012, 16:06:52 »

¡¡ BUFF!! ME TIENE SATURAO!!!!

todo el proyecto de 1 año parado por esta incongruencia!!!!

 :5] :5] :5] :5] :5] :5] :5] :5] :5]
La música es la voz del Alma y las notas sus palabras.

Desconectado luisgorris

  • PIC10
  • *
  • Mensajes: 12
    • Mi Web www.luisgorris.es
Re: extraños problemas con calloc y 18F4620
« Respuesta #4 en: 14 de Abril de 2012, 16:38:29 »
ya no son tan extraños.....

"A subscript to a RAM array must be at least 1 and not more than 128 elements.  Note that large
arrays might not fit in a bank
. ROM arrays may not occupy more than 256 locations."

los datos de un elemento deben estar en el mismo banco de memoria!!!!

ala... ya lo sabeis!!!
La música es la voz del Alma y las notas sus palabras.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: extraños problemas con calloc y 18F4620
« Respuesta #5 en: 14 de Abril de 2012, 21:46:20 »
¡Cierto! Estás usando un PIC18. Qué bueno que le diste al clavo.

Desconectado luisgorris

  • PIC10
  • *
  • Mensajes: 12
    • Mi Web www.luisgorris.es
Re: extraños problemas con calloc y 18F4620
« Respuesta #6 en: 15 de Abril de 2012, 03:57:46 »
bueno.....ya está arreglado.
una solucion un poco chapuzera pero funciona!!!  :-/

he sustituido char nombre[20]; por char *nombre; reservando para cada miembro su espacio de 20 bytes mediante malloc.

¿que se consigue?..que la longitud de los elementos sea mas pequeña, pero en contrapartida se pieden 2 bytes mas por cada elemento (el puntero a char[20]).

en fin...funcionar funciona, pero ahora me he quedado sin memoria (buaaaaa!!!!)  :oops:

Suerte que compré memorias ram estaticas SPI en microchip y estoy esperando que me lleguen, pero claro.. tengo que rehacer todo el codigo de acceso a la memoria!!!!  :(

Gracias a tod@s!!!!
« Última modificación: 15 de Abril de 2012, 07:41:07 por luisgorris »
La música es la voz del Alma y las notas sus palabras.


 

anything