所以我有一个编译器错误,他们的低级_fconvert()函数供应商标记为低优先级,但结果是如果我将NaN值发送到printf()样式,嵌入式系统将崩溃功能。我想为sprintf()编写一个解析浮点数的包装器,如果它们是NaN值,它们将被宏值替换。我想我已经掌握了如何传递变量参数列表的基础知识,但不知道如何解析/替换。任何人都可以帮我吗?
int no_nan_sprintf(char *target_str, const char *format, ...)
{
va_list args;
va_start(args, format);
//need help here, something like
int idx;
for (idx = 0; idx < sizeof(args); idx++)
{
if (isnan(args[idx]))
{
args[idx] = NAN_SUBSTITUTE_VALUE;
}
}
//this should be tha call I want to make to sprintf
sprintf(target_str, format, args);
va_end(args);
} /* no_nan_sprintf */
答案 0 :(得分:1)
过滤整个对*printf
的调用所面临的天真的问题是,盲目地替换所有参数是不够的-您仅需要对浮点参数进行操作即可。
这意味着您需要智能地处理格式字符串本身,以确保您不修改指针或整数。
就确保不通过NaN而言,我选择更改以下内容:
printf ("Two floats and an int: %f %d %f\n", float1, int1, float2);
具有:
float fx(float f) { return isnan(f) ? 0 : f; }
printf ("Two floats and an int: %f %d %f\n", fx(float1), int1, fx(float2));
那样,您不必担心重新实现printf
系列的所有硬细节,只需要过滤引起麻烦的特定变量即可。可以根据需要使fx
函数复杂,例如使用宏而不是零,从而允许在每次调用时提供默认值,等等。
很明显,这只有在您可以更改所有传递NaN的呼叫时才有效。如果它们被深埋在您无法控制的代码中,那么您很可能必须走更困难的路线来替换标准库的整个块。