![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
¿Es posible borrar pila de llamadas?
Hola gente:
¿Cómo están todos? Quiero en C#, cuando entro en un void, al terminar, vuelve a continuar su camino justo donde lo dejó. Entro en un void a() a otro void b(). Todo acaba bien cuando termina void b(), vuelve al void a() y también acaba. El problema está cuando hago esto. Voy al void a(), dentro de él, salto directamente al b(), sin acabar el void b(), salto al void c(), sin terminar el c(), salto o llamo al a() directamente. De esa manera la pila se queda almacenada, no se borra hasta que termine todo el código interior de cada void. ¿Hay alguna manera de borrar la pila de llamada cuando salte de un void a otro sin terminar el programa completo? Ya que estoy haciendo saltitos haciendo pruebas. Lo suelo hacer cuando se hace mençus co nsubmenús y me da la tabarra. Ver vídeo. Gracias.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino. |
#2
|
||||
|
||||
A lo mejor debes dejar sólo el botón "Atrás" y quitar el de "Inicio".
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
|||
|
|||
Ya se lo que le pasa. Cuando entro a un void, voy a otro que está anidado y no acabo el principal.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino. |
#4
|
|||
|
|||
Se desborda la pila por 5380 veces la pila de llamada, a veces 5376, otras veces por 5375, nunca igual.
Como puedes ver, e() llama a a() sin terminar el proceso e(), se crea la recursividad y por eso nunca acaba hasta que se desborde. Tengo una pregunta. Como e() nunca acaba su función porque dentro llama a a(). ¿Hay alguna manera de que termine de forma limpia dicha función e()? Mi idea es que si llamo a e() y dentro tengo a a(), nunca acabará el e(). Lo malo de la función, que debe terminar el proceso o función antes de empezar otra. Si uso goto, no tendré problemas de memoria de pila. Lo malo que el goto, crea malas prácticas de programación, por eso mejor no usarlo. Si domino esto, podré hacer bien programas de consolas como este que puedes ver en el vídeo, llamar ventanas desde otras ventanas sin tener problemas de pila. Ahí está el dilema. Ver vídeo. Código en C#: Código:
using System; namespace Pila_de_llamadas_Consola_01 { internal class Program { static void e() { a(); } static void d() { // Aquí. } static void c() { } static void b() { c(); d(); e(); } static void a() { b(); } static void Main(string[] args) { a(); } } }
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino. |
#5
|
||||
|
||||
En lugar de llamar de unas a otras, puedes regresar con un parámetro a la principal e indicando en ese parámetro a cuál debe ir.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#6
|
|||
|
|||
Hola:
He hecho esto. Porque controla que no haya recursividad sin darme cuenta y funciona. Código:
using System; namespace Pila_de_llamadas_Consola_03 { internal class Program { // Contador para controlar la recursividad. private static int contador = 0; static void e() { if (contador < 1) // Limita las llamadas recursivas. { contador++; a(); } } static void d() { // Aquí. } static void c() { } static void b() { c(); d(); e(); } static void a() { b(); } static void Main(string[] args) { a(); Console.WriteLine("Fin de programa."); // Pulse cualquier tecla para salir. Console.ReadKey(); } } } En lo que comentas. Cita:
Iba a usar los goto que no usa pila de llamadas en ningún momento, todo el mundo me dicen, prohibido usar goto, porque así evito malas prácticas de programación a cara el futuro. ¿Puedes poner un ejemplo sobre lo que indicas? Gracias.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino. |
#7
|
||||
|
||||
Es importante aclarar que void es el tipo de dato que devuelve la función, las llamadas son a funciones, métodos o procedimento sin resultado, no a void. Lo que estas haciendo es un ciclo sin salida (A>B>E>A), la pila se va a llenar siempre. Para eso debes controlar la recursividad.
Esto es una adaptación rápida, pero no parece tener lógica, es difícil entender lo que quieres lograr.
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. ![]() |
#8
|
||||
|
||||
Hay maneras para evitar un stack overflow:
Usando la ultima forma, porque parece que estas intentando es hacer un 'Navigation Controller` como: https://developer.apple.com/document...tioncontroller, y es muy fácil de esquematizar:
__________________
El malabarista. |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
desbordamiento de pila | danielmj | Varios | 4 | 30-10-2016 20:27:48 |
posible borrar toda informacion registrada en bases de datos en un determinado tiempo | jirbert | Conexión con bases de datos | 3 | 13-06-2008 14:29:31 |
posible? borrar toda la informacion guardada en la base de datos | jirbert | Conexión con bases de datos | 4 | 24-04-2008 05:00:59 |
Desbordamiento de pila | ecfisa | OOP | 2 | 06-12-2007 16:08:35 |
Desbordamiento de Pila | Durbed | Conexión con bases de datos | 5 | 21-06-2006 20:05:31 |
![]() |
|