![]() |
Sin memoria en C No corrijan las pequenieces que puede haber, pero el GRAN problema, es que al usar este código en un directorio con pocos archivos o directorios, corre joya, pero si lo uso en algun directorio muy grande, me termina diciendo que no hay memoria, ya que la función al ser recursiva, va consumiendo y consumiendo más memoria. Para hacer esto, uso el Turbo C 3.1, Estaba trabajando con el modelo SMALL de memoria, asique pense en hacer los punteros lejanos para poder acceder al MB, y seleccione el modelo HUGE y declare AUX_FICHEROS como char huge *AUX_FICHEROS, pero sigue sin funcionar =(. La variable CONT es ver cuantas veces se pidio memoria a malloc, solo para control personal. Si alguien pudiese decirme como mejorar esto se lo agradecería. #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <dir.h> #include <dirent.h> #include <string.h> #include <sys\stat.h> #include <sys\types.h> unsigned long Calcula_Tamanio(char *, unsigned long); void Falta_Mem(); int CONT=0; void main() { char *DR="d:\\tc"; FILE *F; int TAM=0; clrscr(); printf("%ld",Calcula_Tamanio(DR,0)); getch(); } unsigned long Calcula_Tamanio(char *FICHERO, unsigned long TAMANIO) { FILE *FP_FICHERO; char *AUX_FICHERO; DIR *PS_DIR; struct dirent *DIRECTORIOS; struct stat INFO_FICHERO, INFO_AUX_FICHERO; stat(FICHERO,&INFO_FICHERO); if(!(PS_DIR=opendir(FICHERO))) { printf("No se ha podido calcular el tama¤o de %s",FICHERO); return -1; } DIRECTORIOS=readdir(PS_DIR); while(DIRECTORIOS!=NULL) { //Genero AUX_ORIGEN de acuerdo al largo del directorio if(!(AUX_FICHERO=(char*)malloc(sizeof(char)*(strle n(FICHERO)+strlen(DIRECTORIOS->d_name)+2)))) Falta_Mem(); //El nuevo directorio o archivo se carga en AUX_ORIGEN para chequear que es? strcpy(AUX_FICHERO,FICHERO); strcat(AUX_FICHERO, "\\"); strcat(AUX_FICHERO,DIRECTORIOS->d_name); //Cargo una estructura del nuevo archivo o directorio stat(AUX_FICHERO,&INFO_AUX_FICHERO); //Verifico si es un directorio. Si es un directorio,,,entro if(INFO_AUX_FICHERO.st_mode==ES_DIR) if(strcmpi(DIRECTORIOS->d_name, ".")!=0 && strcmpi(DIRECTORIOS->d_name, "..")!=0) //Si hay otro directorio dentro entro /*RECURSIVIDAD*/ TAMANIO=Calcula_Tamanio(AUX_FICHERO, TAMANIO); else; else TAMANIO=TAMANIO+INFO_AUX_FICHERO.st_size; DIRECTORIOS=readdir(PS_DIR); } closedir(PS_DIR); free(AUX_FICHERO); free(DIRECTORIOS); return TAMANIO; } void Falta_Mem() { printf("\nMemoria insuficiente, no se podr continuar. %d",CONT); getch(); exit(1); } |
Re: Sin memoria en C En realidad la variable AUX_FICHERO no tiene necesariamente que ser memoria dinámica, pues aunque se use en una función recursiva, una vez que sales de un nivel y vuelves al anterior ya no la utilizas más (de hecho haces el free correctamente). Yo te sugiero que dado que tienes problemas de memoria declares AUX_FICHERO como memoria estática suficientemente grande para el path mas largo y la rellenes con el valor necesario en cualquier nivel de recursividad. |
| La zona horaria es GMT -6. Ahora son las 19:54. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.