# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  lỗi 200 và cách khắc phục

## haido92

Nguyên nhân

Trước hết, để có thể tìm được vị trí gây nên lỗi, chúng ta hãy dùng đoạn chương trình đơn giản sau:

Program Test;
Uses Crt;
Begin
Writeln('Hello');
End.
Rõ ràng, chương trình này chỉ viết chữ Hello lên màn hình. Khi các bạn chạy chương trình sẽ nhận được thông báo lỗi: Runtime error 200 at ****:0091. **** là địa chỉ segment gây lỗi, có thể khác với mỗi máy tùy theo các chương trình đã nạp trong bộ nhớ. 0091 là offset của đoạn mã lệnh gây nên lỗi.

Nếu bạn bỏ dòng thứ 2: Uses Crt thì chương trình lại chạy một cách "ngon lành". Sở dĩ chúng ta có thể bỏ dòng này là vì hàm writeln duy nhất dùng trong chương trình vừa thuộc unit SYSTEM ngầm định, vừa thuộc unit CRT. Trong trường hợp dùng lệnh Uses CRT, CRT.Writeln sẽ được gọi. Trái lại, SYSTEM.Writeln sẽ được sử dụng nếu bạn không viết Uses CRT. Vậy, lỗi có liên quan tới unit CRT.

Giữ nguyên dòng Uses CRT, và thêm dòng:

SYSTEM.writeln('System Hello')
vào trước dòng writeln('Hello'). Khi chạy chương trình, bạn cũng sẽ chẳng thấy dòng System Hello hiện ra, mà hệ thống vẫn đưa ra câu báo lỗi tương tự. Như vậy, phần mã gây lỗi nằm trước mã lệnh SYSTEM.Writeln(System Hello).

Từ 2 nhận xét trên, có thể phán đoán ngay phần mã gây lỗi là phần khởi động của unit CRT-phần được thực hiện đầu tiên khi chương trình Test được nạp vào bộ nhớ.


Cách giải quyết

Mọi vấn đề "đau đầu" nói trên sẽ được giải quyết bằng cách thay đổi nội dung tập tin CRT.TPU. Thông thường, khi bạn khởi động TURBO PASCAL (TP) hay BORLAND PASCAL (BP), CRT.TPU sẽ được hệ thống tự động nạp khi đọc TURBO.TPL (TPL=Turbo Pascal Library). Nhiệm vụ của chúng ta là thay đổi unit CRT trong TURBO.TPL. 

C1: nếu cho mình là một lập trình viên Pro, hãy làm như sau: 
Trước khi tiến hành các bước sau, hãy lưu lại tập tin TURBO.TPL trong \BP\BIN để đề phòng mọi bất trắc.

Bước 1: Sửa lại nội dung unit CRT

Với một bản cài đầy đủ của Borland Pascal 7.0, bạn sẽ có thư mục \BP\CRT, trong đó có 2 tập tin CRT.ASM và CRT.PAS. Đầu tiên, hãy thay đổi nội dung CRT.ASM như sau (hãy bấm Ctrl Q-L và tìm từ DelayLoop và phần mã sau):

; Delay one timer tick or by CX iterationsDelayLoop:
@@1:
SUB AX,1
SBB DX,0
JC @@2
CMP BL,ES:[DI]
JE @@1
@@2: RET
trở thành:

; Delay one timer tick or by CX iterations
DelayLoop:
@@1:
push ax ; bắt đầu các hàng chèn thêm
push cx push dx
mov ax,0
mov cx,1
mov dx,0
div cx ;với 10 lệnh div cx, DelayCount = 5F0h div cx; đủ cho bạn chạy với CPU có tốc độ < 8GHz
div cx ; về mặt lý thuyết.
div cx
div cx
div cx
div cx
div cx
div cx
div cx
pop dx
pop cx
pop ax ; kết thúc các hàng chèn thêm
SUB AX,1
SBB DX,0
JC @@2
CMP BL,ES:[DI]
JE @@1
@@2: RET
Như tôi có trình bày ở phần trên, các dòng chèn thêm không thực hiện bất cứ một lệnh gì mà chỉ đơn thuần là làm chậm vòng DelayLoop lại. Điều này không có nghĩa là đồng hồ hệ thống sẽ chậm lại mà chỉ đơn thuần làm chậm vòng DelayLoop và giảm số lần lặp xuống.
Lệnh nguyên thủy SUB và SBB của vòng lặp được giữ nguyên, các lệnh DIV (sau khi lưu nội dung thanh ghi AX, CX, DX bằng loạt lệnh PUSH) nhằm làm chậm hơn vòng lặp. Sở dĩ tôi chọn các lệnh này là vì DIV là lệnh tiêu tốn nhiều clock của CPU (lệnh mất nhiều thời gian thực hiện). Bạn có thể thêm số lần DIV nếu cảm thấy cần thiết. Cuối cùng, loạt lệnh POP hoàn trả lại nội dung các thanh ghi.
Bước 2. Chép tập tin SE.ASM từ thư mục \BP\SYS vào thư mục \BP\CRT. Tập tin SE.ASM chứa một số định nghĩa cho quá trình dịch các Unit của Borland (hay Turbo) Pascal.
Bước 3. Tiến hành dịch CRT.ASM bằng lệnh:
\BP\BIN\TASM CRT.ASM
Máy sẽ phát ra một vài cảnh báo về cách sử dụng tên biến. Cứ "nhắm mắt làm ngơ", chẳng có gì nghiêm trọng đâu.
Bước 4. Chạy Borland Pascal và tiến hành dịch (bấm F9) \BP\CRT\CRT.PAS để tạo ra CRT.TPU. Chép CRT.TPU vào thư mục \BP\BIN.
Bước 5. Chuyển thư mục hiện thời qua \BP\BIN
Xóa unit CRT trong TURBO.TPL bằng lệnh:
TPUMOVER TURBO.TPL -CRT
Sau đó, đưa unit CRT mới sửa vào TURBO.TPL
TPUMOVER TURBO.TPL +CRT
TURBO.TPL đã sẵn sàng. Hãy khởi động lại Borland Pascal. Hy vọng rằng mọi hàm của bạn đều được thực hiện một cách chính xác và Turbo Pascal sẽ chẳng còn phát ra những thông báo lỗi khó chịu "Run time error 200" khi bạn sử dụng unit CRT nữa.
Giải pháp cho các chương trình Pascal đã biên dịch nhưng không còn source
Chắc rằng trong số các chương trình bạn đã biên dịch bằng Borland Pascal 7, một số chương trình sử dụng unit CRT cũng sẽ gặp phải lỗi Division Error kể trên. Nếu các bạn còn giữ source, biên dịch lại chương trình với unit TURBO.TPL đã hiệu chỉnh không phải là "chuyện lớn". Thế nhưng phải làm thế nào nếu bạn không còn hay không có source các chương trình trên.
Để ý rằng do chương trình EXE đã được dịch, việc thay đổi vòng lặp DelayLoop để không ảnh hưởng tới các phần khác của chương trình là không thực hiện được. Do đó, chúng ta cần thay đổi trực tiếp đoạn mã lệnh gây lỗi.
Giải pháp tôi xin đề cử tới các bạn là thay đoạn lệnh:
****:008e: mov CX,55
****:0091: div CX
bằng một lệnh đơn giản: mov AX,0FFFFh vì FFFFh là giá trị tối đa mà DelayCount (biến dạng word 2 byte) có thể nhận được. Tuy nhiên, để không làm biến đổi địa chỉ các phần khác, bạn nhớ đặt thêm 1 lệnh 2 byte trước lệnh move này (do 2 lệnh nguyên thủy chiếm 5 byte bộ nhớ còn lệnh mov AX,0FFFFh chỉ chiếm 3 byte. Giải pháp này dẫn tới việc nếu bạn dùng hàm delay, máy tính sẽ chờ ít hơn (nhanh hơn) so với thời gian bạn yêu cầu, tuy nhiên trong đa số các trường hợp, điều này không dẫn tới hậu quả gì nghiêm trọng. Để tránh sự phiền hà khi tìm kiếm và thay đổi phần mã gây lỗi, tôi có kèm thêm chương trình PATCH.EXE (có thể chép tại Tòa Soạn PCW). Chương trình này sẽ tự động thực hiện việc thay đổi đoạn mã kể trên. Chỉ có đôi điều bạn cần lưu ý:

1. Chỉ dùng PATCH với các chương trình phát sinh lỗi khi chạy như kể trên.

2. Hãy lưu file nguyên thủy trước khi thực hiện thay đổi.

C2: Nếu bạn không muốn mất thời gian thì hãy tải file này về sau đó copy đè lên file cũ là xong

----------


## b2ltpt

*Exit code*

Nhân đây mình xin nói về các lỗi phát sinh khi chạy chương trình (sưu tầm):
1 Invalid function number An invalid operating system call was attempted.
Thực hiện 1 hàm số vô nghĩa hoặc thực hiện 1 lời gọi hệ điều hành vô nghĩa.
2 File not found Reported when trying to erase, rename or open a non-existent file.
Không tìm thấy file. Lỗi được báo khi có những lệnh Erase, Rename hoặc là Mở một file không tồn tại.
3 Path not found Reported by the directory handling routines when a path does not exist or is invalid.
Không tìm thấy file. Lỗi được báo khi đường dẫn đến file không tìm thấy được hoặc vô nghĩa.
Also reported when trying to access a non-existent file.
Cũng có thể được báo khi có lệnh truy cập 1 file không tồn tại.
4 Too many open files The maximum number of currently opened files by your process has been reached. Certain operating systems limit the number of files which can be opened concurrently, and this error can occur when this limit has been reached.
Quá nhiều file đã mở. Chương trình đã đạt tới giới hạn file được mở. Tuỳ hệ điều hành mà giới hạn file được mở khác nhau, và lỗi này được báo khi số file mở đạt tới giới hạn đó.
5 File access denied Permission accessing the file is denied. This error might be caused by several reasons:
Sự truy cập file bị từ chối. Lỗi này xảy ra khi 1 trong những lỗi sau xãy ra:
• Trying to open for writing a file which is read only, or which is actually a directory.
Có lệnh thực hiện ghi lên file có thuộc tính chỉ đọc (Read-only) hoặc đó chỉ là đường dẫn.
• File is currently locked or used by another process.
File hiện thời bị khoá hoặc bị chiến dụng bởi 1 ứng dụng khác.
• Trying to create a new file, or directory while a file or directory of the same name already exists.
Có lệnh tạo 1 file mới, hoặc 1 đường dẫn mới trùng với 1 file hoặc 1 đường dẫn đã tồn tại.
• Trying to read from a file which was opened in write only mode.
Có lệnh thực hiện đọc 1 file chỉ có thuộc tính chỉ ghi (Write-only)
• Trying to write from a file which was opened in read only mode.
Có lệnh thực hiện ghi vào 1 file đã mở với chế độ chỉ đọc (Read-only)
• Trying to remove a directory or file while it is not possible.
Có lệnh thực hiện xoá (gỡ) 1 đường dẫn hoặc 1 file không có thực
• No permission to access the file or directory.
Quyền truy cập vào file bị khoá.
6 Invalid file handle If this happens, the file variable you are using is trashed; it indicates that your memory is corrupted.
File thực hiện vô nghĩa. Nếu lỗi này xảy ra, biến file đang được sử dụung đã bị lỗi; có nghĩa là bộ nhớ đã bị lỗi.
12 Invalid file access code Reported when a reset or rewrite is called with an invalid FileMode value.
Mã truy cập file vô nghĩa. Lỗi được báo khi lệnh Reset hoặc Rewrite được gọi với 1 giá trị chế độ File vô nghĩa.
15 Invalid drive number The number given to the Getdir or ChDir function specifies a nonexistent disk.
Ổ đĩa vô nghĩa. Số được trả bởi hàm Getdir hoặc ChDir chỉ 1 ổ đĩa không tồn tại
16 Cannot remove current directory Reported when trying to remove the currently active directory.
Không thể xoá đường dẫn hiện thời. Lỗi được báo khi có lệnh xoá 1 đường dẫn đang được sử dụng.
17 Cannot rename across drives You cannot rename a file such that it would end up on another disk or partition.
Không thể đổi tên file mà trỏ đến 1 ổ đĩa khác hoặc 1 phân vùng khác của ổ đĩa.
100 Disk read error An error occurred when reading from disk. Typically when you try to read past the end of a file.
Lỗi đọc đĩa. Lỗi xãy ra trong khi đọc file từ đĩa. Điển hình khi có lệnh tiếp tục đọc phần tiếp theo của cuối file.
101 Disk write error Reported when the disk is full, and you’re trying to write to it.
Lỗi ghi đĩa. Lỗi được báo khi đĩa đã đầy và có lệnh ghi vào đĩa đó.
102 File not assigned This is reported by Reset, Rewrite, Append, Rename and Erase, if you call them with an unassigned file as a parameter.
File chưa được khai báo. Lỗi được báo khi lệnh Reset, Rewrite, Append, Rename và Erase được gọi với 1 biến chưa được khai báo.
103 File not open Reported by the following functions : Close, Read, Write, Seek, EOf, FilePos, FileSize, Flush, BlockRead, and BlockWrite if the file is not open.
File chưa được mở. Lỗi được báo khi các lệnh sau được gọi: Close, Read, Write, Seek, Eof, FilePos, FileSize, Flush, BlockRead, và BlockWrite nếu chưa mở file.
104 File not open for input Reported by Read, BlockRead, Eof, Eoln, SeekEof or SeekEoln if the file is not opened with Reset.
File chưa mở để đọc. Lỗi được báo khi các lệnh sau được gọi: Read, BlockRead, Eof, Eoln, SeekEof hoặc SeekEoln nếu file chưa được mở bằng lệnh Reset.
105 File not open for output Reported by write if a text file isn’t opened with Rewrite.
File chưa được mở để ghi. Lỗi được báo khi 1 biến kiểu Text chưa được mở bằng lệnh Rewrite.
106 Invalid numeric format Reported when a non-numeric value is read from a text file, when a numeric value was expected.
Sai kiểu số. Lỗi được báo khi 1 giá trị ký tự được đọc từ file kiểu Text, khi mà biến đọc vào là 1 biến số.
150 Disk is write-protected (Critical error)
Đĩa ở chế độ Ngăn cản ghi (Write-Protected)
151 Bad drive request struct length (Critical error)
152 Drive not ready (Critical error)
Ổ đĩa chưa chuẩn bị.
154 CRC error in data (Critical error)
Lỗi kiểm tra độ dư vòng (Cyclic redundancy check – CRC) trong dữ liệu.
156 Disk seek error (Critical error)
Tìm kiếm ổ đĩa không được.
157 Unknown media type (Critical error)
Định dạng phương tiện truyền thông không chấp nhận.
158 Sector Not Found (Critical error)
Cung từ trên ổ đĩa không tìm thấy.
159 Printer out of paper (Critical error)
Máy in không có giấy.
160 Device write fault (Critical error)
Thiết bị ghi lỗi.
161 Device read fault (Critical error)
Thiết bị đọc lỗi.
162 Hardware failure (Critical error)
Lỗi ổ cứng.
(Lỗi 150-162 là lỗi phần cứng)
200 Division by zero The application attempted to divide a number by zero.
Lỗi chia cho 0. Chương trình đang cố chia 1 số cho 0 (Kinh nghiệm là lỗi này xảy ra khi cố gọi Unit Crt khi thiếu thư viện này)
201 Range check error If you compiled your program with range checking on, then you can get this error in the following cases:
Lỗi kiểm tra vùng xãy ra. Nếu trình biên dịch có chế độ Kiểm tra vùng (Range-Checking) được mở, thì có thể xãy ra các lỗi sau:
1. An array was accessed with an index outside its declared range.
Có lệnh truy cập vào 1 vùng nằm ngoài khai báo 1 Array.
2. Trying to assign a value to a variable outside its range (for instance an enumerated type).
Có lệnh gán giá trị vượt quá giới hạn giá trị của biến.
202 Stack overflow error The stack has grown beyond its maximum size (in which case the size of local variables should be reduced to avoid this error), or the stack has become corrupt. This error is only reported when stack checking is enabled.
Tràn chồng đợi (Stack). Chồng đợi đã vượt qua giới hạn (có thể giảm dung lượng hoặc không xài biến cục bộ để giảm thiểu lỗi này) hoặc chồng đợi có lỗi. Lỗi này chỉ được báo khi trình biên dịch có chế độ Kiểm tra Chồng đợi (Stack Checking) được mở.
203 Heap overflow error The heap has grown beyond its boundaries. This is caused when trying to allocate memory exlicitly with New, GetMem or ReallocMem, or when a class or object instance is created and no memory is left. Please note that, by default, Free Pascal provides a growing heap, i.e. the heap will try to allocate more memory if needed. However, if the heap has reached the maximum size allowed by the operating system or hardware, then you will get this error.
Tràn Heap. Heap đã đạt tới giới hạn. Lỗi xãy ra khi có lệnh chỉ định Memory Exlicitly (?) với lệnh New, GetMen hoặc ReallocMem, hoặc khi 1 lớp đối tượng được tạo ra và tràn bộ nhớ. Lưu ý: FreePascal cung cấp 1 Heap tự động: Ví dụ nếu Heap đã đạt giá trị cực đại, FreePascal sẽ chỉ định thêm vùng nhớ nếu cần. Nhưng nếu Heap đã đạt giá trị cực đại cho phép bởi hệ điều hành hoặc phần cứng thì lỗi sẽ xảy ra.
204 Invalid pointer operation This you will get if you call Dispose or Freemem with an invalid pointer (notably, Nil)
Lỗi phép toán Con trỏ. Lỗi xảy ra khi có lệnh Dispose hoặc FreeMem một con trỏ Nil hoặc không xác định.
205 Floating point overflow You are trying to use or produce too large real numbers.
Lỗi tràn số. Lỗi xãy ra khi có lệnh sử dụng hoặc sinh ra 1 số thực quá lớn.
206 Floating point underflow You are trying to use or produce too small real numbers.
Lỗi tràn số. Lỗi xãy ra khi có lệnh sử dụng hoặc sinh ra 1 số thực quá nhỏ.
207 Invalid floating point operation Can occur if you try to calculate the square root or logarithm of a negative number.
Lỗi số không xác định. Lỗi xảy ra khi có phép tính toán một căn thức hoặc hàm Log của 1 số âm.
210 Object not initialized When compiled with range checking on, a program will report this error if you call a virtual method without having called istr constructor.
Đối tượng không có giá trị ban đầu. Khi biên dịch với trình có Kiểm tra Vùng (Range-Checking) được mở, chương trình sẽ báo lỗi này nếu có lệnh gọi 1 phương pháp ảo (?) không có đối tượng xây dựng (?)
211 Call to abstract method Your program tried to execute an abstract virtual method. Abstract methods should be overridden, and the overriding method should be called.
Trừu tượng hoá phương pháp (?) Chương trình đang có thi hành 1 phương pháp ảo trừu tượng (?). Phương pháp trừu tượng nên được ghi đè, và phương pháp đã được ghi đè nên được gọi thay.
212 Stream registration error This occurs when an invalid type is registered in the objects unit.
Lỗi đăng ký luồng. Lỗi xảy ra khi 1 kiểu biến không hợp lệ đăng ký trên thư viện Object.
213 Collection index out of range You are trying to access a collection item with an invalid indeobjects unit).
Thu thập danh mục ngoài vùng. Lỗi xãy ra khi có lệnh truy cập những thông tin thu thập được với danh mục không xác định (lỗi trong thư viện Object)
214 Collection overflow error The collection has reached its maximal size, and you are trying to add another element (objects unit).
Thông tin thu thập tràn bộ nhớ. Những thông tin thu thập được đã đạt giới hạn lưu trữ, và có lệnh thêm vào 1 thông tin (lỗi trong thư viện Object)
215 Arithmetic overflow error This error is reported when the result of an arithmetic operation is outside of its supported range. Contrary to Turbo Pascal, this error is only reported for 32-bit or 64-bit arithmetic overflows. This is due to the fact that everything is converted to 32-bit or 64-bit before doing the actual arithmetic operation.
Lỗi tràn số học. Lỗi xảy ra khi kết quả của 1 phép toán số học nằm ngoài giới hạn hỗ trợ của biến. Trái với Turbo Pascal, lỗi này chỉ báo cho các phép toán số học trên hệ 32-bit hoặc 64-bit. Nguyên nhân là các dữ liệu đều được dịch sang thông tin 32-bit hoặc 64-bit trước khi thực hiện các thao tác tính toán số học.
216 General Protection fault The application tried to access invalid memory space. This can be caused by several problems:
Lỗi bảo vệ chung (?) Ứng dụng đã truy cập vào vùng bộ nhớ không hợp lệ. Lỗi xãy ra khi:
1. Deferencing a nil pointer
Truy cập vào 1 con trỏ Nil.
2. Trying to access memory which is out of bounds (for example, calling move with an invalid length).
Truy cập vào vùng nhớ nằm ngoài giới hạn.
217 Unhandled exception occurred An exception occurred, and there was no exception handler present. The sysutils unit installs a default exception handler which catches all excpetions and exits gracefully.
0219 Invalid typecast Thrown when an invalid typecast is attempted on a class using the as operator. This error is also thrown when an object or class is typecast to an invalid class or object and a virtual method of that class or object is called. This last error is only detected if the –CR compiler option is used.
227 Assertion failed error An assertion failed, and no AssertErrorProc procedural variable was installed.

----------


## sonseoer001

tuan informatic nói phức tạp quá, có phải ai cũng có thể làm như vậy đâu. Lỗi này mình đã gặp nhiều, do bộ cài thiếu. Ví dụ dùng lệnh clrscr là máy sẽ báo lỗi 200, xóa clrscr thì ko sao. Hãy download lại bộ cài Pascal đầy đủ là chạy được. Mình đã làm như vậy.

----------


## trungvu

quá nhiều dữ zay ta ^^ 
.......................

----------


## slight_wind01

có 1 vài lỗi nữa này
7: nguyên nhân: lỗi xảy ra trong kiểu số nguyên của biểu thức
Khắc phục
Các bạn hãy xem lại các biểu thức số nguyên của bạn xem có nằng trong phạm vi đang sử dụng ko, xem lại các câu lệnh và chú ý tới các số thực nếu ngoài phạm vi thì phải ghi teo sau 1 số thập phân và số zero
10: lệnh end và begin ko đi cùng với nhau hoặc chưa đóng chú thích
11:chiều dài chuỗi kí tự vượt quá giới hạn
18: có quá nhiều file được đưa vào dịch của chương trình hay unit
19: một kiểu con trỏ/ trỏ đến một nơi chưa được khai báo
20: tên ko thể hiện một biến nào cả (phải có)
21: kí hiệu này ko thể bắt đầu bằng một định nghĩa kiểu
22: kiểu cấu trúc quá lớn
23: kiểu cơ bản của tập hợp ngoài vùng sử dụng
24: cấu trúc file of file và file of obiect là ko cho phép. Kiểu file và kiểu cấu trúc ko thể chứa một kiểu obiect hoặc kiểu file
25: chiều dài chuỗi ko ok cho lắm(vợt giới hạn)
26: kiểu ko tương thích giưa biến và biểu thức hoặc giữa kiểu chỉ số hoặc kiểu mảng hoặc giữa các kiểu toán hạng trong một biểu thức
ngoài ra còn 1 cách khác để khắc phục lỗi 200 đó là bỏ uses đi cũng chạy được [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
Chúc may mắn nhé!
Lần sau viết tiếp(mỏi tay lắm rồi) [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## shopnmm

Anh ý có lây bài ở đâu không zậy. :-?
Nếu có thì ghi rõ nguồn nghen bạn

----------


## hungvietuc1

> Anh ý có lây bài ở đâu không zậy. :-?
> Nếu có thì ghi rõ nguồn nghen bạn


tại sao lại phải nghi ngờ hả bạn
đằng nào thì cũng là đóng góp cho ĐIENANTINHOC.VN mà. dù có sao chép hay ko cung thế thôi

----------


## kidmonter

_ò!!!
còn cách khác nưa nhưng hơi nguy hiểm với những ai hậu đậu
:cool2:_
Trước khi tiến hành các bước sau, hãy lưu lại tập tin TURBO.TPL trong \BP\BIN để đề phòng mọi bất trắc.
Bước 1: Sửa lại nội dung unit CRT


Với một bản cài đầy đủ của Borland Pascal 7.0, bạn sẽ có thư mục \BP\CRT, trong đó có 2 tập tin CRT.ASM và CRT.PAS. Đầu tiên, hãy thay đổi nội dung CRT.ASM như sau (hãy bấm Ctrl Q-L và tìm từ DelayLoop và phần mã sau): 
; Delay one timer tick or by CX iterationsDelayLoop:@@1:SUB AX,1SBB DX,0JC @@2CMP BL,ES:[DI]JE @@1@@2: RETtrở thành: 
; Delay one timer tick or by CX iterationsDelayLoop:@@1:push ax ; bắt đầu các hàng chèn thêmpush cx push dxmov ax,0mov cx,1mov dx,0div cx ;với 10 lệnh div cx, DelayCount = 5F0h div cx; đủ cho bạn chạy với CPU có tốc độ < 8GHzdiv cx ; về mặt lý thuyết.div cxdiv cxdiv cxdiv cxdiv cxdiv cxdiv cxpop dxpop cxpop ax ; kết thúc các hàng chèn thêmSUB AX,1SBB DX,0JC @@2CMP BL,ES:[DI]JE @@1@@2: RETNhư mình có trình bày ở phần trên, các dòng chèn thêm không thực hiện bất cứ một lệnh gì mà chỉ đơn thuần là làm chậm vòng DelayLoop lại. Điều này không có nghĩa là đồng hồ hệ thống sẽ chậm lại mà chỉ đơn thuần làm chậm vòng DelayLoop và giảm số lần lặp xuống. 

Lệnh nguyên thủy SUB và SBB của vòng lặp được giữ nguyên, các lệnh DIV (sau khi lưu nội dung thanh ghi AX, CX, DX bằng loạt lệnh PUSH) nhằm làm chậm hơn vòng lặp. vì DIV là lệnh tiêu tốn nhiều clock của CPU (lệnh mất nhiều thời gian thực hiện). Bạn có thể thêm số lần DIV nếu cảm thấy cần thiết. Cuối cùng, loạt lệnh POP hoàn trả lại nội dung các thanh ghi.
Bước 2. Chép tập tin SE.ASM từ thư mục \BP\SYS vào thư mục \BP\CRT. Tập tin SE.ASM chứa một số định nghĩa cho quá trình dịch các Unit của Borland (hay Turbo) Pascal.
Bước 3. Tiến hành dịch CRT.ASM bằng lệnh:
\BP\BIN\TASM CRT.ASM
Máy sẽ phát ra một vài cảnh báo về cách sử dụng tên biến. Cứ "nhắm mắt làm ngơ", chẳng có gì nghiêm trọng đâu.
Bước 4. Chạy Borland Pascal và tiến hành dịch (bấm F9) \BP\CRT\CRT.PAS để tạo ra CRT.TPU. Chép CRT.TPU vào thư mục \BP\BIN.
Bước 5. Chuyển thư mục hiện thời qua \BP\BIN
Xóa unit CRT trong TURBO.TPL bằng lệnh:
TPUMOVER TURBO.TPL -CRT
Sau đó, đưa unit CRT mới sửa vào TURBO.TPL
TPUMOVER TURBO.TPL +CRT
TURBO.TPL đã sẵn sàng. Hãy khởi động lại Borland Pascal. Hy vọng rằng mọi hàm của bạn đều được thực hiện một cách chính xác và Turbo Pascal sẽ chẳng còn phát ra những thông báo lỗi khó chịu "Run time error 200" khi bạn sử dụng unit CRT nữa.Giải pháp cho các chương trình Pascal đã biên dịch nhưng không còn source
Chắc rằng trong số các chương trình bạn đã biên dịch bằng Borland Pascal 7, một số chương trình sử dụng unit CRT cũng sẽ gặp phải lỗi Division Error kể trên. Nếu các bạn còn giữ source, biên dịch lại chương trình với unit TURBO.TPL đã hiệu chỉnh không phải là "chuyện lớn". Thế nhưng phải làm thế nào nếu bạn không còn hay không có source các chương trình trên.
Để ý rằng do chương trình EXE đã được dịch, việc thay đổi vòng lặp DelayLoop để không ảnh hưởng tới các phần khác của chương trình là không thực hiện được. Do đó, chúng ta cần thay đổi trực tiếp đoạn mã lệnh gây lỗi.
Giải pháp mình xin đề cử tới các bạn là thay đoạn lệnh:
****:008e: mov CX,55
****:0091: div CX
bằng một lệnh đơn giản: mov AX,0FFFFh vì FFFFh là giá trị tối đa mà DelayCount (biến dạng word 2 byte) có thể nhận được. Tuy nhiên, để không làm biến đổi địa chỉ các phần khác, bạn nhớ đặt thêm 1 lệnh 2 byte trước lệnh move này (do 2 lệnh nguyên thủy chiếm 5 byte bộ nhớ còn lệnh mov AX,0FFFFh chỉ chiếm 3 byte. Giải pháp này dẫn tới việc nếu bạn dùng hàm delay, máy tính sẽ chờ ít hơn (nhanh hơn) so với thời gian bạn yêu cầu, tuy nhiên trong đa số các trường hợp, điều này không dẫn tới hậu quả gì nghiêm trọng. Để tránh sự phiền hà khi tìm kiếm và thay đổi phần mã gây lỗi, tôi có kèm thêm chương trình PATCH.EXE (có thể chép tại Tòa Soạn PCW). Chương trình này sẽ tự động thực hiện việc thay đổi đoạn mã kể trên. Chỉ có đôi điều bạn cần lưu ý:
1. Chỉ dùng PATCH với các chương trình phát sinh lỗi khi chạy như kể trên.
2. Hãy lưu file nguyên thủy trước khi thực hiện thay đổi.
Chúc bạn thành công![IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG][IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]:shifty:

----------


## bell.lina

Để đơn giản, các bạn có thể hiểu nôm na về lỗi 200: 
_ nếu bộ cài chuẩn thì lỗi 200 là lỗi chia cho số 0
_ nếu bộ cài Tp bị lỗi hoặc trong quá trình sử dụng, thư viện crt của bạn bị hỏng thì cũng sẽ báo lỗi 200.
Do đó có cách khắc phục là thử viết 1 đoạn chương trình nhỏ, có dùng uses crt để kiểm tra, nếu báo lỗi thì cài lại TP.
Hoặc đơn giản nhất là dùng free pascal, sẽ không sợ phải cài lại nữa [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## bedaukute22

nhưng free pascal hơi nặng nếu dùng mạng thuê bao thì nên download loại borland pascal như mình vừa mới giới thiệu nó ko bị lỗi này đâu![IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## tapchidoisong

> Nguyên nhân
> 
> Trước hết, để có thể tìm được vị trí gây nên lỗi, chúng ta hãy dùng đoạn chương trình đơn giản sau:
> 
> Program Test;
> Uses Crt;
> Begin
> Writeln('Hello');
> End.
> Rõ ràng, chương trình này chỉ viết chữ Hello lên màn hình. Khi các bạn chạy chương trình sẽ nhận được thông báo lỗi: Runtime error 200 at ****:0091. **** là địa chỉ segment gây lỗi, có thể khác với mỗi máy tùy theo các chương trình đã nạp trong bộ nhớ. 0091 là offset của đoạn mã lệnh gây nên lỗi.


Mình dùng turbo pascal chạy bình thường, có lỗi gì đâu.

----------


## annguyenvm

Bạn không bị lỗi là do Tp của bạn chưa bị hỏng thư viện crt. Tp sau khi dùng 1 thời gian (tùy mỗi người) thì thư viện crt sẽ bị hỏng và từ đó, mỗi khi bạn sử dụng nó thì sẽ gặp thông báo trên.

----------


## mapvnn

Sao giờ phát sinh nhiều nhỉ! Lúc trước anh cài TP, sau đó Patch xong rùi dùng tới lúc máy xịt khói cũng không thấy lỗi gì! [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## icanfly

Chẳng hiểu sao giờ nó mới dễ bị lỗi như thế, chứ trước em dùng 2 năm trung học code như điên có làm sao đâu. Lên cấp 3 dùng 1 năm hỏng luôn (cài mới đó).

----------


## seoer

TỐT NHẤT giờ các bác bị lỗi thì download borland pascal về là được làm gì mà phải bàn tán nhiều thế làm gì[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------

