TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: naieto en 02 de Junio de 2007, 22:48:49

Título: Se puede con Switch comparar intervalos?
Publicado por: naieto 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
 
Título: Re: Se puede con Switch comparar intervalos?
Publicado por: Nocturno 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.    }
Título: Re: Se puede con Switch comparar intervalos?
Publicado por: naieto en 04 de Junio de 2007, 13:10:31
Bueno gracias nocturno, voy a ver como lo implemento.
Saludos
Título: Re: Se puede con Switch comparar intervalos?
Publicado por: PalitroqueZ 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?
Título: Re: Se puede con Switch comparar intervalos?
Publicado por: jfh900 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.
Título: Re: Se puede con Switch comparar intervalos?
Publicado por: Nocturno 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.
Título: Re: Se puede con Switch comparar intervalos?
Publicado por: jfh900 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
Título: Re: Se puede con Switch comparar intervalos?
Publicado por: PalitroqueZ 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.

Título: Re: Se puede con Switch comparar intervalos?
Publicado por: Nocturno en 06 de Junio de 2007, 01:36:01
Exacto ;-)