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

Optimización de una función

Estas en el tema de Optimización de una función en el foro de C/C++ en Foros del Web. Buenos días, programé una función, pero me siento un poco satisfecha con ella, quizá sea la mejor forma, pero quisiera otra perspectiva que sea un ...
  #1 (permalink)  
Antiguo 26/05/2013, 12:22
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Optimización de una función

Buenos días, programé una función, pero me siento un poco satisfecha con ella, quizá sea la mejor forma, pero quisiera otra perspectiva que sea un poco más simple. Si tienen alguna idea o me ayudarían con la lógica, sería perfecto.

Código C:
Ver original
  1. /*             Saca la información de w0rm.conf
  2.  *
  3.  * Este programa es software libre: usted puede redistribuirlo y/o
  4.  * modificarlo bajo los términos de la Licencia Pública General de
  5.  * GNU  según es publicada por la Free Software Foundation, bien
  6.  * sea la versión 3 de la Licencia, o (a su elección) cualquier
  7.  * versión posterior.
  8.  *
  9.  * Este programa se distribuye con la esperanza de que sea útil,
  10.  * pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
  11.  * COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte
  12.  * la GNU General Public License para más detalles.
  13.  *
  14.  * Debería haber recibido una copia de la Licencia Pública General de GNU
  15.  * junto con este programa. Si no, véase <http://www.gnu.org/licenses/>.
  16.  *
  17.  * Escrito por Alberto 'guzzan0' José Guilarte para w0rmlinux
  18.  */
  19.  
  20.  
  21. #define DIR_CONFIG "/etc/w0rm.conf"
  22.  
  23. struct wormcfg {
  24.   char servidor_espejo[256]; /* RFC 1035 */
  25.   char protocolo_espejo[5]; /*FTP o HTTP */
  26.   char repositorios[20]; /* Base, opcional, comunidad */
  27.  
  28.   char directorio_db[256]; /* DB con los paquetes */
  29.  
  30. } cfg_w = {"guzzano2.web44.net", "http", "Base",
  31.            "/home/guzzano/Escritorio/w0rm/packages_db"};
  32.  
  33. /* Realiza una comprobación para ver si no existe en la variable
  34.  * algún dato que no sea necesario. Espacios, comillas, errores de tecleo
  35.  * o salto de líneas.
  36.  */
  37.  
  38. static int comprobar_datos (char * cadena_opciones, char ** resultado) {
  39.   char * tmp_r = cadena_opciones;
  40.   char * tmp_c = NULL;
  41.  
  42.   while ((!(isalpha(*tmp_r)) && !(isdigit(*tmp_r))) && *tmp_r != '\0')
  43.     tmp_r += 1;
  44.  
  45.   if (*tmp_r == '\0' || *tmp_r == '\n')
  46.     return -1;
  47.  
  48.   if ((tmp_c = strchr(tmp_r, '\n')) != NULL)
  49.     tmp_c = '\0';
  50.  
  51.   *resultado = tmp_r;
  52.  
  53.   return 0;
  54. }
  55.  
  56. int cargar_configuracion (void) {
  57.   const char * opciones[4] = {"servidor_espejo", "protocolo_espejo", "repositorios_activos",
  58.                   "directorio_db"};
  59.   char cadena_config[256];
  60.   char * tmp = NULL;
  61.   char * tmp2 = NULL;
  62.  
  63.   int opciones_c;
  64.   int tamano_c = 0;
  65.  
  66.   FILE * config_archivo = fopen(DIR_CONFIG, "a+");
  67.  
  68.   if (config_archivo == NULL) {
  69.     fprintf(stderr, "[Error] no se pudo cargar el archivo de configuración");
  70.     return -1;
  71.   }
  72.  
  73.   while (fgets(cadena_config, sizeof(cadena_config)-1, config_archivo) != NULL) {
  74.     if (cadena_config[0] == '#' || cadena_config[0] == '\n')
  75.       continue;
  76.    
  77.     for (opciones_c = 0 ; opciones_c < sizeof(opciones)/sizeof(char *) ; opciones_c++) {
  78.       if (strncmp(opciones[opciones_c], cadena_config, strlen(opciones[opciones_c])) == 0) {
  79.     if (strtok_r(cadena_config, "=", &tmp) == NULL)
  80.       break;
  81.    
  82.     if (comprobar_datos(tmp, &tmp2) != 0)
  83.       break;
  84.    
  85.     switch (opciones_c) {
  86.       case 0:
  87.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.servidor_espejo))-1 ? strlen(tmp2) : sizeof(cfg_w.servidor_espejo)-1; /* Evito buffer overflow */
  88.         strncpy(cfg_w.servidor_espejo, tmp2, tamano_c);
  89.        
  90.         break;
  91.      
  92.       case 1:
  93.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.protocolo_espejo))-1 ? strlen(tmp2) : sizeof(cfg_w.protocolo_espejo)-1;
  94.         strncpy(cfg_w.protocolo_espejo, tmp2, tamano_c);
  95.        
  96.         break;
  97.        
  98.       case 2:
  99.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.repositorios))-1 ? strlen(tmp2) : sizeof(cfg_w.repositorios)-1;
  100.         strncpy(cfg_w.repositorios, tmp2, tamano_c);
  101.        
  102.         break;
  103.      
  104.       case 3:
  105.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.directorio_db))-1 ? strlen(tmp2) : sizeof(cfg_w.directorio_db)-1;
  106.         strncpy(cfg_w.directorio_db, tmp2, tamano_c);
  107.        
  108.         break;
  109.     }  
  110.       }
  111.     }
  112.    
  113.   }
  114.  
  115.   fclose(config_archivo);
  116.   return 0;
  117. }

Se me hace un poco incomodo y cuando se necesitan más variables de configuración el archivo C será realmente pesado y la comparación también.

Saludos.
  #2 (permalink)  
Antiguo 27/05/2013, 13:39
 
Fecha de Ingreso: diciembre-2010
Mensajes: 20
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Optimización de una función

En lugar de calcular a cada rato "strlen(tmp2)" podrías llevar la cuenta de los caracteres que te quedan sustrayendo del total inicial.
  #3 (permalink)  
Antiguo 27/05/2013, 15:29
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Optimización de una función

Como has dicho cuando agregas mas opciones al archivo se te empieza a complicar.
Lo puedes mejorar creando una lista o un mapa. E implementas una busqueda en ese lista.
La lista o el mapa tendria un par (Clave , Valor).

Clave deberia ser una de tus opciones
{"servidor_espejo", "protocolo_espejo", "repositorios_activos", "directorio_db"}

y valor el resultado.

De esta forma cuando lees el archivo simplemente guardas en la lista. Sin importar el nombre de la opción. Después creas un buscador y le pasas como clave una de tus opciones.

Es solo una idea. Si quieres ayuda en eso Avisa!

saludos,
  #4 (permalink)  
Antiguo 28/05/2013, 19:13
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Optimización de una función

Cita:
Iniciado por Aemilius Ver Mensaje
En lugar de calcular a cada rato "strlen(tmp2)" podrías llevar la cuenta de los caracteres que te quedan sustrayendo del total inicial.
Muchísimas gracias por la recomendación. + Positivo.

Cita:
Iniciado por sam90 Ver Mensaje
Como has dicho cuando agregas mas opciones al archivo se te empieza a complicar.
Lo puedes mejorar creando una lista o un mapa. E implementas una busqueda en ese lista.
La lista o el mapa tendria un par (Clave , Valor).

Clave deberia ser una de tus opciones
{"servidor_espejo", "protocolo_espejo", "repositorios_activos", "directorio_db"}

y valor el resultado.

De esta forma cuando lees el archivo simplemente guardas en la lista. Sin importar el nombre de la opción. Después creas un buscador y le pasas como clave una de tus opciones.

Es solo una idea. Si quieres ayuda en eso Avisa!

saludos,
Me pareció genial, pero si usted puede, me puede dar una idea más especifica de ella. Si no es mucha molestia.

Un saludo, muchas gracias por sus respuestas.
  #5 (permalink)  
Antiguo 28/05/2013, 19:28
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Optimización de una función

Aca tenes un ejemplo de una lista:

http://es.kioskea.net/faq/2842-la-lista-enlazada-simple

En la estructura ElementoLista deberías tener dos datos: Una la clave y otro el Valor (los dos serian char*)

Faltaria implementar una funcion busqueda, muy parecida a la que imprime la lista pero va comparando la clave con un valor a buscar, cuando lo encuentra retorna el valor del nodo.

Espero haberte guiado un poco. Anda probando si te interesa y vamos viendo tus erroes.

Saludos

Etiquetas: int, optimización, programa, simple, struct, variable
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 09:02.