elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Sentencia switch vs tablas de búsqueda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sentencia switch vs tablas de búsqueda  (Leído 2,301 veces)
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Sentencia switch vs tablas de búsqueda
« en: 4 Septiembre 2014, 17:45 pm »

Buenas, tengo las siguientes funciones:

Código
  1. char * func1(int condicion)
  2. {
  3.      switch(condicion)
  4.     {
  5.         case 0: return "EQ";
  6.         case 1: return "NE";
  7.         case 2: return "CS";
  8.         case 3: return "CC";
  9.         case 4: return "MI";
  10.         case 5: return "PL";
  11.         case 6: return "VS";
  12.         case 7: return "VC";
  13.         case 8: return "HI";
  14.         case 9: return "LS";
  15.         case 10: return "GE";
  16.         case 11: return "LT";
  17.         case 12: return "GT";
  18.         case 13: return "LE";
  19.         case 14: return "";
  20.         default: return 0;
  21.      }
  22. }
  23.  

Y

Código
  1. char * func2(int condicion)
  2. {
  3.    if ((unsigned) condicion >= 15)
  4. return 0;
  5.    return "EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0" +
  6.               3 * condicion;
  7. }
  8.  

Se que ambas son equivalentes pero lo que me cuesta entender es como la función     con tabla de búsqueda logra aislar la cadena requerida según la condición especificada, si alguien podría explicarme como sucede esto...

Saludos kutcher 


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.905


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #1 en: 4 Septiembre 2014, 20:19 pm »

Tal vez asi te resulte mas claro:
char *cadena_base = "EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0";

cadena_base es un puntero a char * que apunta en realidad a varias cadenas.

Entonces func2 retorna un puntero siempre dentro de la misma cadena_base (para eso comprueba que el valor de condicion no sea mayor a 14) usando: cadena_base + (3 * condicion).

3 es el tamaño de cada cadena dentro de cadena_base con su cero terminador y condicion actua como indice.

Ejemplos, si condicion es 0:
cadena_base + 3 * 0 = cadena_base, como hay un \0 despues de EQ ahi terminara la cadena.

Si condicion es 2:
cadena_base + 3 * 2 = cadena_base + 6 = al apuntar a seis caracteres despues de cadena_base entonces el puntero retornado apunta a la cadena CS.


« Última modificación: 4 Septiembre 2014, 20:23 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #2 en: 4 Septiembre 2014, 20:40 pm »

cadena_base es un puntero a char * que apunta en realidad a varias cadenas.

@Eternal Idol: Entonces tu dices que func2 retorna la dirección de la cadena solicitada :

Código
  1. "EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0"

Acaso este tipo de cadenas también poseen una dirección de almacenamiento
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.905


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #3 en: 4 Septiembre 2014, 20:43 pm »

Si claro, por eso su tipo de retorno es char *; si tambien, todos los bytes de esas cadenas estan en la sección de datos (tanto en func1 como en func2).
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #4 en: 5 Septiembre 2014, 01:48 am »

Si claro, por eso su tipo de retorno es char *; si tambien, todos los bytes de esas cadenas estan en la sección de datos (tanto en func1 como en func2).

Ya entonces esto seria lo mas parecido a un array de caracteres aunque no la hayamos declarado como tal, en cuanto a tu comentario: los bytes de esas cadenas están en la sección de datos no comprendo como va esto..

Saludos
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.905


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #5 en: 5 Septiembre 2014, 02:01 am »

Si, un conjunto de bytes, con el cero terminador es una cadena.

En un ejecutable hay secciones, por lo general .text para el codigo binario, .data para las variables globales (donde estaran estas cadenas) y .rdata para constantes.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #6 en: 5 Septiembre 2014, 18:25 pm »

Si, un conjunto de bytes, con el cero terminador es una cadena.

En un ejecutable hay secciones, por lo general .text para el codigo binario, .data para las variables globales (donde estaran estas cadenas) y .rdata para constantes.

Solo una ultima consulta mas; como ya sabemos func2 retorna una dirección de memoria que correspondería a una cadena local de func2 pero si al salir de tal función se perdería la referencia a ella

Saludos
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.905


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #7 en: 5 Septiembre 2014, 19:06 pm »

Solo una ultima consulta mas; como ya sabemos func2 retorna una dirección de memoria que correspondería a una cadena local de func2 pero si al salir de tal función se perdería la referencia a ella

Saludos

No, como te decia esta en la sección de datos, es como una variable global. Si usaras un array de caracteres definido en la funcion entonces si seria una variable local, estaria en la pila y al salir de la funcion estaria fuera de su ambito. Igual no hay ninguna diferencia entre func1 y func2 en este aspecto.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #8 en: 5 Septiembre 2014, 20:48 pm »

No, como te decia esta en la sección de datos, es como una variable global. Si usaras un array de caracteres definido en la funcion entonces si seria una variable local, estaria en la pila y al salir de la funcion estaria fuera de su ambito.

Si efectivamente tiene ámbito global lo he comprobado con este código:

Código
  1. #include<stdio.h>
  2.  
  3. char *func2(int condicion)
  4. {
  5.    if ((unsigned) condicion >= 15)
  6.        return 0;
  7.    return "A\0B\0C\0D\0E\0";
  8. }
  9.  
  10. int main(void)
  11. {
  12.    int i;
  13.    char *p =  func2(0);
  14.  
  15.    for (i = 0; p[i] != '\0'; i += 2)
  16.       printf("%c ", *(p + i));
  17.  
  18.    return 0;
  19. }

Muchas gracias por toda la ayuda  ;-)

Saludos kutcher
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.905


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Sentencia switch vs tablas de búsqueda
« Respuesta #9 en: 5 Septiembre 2014, 21:45 pm »

De nadas  ::)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema en sentencia de búsqueda con varios valores.
Bases de Datos
mokoMonster 5 6,537 Último mensaje 27 Febrero 2014, 13:21 pm
por leo1972
Duda sentencia switch
Programación C/C++
netca 3 2,093 Último mensaje 27 Julio 2012, 05:17 am
por avesudra
problema con sentencia switch
Programación C/C++
++c 2 1,402 Último mensaje 6 Mayo 2014, 00:16 am
por ++c
Cómo hago una búsqueda inteligente con una sentencia sql y en c#?
.NET (C#, VB.NET, ASP)
irvincnt93 2 2,407 Último mensaje 3 Marzo 2015, 00:05 am
por Eleкtro
[C] Duda sencilla - sentencia Switch
Programación C/C++
n-utz 4 1,438 Último mensaje 31 Mayo 2016, 01:00 am
por n-utz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines