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

Bucle inusual

Estas en el tema de Bucle inusual en el foro de C/C++ en Foros del Web. Buenas, tengo un problema con un bucle que no termina y se repita dos veces aun así coloque un break, la linea es la 137. ...
  #1 (permalink)  
Antiguo 14/12/2012, 02:17
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Bucle inusual

Buenas, tengo un problema con un bucle que no termina y se repita dos veces aun así coloque un break, la linea es la 137.

Código C:
Ver original
  1. /*
  2.  
  3.     @author:        Alberto Jsé <guzzan0>
  4.     @package:       pkgrmd - This package remove all dependences alone of a applications.
  5.  
  6. */
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <sys/types.h>
  12. #include <dirent.h>
  13.  
  14. #define VERSION "Dannie27"
  15.  
  16. void search_package(char *package_name);
  17. void depends_parser(FILE *pkgfile_dir);
  18.  
  19. int main(int argc, char *argv[])
  20. {
  21.     if (argc > 1)
  22.     {
  23.         if (strncmp(argv[1], "--info", 6) == 0)
  24.         {
  25.             printf("Written by Alberto Jse <guzzan0>\nVersion: %s\n\nPlease report bug to [email protected]\n", VERSION);
  26.         }
  27.         else if (strncmp(argv[1], "--help", 6) == 0)
  28.         {
  29.             printf("Usage: pkgrmd <commands> or <package to remove>\nExample: pkgrmd wine, pkgrmd xorg, etc.\n\n");
  30.             printf("Commands avaiable: \n\n--help (Show this help) \n--info (Show the current version and author)\n");
  31.         }
  32.         else
  33.         {
  34.             if ((strlen(argv[1])) > 20)
  35.             {
  36.                 printf("[pkgrmd] Sorry, max name package is 20 characteres. \n");
  37.             }
  38.             else
  39.             {
  40.                 search_package(argv[1]);
  41.             }
  42.         }
  43.     }
  44.     else
  45.     {
  46.         printf("[pkgrmd] Try \"pkgdmr --help\" for more information. \n");
  47.     }
  48. }
  49.  
  50. void search_package(char *package_name)
  51. {
  52.     FILE* package_installed = fopen("/var/lib/pkg/db", "r");
  53.    
  54.     char *package_n, package_file_lines[225];
  55.     int package_install = 0;
  56.  
  57.     package_n = (char *) malloc(strlen(package_name)+2);
  58.  
  59.     if (!package_n)
  60.     {
  61.         puts("Malloc can not create more space.");
  62.         exit(0);
  63.     }
  64.    
  65.     sprintf(package_n, "%s\n", package_name);
  66.    
  67.     if (package_installed != NULL)
  68.     {
  69.         while (fgets(package_file_lines, sizeof(package_file_lines), package_installed) != NULL)
  70.         {
  71.             if (strcmp(package_file_lines, package_n) == 0)
  72.             {
  73.                 package_install = 1;
  74.                 break;
  75.             }
  76.             else
  77.             {
  78.                 package_install = 0;
  79.             }
  80.         }
  81.         free(package_n);
  82.     }
  83.     else
  84.     {
  85.         puts("[pkgrmd] I can't open file: /var/lib/pkg/db - Sorry");
  86.         exit(0);
  87.     }
  88.  
  89.     fclose(package_installed);
  90.  
  91.     if (package_install == 1)
  92.     {
  93.         DIR *ports_directory, *package_directory;
  94.         struct dirent *structure_directory, *structure_package;
  95.  
  96.         char ports_base[12] = "/usr/ports/", *package_directories = NULL;
  97.  
  98.         if ((ports_directory = opendir(ports_base)) != NULL)
  99.         {
  100.             while ((structure_directory = readdir(ports_directory)) != NULL)
  101.             {
  102.                 if (*structure_directory->d_name == '.')
  103.                     continue;
  104.  
  105.                 package_directories = (char *) malloc(strlen(ports_base)+strlen(structure_directory->d_name)+1);
  106.                 if (!package_directories)
  107.                 {
  108.                     puts("Malloc can't create more space.");
  109.                     exit(0);
  110.                 }
  111.                
  112.                 sprintf(package_directories, "%s%s/", ports_base, structure_directory->d_name);
  113.  
  114.                 if ((package_directory = opendir(package_directories)) != NULL)
  115.                 {
  116.                     while ((structure_package = readdir(package_directory)) != NULL)
  117.                     {
  118.                         if (*structure_package->d_name == '.')
  119.                             continue;
  120.                            
  121.                         if (strcmp(package_name, structure_package->d_name) == 0)
  122.                         {  
  123.                             FILE *pkgbuild;
  124.                             char *depends;
  125.                            
  126.                             depends = (char *) malloc(strlen(package_directories)+strlen(structure_package->d_name)+9);
  127.                             if (!depends)
  128.                             {
  129.                                 puts("Malloc can't create more space.");
  130.                                 exit(0);
  131.                             }
  132.                            
  133.                             sprintf(depends, "%s%s/Pkgfile", package_directories, structure_package->d_name);
  134.  
  135.                             if ((pkgbuild = fopen(depends, "r")))
  136.                             {
  137.                                 puts("s");
  138.                                 fclose(pkgbuild);
  139.                             }
  140.                             else
  141.                             {
  142.                                 printf("[pkgrmd] The package %s not have file pkgfile. Renew pkgfile with commands \"ports -u\" and try again. \n", structure_package->d_name);
  143.                             }
  144.  
  145.                             break;
  146.                         }
  147.                     }
  148.                     puts("test");
  149.                 }
  150.                 else
  151.                 {
  152.                     printf("[pkgrmd] This error no is fatal. But I can't open dir: %s%s", package_directories, structure_package->d_name);
  153.                     exit(0);
  154.                 }
  155.             }
  156.             closedir(ports_directory);
  157.             closedir(package_directory);
  158.         }
  159.         else
  160.         {
  161.             printf("[pkgrmd] I cant read directory: %s, you have installed prt-get?", ports_base);
  162.             exit(0);
  163.         }
  164.     }
  165.     else
  166.     {
  167.         printf("[pkgrmd] The package %s not is installed. \n[pkgrmd] Please verify package with: prt-get search [name_package] \n", package_name);
  168.         exit(0);
  169.     }
  170. }

Como una duda adicional, ¿estará mal abusar de la función exit()? y he visto ejemplos donde con malloc se tiene que multiplicar lo que queremos abrir por sizeof(char*) ¿tengo que hacerlo?

Muchas gracias, saludos!

Última edición por guzzano; 14/12/2012 a las 02:58
  #2 (permalink)  
Antiguo 14/12/2012, 16:17
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Bucle inusual

Cita:
se tiene que multiplicar lo que queremos abrir por sizeof(char*)
el caso de sizeof(char *) se usa para crear arreglos de punteros. En tu caso debe ser sizeof(char), y apesar de que el tipo char ocupa un byte para mi gusto es necesario ponerlo mas que nada por una forma mas ordenada de programacion( todos sabemos que 1 x cualquier_numero = cualquier_numero )

Cita:
¿estará mal abusar de la función exit()?
mmm la verdad nose pero viste que el abuso siempre es malo :)..... Lo que deberias cambiar es el argumento que le pasas a la funcion cuando hay un error; el 0(cero) se utiliza en caso de exito y distinto de cero si hubo un error. Para esto hay definidas dos macros: EXIT_SUCCESS y EXIT_FAILURE


Saludos
  #3 (permalink)  
Antiguo 14/12/2012, 22:31
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Respuesta: Bucle inusual

Cita:
Iniciado por cesar_casla Ver Mensaje
el caso de sizeof(char *) se usa para crear arreglos de punteros. En tu caso debe ser sizeof(char), y apesar de que el tipo char ocupa un byte para mi gusto es necesario ponerlo mas que nada por una forma mas ordenada de programacion( todos sabemos que 1 x cualquier_numero = cualquier_numero )


mmm la verdad nose pero viste que el abuso siempre es malo :)..... Lo que deberias cambiar es el argumento que le pasas a la funcion cuando hay un error; el 0(cero) se utiliza en caso de exito y distinto de cero si hubo un error. Para esto hay definidas dos macros: EXIT_SUCCESS y EXIT_FAILURE


Saludos
Perfecto, mejore el código para que en algunas cosas saliera sin necesidad de invocar exit(); Otra duda, ya que veo que sabes acerca, digamos que quiero un string, osea

Código C:
Ver original
  1. char *package[2] = {"xorg", "wine");

El compilador asigna creo yo cuantos caracteres debe tener este string, pero dado el caso que yo quiera asignarlo desde malloc.

Crear el ejemplo de arriba desde malloc. ¿Tienes idea?

Sobre el bucle lo solucione agregando una variable que al encontrar el paquete haga un break; en el otro bucle.

Saludos.
  #4 (permalink)  
Antiguo 15/12/2012, 00:34
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Bucle inusual

Seria algo asi:

Código C:
Ver original
  1. char **p=NULL;
  2.  
  3. p=(char **)malloc(sizeof(char *)*CANT_PUNTEROS); /* reservo "x" punteros */
  4.  
  5. for(i=0;i<CANT_PUNTEROS;i++)  
  6.   p[i]=(char *)malloc(sizeof(char)*MAX_STRING); /* a cada puntero le reservo "x" longitud de tamaño*/

Viendolo como una matriz: CANT_PPUNTEROS=num_filas y MAX_STRING=num_columnas


Saludos
  #5 (permalink)  
Antiguo 15/12/2012, 01:11
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Respuesta: Bucle inusual

Nada más que decir, ¡GENIO! muchas gracias!

Edito, probe, estudie un poco sobre los arrays multidimensionales, los probe en varias cosas y me funcionaron. Pero aquí, al parecer no, a ver si me puedes decir en donde me he equivocado, y disculpa el abuso.

Código C:
Ver original
  1. char *depends_parser(FILE *pkgfile_dir)
  2. {
  3.     char character, last_character = '0', *string_depends = NULL, **depends_alone = NULL, *depends_p;
  4.     int character_count = 0, memory_count = 1, memory_count2 = 1, position_check = 0;
  5.  
  6.     depends_alone = (char **) malloc(sizeof(char *)*memory_count2);
  7.  
  8.     while ((character = getc(pkgfile_dir)) != EOF)
  9.     {
  10.         if (character == '\n')
  11.         {
  12.             if ((strstr(string_depends, "Depends on:")))
  13.             {
  14.                
  15.                 string_depends[character_count] = '\0';
  16.                 depends_p = string_depends;
  17.  
  18.                 character_count = 0;
  19.                 memory_count = 1;
  20.                
  21.                 while (*depends_p != '\0')
  22.                 {
  23.                    
  24.                     if (*depends_p == ':')
  25.                     {
  26.                         position_check = 1;
  27.                         depends_p++;
  28.  
  29.                         if (!isalpha(*depends_p)){}
  30.                         else
  31.                         {
  32.                             depends_p--;
  33.                         }
  34.                     }
  35.                     else if (position_check == 1)
  36.                     {
  37.                         if (*depends_p == ' ')
  38.                         {
  39.                             memory_count2++;
  40.  
  41.                             depends_alone = (char **) realloc(depends_alone, sizeof(char *)*memory_count2);
  42.                            
  43.                             character_count = 0;
  44.                             memory_count = 1;
  45.                         }
  46.                        
  47.                         if (isalpha(*depends_p) || *depends_p == '-' || isdigit(*depends_p))
  48.                         {
  49.                            
  50.                             depends_alone[memory_count2] = (char *) realloc(depends_alone[memory_count2], sizeof(char)*memory_count);
  51.                             depends_alone[memory_count2][character_count] = *depends_p;
  52.  
  53.  
  54.                             character_count++;
  55.                             memory_count++;
  56.                         }
  57.                     }
  58.                    
  59.                     depends_p++;
  60.                 }
  61.                 break;
  62.             }
  63.             else
  64.             {
  65.                 character_count = 0;
  66.                 memory_count = 1;
  67.                 string_depends = malloc(0);
  68.             }
  69.         }
  70.         else
  71.         {
  72.            
  73.             string_depends = (char *) realloc(string_depends, memory_count);
  74.             string_depends[character_count] = character;
  75.  
  76.             character_count++;
  77.             memory_count++;
  78.         }
  79.     }
  80.  
  81.     //puts(depends_alone[0]);
  82.  
  83.     if (string_depends)
  84.         free(string_depends);
  85. }

Última edición por guzzano; 15/12/2012 a las 10:29
  #6 (permalink)  
Antiguo 15/12/2012, 10:29
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Respuesta: Bucle inusual

Doble post, lo siento.
  #7 (permalink)  
Antiguo 15/12/2012, 14:26
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Bucle inusual

Un poco dificil de entender ya que nose bien como es el formato del archivo que estas usando... igual el problema puede ser que usas memory_count2 como indice del arreglo dinamico de punteros:

1° inicializas a memory_count2=1, y reservas memoria a depends_alone
2° si se cumple if (*depends_p == ' ') memory_count incrementa a 2, luego volves a reservar memoria a depends_alone(le reservas dos punteros). Hasta aca todo bien

Código C:
Ver original
  1. depends_alone[memory_count2] = (char *) realloc(depends_alone[memory_count2], sizeof(char)*memory_count);
aca esta el problema: si reservaste dos punteros, osea posiciones 0 y 1 del arreglo de punteros, no podes acceder a depends_alone[memory_count2] ya que estas accediendo a la posicion 2 que no existe


Creo q ese es el error, sino trata de detallar mas que te marca el compilador


Saludos
  #8 (permalink)  
Antiguo 18/12/2012, 01:51
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Respuesta: Bucle inusual

Muchisimas gracias, estoy volviendo a hacer la función ya lo probare!

Saludos.

Etiquetas: bucle, int, string
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 13:43.