C vsnprintf()忽略最后一个参数

时间:2019-05-02 17:24:52

标签: c printf

我正在尝试使用TI C2000微控制器在TFT显示器上显示格式化的字符串。为此,我使用以下功能。

void text_writeFormatAtPoint(fontHeader_t font, uint16_t x, uint16_t y, textAlignment_t align, char *fmt, ...) {
    va_list lst;
    char s[64];
    va_start(lst, fmt);
    vsnprintf(s, 63, fmt, lst);
    va_end(lst);
    text_writeTextAtPoint(font, s, x, y, align);
}

我用以下行调用该函数。

text_writeFormatAtPoint(f_12x16, 0, clock->face.y+30, CENTER, "%2d:%02d:%02d", hours, mins, secs);

在其他微控制器上,它完全可以按预期工作。但是,在此字符串上,仅将小时和分钟输入字符串,而秒位置保留在00。通过调试,我确保secs变量具有正确的值,并且s是错误的,而不是显示代码。我是否忽略了vsnprintf()的某些功能,或者可能是TI实现该功能的错误?

如果我执行以下操作

text_writeFormatAtPoint(f_12x16, 0, clock->face.y+30, CENTER, "%2d:%02d:%02d:%02d", hours, mins, secs, secs);

最右边的位置会更新,但不会更新。

2 个答案:

答案 0 :(得分:2)

问题在于secs被声明为uint32_t,而hoursmins被声明为uint16_t,因此格式说明符必须为{{1} }。 (我很惊讶这产生了如此重大的影响)

答案 1 :(得分:2)

您已确定问题所在(类型错误),并建议将秒数更改为%02ld,因为secsuint32_t。从技术上讲,这仍然是错误的,因为%02ld期望long int。一方面,它是有符号的,而不是无符号的,并且并非所有系统都必须以与有符号的整数相同的方式编码一个小的无符号整数。另外,当您转到另一个long int不是32位的系统时,它将再次中断。

我认为更好的解决方法是投射:

text_writeFormatAtPoint(f_12x16, 0, clock->face.y+30, CENTER, "%2d:%02d:%02d", (int)hours, (int)mins, (int)secs);