• Lunes 29 de Abril de 2024, 03:46

Autor Tema:  Error 28 "out Of Stack Space"  (Leído 4457 veces)

lao.torres

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Error 28 "out Of Stack Space"
« en: Jueves 31 de Mayo de 2007, 19:14 »
0
: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

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Error 28 "out Of Stack Space"
« Respuesta #1 en: Lunes 2 de Julio de 2007, 01:11 »
0
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
  1.  
  2. Private Function sumar() As Double 'esta función producirá desbordamiento
  3.     Static d As Double
  4.     d = d + 1
  5.     If d = 6000 Then Exit Function
  6.     Call sumar
  7.     sumar = d
  8. End Function
  9.  
  10. Private Sub Command1_Click()
  11.     msgbox(sumar)
  12. End Sub
  13.  
  14.  
  15.  

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
  1. Private function contar() as double 'esta función NO producirá desbordamiento
  2.     Dim d As Double
  3.     For d = 0 To 6000
  4.         d = d + 1
  5.     Next
  6. End Sub
  7.  
  8. Private Sub Command1_Click()
  9.     msgbox(contar) 'no da error
  10.     msgbox(sumar) 'dará error de desbordameinto de pila
  11. End Sub
  12.  
  13. Private Function sumar() As Double  'esta función producirá desbordamiento
  14.     Static d As Double
  15.     d = d + 1
  16.     If d = 6000 Then Exit Function
  17.     Call sumar
  18.     sumar = d
  19. End Function
  20.  
  21.  
  22.  

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.
«Ma non troppo»
----> ModoVacaciones = False<----