Want create site? Find Free WordPress Themes and plugins.

Những Lỗi Lập Trình Arduino Phổ Biến 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 1. Nhầm lẫn toán tử gán và phép so sánh bằng

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

1 if (something = 0) {

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. “=” là kí hiệu cho toán tử gán (giá trị)

Đầu tiên, chúng ta cần hiểu rằng C/C++ (lập trình Arduino cũng là lập trình C) sử dụng dấu “=” cho phép gán giá trị. Nghĩa là giá trị của thứ nằm bên phải dấu “=” sẽ được gán cho thứ bên trái dấu “=”.

Ví dụ:

1

2

int a;

a = 100;

Đoạn code này sẽ tạo ra một biến “a” và sau đó gán giá trị 100 (thập phân) cho a

2. “==” là kí hiệu cho toán tử so sánh

Khi bạn muốn so sánh 2 giá trị có bằng nhau không bạn sử dụng dấu “==” chứ không phải dấu “=”.

Ví dụ:

1

2

3

4

5

int a = 100;

int b = 100;

if (a == b) {

// Các lệnh tiếp theo nếu kết quả là a = b.

}

Đoạn code sẽ so sánh giá trị của a với giá trị của b xem có bằng nhau không. Trong ví dụ này, câu lệnh If sẽ trả giá trị True vì cả a và b đều có cùng giá trị (100)

3. Tại sao câu lệnh If cho phép sử dụng toán tử gán “=” ?

Câu hỏi này hay nè! Vậy khi nào bạn muốn sử dụng một toán tử gán “=” trong câu lệnh If ? Không phải bạn chỉ đơn thuần thực hiện so sánh với câu lệnh If thôi sao? Thử phân tích ví dụ bên dưới nhé:

1 if (reading = digitalRead(2)) {

Điều gì sẽ xảy ra nhỉ? Ah, thì…

  1. Đầu tiên, C sẽ gọi hàm digitalRead()
  2. digitalRead() kiểm tra chân số 2 và trả về HIGH hoặc LOW
  3. Biến “reading” sẽ mang giá trị trả về từ hàm digitalRead()
  4. Câu lệnh If sẽ đánh giá dựa trên giá trị mà “reading” nhận được.

Nói cách khác, bạn đang không so sánh giá trị của biến “reading” xem có “bằng” giá trị của chân số 2 hay không mà chỉ đơn thuần đưa ra đánh giá dựa trên giá trị của chân số 2 (HIGH/LOW = 1/0 =True/False). Dưới đây là cách “chính thống” để làm điều tương tự:

1

2

reading = digitalRead(2);

if (reading) {

Bạn thấy rằng, nếu hiểu được nó thì đây rõ ràng là một lối tắt hay. Tuy nhiên, mình nghĩ rằng hầu hết các bạn mới bắt đầu đều hiểu sai cả ^^!

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

Cá nhân mình vẫn hay gõ thiếu dấu 1 dấu “=” trong phép so sánh bằng, (dù ý thức được lỗi này) do sơ suất trong khi đánh máy.

Lối tắt phía trên hay đấy nhưng có thể dẫn đến những lỗi không lường trước được. Quay lại ví dụ ban đầu:

1 if (something = 0) {

Bạn dự định là nếu biến “something” “==” 0 thì sẽ làm gì đó nhưng với cách viết trên thì chương trình của bạn sẽ chẳng bao giờ chạy các câu lệnh trong hàm If cho dù “something” đúng bằng 0.

Nguyên nhân:

Bạn vừa gán 0 cho “something” do đó đoạn code phía trên sẽ tương đương với đoạn code bên dưới

 

1 if (0 = something) {

mà điều kiện trong ngoặc đơn đã False thì … bạn biết rồi đấy! Và Arduino IDE vẫn biên dịch được bình thường nhé!

Arduino-IDE-khong-bao-loi

Sẽ thế nào nếu cùng nội dung ở ví dụ trên nhưng bạn viết theo cách bên dưới:

Điều gì sẽ xảy ra? Ah, trình biên dịch sẽ cười vào mặt bạn (quăng ra lỗi này):

Arduino IDE báo lỗi
Arduino-IDE-bao-loi

 

Số 0 là hằng số nên bạn không thể gán cho nó 1 giá trị khác được.

Mặc dù về mặt logic, 2 câu lệnh bên dưới là như nhau vì trong quá trình so sánh thì mình không quan tâm đến thứ tự.

1

2

if (0 == something)

if (something == 0)

Tuy nhiên, bạn sẽ thấy, nếu lỡ gõ thiếu 1 dấu “=” thì cách viết thứ 1 cực kỳ có lợi vì Arduino IDE sẽ báo lỗi ngay cho bạn trong khi với cách viết thứ 2 bạn có thể sẽ mất hàng giờ kiểm tra phần cứng cũng như phần mềm trước khi mò ra lỗi này, đặc biệt là khi chương trình của bạn dài.

5. 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 toán tử gán “=” và toán tử so sánh “==”. Và, nếu trong chương trình của bạn có 1 (hoặc nhiều) lệnh If không bao giờ chạy dù cho đáng lẽ nó phải chạy thì 99% là lỗi nhầm 2 toán tử này rồi. Bạn cần kiểm tra lại thật kĩ các điều kiện để phát hiện lỗi. 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