Anonymous
`std::sprintf` или `std::snprintf` с пакетом параметров без дополнительного вызова и буфера tmp
Сообщение
Anonymous » 12 ноя 2024, 23:40
Есть ли способ избавиться от tmp и второго вызова std::snprintf в Print? Могу ли я сделать то же самое с помощью одного вызова std::snprintf?
Код: Выделить всё
// arm-none-eabi-g++ -std=c++14 -O3 -Wall -fno-rtti -fno-exceptions
#include
#include
#include
#include
void TransmitViaUartAndDma(const char * buffer, int len) {
// "Embedded World"
(void)buffer;
(void)len;
}
constexpr std::size_t buf_size = 64; // = sizeof(buffer)/sizeof(buffer[0])
std::array buffer{};
template
void Print(Arg&& arg, Args&&... args) {
std::array tmp{};
int len = std::snprintf(tmp.begin(), buffer.size(),
"%s"
"\n",
std::forward(arg));
// std::printf("len = %d\n", len);
len = std::snprintf(buffer.begin(), buffer.size(),
tmp.cbegin(),
std::forward(args)...);
// std::printf("len = %d\n", len);
TransmitViaUartAndDma(buffer.cbegin(), len);
}
int main() {
std::uint32_t val1{222};
std::uint32_t val2{111};
Print("%u. %u. Hello, ", val1, val2);
// std::printf(buffer.cbegin());
Print("%u. %u. World!", val2, val1);
// std::printf(buffer.cbegin());
return 0;
}
// 222. 111. Hello,
// 111. 222. World!
Демо
Встроенное
Примечание: я не могу использовать std::cout.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... al-call-an
1731444052
Anonymous
Есть ли способ избавиться от tmp и второго вызова std::snprintf в Print? Могу ли я сделать то же самое с помощью одного вызова std::snprintf? [code]// arm-none-eabi-g++ -std=c++14 -O3 -Wall -fno-rtti -fno-exceptions #include #include #include #include void TransmitViaUartAndDma(const char * buffer, int len) { // "Embedded World" (void)buffer; (void)len; } constexpr std::size_t buf_size = 64; // = sizeof(buffer)/sizeof(buffer[0]) std::array buffer{}; template void Print(Arg&& arg, Args&&... args) { std::array tmp{}; int len = std::snprintf(tmp.begin(), buffer.size(), "%s" "\n", std::forward(arg)); // std::printf("len = %d\n", len); len = std::snprintf(buffer.begin(), buffer.size(), tmp.cbegin(), std::forward(args)...); // std::printf("len = %d\n", len); TransmitViaUartAndDma(buffer.cbegin(), len); } int main() { std::uint32_t val1{222}; std::uint32_t val2{111}; Print("%u. %u. Hello, ", val1, val2); // std::printf(buffer.cbegin()); Print("%u. %u. World!", val2, val1); // std::printf(buffer.cbegin()); return 0; } // 222. 111. Hello, // 111. 222. World! [/code] Демо Встроенное Примечание: я не могу использовать std::cout. Подробнее здесь: [url]https://stackoverflow.com/questions/79182447/stdsprintf-or-stdsnprintf-with-parameter-pack-without-additional-call-an[/url]