none
Error en switch con variable i RRS feed

  • Pregunta

  • Buenas...

    Tengo un programa de WPF en c#, es un juego sobre coches.

     private void PowerUp()
            {
                // esta es la función de encendido, esta función se ejecutará cuando el jugador tome la estrella en el juego
                i += .5; // aumentar i en 0,5
    
    
                // si i es mayor que 4, reinicie i de nuevo a 1
                if (i > 4)
                {
                    i = 1;
                }
    
                // con cada incremento de la i cambia la imagen del jugador a una de las 4 imágenes siguientes
                switch (i)
                {
                    case 1:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode1.png"));
                        break;
                    case 2:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode2.png"));
                        break;
                    case 3:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode3.png"));
                        break;
                    case 4:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode4.png"));
                        break;
                }
    
                // cambia el fondo a color coral claro
                myCanvas.Background = Brushes.LightCoral;
            }
     

    Este metodo de PowerUp lo que hace es que mediante ese codigo crea un "sprite". Es decir, cuando el jugador(un coche) tome una estrella el coche se encendera de distintos colores, hace alusion a cuando el personaje de mario come una estrella y este se pone de colores. 

    Bueno, en el switch me marca error en la "i", porque dice que debe de ser de valor char, string, integer o del tipo que acepte valores nulos, pero la i es de tipo int, entonces no se por que me marque error aun asi...

    Mediante el switch es que va a ser posible el cambio de distintos colores al coche

    Alguien sabe si tengo que cambiar el tipo de variable, o es el modo en que tengo declarados los cases?


    martes, 15 de diciembre de 2020 19:01

Respuestas

  • Lo siento, la tenia declarada como tipo int y la tengo que sea global.

    Cambie a double [...]

    No. No puedes hacer un switch con una variable de tipo double.

    La razón de que no se permita es que el switch lo que hace es compararla en igualdad con todos los valores de los case. Pero un double no se debe comparar en igualdad porque los double son tipos imprecisos.

    En tu caso particular la comparación funcionaría porque solo comparas valores enteros. Puedes cambiar el switch para que compare la parte entera: switch(Convert.ToInt32(i)) {...}. Pero con carácter general, recuerda que los valores de tipo float o double no se deben usar en comparaciones de igualdad, porque el resultado de la comparación es impredecible debido a los redondeos internos que ocurren cuando un valor en base 10 que tiene decimales se convierte a su representación interna en base 2..

    • Marcado como respuesta EricRRModerator miércoles, 16 de diciembre de 2020 16:03
    miércoles, 16 de diciembre de 2020 8:41
    Moderador

Todas las respuestas

  • Hola Brenda,

    Viendo tú código, veo que la variable i se cambia en el if, si cumple con el requisito, sin embargo, lo mejor es que debugues el código para que veas que tipo de dato se está guardando en i.

    Quedo atento.

    Saludos,

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.


    martes, 15 de diciembre de 2020 20:22
    Moderador
  • Hola. Lo primero sería saber de qué tipo es la variable i. No veo su definición así que entiendo la tienes definida a nivel de clase.

    Ahora bien si  la variable fuera de tipo double puedes poner en tus bloques case algo así con un sufijo

                switch (i)
                {
                    case 1d:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode1.png"));
                        break;
                    case 2d:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode2.png"));
                        break;
                    case 3d:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode3.png"));
                        break;
                    case 4d:
                        playerImage.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Imagenes/powermode4.png"));
                        break;
                }

    Un número sin sufijo por defecto es de tipo int, un número con punto flotante sin sufijo, es por defecto de tipo double

    Echa un ojo a Tipos numéricos de punto flotante (referencia de C#). En la parte de Literales Reales.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    martes, 15 de diciembre de 2020 23:08
    Moderador
  • Por cierto

    Aquí 

    i += .5; // aumentar i en 0,5

    Estas sumando coma flotante y en el enunciado estás especificando que de tipo int, yo cambiaría a double



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 15 de diciembre de 2020 23:15
    Moderador
  • Lo siento, la tenia declarada como tipo int y la tengo que sea global.

    Cambie a double, pero aun así me marca error en donde mismo, que es en:

    switch(i)

    igual ya le agregue sufijo a cada uno de los switch, pero sigue el mismoo error):


    • Editado BrendaCap miércoles, 16 de diciembre de 2020 1:32
    miércoles, 16 de diciembre de 2020 1:02
  • Hola, 

    Parece que sea el problema en la definición de la variable, si está como int, ¿no te da error al hacerle + .5?

    De todas formas debería funcionarte si haces: 

    switch (i.ToString())

    y luego 

    case "1":

    case "2":

    Saludos.

    miércoles, 16 de diciembre de 2020 6:29
  • Lo siento, la tenia declarada como tipo int y la tengo que sea global.

    Cambie a double [...]

    No. No puedes hacer un switch con una variable de tipo double.

    La razón de que no se permita es que el switch lo que hace es compararla en igualdad con todos los valores de los case. Pero un double no se debe comparar en igualdad porque los double son tipos imprecisos.

    En tu caso particular la comparación funcionaría porque solo comparas valores enteros. Puedes cambiar el switch para que compare la parte entera: switch(Convert.ToInt32(i)) {...}. Pero con carácter general, recuerda que los valores de tipo float o double no se deben usar en comparaciones de igualdad, porque el resultado de la comparación es impredecible debido a los redondeos internos que ocurren cuando un valor en base 10 que tiene decimales se convierte a su representación interna en base 2..

    • Marcado como respuesta EricRRModerator miércoles, 16 de diciembre de 2020 16:03
    miércoles, 16 de diciembre de 2020 8:41
    Moderador