Pascal - Runtime Error 200

Actualización 12/03/2013:
Publicado originalmente en mi web de Terra el 02/06/2001. Recupero este manual ya que había bastante gente consultándolo.



Voy a empezar la sección de Pascal hablando del RUNTIME ERROR 200 del Turbo Pascal y del Borland Pascal. Seguro que alguna vez te bajaste algún programa que funciona bajo DOS, y funcionaba bien en tu ordenador viejo, pero al probarlo en un ordenador más rápido ponía algo así como RUNTIME ERROR 200 AT XXXX:YYYY.

Esto se debe a que cuando la gente de Borland programó el Turbo/Borland Pascal, los ordenadores no eran tan rápidos como los de ahora. Me explico:

En pascal se pueden usar 'units', que viene a ser algo así como los #include <archivo.h> de c/c++. Una de esas units, la CRT, que es una de las más usadas, tiene una función llamada DELAY, que produce una parada de X milisegundos al llamarla de esta manera: DELAY (X);

¿Que cómo hace para saber cuanto tiempo tiene que detener la ejecución? En el código de inicialización de la unit, que se ejecuta al principio de cada programa que la use (por eso el programa no llega ni a arrancar), ejecuta un bucle de 55ms en el que se incrementa una variable LONGINT. Al acabar, se hace una división entre 55 para saber cuántas veces tiene que incrementar la variable hasta que pase 1ms, y el resultado lo guarda en una variable tipo WORD (0-65535).

En un ordenador lento no hay problema, pero cuando usamos uno de más de 200MHz (aproximadamente), la variable LONGINT aumenta tanto que al hacer la división, el resultado no cabe en la variable WORD. Ahora es cuando el ordenador 'razona': al no caber el resultado, eso quiere decir que es un valor infinito, y la única manera de que haya dado infinito una división es que lo haya dividido entre cero, y saca por pantalla: RUNTIME ERROR 200 (división entre cero, en el manual de Turbo/Borland Pascal).

Para corregir ese error, se pueden hacer varias cosas:
- Si no tienes el código fuente del programa, aplica el parche de Andreas Bauer. Puedes instalarlo como una herramienta en el menú OPTIONS_TOOLS_NEW:
En Title ponemos algo que nos recuerde el parche, por ejemplo ~R~TE200 patch (La R entre los caracteres ~ aparecerá resaltada en el menú, y al pulsar la R se ejecutará el parche). En Program Path ponemos la ruta donde está guardado el parche, por ejemplo TPPATCH y en command line ponemos TPPATCH $EXENAME.
Luego ejecuta el programa que use la unit CRT con el error usando Alt-R R ó CTRL+F9. Después de que aparezca el RTE200, usa Alt-T, R, y ejecuta el programa de nuevo. El error está solucionado.

Tool

- Crea tu propia unit CRT. Para eso tendrás que tener unos conocimientos de programación algo buenos, porque la CRT tiene bastantes funciones, y en algunas hay que usar ensamblador.
- Cambia la unit CRT por una con el error corregido, por ejemplo la de Pedt Scragg, que corrige algunos errores y añade algunas cosas, como reconocimiento de las teclas F11 y F12. Para usarla tendrás que sustituirla por la errónea: en el directorio Turbo Pascal está el archivo TURBO.TPL. Ahí es donde están guardadas las units de borland. Para modificarlas, usa el programa TPUMOVER.EXE que está en ese mismo directorio (¡¡¡recuerda hacer antes una copia de seguridad de ese archivo!!!) de la siguiente manera: TPUMOVER TURBO.TPL -CRT.

C:\TP\BIN\>TPUMOVER.EXE TURBO.TPL



Luego, en el archivo CRT.ZIP, extrae la versión de la CRT que coincida con la de tu compilador:
CRT50.TPU - CRT para V5.00
CRT55.TPU - CRT para V5.50
CRT60.TPU - CRT para V6.00
CRT70.TPU - CRT para V7.0x Modo Real
CRT70.TPP - CRT para V7.0x Modo Protegido
CRT80.TPU - CRT para Delphi V1 Modo Real
CRT80.TPP - CRT para Delphi V1 Modo Protegido
Renombra CRTXX.TPU a CRT.TPU y CRTXX.TPP a CRT.TPP.
(Para Turbo Pascal 7.0 usa CRT70.TPU)
Introduce ahora este archivo en la librería correspondiente:
TPUMOVER TURBO.TPL +CRT

Ahora, cualquier programa que compiles con la CRT funcionará perfectamente en cualquier ordenador (si tú programas bien el resto;)
Resumiendo, los archivos necesarios son:
Unit CRT de Pedt Scragg
parche de Andreas Bauer
Más información (en inglés) en:
http://www.merlyn.demon.co.uk/pas-r200.htm