Autor Tema: Se puede con Switch comparar intervalos?  (Leído 8360 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Se puede con Switch comparar intervalos?
« en: 02 de Junio de 2007, 22:48:49 »
Hola gente lo que quiero saber es si puedo usar a switch de la siguiente manera

switch (cmd) {

   case a<cmd<b : blablabla;
   case c<cmd<d :  blebleblu;

es decir si puedo comparar cmd con intervalos de valores. Esto si fuera posible simplificaria mucho el rollo de if else if else que me quedo en el programa.
Estoy interpretando el protocolo rc5 y ya casi lo tengo cocinado. Cuando lo termine lo posteo para todos!!
Desde ya gracias
 
El fruto solo madura con el tiempo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Se puede con Switch comparar intervalos?
« Respuesta #1 en: 03 de Junio de 2007, 01:52:24 »
Directamente no se puede, pero con un truquillo resulta fácil de implementar.
En el ejemplo siguiente, vamos a averiguar en qué decena está una variable que puede valer entre 0 y 50:
Código: C
  1. intervalo = 1 + (x>10) + (x>20)  + (x>30) +  (x>40) ;
  2.    switch (intervalo) {
  3.       case 1:
  4.          printf("De 0 a 10: %u",x);
  5.          break;
  6.       case 2:
  7.          printf("De 11 a 20: %u",x);
  8.          break;
  9.       case 3:
  10.          printf("De 21 a 30: %u",x);
  11.          break;
  12.       case 4:
  13.          printf("De 31 a 40: %u",x);
  14.          break;
  15.       case 5:
  16.          printf("De 41 a 50: %u",x);
  17.          break;                          
  18.    }

Desconectado naieto

  • PIC10
  • *
  • Mensajes: 45
Re: Se puede con Switch comparar intervalos?
« Respuesta #2 en: 04 de Junio de 2007, 13:10:31 »
Bueno gracias nocturno, voy a ver como lo implemento.
Saludos
El fruto solo madura con el tiempo

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Se puede con Switch comparar intervalos?
« Respuesta #3 en: 04 de Junio de 2007, 15:59:27 »
interesante truco, es decir que (x>10) ¿se puede interpretar como una función dentro de una operación aritmética?
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Se puede con Switch comparar intervalos?
« Respuesta #4 en: 04 de Junio de 2007, 16:04:50 »
Este truco (muy bueno por cierto) funciona si el compilador tiene definido el valor booleano TRUE como 1, esto no siempre es así, de echo el valor TRUE puede ser cualquier valor distinto de cero. Algunos compiladores de echo lo definen como:

typedef TRUE !0

Y podemos tener cualquier valor definido, aunque lo normal es que sea como propone Manolo.

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Se puede con Switch comparar intervalos?
« Respuesta #5 en: 04 de Junio de 2007, 16:14:58 »
Desconocía que el TRUE pudiese ser modificado.
No obstante  tengo que decir que ese ejemplo simulado con CCS funciona perfecto.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Se puede con Switch comparar intervalos?
« Respuesta #6 en: 04 de Junio de 2007, 18:51:44 »
Hola Manolo, si se puede modificar aunque la directiva que empleé typedef no es la adecuada.

Aquí te dejo el ejemplo para definir TRUE y FALSE:

Código: CSS
  1. #undef  FALSE
  2. #undef  TRUE
  3. #define FALSE  0
  4. #define TRUE   !FALSE
  5.  
  6. void main()
  7. {
  8.  
  9.    setup_adc_ports(NO_ANALOGS);
  10.    setup_adc(ADC_OFF);
  11.    setup_spi(SPI_SS_DISABLED);
  12.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  13.    setup_timer_1(T1_DISABLED);
  14.    setup_timer_2(T2_DISABLED,0,1);
  15.  
  16.    // TODO: USER CODE!!
  17.    
  18.    while(TRUE);
  19.  
  20. }

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Se puede con Switch comparar intervalos?
« Respuesta #7 en: 05 de Junio de 2007, 19:55:04 »
ahora creo entender lo del 'truco'

así como se aplica dentro de un condicional para devolver 2 estados, entonces con la suma aritmética voy sumandos unos o ceros dependiendo del caso.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek



 

anything