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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda 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 4,704 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void
« Respuesta #10 en: 30 Agosto 2024, 17:36 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.

Muy bueno, si Señor.  ;D

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.

Eso intentaba desde el principio, que vuelva de forma limpia, de cualquier proceso. Con los GOTO, que está muy mal visto por ser propenso a tener malas prácticas de programación, como no usa pila, solo etiquetas, iba hacer pruebas.

Hay más opciones de saltos según aquí.

https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/statements/jump-statements

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

Sigo cogiendo ideas. Me da igual empezar desde cero el programa aunque sea largo.


En cuanto a tu ejemplo del:

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

Pues si, me interesa estar en B, luego paso limpiamente a D, luego a A, luego a D otra vez, todo limpio, de eso se trata, ya que estoy trabajando como si fueran un Form llama a otro Form del que me de la gana dentro de un programa de Windows Form, que en este caso no hay problemas, en modo consola si hay si te despistas.


En cuanto al return, me imagino que te refieres que justo antes que acabe un void o función, tenga return true; o el return false;

Muchas gracias a todos por las aclaraciones.


« Última modificación: 30 Agosto 2024, 18:05 pm por Meta » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void
« Respuesta #11 en: 30 Agosto 2024, 23:25 pm »

Si en el void Volumen(); estoy aquí.

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

Terminaré entrando en _0_Ajustes.AjustesPrincipal(); sin acabar la función Volumen().

Como dicen arriba y es verdad. Dejo acabar primero Volumen, pero hay dos opciones, > ATRÁS y INICIO dentro de Volumen.

En este caso quiero pulsar > ATRÁS.

¿Cómo se hace?

Saludos.


En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Salir de un void
« Respuesta #12 en: 31 Agosto 2024, 02:50 am »


En cuanto al return, me imagino que te refieres que justo antes que acabe un void o función, tenga return true; o el return false;

Sí, pero las void no pueden devolver valores, así que tendrías que cambiar las funciones de los submenús a bool.

Te pongo un ejemplo genérico (y medio en pseudocódigo) de cómo podrías hacerlo:

Código
  1. void MenuPrincipal()
  2. {
  3. bool salir = false;
  4. do {
  5. dibujar menu principal;
  6. leer opcion;
  7. switch (opcion) {
  8. case 1:
  9. Ajustes();
  10. break;
  11. case 2:
  12. SubMenuB();
  13. break;
  14. etc ...
  15. case N:
  16. salir = true;
  17. break;
  18.  
  19. }
  20. } while (!salir);
  21. }
  22.  
  23. bool AjustesPrincipal()
  24. {
  25. // La variable inicio indicara si se selecciono volver al inicio
  26. bool salir = false, inicio = false;
  27. do {
  28. dibujar menu;
  29. leer opcion;
  30. switch (opcion) {
  31. case 1:
  32. salir = inicio = Volumen();
  33. break;
  34. case 2:
  35. salir = inicio = SubMenuB();
  36. break;
  37. etc ...
  38. case Atras:
  39. salir = true;
  40. break;
  41. case Inicio:
  42. salir = inicio = true;
  43. break;
  44. }
  45. } while (!salir);
  46.  
  47. return inicio;
  48. }

Con Volumen y todos los demás submenús harías esencialmente lo mismo que con AjustesPrincipal:

Código
  1. bool Volumen()
  2. {
  3. bool salir = false, inicio = false;
  4. do {
  5. dibujar menu;
  6. leer opcion;
  7. switch (opcion) {
  8. case 1:
  9. instrucciones;
  10. break;
  11. case 2:
  12. // Si volumen llamara a un submenu, habria que hacerlo tambien asi:
  13. salir = inicio = SubMenu();
  14. break;
  15. etc ...
  16. case Atras:
  17. salir = true;
  18. break;
  19. case Inicio:
  20. salir = inicio = true;
  21. break;
  22. }
  23. } while (!salir);
  24.  
  25. return inicio;
  26. }

Puede que tengas que reestructurar un poco tu código, pero eso debería funcionar.

Como mencionaste lo de los goto, si acaso necesitaras que cuando se seleccione "Atrás" o "Inicio", la función retorne inmediatamente sin pasar por el while, podrías hacerlo así:

Código
  1. case 2:
  2. // Si volumen llamara a un submenu, habria que hacerlo tambien asi:
  3. inicio = SubMenu();
  4. if (inicio)
  5. return true;
  6.  
  7. break;
  8. etc ...
  9. case Atras:
  10. return false;
  11. break;
  12. case Inicio:
  13. return true;
  14. break;
  15. }
  16. } while (!salir);
  17.  
  18.  

Así que ni siquiera en este caso hay necesidad de gotos. De hecho, prácticamente nunca hay que usarlos (hay poquísimas excepciones donde pueden ser útiles).
« Última modificación: 31 Agosto 2024, 02:53 am por RayR » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void
« Respuesta #13 en: 1 Septiembre 2024, 18:09 pm »

Muy bueno.

Estuve viendo, que no esté llamando una función dentro de otra sin acabar la anterior. Para eso mejor los goto. (Recordar, no se recomienda su uso para evitar malas prácticas de programación).

Dice que, puedo volver con un parámetro a la función principal e indicando en ese parámetro a dónde ir.

¿Algún ejemplo de esto?

Otros me dicen que, use la forma de programar en consolas, modo máquinas de estados.

Todas las funciones que haga, se controla en la raíz, todas las variables que sean estáticas o globales en raíz, es decir, que cuando llames a una función y termine, vuelva a la raíz del programa y se va a otra función que yo le indique. Toda función en realidad es una ventana hecho en modo consola. Así no habrá riesgo todo el tema de pilas de llamadas, o hay desbordamiento de pila, o el programa se comporta de otra manera que no deseo, por ejemplo, se me va a otra ventana porque la función no había acabado.

 ;)
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Salir de un void
« Respuesta #14 en: 6 Octubre 2024, 18:27 pm »

Descansé un poco.

Para entendernos un poco.

Como indica aquí el vídeo de abajo usando la consola en C#, haciendo sistemas de menús y submenús. Quiero hacer el mejor diseño de cambiar a una página o otra como las páginas Web.



LAs páginas Web de HTML puro y duro, voy de una página a otra. En temas de consolas C#.

¿Cuál es la idea correcta y no haya desbordamiento de pila?

Porque cada página que la llamo ventana, lo hacía con void, es decir, como un archivo.html de una página Web.

Se sabe que es modular, eso es lo bueno, no te interesa una página o archivo.html lo quitas y no hay problemas, o lo pones, sin desbordamiento de pila ni nada.

¿Algún consejo?

Saludos.
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,332 Último mensaje 25 Enero 2011, 16:06 pm
por Littlehorse
dev-c++ ----> ¿void?
Programación C/C++
lalocr 7 18,936 Último mensaje 21 Abril 2011, 11:05 am
por <<<-Basura->>>
Convertir de void a int
Programación C/C++
mester 3 5,299 Último mensaje 22 Noviembre 2015, 20:07 pm
por mester
Problema con un void
Programación C/C++
grossgore 2 1,841 Último mensaje 4 Mayo 2017, 16:10 pm
por dato000
Problemas con los void « 1 2 »
Programación C/C++
Sayuri108 18 6,774 Último mensaje 10 Enero 2018, 01:47 am
por srWhiteSkull
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines