Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Sin memoria en C

Estas en el tema de Sin memoria en C en el foro de C/C++ en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 01/05/2008, 11:59
 
Fecha de Ingreso: mayo-2008
Mensajes: 2
Antigüedad: 16 años, 1 mes
Puntos: 0
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);
}
  #2 (permalink)  
Antiguo 01/05/2008, 12:19
 
Fecha de Ingreso: marzo-2008
Mensajes: 303
Antigüedad: 16 años, 2 meses
Puntos: 4
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.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:45.