Bước tới nội dung

Học Pascal/Kinh nghiệm khi code

Tủ sách mở Wikibooks

Những kinh nghiệm khi code bằng Pascal

[sửa]

Đây là nơi các bạn có thể chia sẻ những kinh nghiệm chung về Pascal, nếu muốn chia sẻ kinh nghiệm gì thì các bạn đừng ngại chia sẻ chúng nhé

Kiến thức trên internet rất nhiều. Nhưng kinh nghiệm không phải thứ chỉ học lý thuyết mà có.

Nếu rảnh thì mong các tiền bối để lại đây cho đời sau.

Kinh nghiệm về lỗi

[sửa]

Run Time Error

[sửa]
  • 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 trường hợp sau:
  • 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ếm 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ụng đã 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 hà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à nên dùng 1 phương pháp ghi đè 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 index(objects 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.
  • 201: nhiều người thường mắc phải lỗi này, nó là một lỗi OutRange, ví dụ khi bạn khai báo một biến sử dụng kiểu dữ liệu nào đó nhưng trong chương trình thì biến lại nhận giá trị lớn hơn hay nhỏ giới hạn của kiểu dữ liệu đó.
  • Nguyên nhân: thường thì lỗi xuất hiện khi chương trình các vòng lặp (đặc biệt là : Repeat...until, While...do), hoặc có khi là số lượng phần tử của mảng.
  • Khắc phục: các bạn có thể kiểm tra lại xem lỗi xuất hiện ở đâu rồi chỉnh lại hoặc cho biến đó một kiểu dữ liệu lớn hơn, nếu vẫn còn báo lỗi thì có thể vòng lặp đó là vòng lặp vô tận, nên xem lại điều kiện vòng lặp còn nếu là lỗi về mảng thì cũng nên xem về kiểu dữ liệu của phần tử của mảng và xem lại có đủ số lượng phần tử không.

Kinh nghiệm về giải thuật toán

[sửa]

Những kinh nghiệm khác

[sửa]
  • Khi bạn dùng Free Pascal hay các phần mềm có hỗ trợ khác thì nhấn một phím hay một tổ hợp phím đặc biệt cho phép chạy chương trình nhưng chạy từng lệnh, ví dụ như Free Pascal sử dụng phím F8. Điều này giúp cho việc tìm kiếm lỗi diễn ra dễ dàng hơn.
  • Khi bạn chạy chương trình bị lỗi, mà không biết lỗi tại đâu, hãy vô hiệu hóa code bằng câu lệnh chú thích {    ………….    } hoặc // …………… . Bạn vô hiệu hóa rồi chạy thử, nếu chạy ổn thì giảm bớt phạm vi chú thích, đến lúc nào đó khi phạm vi chú thích được thu hẹp bạn sẽ biết code bạn lỗi chỗ nào. Cách này cũng khá hay, nên các bạn thử dùng. Nói chung các bạn phải có những thủ thuật riêng để chủ động tìm lỗi, chứ ngồi đợi F8 từng bước chạy debug thì rất lâu
  • Bạn không nên khai báo mảng trong thủ tục, vì lúc bị lỗi bạn sẽ không tìm được nguyên nhân, tất cả mảng bạn nên khai báo ở biến toàn cục.
  • Khi bạn cần bỏ qua các câu lệnh ở dòng phía dưới trong vòng lặp và tiếp tục thực hiện vòng lặp thì hãy dùng lệnh "continue" Chương trình sẽ chỉ thực hiện các câu lệnh trong vòng lặp ở dòng phía trên lệnh "continue".
    • Lệnh break được dùng để dừng vòng lặp khi đã đạt được mục tiêu trước số lần lặp dự kiến.
    • Lệnh exit để bạn thoát khỏi hàm hoặc thủ tục. Đối với hàm exit(giá trị) sẽ trả về giá trị cho hàm đó.
    • Lệnh halt để bạn dừng cả chương trình. Khi bạn dùng các lệnh dừng Halt, hãy đảm bảo bạn đã đóng file (nếu có đọc/ghi file) tránh gặp lỗi.
  • Khi bạn khai báo mảng, thông thường bạn sẽ tạo biến max = phần tử đầu tiên của dãy. tức là max:= 100(a: array [1..100] of integer. Đối hầu hết trường hợp vậy là ổn, nhưng đôi khi 1 số trường hợp khiến bạn phải lăn tăn không biết gán max là giá trị nào. Cách tốt nhất là bạn gán max:= high(longint), pascal sẽ lấy giá trị lớn nhất (dương vô cùng) và bạn có thể thoải mái chạy mà không gặp lỗi. Bộ nhớ biến có thừa mà, cứ phải tiết kiệm làm gì ? Trừ phi mảng chỉ đánh dấu 2 giá trị 0/1, true/false thì bạn hãy đặt byte hoặc boolean.
    • high(tên kiểu dữ liệu) -> miền giá trị lớn nhất của kiểu dữ liệu
    • low(tên kiểu dữ liệu) -> miền giá trị nhỏ nhất của kiểu dữ liệu
  • Đừng quên save code (F2) trước khi chạy (Ctrl+F9) :>