elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
05 Septiembre 2008, 13:41  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  Duda en variable estatica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Duda en variable estatica  (Leído 179 veces)
Leber

Desconectado Desconectado

Mensajes: 249

"Las estrellas se apagan..."


Ver Perfil
Duda en variable estatica
« en: 20 Febrero 2008, 19:35 »

Buenas, estaba viendo un trozo de codigo y no comprendi:

les dejo el trozo de la funcion y luego comentamos la duda:

Código:
void dir(char *path) //funcion recursiva; se llama asimisma para analizar los subdirectorios de directorios
{

  DIR *dirp;
  struct dirent *dp;
  static nivel=1;
  struct stat buf;
  int ok,i;
 char fichero[256],tipo;
                                                       

                                                        if((dirp=opendir(path))==NULL)
                                                             {
                                                                    perror("error path");
                                                                    exit(-1);
                                                             }

                                                         
                                                               
                                                    while((dp=readdir(dirp))!=NULL){
                                                         
                                                       if(EQ(dp->d_name,"..") || EQ(dp->d_name,"."))
                                                                   continue;
                                                       
                                                         sprintf(fichero,"%s/%s",path,dp->d_name);

                                                        if(stat(fichero,&buf)==-1){
                                                            printf("Haciendo stat a fichero: %s\n",fichero);
                                                            perror("stat");
                                                           
                                                              }
                           
                                                  if((buf.st_mode & S_IFMT)==S_IFDIR)
                                                       {
                                                           
                                                              for(i=0;i<nivel;i++)
                                                                   printf("\t");
                                                           fprintf(stdout,"(d) %s\n",dp->d_name);
                                                           ++nivel;
                                                            dir(fichero);
                                                            --nivel;
                                                             
                                                         
                                                       }
                                           else{
                                                     for(i=0;i<=nivel;i++)
                                                              printf("\t");
                                                     fprintf(stdout,"(f) %s\n",dp->d_name);
                                         }
                           }
}

Esta es la funcion, consiste en un simple ls, solo que desplazando los directorios/ficheros que se encuentran en otros subdirectorios y demas... la salida es mas o menos asi:

Código:
./dir3 directorios/
                (f) pepa
        (d) dir1
                        (f) juanca
                        (f) antonio
                        (f) oliete
        (d) dir2
                        (f) cesar
                        (f) pedro
                (f) pepe
                (f) xavi

Como vemos, los ficheros que forman parte de un subdirectorio se tabulan mas.Mi duda consiste en esto:

Código:
if((buf.st_mode & S_IFMT)==S_IFDIR)
                                                       {
                                                           
                                                              for(i=0;i<nivel;i++)
                                                                   printf("\t");
                                                           fprintf(stdout,"(d) %s\n",dp->d_name);
                                                           ++nivel;
                                                            dir(fichero);
                                                            --nivel;
                                                             
                                                         
                                                       }

Mientras i sea menor que nivel tabulamos, eso correcto, luego imprimimos el nombre de directorio, incrementamos nivel y llamamos otra vez a la funcion para examinar los ficheros del directorio. Vale, mi pregunta es, como se decrementa nivel? Porque segun lo veo yo, siempre que entre en el if, se llama a la funcion otra vez, y no da tiempo a que se decremente, no se, quiza soy yo que estoy espeso espeso hoy, y es muy posible que sea esto, pero esque no le veo el que.

Ya que, si el fichero a analizar es directorio, incrementamos nivel, y le pasamos de modo recursivo el path para analizar los ficheros que contiene, pero viendolo asi, nunca se decrementaria nivel.

Era una duda, a ver si me la pueden solucionar, gracias de antemano
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Flakito81

Desconectado Desconectado

Mensajes: 317



Ver Perfil
Re: Duda en variable estatica
« Respuesta #1 en: 20 Febrero 2008, 22:14 »

La clave está en:
Código
     dir(fichero); 
    --nivel;
 
dir es una función recursiva, cuando haces la llamada se guardan todos los datos de la función hasta llegar ahí, luego cuando sales de la recursividad los datos se van extrayendo de la pila del sistema y se ejecuta el código que hay por debajo, en este caso el --nivel que es el encargado de los '\t'

Minitraza:
- entras en directorio
- se encuentra un subdirectorio, nivel toma el valor 1, se imprime, se guardan los datos en la pila del sistema, se listan todos ficheros
- como no hay mas ficheros que listar se termina la función, como fue llamada recursivamente recuperamos los datos de la pila y continuamos por donde estabamos, es decir vamos a --nivel luego nivel = 0
-se encuentra subdirectorio2 y se repiten los pasos.

Espero haberte ayudado algo.

Suerte!
En línea
Leber

Desconectado Desconectado

Mensajes: 249

"Las estrellas se apagan..."


Ver Perfil
Re: Duda en variable estatica
« Respuesta #2 en: 24 Febrero 2008, 13:51 »

Mas o menos te entiendo, pero a que te refieres con que se guarda los datos en la pila?

Las variables, su valor y demas son guardadas, y luego al acabar la funcion se van extrayendo?

No entendi muy bien, pero gracias de todos modos, un saludo
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
Flakito81

Desconectado Desconectado

Mensajes: 317



Ver Perfil
Re: Duda en variable estatica
« Respuesta #3 en: 24 Febrero 2008, 16:10 »

Las variables, su valor y demas son guardadas, y luego al acabar la funcion se van extrayendo?

Digamos que al acabar la ejecucion de la subrutina deben restaurarse los registros de trabajo al estado anterior a la llamada. Lo que guardamos es la direccion de retorno para saber por donde vamos. Busca en google informacion sobre la resursividad que te será de gran ayuda para entenderlo.

Un saludo

En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC