Visual Basic - Evitar la saturación de la pila de llamadas

Life is soft - evento anual de software empresarial
   
Vista:

Evitar la saturación de la pila de llamadas

Publicado por SebasSBM (20 intervenciones) el 30/08/2007 17:31:43
He creado un programa tan largo que he tenido que dividir el procedimiento en varios procedimientos, y los he enlazado usando "Call" al final de cada instrucción.

Option Explicit
Private Borrar(1 To 36) As Variant, BorrarA As Variant ' El valor de estas variables es un número aleatorio del 1 al 81. Los valores de estas variables no se repiten entre sí.

[...]

Public Sub Blanquear()
[...]
Call Cuadrar
End Sub

Public Sub Cuadrar()
For Each BorrarA In Borrar
Line1: If BorrarA = 1 And BorrarA = 2 Or BorrarA = 1 And BorrarA = 3 Or BorrarA = 1 And BorrarA = 4 Or BorrarA = 1 And BorrarA = 5 Or BorrarA = 1 And BorrarA = 6 Or BorrarA = 1 And BorrarA = 7 _ Or BorrarA = 1 And BorrarA = 8 Or BorrarA = 1 And BorrarA = 9 Or BorrarA = 2 And BorrarA = 3 _ Or BorrarA = 2 And BorrarA = 4 Or BorrarA = 2 And BorrarA = 5 Or BorrarA = 2 And BorrarA = 6 _
Or BorrarA = 2 And BorrarA = 7 Or BorrarA = 2 And BorrarA = 8 Or BorrarA = 2 And BorrarA = 9 _ Or BorrarA = 3 And BorrarA = 4 Or BorrarA = 3 And BorrarA = 5 Or BorrarA = 3 And BorrarA = 6 _
Or BorrarA = 3 And BorrarA = 7 Or BorrarA = 3 And BorrarA = 8 Or BorrarA = 3 And BorrarA = 9 _
Or BorrarA = 4 And BorrarA = 5 Or BorrarA = 4 And BorrarA = 6 Or BorrarA = 4 And BorrarA = 7 _
Or BorrarA = 4 And BorrarA = 8 Or BorrarA = 4 And BorrarA = 9 Or BorrarA = 5 And BorrarA = 6 _
Or BorrarA = 5 And BorrarA = 7 Or BorrarA = 5 And BorrarA = 8 Or BorrarA = 5 And BorrarA = 9 _
Or BorrarA = 6 And BorrarA = 7 Or BorrarA = 6 And BorrarA = 8 Or _
BorrarA = 6 And BorrarA = 9 Or BorrarA = 7 And BorrarA = 8 Or BorrarA = 7 And BorrarA = 9 Or_ BorrarA = 8 And BorrarA = 9 Then GoTo Line2 Else Blanquear ' Así me aseguro que alguna de las coincidencias anteriores se cumpla, ya que el procedimiento "Blanquear asigna aleatoriamente los valores de las variables de la matriz Borrar.
Line2: If...(similar a la línea 1, con otros valores) Then GoTo Line3 Else Blanquear
Line3:[...] 'la última línea de todas llama a otro procedimiento si las condiciones If..Then(similares a las anteriores), se cumplen.
Next
[...]
End Sub
[...]

En la pila de llamadas me aparecen múltiples llamadas a estos dos procedimientos alternativamente. ¿Cómo puedo evitar esto? Existe alguna forma de llamar a otro procedimiento anulando la llamada del procedimiento que se está ejecutando actualmente?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Es recursivo tu código

Publicado por Taliban (13 intervenciones) el 30/08/2007 18:18:04
El problema que veo, como me dijiste en el post anterior, es que se satura la pila, porque tu código es recursivo: Blanquear() llama a Cuadrar() y Cuadrar() llama a Blanquear(). Tal vez sí te sirva usar el Gosub, pero dentro del mismo procedimiento Cuadrar:

Public Sub Cuadrar()
For Each BorrarA In Borrar
[...]
BorrarA = 9 Or_ BorrarA = 8 And BorrarA = 9 Then GoTo Line2 Else Gosub Blanquear
Line2: If...(similar a la línea 1, con otros valores) Then GoTo Line3 Else Gosub Blanquear
Line3:[...]
Next
[...]
Exit Sub ' No olvides poner esto.
Blanquear:
' Aquí deberías poner el código del Sub Blanquear.
[...]
Return
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lo he probado, pero...

Publicado por SebasSBM (20 intervenciones) el 30/08/2007 19:05:51
Gracias por tu ayuda. Talvez funcionaría, pero haciendo esto el procedimiento Cuadrar se vuelve demasiado largo. Los valores de la matriz Borrar dependen del procedimiento Blanquear, y el procedimiento cuadrar establece ciertos límites en cuanto a los valores de las variables de dicha matriz. ¿Existe alguna otra solución?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar