Clipper 5.x

Errores no documentados
(Cuando la culpa la tiene Clipper)

 

Hay veces en que el código de un programa parece estar bien y se producen errores sin una explicación aparente.
En otras oportunidades estos errores no presentan ningún mensaje, son fallas en nuestro sistema, pero al ver el código una y otra vez todo aparenta estar bien.
A continuación hay una tabla descriptiva de estos "errores indocumentados del Clipper".

 

Error Detalle y posible solución.
Error en tiempo de ejecución R6003
(runtime error R6003)
Este es un error muy típico hoy en día, donde los PC's son muy veloces, se produce cuando corres un programa en Clipper en un procesador demasiado rápido, o que tiene alguna arquitectura preparada para omitir ciclos innecesarios, como por ejemplo los nuevos "AMD(tm)".
La manera mas práctica de resolver este error es bajarte el archivo __wait_4.obj ó el
__wait_b.obj (Recomendado) de esta página y linkear los programas incluyéndolo, no hace falta modificar el código, solo incluir el archivo al momento de hacer el "Link".
Gracias a la voluntaria y desinteresada colaboración de Walter Negro, un avanzado programador del Clipper obtuve el archivo "__wait_b.obj", el me explicó que es mejor usar este .OBJ porque el otro usa un FOR para ralentizar y con máquinas más rápidas o con ciertas optimizaciones puede volver a ocurrir el R6003.En cambio el __wait_b.obj usa el contador interno de la maquina para determinar un tiempo que sea independiente de la velocidad del procesador.
En la página de Walter Negro,
www.genesys.4mg.com , está muy claramente explicado el tema y se puede obtener una solución para este problema a trabes de un parche (Patch) para los usuarios que solo tengan un .EXE y no puedan recompilar el programa.
Error interno 8002
(internal error 8002)
Este error ocurre cuando un programa es compilado con Clipper 5.3 y likeditado con ExoSpace crea índices en bases de datos que tienen una gran cantidad de registros, para solucionar esto solo hace falta arreglar (to patch) el programa con el utilitario OPTEDIT.EXE con el parámetro "extramin" por ejemplo:

Optedit myprog.exe -extramin 4096

Aunque algunas aplicaciones pueden necesitar un valor superior a 4096, la mayoría de los errores 8002 se solucionan con este parámetro.
Error interno 667
(Internal Error 667)
Este error se produce cuando se corrompe el área de memoria llamada "evaluation stack", que es la que el compilador Clipper utiliza para contener las variables locales. Esto es debido a que se declararon demasiadas variables de tipo estático (Static).
Para solucionarlo solo es necesario reducir la cantidad de variables definidas como estáticas.
Error interno 1210
(Internal Error 1210)
Un 1210 ocurre cuando el manejador de bases de datos "DBFNTX" detecta una inconsistencia en un índice pero no la interpreta como una corrupción del mismo.
Este caso se puede dar por varios motivos, el mas común es que en la expresión del índice haya alguna función que esté variando el largo de la cadena, por ejemplo si tratas de hacer un AllTrim() en una expresión de índice, el programa dará un error, probablemente 1026 (error en datos), ya que todos los resultados de una expresión de índice deben tener el mismo tamaño y formato.
Otra posibilidad es que haya demasiados campos clave idénticos en la expresión del índice, este caso no parecía tener solución hasta que a Norman Mongeau se le ocurrió la excelente idea de agregar al final de la expresión algo como "+ Str(RecNo())", e increíblemente funcionó.
Si ninguna de estas soluciones arregla el problema, la solución definitiva sería cambiar el manejador "DBFNTX", ya que este error solo se produce con este manejador.
Error interno 5333
(Internal Error 5333)
Este poco común error se produce cuando el subsistema de memoria virtual se ve sobrecargado y no queda memoria para continuar ejecutando el programa. La única manera de solucionar este error es migrar a Clipper 5.2d ó superior, ya que en esas versiones ya solucionaron el problema.
Para forzar el error se puede ejecutar el comando "@ 500, 1000 Say 'Hola'", si la versión del Clipper que posees es inferior a 5.2d, seguramente dará un error interno 5333.
Error irrecuperable 650: Desbordamiento de pila interna
(Unrecoverable Error 650: Processor Stack Fault)
Este error se produce cuando el programa entra en una recursividad infinita, por ejemplo cuando una función se llama a si misma una y otra vez, es muy típico cuando ocurre un error en el código de un manipulador de errores (error handler).

Para hacer un programa que produzca este error solo debe llamar una función desde dentro de la misma, ejemplo:

Func Prueba650()
Prueba650()

Si un programa arroja este error y no puedes determinar donde se produce esa recursividad, lo mejor es depurarlo desde el principio y buscar donde esto sucede.
Otro caso posible es que haya mas de 50 procedimientos ó funciones que se hayan llamado entre si, por ejemplo:

Proc1
[...]
Call Proc2
Proc2
[...]
Call Pro3
...
...
Proc50
Call Proc51

En realidad puede variar la cantidad de procedimientos dependiendo la versión del compilador, del linkeador y de la memoria, pero 50 es un número mínimo para el peor de estos casos.
Fallan los índices al hacer búsquedas "DbSeek()" en un Terminal Server ó un servidor Novell.
Si bien conozco la solución para este problema, no tengo idea de los motivos del mismo.
En la empresa en la que trabajo esporádicamente esto sucede, y luego recibí un email de alguien que tenía el mismo problema en un Terminal Server.
El problema en detalle es el siguiente, de repente las búsquedas en las bases de datos fallan, y por mas que los índices sean regenerados las búsquedas siguen fallando.
La única forma que conozco de arreglar este error es copiar el .DBF (La base de datos en cuestión) con otro nombre, ojo no renombrar, sino hacer un "Copy" desde DOS

Ejemplo :

Copy MYBASE.DBF TEMP.DBF

Y luego volver a copiar la base con el nombre original

Ejemplo:

Copy TEMP.DBF MYBASE.DBF
¿Desea sobrescribir bt.prg (Sí/No/Todo)?S

Luego de esto hay que regenerar todos los índices de la misma y listo, problema solucionado por un tiempo indeterminado, normalmente el período de tiempo es bastante largo (gracias a Dios), por lo que esta solución es relativamente efectiva.

Nota: La verdad es que ni siquiera puedo imaginar donde radica el problema, ni mucho menos que es lo que lo soluciona, la primera vez que tuve este error pedí ayuda al centro de cómputos de la empresa y me dieron esta solución, me reí y reclamé que me dieran una respuesta veraz, pero insistieron al punto en que lo probé y fue tal la sorpresa que quedé anonadado.
(En realidad ellos me dijeron que para que funcione tenía que copiar la base con el nombre del operador que me atendió, y que de otra forma no funcionaría, hoy por cábala lo sigo haciendo así, DAFFY.DBF)
Si alguien conoce el motivo de este error y por que se soluciona, por favor envíen un email al Gurú del Clipper para explicarlo, gracias.
Error interno 9
(Internal error 9)
Este poco descriptivo error se produce cuando los índices de una base se encuentran inconsistentes, para solucionarlo solo hace falta regenerarlos.
Error de Clipper al sumar dos valores y compararlos con uno igual
Dado el siguiente programa :

Var1 = 2045.18
Var2 = 500
Tot = 2545.18
If Tot = (Var1 + Var2)
..? "Igual"
Else
..? "Distinto"
EndI

Clipper a diferencia de Fox, DBase o lo que ustedes suponen, dice que es "Distinto".
Aún no comprendo a que se debe el error, incluso si se cambian los valores de las variables en algunos casos da "Igual" y en otros "Distinto".
Consulté a la gente de CA para pedir una explicación y no tuve respuesta alguna.
Este error es realmente grabe, ya que nadie se pone a probar que el comando "IF" funcione y normalmente cuesta horrores detectarlo.
Si alguien entiende el motivo de este error por favor que me envíe un email.

Para solucionar esto solo hace falta cambiar la línea:

If Tot = (Var1 + Var2)

Por:

If Str(Tot) = Str(Var1 + Var2)

Es increíble, pero es así.
@ 2,2 say int(1.14*100) da como resultado 113 Este increible error es heredado desde el C#.
int(1.14*100) = 113
int(1.15*100) = 114
int(1.16*100) = 115
int(1.17*100) = 117

Fox y dBase cometen el mismo error.

 

Esta sección sobre CA-Clipper está coordinada íntegramente por Diego Lucio D'Onofrio


la Luna del Guille o... el Guille que está en la Luna... tanto monta...

Estadísticas desde el 01/Nov/2002 23:15