2009-09-04 38 views
5

Tôi muốn có một ứng dụng di động của ứng dụng của mình. Tuy nhiên, Tôi đã nghe nói rằng có một số vấn đề với printf từ stdlib trên một số máy nhất định nơi nó không hoạt động như dự định. Ví dụ, khi sử dụng công cụ chuyển đổi số % f thì có thể xảy ra rằng trên một số kiến ​​trúc nhất định việc triển khai printf bao gồm dấu thập phân trong đầu ra!Thử nghiệm thực hiện printf

Bây giờ tôi tự hỏi, nếu có thể một số thử nghiệm thường xuyên ra có mà tôi có thể sử dụng để kiểm tra tính chính xác ngữ nghĩa của stdlib c thực hiện, đặc biệt là printf thường lệ. Có thể có một số tài nguyên tốt chỉ ra một số vấn đề khi chuyển các chương trình?

Rất cám ơn, Heinz

+0

Điều gì sai với dấu thập phân trong đầu ra? IMO nó liên quan nhiều hơn đến l10n so với tính di động. –

+0

Khi bạn sử dụng nó để thử nghiệm, về cơ bản bạn có được kết quả đầu ra khác nhau trên các nền tảng khác nhau; điều này có thể có nghĩa là một thử nghiệm có thể thất bại vì dấu thập phân dẫn đến một represenation khác nhau mặc dù các giá trị chính nó là như nhau. –

+3

@Heinz, bạn có thể đặt ngôn ngữ thành "C" trong mã thử nghiệm của bạn (ví dụ: setlocale (LC_NUMERICAL, "C")). Điều này nên đầu ra luôn luôn là một dấu thập phân và không phải là dấu phẩy hoặc cái gì khác. – quinmars

Trả lời

1

Bạn nên viết bộ kiểm tra của riêng bạn mà bao gồm các vấn đề mà bạn quan tâm. Nó rất đơn giản để gọi printf 100 lần với các đầu vào khác nhau, và đầu ra là văn bản đơn giản, do đó, nó đơn giản để kiểm tra đối với đầu ra bạn mong đợi.

4

Tôi nghĩ rằng Postel's law ("bảo thủ những gì bạn làm, tự do trong những gì bạn chấp nhận từ những người khác") cũng áp dụng ở đây. Không viết các bài kiểm tra của bạn để yêu cầu một đối sánh theo từng ký tự để xem xét việc triển khai printf() để hoạt động.

Thay vào đó, hãy thực hiện cấp cao hơn; phân tích đầu ra văn bản theo số printf() vào kiểu dữ liệu dự kiến ​​và so sánh với giá trị của loại đó.

I.e, nếu in "2,25", phân tích văn bản (sử dụng strtod() hoặc tương đương) và so sánh với số thực tế 2,25, không phải chuỗi văn bản bằng chữ "2,25".

0

Tôi khuyên bạn nên thử nghiệm theo cách sau: sử dụng sprintf() để tạo một số mẫu thử nghiệm và so sánh chúng với mẫu "chính xác" của bạn.

Tôi đã làm một cái gì đó như thế này bằng cách sử dụng fprintf (chỉ để tránh bộ nhớ đệm trong hệ thống nhúng của chúng tôi).

Tôi nghĩ rằng kết quả sẽ không khác nhau đối với printf và sprintf: thuật toán định dạng giống nhau.

+0

Các thuật toán giống nhau bởi vì trong hầu hết các trường hợp, tất cả họ printf đều sử dụng một triển khai phổ biến. So sánh một thành viên trong gia đình với một thành viên khác sẽ chỉ xác nhận rằng họ có cùng câu trả lời, nhưng không giúp quyết định xem đó có phải là câu trả lời đúng hay không. – RBerteig

Các vấn đề liên quan