C/Visual C - sin memoria en c

   
Vista:

sin memoria en c

Publicado por javi (1 intervención) el 01/05/2008 19:49:42
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 <sysstat.h>
#include <sys ypes.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)*(strlen(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(" Memoria insuficiente, no se podr  continuar. %d",CONT);
getch();
exit(1);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:sin memoria en c

Publicado por Nelek (818 intervenciones) el 02/05/2008 09:28:19
Hola,

así a priver vistazo solo me ha llamado la atencion que te has olvidado de liberar FICHERO, liberas AUX_FICHERO y DIRECTORIOS pero el tercero no.

Por otro lado...

Sabemos que segun la estructura de ficheros, el maximo tamanyo de una ruta (incluyendo el nombre del fichero) es 256. Porque no te creas la cadena AUX_FICHERO con dicho largo y la rellenas con la ruta o la borras segun te convenga en lugar de ir usando el malloc?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar