Я хочу написать быструю функцию типа printf() для встроенной платы, над которой я работаю, где выходной терминал является последовательным портом. Я пробовал что-то вроде этого:
int32_t printfDebugSerial(const char *format, ...)
{
char tempBuff[256];
memset(tempBuff, 0, sizeof tempBuff);
va_list arg;
int32_t done;
va_start (arg, format);
done = (int32_t)sprintf(tempBuff,format, arg);
va_end (arg);
HAL_sendToSerial((uint8_t*)tempBuff, strlen(tempBuff)); // writes bytes to serial port
return done;
}
Но результат, который я получил, когда назвал его, выглядит следующим образом:
printfDebugSerial("Hello = %u", 1234);
выход:
Hello = 536929228
затем называется:
printfDebugSerial("Hello = %f", 934.3245);
выход:
Hello = 0.000000
Любая помощь, что здесь не так?
связанные: stackoverflow.com/questions/46100864/…
Если вы используете GCC, скомпилируйте с -Wall -Werror.
@JonathonReinhart, он работал без '-Wall -Werror'
@HansPassant, большое спасибо, просто любопытно, почему sprintf () не работает?
Пересылка списка аргументов переменной длины требует дополнительной магии, только функции vxxxprintf знают, как это делать.
@HansPassant, ха-ха тебя достал :)





Вы должны использовать vsprintf вместо sprintf, если вы пересылаете va_list:
int32_t printfDebugSerial(const char *format, ...)
{
char tempBuff[256];
memset(tempBuff, 0, sizeof tempBuff);
va_list arg;
int32_t done;
va_start (arg, format);
done = (int32_t)vsprintf(tempBuff,format, arg);
va_end (arg);
HAL_sendToSerial((uint8_t*)tempBuff, strlen(tempBuff)); // writes bytes to serial port
return done;
}
Большое спасибо, просто любопытно, почему sprintf () не работает?
Если у вас есть %u в вашем формате, sprintf будет ожидать целое число без знака, но в вашем случае вместо этого тип параметра был va_list, что не работает. sprintf обычно внутренне создает va_list, как и вы, и вызывает с ним vsprintf.
Используйте vsnprintf ()