Programación General > VBA

 Error 28 "out Of Stack Space"

(1/1)

lao.torres:
:hola:

Por favor, si alguien puede ayudarme se lo agradecre muuuuuuuuuucho !

mi problema es el siguiente:   tengo un sistema que utiliza API's, especificamente el  ShellExecute, Sleep, SetCursorPos, FindWindow y PostMessage. El objetivo del sistema es que lee desde una base de datos una lista de archivos que los abre, se ejecutan un tiempo determinado y se cierran, esto es uno a uno infinitamente....   pero despues de un tiempo sale el error en pantalla:

out of stack space !!    ya estuve investigando y segun lei que las variables son el problema... segun yo ya cambie a constantes las variables pero sigue saliendo el mismo error.....

alguien podria ayudarme a solucionarlo?  

gracias mil !!!!!!


Laura !

Nebire:
Hola.

El problema del espacio de pila, no son las variables, sino la forma en que las utilizas.

Veamos, la pila es un espacio de memoria de tamaño limitado cuyo cometido es acceder muy rápidamente a su contenido o bien contener los punhtos de ruptura de la secuencia de los programas, para retornar al punto siguiente una vez terminado el ciclo de una estructura (función, sub,evento...). Esto pués supone una ventaja y un inconveniente. La ventaja es que usando la pila el acceso alos datos es más rápido, el inconveniente es que como el espacio es limitado hay que asegurarse que no ocupamos todo el espacio de pila.

Tienes que examinar tu código y buscar donde haces operaciones de recursividad (que es cuando más facilmente puedes desbordar la pila sin darte cuenta).

Por ejemplo, el sigueinte código me produce el desbordamiento de la pila (se pone un botón que llama a una rutina:

cuando aparece el problema de la pila d vale 5568 (en mi sistema).

--- Código: Text --- Private Function sumar() As Double 'esta función producirá desbordamiento    Static d As Double    d = d + 1    If d = 6000 Then Exit Function    Call sumar    sumar = dEnd Function Private Sub Command1_Click()    msgbox(sumar)End Sub   
Lo que sucede es que tras cada llamada a la rutnina contar, el sistema debe almacenar en la pila el punto del SALTO a la rutina contar, para que al término de la misma pueda retornar, pero sucede que tras un salto, sucede otro y orro y otro ... por tanto el espacio de pila se queda agotado o al menos el sistema detecta que se puede quedar agotado, porque ha entrado en un bucle que parece sin fin (en este caso concreto). ya que el desboramiento se produce cuando d vale 5568 no llega a alcanzar el valor 6000, que es cuando la pila se empezaría a vacíar tras empezar a devolver los puntos de retorno, de hecho si pusiéramos el valor 5567 en la comprobación de d, habríamos llegado al límite sin superarlo...

La solución consiste en resolver el problema con otro enfoque , en el ejemplo sería cuestión de usar una estructura for...next para evitar esto... (sin eliminar aquella función creamos otra similar para ver las diferencias)

--- Código: Text ---Private function contar() as double 'esta función NO producirá desbordamiento    Dim d As Double    For d = 0 To 6000        d = d + 1    NextEnd Sub Private Sub Command1_Click()    msgbox(contar) 'no da error    msgbox(sumar) 'dará error de desbordameinto de pilaEnd Sub Private Function sumar() As Double  'esta función producirá desbordamiento    Static d As Double    d = d + 1    If d = 6000 Then Exit Function    Call sumar    sumar = dEnd Function   
Es decir el bucle for next almacena en la pila (suponiendo que se almacene) sólo 1 variable (el valor del límite)...que se consulta con cada next y se elimina de la pila al salir del bucle.

Así tu problema posiblemente esté en que abres archivos  y abres y abres y abres, cuando lo ideal es abrir y cerrar ; si es necesario abrir y abrir sin cerrar, debes asegurarte que esto no se aplique a un número muy grande ... La forma rápida y segura de desbordamiento es anidar a un nivel profundo...

Aunque el problema no lo tuevieres en los archivos es similar.... un problema de anidación o de múltiples llamadas a funciones, eventos, subrutinas, doevents,etc.. sin generarse el retorno para ir vaciando la pila.

Navegación

[0] Índice de Mensajes

Ir a la versión completa