tôi có tất cả những 8.1 chương trình phiên bản Tcl/Tk đã trở thành bị hỏng vì Tcl/Tk 8.5.10 không xử lý đúng các chuyển đổi chuỗi/số.
Ở đây, shell vào Tcl, và gõ:
% expr {01}
1
(và vân vân ..)
% expr {06}
6
% expr {07}
7
và sau đó chúng tôi nhận tới 8 ...
% expr {08}
missing operator at "[email protected]_"
trông giống như số bát phân không hợp lệ
Nhưng tôi t tồi tệ hơn. Vẫn trong Tcl vỏ, hãy thử này:
Trong vỏ Tcl8.1 tôi:
% format "%.0f" {08}
8
Nhưng mới và cải tiến Tcl8.5 vỏ của tôi, tôi nhận được một lỗi:
% format "%.0f" {08}
expected floating-point number but got "08" (looks like invalid octal number)
này chỉ là ngốc nghếch! Tôi có tất cả các mã này hoạt động tốt trong Tcl7.6 và Tcl8.1, nhưng bắt đầu cho ra kết quả ngẫu nhiên, ngẫu nhiên trong Tcl8.5 . Chỉ khi số 08 xảy ra với được tạo hoặc sử dụng! Tôi đã dành hàng giờ cố gắng tìm ra vấn đề. Nhưng hóa ra đó chỉ là một mã số khó chịu khó chịu mà tôi đang sử dụng!
Vì vậy, tôi đăng bài rant này như một cảnh báo.
Phiên bản Tcl/Tk 8.5.10 xử lý số tám không chính xác. Nếu bạn đang mong đợi hành vi lành mạnh từ các tuyên bố định dạng của mình, thì này sẽ không xảy ra. Mã của bạn sẽ bay dọc theo, cho đến khi gặp chuỗi có giá trị là {08} và trình thông dịch Tcl 8.5.10 sẽ phát sinh lỗi, vì nó giả định rằng {08} là số đặc biệt số bát phân, bất kể thực tế là tất cả các số ít khác bạn đã sử dụng sẽ chỉ hoạt động tốt!
Một giải pháp khả thi cho vấn đề nêu trên là hạ cấp xuống vỏ Tcl 8.1 . Tôi đã xác nhận rằng phiên bản đó ít nhất xử lý các định dạng báo cáo cho số 08 một cách chính xác. Tcl 8.5.10 shell đơn giản là không.
Nguồn
2011-10-15 07:41:15
Multiline, vâng, nhưng đề xuất "quét" là nhỏ gọn nhất và dễ hiểu mà tôi đã thấy. "set b [scan b% d]" đáp ứng nhu cầu của tôi. Phần còn lại của proc forceInteger được dành cho việc xác thực đầu vào phòng thủ. –