Sữa lỗi chính tả trong lập trình c

Hay còn gọi là lỗi biên dịch (Compiler error) Đây là loại lỗi sơ đẳng nhất trong lập trình. Thường là do bạn gõ sai cấu trúc của ngôn ngữ (ví dụ như thiếu dấu kết thúc một câu lệnh, một số ngôn ngữ từ khoá phân biệt chữ hoa, chữ thường thì lại gõ chữ hoa, v.v. gọi nôm na là lỗi chính tả). Chương trình sẽ không thể biên địch được khi gặp lỗi này. Các trình biên dịch sẽ khi biên dịch code, khi gặp lỗi ở dòng code nào thì sẽ báo lỗi. Các trình soạn thảo (Editor) hoặc các IDE tiên tiến hiện nay như Visual Studio, Eclipse, Android Studio, NetBean, v.v. đều hỗ trợ cho người lập trình một cách trực quan để xử lý lỗi này. Một vài ví dụ cho lỗi này:

Ví dụ 1

  
if (a==b) then a+=b;  

Lỗi cú pháp vì trong C++ lệnh if phải viết là

  
if (a==b) a+=b;  

Ví dụ 2

  
class SV  
{  
   int ma sv; //Lỗi viết sai tên biến, khai báo biến không được có khoảng trắng  
   void nhap() {  
     for (i=0; i<=2; i++) // lỗi chưa khai báo biến i   
        cin>>i;  
   }  
} //lỗi thiếu dấu ;
void main //lỗi thiếu dấu () sau hàm main()  
{  
}  

2. Lỗi thực thi (Runtime error)

Xảy ra bất ngờ khi chương trình đang chạy Loại lỗi này thường xảy ra do người lập trình viết code ẩu, không lường hết các trường hợp xảy ra, khiến chương trình đang chạy thì bị lỗi treo màn hình, thoát khỏi chương trình hoặc thoát luôn chương trình, v.v. Lỗi này có thể dễ dàng phát hiện bằng cách Debug.

Ví dụ 1

  
float s=0;  
for (int i=0; i<=10; i++)   
s=s+1/(i-3);   

Lỗi trên xảy ra khi i nhận giá trị = 3 thì 1/(i-3)=1/0: lỗi chia cho 0. hoặc

  
float t, x; cout<<"x="; cin>>x;  
t=sqrt(x);
cout<<t;  

nếu nhập x nhỏ hơn 0 thì sqrt(x) không tính được (không có căn bậc 2 của số âm).

Ví dụ 2

  
while(true)  
{  
//vòng lặp vô tận  
}  

Ví dụ 3

  
int[] array = new int[10];  
array [12] = 7; //lỗi truy cập vùng nhớ chưa cấp phát  

Cách khắc phục

  • Phải kiểm tra các điều kiện, dự đoán trước khả năng có thể gây lỗi khi thực thi, chẳng hạn kiểm tra x lớn hơn 0 trước khi tính căn bậc 2, …
  • Các ngôn ngữ tiên tiến như C#, Java, VB.Net bổ xung cấu trúc xử lý ngoại lệ try … catch … finally…

3. Lỗi logic

Đây là lỗi do tư duy sai, thuật toán sai dẫn đến sai kết quả Ví dụ sinh viên không biết viết thuật toán tìm ước số chung lớn nhất, không biết viết công thức nghiệm giải phương trinh bậc 2, thực hiện sai giải thuật…

Dễ dàng để nhận ra đoạn code trên dùng để tính tổng các số từ 0 tới n. Tuy nhiên khi bạn chạy ở nhiều máy khác nhau hay chạy ở trên CodeLearn với số lần đủ lớn, bạn sẽ thấy kết quả sẽ ko phải luôn luôn giống nhau!

Lỗi xảy ra chính ở việc bạn không khởi tạo giá trị cho biến số a. Theo đó, mỗi một lần chạy, biến a sẽ được hệ điều hành gán cho 1 giá trị ngẫu nhiên. Và nếu giá trị ngẫu nhiên đó không bằng 0, thì chương trình này chắc chắn là chạy sai rồi, đúng không?

Có rất nhiều bạn nói với tôi rằng, khi khởi tạo 1 biến số thì biến đó sẽ nhận 1 giá trị mặc định. Xin thừa rằng, điều ấy phụ thuộc khá nhiều vào trình biên dịch hoặc cờ biên dịch (compiler flag). Có những trình biên dịch tự động cấp phát và khởi tạo biến số nguyên bằng 0, có những trình biên dịch tự động cấp phát và khởi tạo cả một mảng số nguyên gồm những số 0, nhưng có những trình biên dịch mặc kệ, việc khởi tạo hoàn toàn nằm trong tay bạn.

Đặc biệt, trong 1 số đoạn mã liên quan tới mảng hay ma trận, nếu sử dụng mảng hay ma trận mà không khởi tạo giá trị cho mảng kiểu như bool array[100] hay int array[100][100] thì tỉ lệ gặp lỗi của bạn sẽ cao hơn bình thường.

Tại sao C/C++ thường bị lỗi này?

Với Java hay C#, nếu bạn gõ thử đoạn code tương tự, bạn sẽ bị gặp báo lỗi: variable … might not have been initialized (Java) hay Use of unassigned local variable ‘…’ (C#) và buộc phải sửa lỗi này.

Với C hay C++, nếu bạn sử dụng IDE với các tham số mặc định, thì thường lỗi trên sẽ bị trình biên dịch bỏ qua, ko nhìn thấy. Có một số trình biên dịch nếu cấu hình cờ biên dịch chặt hơn một chút, bạn sẽ nhìn thấy warning. Tuy nhiên đa phần coder chúng ta đều mặc kệ warning, và đó là lí do chương trình của bạn chạy không đúng.

Tại sao lại có chuyện lúc thì không warning, lúc thì warning và lúc thì báo lỗi, bạn hãy đọc và hiểu thêm về cờ biên dịch ở phía bên dưới nhé

Cờ biên dịch:

Cờ biên dịch được hiểu là những tuỳ chọn, tham số khi trình biên dịch biên dịch code của các bạn

Xét đoạn mã sau:

`

include <iostream> using namespace std; int main() { int a; cout << a << endl;}`

Bây giờ hãy thử biên dịch đoạn code trên với 2 câu lệnh khác nhau như hình dưới đây:

Sữa lỗi chính tả trong lập trình c

Sự khác nhau khi biên dịch trong trường hợp có và không có cờ "-Wall"

Như bạn thấy rồi đấy, trong trường hợp có cờ "-Wall", trình biên dịch sẽ bật cảnh báo về việc không khởi tạo biến. Thông thường, trên máy bạn hay IDE của bạn sẽ không bật cờ này, đó là lí do bạn ko phát hiện ra được lỗi không khởi tạo biến của mình.

Sữa lỗi chính tả trong lập trình c

Tiếp theo hãy xem sự kết hợp của hai cờ "-Wall" và "-Werror" khi biên dịch đoạn mã trên. Bạn sẽ thấy bây giờ trình biên dịch báo lỗi chứ không còn là cảnh báo nữa.

Chi tiết các cờ biên dịch bạn có thể tham khảo ở link sau: https://caiorss.github.io/C-Cpp-Notes/compiler-flags-options.html

Kết luận

Giờ thì các bạn có thể hiểu sơ sơ về lỗi không khởi tạo biến và tác hại của nó rồi chứ.

Lỗi này không chỉ gặp với C++, mà có thể 1 số ngôn ngữ khác cũng có thể gặp (với 1 số ngôn ngữ mà mình chưa biết). Do đó, hãy luôn rèn cho mình thói quen khởi tạo 1 giá trị mặc định khi bạn khai báo một biến hay một đối tượng nhé.