Tuesday, May 28, 2013

Golang: cái lợi khi phải chuyễn kiểu tường minh cho loại số



Lần đầu tiên tối viết một ứng dụng chạy được mà không quá nhỏ trên Go là một ứng dụng xử lý ảnh. Mọi thứ khá phức tạp với Go ở chổ phải làm việc với các loại số, int32 cho ảnh 32bit, int8 (char trong C++) cho ảnh 8bit. Khó khăn là vầy:

var a int32

var b, c int8

a = b + c // báo lỗi khi biên dịch.

Go không cho tự động chuyễn kiểu giữa các loại số, ta phải chuyễn kiểu tường minh, có nghĩa là phải:

a= int32(b) + int32(c)

Cái lúc viết xong chương trình nói trên, phải níu là mệt mỏi với cái kiểu bắt buộc chuyễn kiểu, nhưng dần già mình đã hiểu tại sao Google lại đưa ra hướng thiết kế đó. Cụ thể mấy bửa nay quay về với C++, vẫn là xử lý ảnh.
Ứng dụng này có 1 công đạon cần tính cái BoundingBox (hình chữ nhật bao bên ngoài 1 vật thể nào đó) sau đó xem coi cái box đó có khả năng là hình gần gần vuông không. Đơn giản mình làm theo kiểu:
float r = box.width/box.height
0.9 <= r <= 1.1
Thử với vài hình vuông và hình chử nhật tự vẻ ok, thử luôn trên vài cái hình được, tạm ổn, cho tới hôm nay có 1 cái hình ngang 71 dọc 72, dò hoài không ra cái hình này.
Mò mẫm trong mấy trăm dòng code tới cuối ngày thì hỡi hỡi ôi, r =71/72; r == 0 mà cứ tưởng nó ra 0.98xxxxx.

No comments:

Post a Comment