• Sábado 9 de Noviembre de 2024, 02:20

Autor Tema:  Error "c0000005" - ¿por Qué Ocurre?  (Leído 14783 veces)

CSIU

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Error "c0000005" - ¿por Qué Ocurre?
« en: Jueves 1 de Septiembre de 2005, 17:48 »
0
Saludos a todos,

 No se si ya les ha pasado que de repente están en un programa desarrollado en VFP y les sale un mensaje de error con el código "C0000005" sacándolos inmediatamente de la aplicación cuando presionas "aceptar". Alguien sabe a que se debe?

 He buscado en internet y unos lo atribuyen al OS, otros al trabajo con grids en VFP, otros a la memoria de la pc. Será un problema solo en VFP?, Cómo se puede evitar el tener este error?

Gracias de antemano.- :ph34r:
"Six bullets... more than enough to kill a man." Revolver Ocelot

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Error "c0000005" - ¿por Qué Ocurre?
« Respuesta #1 en: Jueves 1 de Septiembre de 2005, 17:52 »
0
Es un error del ejecutable, un acceso a memoria que no es valida. ¿Como evitarlo? No conozco casi nada de VFP, intenta depurar tu programa y ver en que punto se da la excepcion.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

CSIU

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Error "c0000005" - ¿por Qué Ocurre?
« Respuesta #2 en: Jueves 1 de Septiembre de 2005, 18:06 »
0
mmm...voy a revisar el código otra vez, lo que me parece raro es que esa aplicación ya se ha utilizando en diferentes máquinas y no ha dado ese mensaje...por eso pensé que se debía a un factor externo a dicha aplicación. Quizá exista algún archivo corrupto en esa instalación...bueno, voy a revisar el código.

Gracias  :D
"Six bullets... more than enough to kill a man." Revolver Ocelot

DrakerDG

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
    • http://drakerdg.xbot.es/wordpress/
Re: Error "c0000005" - ¿por Qué Ocurre?
« Respuesta #3 en: Viernes 2 de Septiembre de 2005, 14:27 »
0
:comp: Conozco ese tipo de error, de hecho en VisualFox cuando se genera en alguna aplicación o ejecutable un error cualquiera, automáticamente se guarda en un archivo (Ej.: vfp7err.log) los errores con información importante para poder determinar donde se produce el error.  En mi caso lo eh encontrado en la carpeta "C:\Archivos de programa\Archivos comunes\Microsoft Shared\VFP\".  A continuación te pasteo un ejemplo que a mí me ocurrió:

Código: Text
  1.  
  2. Fatal error: Exception code=C0000005 @ 09/20/04 09:35:10 AM. Error log file: C:\Archivos de programa\Archivos comunes\Microsoft Shared\VFP\vfp7rerr.log
  3.   Called from -  frmfind.op.p2.txtdato.interactivechange line 38  {c:\seime\forms\frmfind.sct c:\seime\forms\frmfind.sct}
  4.   Called from -  frminout.cmdfind.click line 13  {c:\seime\forms\frminout.sct c:\seime\forms\frminout.sct}
  5.   Called from -  frmmain.toolbar01.cmdprof.click line 3  {c:\seime\forms\frmmain.sct c:\seime\forms\frmmain.sct}
  6.   Called from -  digiarm line 39  {C:\SEIME\progs\digiarm.prg c:\seime\digisoft.exe}
  7.  
  8.  
  9.  

Primero te indica el error (en este caso C0000005), la fecha y la hora en que ocurrió.  Pero lo más importante es que escribe los eventos y las líneas que provocaron el error.  Como se puede observar hay varios eventos tabulados, el primero (frmfind.op.p2.txtdato.interactivechange line 38) es el que indica en que línea exactamente se produjo el error, los siguientes son los eventos precedentes para llegar a esa parte del código, por lo que su interpretación es de abajo hacia arriba.  

En este caso en particular, parto de un ejecutable llamado digisoft.exe, en el programa digiarm.prg indica la línea en que se inicia el procesamiento de eventos con READ EVENTS.
La siguiente indica que en el formulario frmmain.sct por medio del evento frmmain.toolbar01.cmdprof.click  en la línea 3 se abre el formulario llamado frminout.sct, del cual por medio del evento frminout.cmdfind.click  en la línea 13 llama al formulario frmfind.sct, y en este ultimo por medio del evento frmfind.op.p2.txtdato.interactivechange específicamente llegamos a la línea 38 en donde se produjo el error C0000005 y me saca del problema.

Siguiendo esta información, el error se producía en un proceso de búsqueda, ya que el formulario en el que estaba me servía para buscar información de artículos de inventario.  El problema radicaba en el manejo de las áreas y punteros de este formulario y del formulario precedente frminout.sct. En este hacia uso de la información recolectada en el anterior y realizaba una búsqueda, accesando una tabla de la misma base de datos de la consulta del formulario frmfind.sct.  

Cuando uno trabaja con archivos, es importante llevar un control en el manejo de apertura de áreas y punteros.  Ya que las áreas son espacios de memoria (buffer).  Mi error consistía en abrir una base de datos (OPEN DATABASE), luego una tabla con el SELECT, cerraba la tabla con él USE, pero no liberaba correctamente el buffer de la base de datos.  Al realizar varias consultas, acumulaba X cantidad de buffers (las veces que se realizaba esta operación) y llegaba un momento en que el espacio de memoria de buffers era demasiado grande y es en ese momento en que se producía el error.

Solución:  cambie la forma de consultar las tablas, procuro utilizar mas consultas en vez de abrir las bases de datos, y al realizar consultas liberó los punteros de las tablas involucradas por medio del USE.  Por ejemplo:

Código: Text
  1.  
  2. SELECT *&#59;
  3.  FROM sPath + 'data\digisoft!usuario'&#59;
  4.  WHERE (alltrim(str(usuario.codigo)) LIKE this.tag)&#59;
  5.  AND ((usuario.estatus >= nEMn)&#59;
  6.  AND (usuario.estatus =< nEMx))&#59;
  7.  ORDER BY usuario.codigo&#59;
  8.  INTO CURSOR myresp
  9.  
  10. * Como utilicé la tabla usuario, llamo al puntero que el SELECT de la consulta
  11. * llamó y procedo a liberarlo de la memoria con USE.
  12. * El comando use localiza la posición de memoria del puntero y libera el espacio
  13. * de memoria correspondiente.
  14.  
  15. SELECT usuario
  16. USE
  17.  
  18.  
  19.  

Es aconsejable hacer uso moderado del manejo de áreas (espacios de memoria), pues este error es causa en la mayoría de los casos por desbordamiento de pila (Stack overflow).  Realmente este tipo de error se da en cualquier programa en el cual se haga uso de apertura y cierre de archivos.  En la imagen adjunta está un ejemplo de este error.

Espero que toda esta historia te sirva.  :suerte:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
Saludos desde Guatemala, C. A.
Electrobotics