Want create site? Find Free WordPress Themes and plugins.

Những Lỗi Lập Trình Arduino Mà Ai Cũng Gặp!

Cần đọc nếu bạn không muốn mất cả giờ đồng hồ ngồi debug code ^^!

Có những lỗi lập trình C/C++ mà tất cả những người lập trình C đều gặp phải, bất kể là có hay không có kinh… nghiệm. Bạn sẽ gặp những lỗi này khá thường xuyên khi mới bắt đầu lập trình nhưng sẽ không có chuyện khi đã Pro thì không gặp nó nữa. Do code Arduino viết trên nền C/C++ nên chắc chắn bạn cũng sẽ gặp lỗi tương tự, kkk…

Phần 2. Giá trị phép toán ứng với kiểu Số Nguyên (Integer) và Số Thực (Float)

Tham khảo đoạn code bên dưới

1

float mot_nua = 1/2;

Bạn có phát hiện ra lỗi trong câu lệnh trên hay không? Nếu không nhìn ra thì khả năng bạn bị rơi vào bẫy cực kì cao đó. Hại não nhất ở đây là trình biên dịch C hay Arduino IDE cũng sẽ chẳng đưa ra cảnh báo gì khi bạn compile chương trình đâu vì cơ bản là câu lệnh trên vẫn viết đúng cấu trúc. Có điều kết quả từ cách viết trên khác xa với kết quả mà bạn muốn nhắm tới (nếu bạn không thấy có gì bất ổn với nó cả). Sau đây sẽ là cách mà lỗi siêu cơ bản này “hoạt động”

1. Tại sao lại lỗi ??!

Đầu tiên, chúng ta cần hiểu rằng, khác với Pascal, kết quả của phép chia “/” chỉ tồn tại ở kiểu số thực (real); trong C/C++ (lập trình Arduino cũng là lập trình C) thì kết quả phép chia có thể mang kiểu số thực (float) hoặc kiểu số nguyên (integer) tùy trường hợp cụ thể. Quay lại ví dụ ban đầu, nếu bạn nghĩ rằng giá trị của biến “mot_nua” là 0.5 thì chúc mừng bạn. Bạn đã … rớt ngay vào bẫy. Trong trường hợp này, kết quả của phép chia “/” sẽ là 0  => Giá trị của “mot_nua” là 0.

Tại sao kỳ vậy?

Ah, trong C/C++ nếu cả số chia và số bị chia đều có kiểu Số Nguyên (integer) thì kết quả của phép chia cũng là Số Nguyên (integer).

1

float mot_nua = 1/2;

Quay lại ví dụ ban đầu, do 1 và 2 đều là 2 hằng số có kiểu số nguyên nên dĩ nhiên, kết quả không thể là 0.5 được.

2. Làm thế nào để tránh lỗi này?

Làm cách nào để phép chia như trên ra được kết quả 0.5?

Cái này có 2 cách nhé.

Cách 1: Ép kiểu số thực (real) cho một biến kiểu số nguyên (integer)

1

2

int a = 2;

float c = (float)1 / (float)a;

Cách 2: Thêm phần thập phân cho số bị chia hoặc số chia

1

2

int a = 2;

float c = 1.0 / a;

Đây là cách mình thích dùng nhất. Ngắn gọn, dễ hiểu hơn cách 1, và khi nhìn vào dấu thập phân thì mình cũng tự động nhớ đến vấn đề kiểu dữ liệu của biến.

3. Kết luận:

Tóm lại, bạn cần chắc rằng bạn hiểu và sử dụng đúng phép chia “/” trong C/C++. Và tốt nhất, nếu có phép chia trong code thì nên khai báo hoặc số chia hoặc số bị chia phải là kiểu số thực ngay từ đầu để tránh lỗi xảy ra mà bạn không lường trước được. Và cũng đừng quên cách viết chương trình thế nào để tránh lỗi này nhé.

Did you find apk for android? You can find new Free Android Games and apps.

Trả lời