powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переменное число аргументов, почему так не работает?
10 сообщений из 10, страница 1 из 1
Переменное число аргументов, почему так не работает?
    #39721483
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть процедура:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
void debugMsg(const char * format, ...) {
  Serial.print(millis());
  Serial.print('[');
  Serial.print(ESP.getFreeHeap());
  Serial.print("] ");  
  va_list arg;  
  va_start(arg, format);  
  Serial.printf(format, arg); 
/*
  char temp[64];
  char* buffer = temp;
  size_t len = vsnprintf(temp, sizeof(temp), format, arg);
  va_end(arg);
  if (len > sizeof(temp) - 1) {
      buffer = new char[len + 1];
      if (!buffer) {
          return;
      }
      va_start(arg, format);
      vsnprintf(buffer, len + 1, format, arg);
      va_end(arg);
  }
  len = Serial.write((const uint8_t*) buffer, len);
  if (buffer != temp) {
    delete[] buffer;
  } 
*/
  Serial.println("");  
  va_end(arg);
}



процедура в таком виде не выводит текст из параметров,
если закомментировать Serial.printf(format, arg), а остальное раскомментировать, то выводит.
Закомментированный кусок это содержимое Print::printf

Как сделать правильно чтобы не писать весь код printf?
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39721499
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvait
Код: plaintext
1.
2.
3.
  va_list arg;  
  va_start(arg, format);  
  Serial.printf(format, arg);



Все правильно, это не должно работать, т.к. Serial.printf() вторым аргументом врядли поддерживает значения типа va_list.

Вам нужен второй вариант этой функции - Serial.vprintf который бы принимал va_list, и потом например печатал его через vsnprintf или аналоги.
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39721519
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, я думал что va_list передаётся как эти три точки
к сожалению у этого Serial нет функции vprintf
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39721533
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvait,

Если у вас С++ 11 и выше, то можно обойтись вообще без va_list.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
template<typename ...Args>
void debugMsg(const char * format, Args ... args) {
  Serial.print(millis());
  Serial.print('[');
  Serial.print(ESP.getFreeHeap());
  Serial.print("] ");  
  Serial.printf(format, args...); 
  Serial.println("");  
}


Тогда текущая версия Serial.printf подойдет без изменений.
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39721585
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvait,

Можно выполнить vsprintf в буфер и передать через
Serial.printf("%s", buf);
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39722042
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky, спасибо, именно этого и хотелось
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39722050
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли у вас С++ 11 и выше, то можно обойтись вообще без va_list.

С макросом это было бы короче:
Код: sql
1.
2.
#define debugMsg(format, ...) Serial.printf("%d[%d] " format, millis(), 
ESP.getFreeHeap(), VA_ARGS)


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39722136
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly MoskovskyЕсли у вас С++ 11 и выше, то можно обойтись вообще без va_list.

С макросом это было бы короче:
Код: sql
1.
2.
#define debugMsg(format, ...) Serial.printf("%d[%d] " format, millis(), 
ESP.getFreeHeap(), VA_ARGS)



Макрос должен быть поскольку это отладочные сообщения. Если мы говорим о С++ то я бы использовал оператор <<
что то типа такого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#define  debugMsg(ARGS)  \
do { \
   std::string buff; buff.reserve(128);
   std::ostringstream os(buff); \
   os << std::setw(10) <<  millis() \
      << " ["<< std::setfill('0') << std::hex << std::setw(10) << ESP.getFreeHeap() << "] "  << std::setfill(' ') << std::dec \
      << ARGS; \
   Serial.puts(os.str().c_str()); \
} while(0);

main()
{
...............

debugMsg( var1 << " " << var2 << " etc..." )


ещё один нюанс для ТС - отладочное сообщение в порт лучше выводить одной строкой чтобы не вклинивались сообщения из других нитей.
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39722213
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovС макросом это было бы короче:
Не будет работать для пустого списка аргументов.
...
Рейтинг: 0 / 0
Переменное число аргументов, почему так не работает?
    #39722282
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНе будет работать для пустого списка аргументов.

Для GNU CPP - будет: https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переменное число аргументов, почему так не работает?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]