Retroceder   Foros del Web > Temas generales de computación > Programación > C/C++

Respuesta
 
Herramientas Desplegado
Antiguo 01-may-2008, 11:59   #1 (permalink)
JaviPrieto_89 ha deshabilitado el karma
 
Fecha de Ingreso: mayo-2008
Mensajes: 1
Triste 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);
}
JaviPrieto_89 está desconectado   Responder Citando
Antiguo 01-may-2008, 12:19   #2 (permalink)
a2a2 tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Mensajes: 303
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.
a2a2 está desconectado   Responder Citando
Respuesta
No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 02:00.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93