C vsnprintf () игнорирует последний аргумент - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь отобразить отформатированную строку на TFT-дисплее с помощью микроконтроллера TI C2000. Для этого я использую следующую функцию.

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 ]

2 голосов
/ 02 мая 2019

Вы выявили проблему (неправильные типы) и предложили изменить секунды на %02ld, поскольку secs равно uint32_t.Технически это все еще неправильно, поскольку %02ld ожидает long int.С одной стороны, это подписано, а не без знака, и не все системы обязательно кодируют маленькое целое число без знака так же, как целое число со знаком.С другой стороны, он снова сломается, когда вы перейдете в другую систему, где long int - это что-то, отличное от 32 бит.

2 голосов
/ 02 мая 2019

Проблема заключалась в том, что secs был объявлен как uint32_t, тогда как hours и mins были uint16_t, поэтому спецификатор формата должен был быть %02ld.(Я удивлен, что это оказало такое значительное влияние)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...