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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Salir de un void
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Salir de un void  (Leído 6,204 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Salir de un void
« en: 28 Agosto 2024, 23:20 pm »

Buenas:

A veces entro en una función void, como que se llama así mismo y el programa no funciona como debería.

En la pila de llamadas muestra esto.

Ver zoom.

Como puedes ver en la imagen en la Pila de llamadas, cada vez que intento salir del submenú, se repite cada vez más y en este caso hay tres, Volumen() y otras tres AjustesPrincipal(). Tiene que salir desde que salga, no que tenga comportamiento de este tipo.

Dejo código por si les dice algo en C# en modo consola.

Volumen();
Código
  1. //     ** VOLUMEN **
  2. //> Vol: ■■■■■■-- 6
  3. //
  4. //> ATRÁS    > INICIO
  5.  
  6. using LCD_Menu_con_submenus_Consola_03.Ventana01;
  7. using System;
  8.  
  9. namespace LCD_Menu_con_submenus_Consola_03.Ventana03
  10. {
  11.    public class _0_Volumen
  12.    {
  13.        static int volumen = 6;
  14.        public static void Volumen()
  15.        {
  16.            // Variables.
  17.            string[] TEXTO =
  18.            {
  19.                "   ** VOLUMEN **    ", // Posición 0.
  20.                " Vol: ",               // 1
  21.                "■",                    // 2
  22.                "-",                    // 3
  23.                "ATRÁS",                // 4
  24.                "INICIO",               // 5
  25.                ">",                    // 6
  26.                " "                     // 7
  27.            };
  28.  
  29.            const int VOLMEN_MAX = 8;
  30.            int opcion = 0; // 0 = Volumen, 1 = ATRÁS y 2 = INICIO.
  31.  
  32.            ConsoleKey teclaVolumen;
  33.  
  34.            // Limpiar pantalla.
  35.            Console.Clear();
  36.  
  37.            // Mostrar menú.
  38.            MostrarMenu();
  39.  
  40.            do
  41.            {
  42.                // ¿Están en la opción Volumen o 0?
  43.                if (opcion == 0)
  44.                {
  45.                    // Sí. Mostrar volumen.
  46.                    MostrarVolumen();
  47.                }
  48.  
  49.                // Captura tecla y lo guarda en la variable teclaVolumen.
  50.                teclaVolumen = Console.ReadKey(true).Key;
  51.  
  52.                // ¿Están en la opción Volumen o 0?
  53.  
  54.                if (opcion == 0)
  55.                {
  56.                    // Sí. Controlar el volumen.
  57.                    if ((teclaVolumen == ConsoleKey.RightArrow) && (volumen < VOLMEN_MAX))
  58.                    {
  59.                        volumen++;
  60.                    }
  61.                    else if ((teclaVolumen == ConsoleKey.LeftArrow) && (volumen > 0))
  62.                    {
  63.                        volumen--;
  64.                    }
  65.                    else if ((teclaVolumen == ConsoleKey.UpArrow) || (teclaVolumen == ConsoleKey.DownArrow))
  66.                    {
  67.                        opcion = 1; // 1 = ATRÁS.
  68.                    }
  69.                }
  70.                else // No. Mientras.
  71.                {
  72.                    // Navegar entre ATRÁS e INICIO.
  73.                    if ((teclaVolumen == ConsoleKey.LeftArrow) && (opcion == 2))
  74.                    {
  75.                        opcion = 1; // 1 = ATRÁS.
  76.                    }
  77.                    else if ((teclaVolumen == ConsoleKey.RightArrow) && (opcion == 1))
  78.                    {
  79.                        opcion = 2; // 2 = INICIO.
  80.                    }
  81.                    else if ((teclaVolumen == ConsoleKey.UpArrow) || (teclaVolumen == ConsoleKey.DownArrow))
  82.                    {
  83.                        opcion = 0; // 0 = Volumen.
  84.                    }
  85.                }
  86.  
  87.                // Mostrar menú.
  88.                MostrarMenu();
  89.  
  90.            } while (teclaVolumen != ConsoleKey.Enter || opcion == 0));
  91.  
  92.            // Acción al pulsar Enter.
  93.            if (opcion == 1)
  94.            {
  95.                // ATRÁS.
  96.                _0_Ajustes.AjustesPrincipal();
  97.            }
  98.            else if (opcion == 2)
  99.            {
  100.                // INICIO.
  101.                Inicio.InicioPrincipal();
  102.            }
  103.  
  104.            // Mostrar dibujado en pantalla.
  105.            void MostrarVolumen()
  106.            {
  107.                Console.SetCursorPosition(0, 0);
  108.                Console.Write(TEXTO[0]);           //    ** VOLUMEN **
  109.  
  110.                Console.SetCursorPosition(1, 1);
  111.                Console.Write(TEXTO[1]);           //   Vol:
  112.  
  113.                for (int i = 0; i < volumen; i++)
  114.                {
  115.                    Console.Write(TEXTO[2]);       // &#9632;
  116.                }
  117.  
  118.                for (int j = 0; j < (VOLMEN_MAX - volumen); j++)
  119.                {
  120.                    Console.Write(TEXTO[3]);       // -
  121.                }
  122.  
  123.                // Mostrar el volumen en número.
  124.                Console.SetCursorPosition(16, 1);
  125.                Console.Write(volumen);
  126.            }
  127.  
  128.            void MostrarMenu()
  129.            {
  130.                Console.SetCursorPosition(2, 3);
  131.                Console.Write(TEXTO[4]);           //   ATRÁS
  132.  
  133.                Console.SetCursorPosition(13, 3);
  134.                Console.Write(TEXTO[5]);           //   INICIO
  135.  
  136.                Console.SetCursorPosition(0, 1);
  137.                Console.Write(TEXTO[7]);           //
  138.                Console.SetCursorPosition(0, 3);
  139.                Console.Write(TEXTO[7]);           //
  140.                Console.SetCursorPosition(11, 3);
  141.                Console.Write(TEXTO[7]);           //
  142.  
  143.                // ¿Es 0 = Volumen?
  144.                if (opcion == 0)
  145.                {
  146.                    // Sí. Indica esta posición del cursor.
  147.                    Console.SetCursorPosition(0, 1);
  148.                }
  149.  
  150.                // No. Entonces, ¿ 1 = ATRÁS?
  151.                else if (opcion == 1)
  152.                {
  153.                    // Sí. Indica esta posición del cursor.
  154.                    Console.SetCursorPosition(0, 3);
  155.                }
  156.  
  157.                // No. Entonces, ¿2 = INICIO?
  158.                else if (opcion == 2)
  159.                {
  160.                    // Sí. Indica esta posición del cursor.
  161.                    Console.SetCursorPosition(11, 3);
  162.                }
  163.  
  164.                // Muestra el caracter >.
  165.                Console.Write(TEXTO[6]);  //   >
  166.            }
  167.        }
  168.    }
  169. }
  170.  

AjustesPrincipal():
Código
  1. //    ** AJUSTES **        
  2. // > Volumen.
  3. //   Brillo/Contraste  
  4. //   [x] Beep.
  5.  
  6. //    ** AJUSTES **        
  7. // > [x] Luz de fondo.
  8. //   ATRÁS
  9. //   INICIO
  10.  
  11. using LCD_Menu_con_submenus_Consola_03.Ventana03;
  12. using System;
  13.  
  14. namespace LCD_Menu_con_submenus_Consola_03.Ventana01
  15. {
  16.    public class _0_Ajustes
  17.    {
  18.        public static void AjustesPrincipal()
  19.        {
  20.            string[] TEXTO =
  21.            {
  22.                "   ** AJUSTES **    ", // Posición 0.
  23.                "  Volumen.          ", // 1
  24.                "  Brillo / Contraste", // 2
  25.                "  [ ] Beep          ", // 3
  26.                "  [ ] Luz de fondo. ", // 4
  27.                "  ATRÁS             ", // 5
  28.                "  INICIO            ", // 6
  29.                ">",                    // 7
  30.                "x",                    // 8
  31.                " "                     // 9
  32.            };
  33.  
  34.            // Contador de teclas y navegador.
  35.            sbyte indiceSeleccionado = 0;                   // Índice seleccionado de cada opción del menú.
  36.            bool salir = false;                             // Para salir del menú principal al INICIO.
  37.            const sbyte SELECCION_OPCIONES_TOTALES = 5;     // Total de opciones para seleccionar y fija.
  38.  
  39.            // Capturar tecla para luego validar.
  40.            ConsoleKey tecla;
  41.  
  42.            do
  43.            {
  44.                //******************************************************************
  45.                // Dibujo el menú principal.
  46.  
  47.                switch (indiceSeleccionado)
  48.                {
  49.                    case 0:
  50.                        Console.SetCursorPosition(0, 0);
  51.                        Console.Write(TEXTO[0]);         //     ** AJUSTES **    
  52.                        Console.SetCursorPosition(0, 1);
  53.                        Console.Write(TEXTO[1]);         // > Volumen.            
  54.                        Console.SetCursorPosition(0, 1);
  55.                        Console.Write(TEXTO[7]);         // >
  56.                        Console.SetCursorPosition(0, 2);
  57.                        Console.Write(TEXTO[2]);         //   Brillo / Contraste      
  58.                        Console.SetCursorPosition(0, 3);
  59.                        Console.Write(TEXTO[3]);         //   [ ] Beep.            
  60.                        break;
  61.  
  62.                    case 1:
  63.                        Console.SetCursorPosition(0, 0);
  64.                        Console.Write(TEXTO[0]);         //     ** AJUSTES **  
  65.                        Console.SetCursorPosition(0, 1);
  66.                        Console.Write(TEXTO[1]);         //   Volumen.  
  67.                        Console.SetCursorPosition(0, 2);
  68.                        Console.Write(TEXTO[2]);         // > Brillo / Contraste      
  69.                        Console.SetCursorPosition(0, 2);
  70.                        Console.Write(TEXTO[7]);         // >
  71.                        Console.SetCursorPosition(0, 3);
  72.                        Console.Write(TEXTO[3]);         //   [ ] Beep.  
  73.                        break;
  74.  
  75.                    case 2:
  76.                        Console.SetCursorPosition(0, 0);
  77.                        Console.Write(TEXTO[0]);         //     ** AJUSTES **  
  78.                        Console.SetCursorPosition(0, 1);
  79.                        Console.Write(TEXTO[1]);         //   Volumen.  
  80.                        Console.SetCursorPosition(0, 2);
  81.                        Console.Write(TEXTO[2]);         //   Brillo / Contraste      
  82.                        Console.SetCursorPosition(0, 3);
  83.                        Console.Write(TEXTO[3]);         // > [ ] Beep.  
  84.                        Console.SetCursorPosition(0, 3);
  85.                        Console.Write(TEXTO[7]);         // >
  86.                        break;
  87.  
  88.                    case 3:
  89.                        Console.SetCursorPosition(0, 0);
  90.                        Console.Write(TEXTO[0]);         //     ** AJUSTES **  
  91.                        Console.SetCursorPosition(0, 1);
  92.                        Console.Write(TEXTO[4]);         // >  [ ] Luz de fondo.
  93.                        Console.SetCursorPosition(0, 1);
  94.                        Console.Write(TEXTO[7]);         // >        
  95.                        Console.SetCursorPosition(0, 2);
  96.                        Console.Write(TEXTO[5]);         //    ATRÁS
  97.                        Console.SetCursorPosition(0, 3);
  98.                        Console.Write(TEXTO[6]);         //    INICIO
  99.                        break;
  100.  
  101.                    case 4:
  102.                        Console.SetCursorPosition(0, 0);
  103.                        Console.Write(TEXTO[0]);         //     ** AJUSTES **  
  104.                        Console.SetCursorPosition(0, 1);
  105.                        Console.Write(TEXTO[4]);         //   [ ] Luz de fondo.
  106.                        Console.SetCursorPosition(0, 2);
  107.                        Console.Write(TEXTO[5]);         // > ATRÁS      
  108.                        Console.SetCursorPosition(0, 2);
  109.                        Console.Write(TEXTO[7]);         // >
  110.                        Console.SetCursorPosition(0, 3);
  111.                        Console.Write(TEXTO[6]);         //    INICIO
  112.                        break;
  113.  
  114.                    case 5:
  115.                        Console.SetCursorPosition(0, 0);
  116.                        Console.Write(TEXTO[0]);         //     ** AJUSTES **  
  117.                        Console.SetCursorPosition(0, 1);
  118.                        Console.Write(TEXTO[4]);         //   [ ] Luz de fondo.
  119.                        Console.SetCursorPosition(0, 2);
  120.                        Console.Write(TEXTO[5]);         //   ATRÁS      
  121.                        Console.SetCursorPosition(0, 3);
  122.                        Console.Write(TEXTO[6]);         // > INICIO
  123.                        Console.SetCursorPosition(0, 3);
  124.                        Console.Write(TEXTO[7]);         // >
  125.                        break;
  126.  
  127.                    default:
  128.                        Console.Write("Fuera de rango.     ");
  129.                        break;
  130.                }
  131.  
  132.                // Fin de pintar el menú principal.
  133.                //******************************************************************
  134.  
  135.                // Leer tecla ingresada por el usuario.
  136.                tecla = Console.ReadKey(true).Key;
  137.  
  138.                // Validar el tipo de tecla.
  139.                if (tecla == ConsoleKey.Enter)
  140.                {
  141.                    switch (indiceSeleccionado)
  142.                    {
  143.                        case 0:
  144.                            _0_Volumen.Volumen();
  145.                            break;
  146.  
  147.                        case 1:
  148.  
  149.                            break;
  150.  
  151.                        case 2:
  152.  
  153.                            break;
  154.  
  155.                        case 3:
  156.  
  157.                            break;
  158.  
  159.                        case 4:
  160.                            salir = true;
  161.                            break;
  162.  
  163.                        case 5:
  164.                            Inicio.InicioPrincipal();
  165.                            break;
  166.  
  167.                        default:
  168.                            Console.Write("Fuera de rango.     ");
  169.                            break;
  170.                    }
  171.                }
  172.  
  173.                // ¿Has pulsado tecla flecha Abajo?
  174.                if (tecla == ConsoleKey.DownArrow)
  175.                {
  176.                    indiceSeleccionado++;
  177.                }
  178.  
  179.                // Entonces si pulsas tecla flecha Arriba.
  180.                if (tecla == ConsoleKey.UpArrow)
  181.                {
  182.                    indiceSeleccionado--;
  183.                }
  184.  
  185.                // Si está en la última opción, salta a la primera.
  186.                if (indiceSeleccionado > SELECCION_OPCIONES_TOTALES)
  187.                {
  188.                    indiceSeleccionado = 0;
  189.                }
  190.  
  191.                // Si está en la primera posición, salta a la última.
  192.                if (indiceSeleccionado < 0)
  193.                {
  194.                    indiceSeleccionado = SELECCION_OPCIONES_TOTALES;
  195.                }
  196.  
  197.                // Salida del menú.
  198.            } while (salir == false);
  199.        }
  200.    }
  201. }

Llevo tiempo sin resolver esto.

Espero que se entienda lo que quiero decir, si no, se lo explico con más capturas.

Muchas gracias.


« Última modificación: 29 Agosto 2024, 22:02 pm por Meta » En línea

Eternal Idol
Kernel coder
Colaborador
***
Desconectado Desconectado

Mensajes: 5.969


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


Ver Perfil WWW
Re: Salir de un void
« Respuesta #1 en: 29 Agosto 2024, 10:58 am »

Pone los breakpoints y depuralo, esas dos funciones se llaman entre si dependiendo del contexto, tal vez la entrada por teclado no este funcionando como esperas ...

Código
  1.            if (opcion == 1)
  2.            {
  3.                // ATRÁS.
  4.                _0_Ajustes.AjustesPrincipal();
  5.            }

Código
  1.            switch (indiceSeleccionado)
  2.            {
  3.                        case 0:
  4.                            _0_Volumen.Volumen();
  5.                            break;


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
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void [Ver vídeo]
« Respuesta #2 en: 29 Agosto 2024, 20:41 pm »

Lo he hecho, se crea pila de llamada.

Tal vez tenga que empezar desde cero, eso de llamar un void, dentro de otro void en C#, si no cierras ese void como debe ser, porque, me voy a otro void para arriba y para abajo...

Como no se cierra, se me desborda con el tiempo, de tanto usarlo, la pila de llamada.

Está claro que el problema es la pila de llamadas.

Por ejemplo, en este vídeo si entro y salgo de muchos void que suele ser cada ventana con sus funciones o sin ellas.



¿Cuál es la mejor forma de hacer un programa que por cada llamada void, es una ventana con funciones?
« Última modificación: 29 Agosto 2024, 21:16 pm por Meta » En línea

Danielㅤ


Desconectado Desconectado

Mensajes: 1.853


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Salir de un void
« Respuesta #3 en: 29 Agosto 2024, 21:29 pm »

Hola, podrías probar a eliminar este bucle que no cumple ninguna función:

Código
  1. while (salir == false);

o al menos está mal ubicado, no tiene instrucciones a ejecutar, es un bucle vacío.


Saludos
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void
« Respuesta #4 en: 29 Agosto 2024, 22:14 pm »


Lo he hecho y se me va a la función ConfiguracionPrincipal() si pulso abajo o arriba. Si lo dejo si puedo elegir las opciones. Así que el programa se comporta diferente.

Lo dejé puesto otra vez.

Por lo que veo, hay que borrar la pila si es posible hacerlo, ya que al entrar en la función, no la termina, porque antes, me voy a otro menú que tiene otra función.

¿Es posible hacerlo?

Por lo que indica aquí en este vídeo, tiene que acabar toda la función, y en mi caso antes me voy a otro sin acabar el original, por eso pasa lo que pasa. Las Santas Pilas de llamadas que me tienen loco.



;)
En línea

Eternal Idol
Kernel coder
Colaborador
***
Desconectado Desconectado

Mensajes: 5.969


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


Ver Perfil WWW
Re: Salir de un void [Ver vídeo]
« Respuesta #5 en: 29 Agosto 2024, 23:31 pm »

Igual depurar es tambien comprobar los valores que van tomando las variables y en que escenario se produce este problema, eso es lo que tenes que ver en primer termino. ¿Que hace que opcion sea 1 e indiceSeleccionado 0? Si eso valores estan correctos en cuanto a entrada por parte del usuario entonces tenes recursion infinita y tenes que repensar la logica.
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
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void [Ver vídeo]
« Respuesta #6 en: 29 Agosto 2024, 23:48 pm »

En realidad infinita no, ya que si entro tres veces, debo salir tres veces para que luego el programa me funcione bien.

Estoy averiguando si es posible borrar la pila por mi mismo, no se si se puede hacer realmente.



Parece ser que si, voy a leer un poco más aquí.

https://csharp.com.es/la-pila-en-c-lifo-la-cola-lilo/

Gracias por los comentarios, les seguiré escribiendo.
En línea

Eternal Idol
Kernel coder
Colaborador
***
Desconectado Desconectado

Mensajes: 5.969


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


Ver Perfil WWW
Re: Salir de un void
« Respuesta #7 en: 30 Agosto 2024, 00:17 am »

Tocar la pila de llamadas es un delirio. Replantea el codigo de tal manera que no se llamen entre ambas funciones.
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
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void
« Respuesta #8 en: 30 Agosto 2024, 07:16 am »

Entonces, cuando pulso atrás debo ir como indica abajo.

_0_Ajustes.AjustesPrincipal();

No ha acabado la función Volumen();

Ahí está el problema, debe terminar primero Volumen() para que no se quede ahí en la pila precisamente Volumen() cuando me estoy hiendo a otro void como en este caso _0_Ajustes.AjustesPrincipal();.

¿Alguna idea?
En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Salir de un void
« Respuesta #9 en: 30 Agosto 2024, 16:54 pm »

Primero que nada, deberías repasar los fundamentos, porque te estás complicando mucho con cosas más bien triviales, además de que la sugerencia de quitar el bucle era tan disparatada, y tan obvio lo que iba a suceder, que no sé cómo se te ocurrió siquiera probarla.

En cuanto al problema, en general, si tienes una secuencia de llamadas de funciones tipo:

A  --> B --> C --> D

deberías intentar evitar que cualquiera de esas funciones llame a alguna de las anteriores (B no debería llamar a A, C no debería llamar ni a A ni a B, etc.). Si por ejemplo, estando en D, quieres volver al submenú anterior (C), la solución NO es llamar a C, sino simplemente dejar que D termine su ejecución, retornando de forma normal.

Si también quieres que, por ejemplo, desde D o C sea posible volver al menú inicial (A), lo único que cambia es que estas funciones deberían devolver un valor que indique que se seleccionó la opción del menú principal. Suponiendo que sea un bool, lo que harías sería que cuando desde una función se desea volver al inicio, ésta termine con un return true (y en todos los demás casos, retornar false). Asimismo, todas las funciones, al invocar a otra, deberán verificar el valor que retorne, y si es true, deberán terminar su ejecución, devolviendo a su vez true, es decir, este valor se propaga a lo largo de la secuencia de llamadas, lo cual hará que termines volviendo al menú inicial de forma limpia.

Para que todo esto funcione, tienes que cambiar tus funciones de manera que los menús se impriman dentro de los bucles.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
(void *) en funciones
Programación C/C++
Shon 4 5,371 Último mensaje 25 Enero 2011, 16:06 pm
por Littlehorse
dev-c++ ----> ¿void?
Programación C/C++
lalocr 7 19,017 Último mensaje 21 Abril 2011, 11:05 am
por <<<-Basura->>>
Convertir de void a int
Programación C/C++
mester 3 5,345 Último mensaje 22 Noviembre 2015, 20:07 pm
por mester
Problema con un void
Programación C/C++
grossgore 2 1,876 Último mensaje 4 Mayo 2017, 16:10 pm
por dato000
Problemas con los void « 1 2 »
Programación C/C++
Sayuri108 18 6,905 Último mensaje 10 Enero 2018, 01:47 am
por srWhiteSkull
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines