¿Cómo configurar Switch - Case?

Hola, tengo este pequeño problemilla y no me aclaro para hacerlo.

Quiero convertir todos estos if y else if en switch-case pero no me aclaro, alguien me puede decir como ponerlo?

Código:
void R_Velo(void)
          {
      p=(5.0*q)/1024.0;      

      if((p>=0.0) && (p<0.5))  { velo= 000; V=00;}
     else if((p>=0.5) && (p<1.0))  { velo= 500; V=15;}       
     else if((p>=1.0) && (p<1.8))  { velo= 600; V=33;}       
     else if((p>=1.8) && (p<2.6))  { velo= 700; V=48;}   
     else if((p>=2.6) && (p<3.4))  { velo= 800; V=60;}  
     else if((p>=3.4) && (p<4.2))  { velo= 900; V=72;}  
     else if((p>=4.2) && (p<5.0))  { velo=1000; V=87;}     
        }
Gracias.
 
switch case es para cuando una variable toma un valor bien determinado, y no para cuando su valor esta comprendido en un rango de valores. No es aplicable en tu programa.

Por curiosidad: Para que quisieras convertir los if en case?
 
Última edición:
No serviría el switch-case aquí por que esta solo compara valores definidos de enteros, no opera con comparadores, solo si el valor es exactamente igual a, pero podrías optimizar la secuencia, no necesitas hacer AND en cada paso por que ya estas usando else if, la comparativa anterior ya se realizo y SI NO es que se ejecuta la otra, así que puedes eliminar el rango bajo, puesto que de ser inferior, entonces se hubiera cumplido la condición anterior y esta no se ejecuta.
Código:
void R_Velo(void)
          {
      p=(5.0*q)/1024.0;      

      if((p>=0.0) && (p<0.5))  { velo= 000; V=00;}
     else if(p<1.0)  { velo= 500; V=15;}       
     else if(p<1.8)  { velo= 600; V=33;}       
     else if(p<2.6)  { velo= 700; V=48;}   
     else if(p<3.4)  { velo= 800; V=60;}  
     else if(p<4.2)  { velo= 900; V=72;}  
     else if(p<5.0)  { velo=1000; V=87;}     
        }

PD: al compilar, el switch case es lo mismo que un if-else if - else, no te ahorra memoria, solo sirve para tener mas ordenado el código.
 
Última edición:
Lo que me dices no lo habia pensado, de esa forma no se corre el riesgo de que por ejemplo al poner el rango,
Código:
 else if(p<2.6) {velo=700; v=48;}
,pueda tomar cualquiera de los rangos anteriores?.

Código:
if((p>=0.0) && (p<0.5))  { velo= 000; V=00;}
     else if(p<1.0)  { velo= 500; V=15;}       
     else if(p<1.8)  { velo= 600; V=33;}
.

Ya lo pruebo y comento, de paso veo el ahorro de memoria,

Gracias Nuyel
 
Es que se anida uno dentro de otro, cuando uno de ellos se cumpla se rompe toda la anidación, eso hace que las siguientes condicionales no sean ejecutadas, si solo usas IF no se anidan y la siguiente condicional se ejecuta.

para que se ejecute la línea
else if(p<2.6) {velo=700; v=48;}

Las otras anteriores tendrían que ser falsas, es decir, p=>1.8 para que las otras condicionales sean ignoradas y se llegue a ejecutar esta parte. la siguiente línea como vemos se cumple, pero al estar en ELSE no se ejecuta a menos de que la anterior sea falsa.
 
Ademas para ahorrar memoria y sobre todo acelerar la ejecucion podrias eliminar la linea:
p=(5.0*q)/1024.0;
y comparar en los if else directamente el valor de q. Esto seria posible si no vuelves a utilizar p en alguna otra parte. Y hasta quiza si es asi tambien podrias reemplazar por q y "acomodar las cuentas"
 
Ademas para ahorrar memoria y sobre todo acelerar la ejecucion podrias eliminar la linea:
p=(5.0*q)/1024.0;
y comparar en los if else directamente el valor de q. Esto seria posible si no vuelves a utilizar p en alguna otra parte. Y hasta quiza si es asi tambien podrias reemplazar por q y "acomodar las cuentas"

Hola el paso, esto que dices no se como ponerlo, solo lo utilizo cuando llamo esa funcion.

Lo que intento hacer es, en vez de que con un potenciometro ir dando velocidad, hacer que solo tenga 5 velocidades o 6 y que estas sean fijas, en funcion de la tension de referencia que este dentro de un rango hacer una velocidad, mas o menos como tienen los ventiladores de los portatiles, en funcion de la temperatura dar una velocidad.

Es que se anida uno dentro de otro, cuando uno de ellos se cumpla se rompe toda la anidación, eso hace que las siguientes condicionales no sean ejecutadas, si solo usas IF no se anidan y la siguiente condicional se ejecuta.

para que se ejecute la línea
else if(p<2.6) {velo=700; v=48;}

Las otras anteriores tendrían que ser falsas, es decir, p=>1.8 para que las otras condicionales sean ignoradas y se llegue a ejecutar esta parte. la siguiente línea como vemos se cumple, pero al estar en ELSE no se ejecuta a menos de que la anterior sea falsa.

Nuyel gracias, no lo habia pensado asi de esa manera, siempre se aprende algo, jeje.
 
Lo que el se refería es que hagas los cálculos en papel y establezcas ahí los limites en los valores cuantizados del ADC (0-1023) en lugar de hacer que el MCU realice una operación de multiplicación y división, sin aceleración por hardware esas operaciones se traducen en restas y sumas sucesivas que ocupan mucho tiempo para su ejecución, y mas aun usando float.
 
Lo que el se refería es que hagas los cálculos en papel y establezcas ahí los limites en los valores cuantizados del ADC (0-1023) en lugar de hacer que el MCU realice una operación de multiplicación y división, sin aceleración por hardware esas operaciones se traducen en restas y sumas sucesivas que ocupan mucho tiempo para su ejecución, y mas aun usando float.
eso (y)
 
Atrás
Arriba