TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: blackcat en 07 de Marzo de 2008, 01:43:15
-
Hola ... tengo un problema de los buenos ... :( ... de esos que te rompen el coco ....
Resulta que tengo un funcion que realiza un conjunto de operaciones sobre un arreglo de datos, resulta que este arreglo de datos no tiene un tamano fijo y para poder hacer la operaciones debo crear primero varios buffers en memoria dinamica.
Tengo algo como asi:
void Assign_ptrs( char * file, char tamano )
{
unsigned int * a_file_0 = (unsigned int * ) malloc( tamano * 2 );
unsigned int * a_file_1 = (unsigned int * ) malloc( tamano * 4 );
.......
Realizo la operaciones ....
.......
free( a_file_0 );
free( a_file_1 );
}
Todo sale bien cuando se ejecuta la rutina una vez ... pero cuando llamo la rutina por segunda vez el condenado pic se reinicia despues de la linea donde esta el malloc ....
Ya revise todo .. el puntero a_file no cambia ... hay espacio suficiente ... etc ...
Estoy usando C30, el heap es de 4096 bytes y el stack minimo de 128 bytes ... no se cual es el problema puesto que esta es mi primera vez usando memoria dinamica en un microcontrolador ... ayuda por favor!!!!
-
Ok ... ya revisando mejor. El problema se da cuando hay dos malloc dentro de la rutina .... pero porque esto es asi ???? .... lo solucione usando un malloc mas grande ... en vez de dos pequenos ....
Pero todavia no entiendo el problema ... si la primera vez lo hace bien pero no asi la segunda !
-
Nose, a lo mejor mi solucion no sea tan elegante pero no veo por qué no tenga que funcionar:
unsigned int * a_file_0[tamano*2];
unsigned int * a_file_1[tamano*4];
Segun tengo entendido, las variables locales son memoria dinamica de por si... cuando sales de una funcion la memoria supuestamente se libera... cosa que no ocurre con las variables globales, donde yo veo mas justificado el uso de malloc.
-
Mmmm dejame revisar ... no soy muy experto en este tema ... pero muchas gracias por la sugerencia!
-
Muchas gracias por tu sugerencia ... la verdad no sabia que se podian hacer declaraciones dinamicas de arreglos ... :lol: :lol: pero bien ... todos los dias se aprende algo nuevo ... :-/
Solo me falta probar el programita ....
-
¿Te ha funcionado Blackcat?
Es muy elegante la solución de Manex, pero me gustaría saber si furula.
-
Segun tengo entendido, las variables locales son memoria dinamica de por si... cuando sales de una funcion la memoria supuestamente se libera.
Digamos que si, las variables locales se gestionan desde el Stack, y son liberadas automaticamente al salir de la funcion, se dice automatica porque al regresar de la funcion o subrutina el Stack toma el valor siguiente a la funcion llamadora.
cosa que no ocurre con las variables globales, donde yo veo mas justificado el uso de malloc.
Exacto, el uso de malloc se aplica a variables globales que no necesitan tener tanta persistencia en el tiempo, es decir una variables que solo es utilizada por 2 o mas funciones, pero despues no se va a utilizar mas, su uso optimiza el uso de la RAM.
Nose, a lo mejor mi solucion no sea tan elegante pero no veo por qué no tenga que funcionar:
unsigned int * a_file_0[tamano*2];
unsigned int * a_file_1[tamano*4];
En ANSI C esto no se puede hacer, el tamaño del indice tiene que ser constante al momento de la compilacion, nose en C30, por otro lado hay que tener en cuenta el tamaño del Stack para asignar arrays de esta manera, sino un stack overflow puede producirse.
Saludos !
-
Bueno les comento:
Si funciono el código que me dijo MANEX:
unsigned int * a_file_0[tamano*2];
unsigned int * a_file_1[tamano*4];
claro las variables son locales y no tiene problemas. .. al igual que RICHI777 yo también pensaba que eso no se podía hacer .. pero resultó que si funciona y muy bien ... no me da problemas esa parte de código ... Revise de arriba para abajo el libro de "El Lenguaje de Programacion C" de Brian W. Kernighan y Dennis M. Ritchie y no dice nada al respecto .. :?
Pero el problema todavia persiste si hay dos malloc consecutivos!
-
Queria rescatar este tema del fondo ... otra vez ...
Siempre tengo problemas cuando hago esto:
void main (void)
{
void * ptr1 = malloc( 4 );
void * ptr2 = malloc( 8 );
.....
}
El primer malloc lo hace bien ... el segundo da error ... ¿¿porque??
-
:-/
JA!! Yo sabia que habia algo malo ... ya pensaba que me estaba volviendo loco, esto es lo que dice el FIXED ISSUES de la nueva version 3.11 de C30
C30-505 - malloc() fails even though there is enough heap available
Con el 3.11 ya no da error !! :P :P :P