2009-09-04 10 views
5

Me gustaría tener una implementación portátil de mi aplicación. Sin embargo, he oído que hay algunos problemas con printf desde el stdlib en ciertas máquinas donde no se comporta como se pretendía. Por ejemplo, cuando se usa el especificador de conversión % f, puede suceder que en ciertas arquitecturas la implementación printf incluya un punto decimal en la salida.Implementación de printf de prueba

Ahora me pregunto, si hay tal vez algunas rutinas de prueba por ahí que podría uso para probar la corrección semántica de aplicación stdlib c, en particular, la rutina printf. Tal vez hay algunos buenos recursos que señalan algunos problemas al portar programas?

Muchas gracias, Heinz

+0

¿Qué pasa con el punto decimal en la salida? IMO está más relacionado con l10n que la portabilidad. –

+0

Cuando lo usa para probar, básicamente obtiene diferentes resultados en diferentes plataformas; esto podría significar que una prueba podría fallar debido a que el punto decimal lleva a una representación diferente, aunque los valores en sí son los mismos. –

+3

@Heinz, puede establecer la configuración regional en "C" en el código de prueba (es decir, setlocale (LC_NUMERICAL, "C")). Esto debería producir siempre un punto decimal y no una coma o algo más. – quinmars

Respuesta

1

debe escribir su propia batería de pruebas que abarca los temas que le preocupan. Es muy simple llamar a printf 100 veces con entradas variables, y el resultado es texto simple, por lo que es fácil verificarlo contra el resultado esperado.

4

Creo que Postel's law ("sé conservador en lo que haces, se liberal en lo que aceptas de los demás") se aplica aquí también. No escriba sus pruebas para requerir una coincidencia carácter por carácter para poder considerar que la implementación printf() está funcionando.

En su lugar, hazlo a un nivel superior; analizar el resultado de texto por printf() en el tipo de datos esperado y compararlo con un valor de ese tipo.

Es decir, si imprime "2.25", analice el texto (usando strtod() o equivalente) y compare con el número real 2.25, no con la cadena de texto literal "2.25".

0

Recomendaría probarlo de la siguiente manera: use sprintf() para producir algunas plantillas de prueba y compararlas con las "correctas".

Hice algo como esto usando fprintf (solo para evitar el almacenamiento en caché en nuestro sistema integrado).

Creo que los resultados no diferirán para printf y sprintf: el algoritmo de formateo es el mismo.

+0

Los algoritmos son los mismos porque en la mayoría de los casos toda la familia printf usa una implementación común. Comparar a un miembro de la familia con otro solo confirmará que obtuvieron la misma respuesta, pero no ayudan a decidir si es la respuesta correcta. – RBerteig