Easyelectronics.ru

Электроника для всех
Текущее время: 20 ноя 2017, 05:23

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: [Решено] GCC + va_list
СообщениеДобавлено: 08 мар 2017, 00:55 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 712
Откуда: Украина, Харьков
Добрый вечер!

Есть функция:
Код:
void LOG_SendPrintf(char* format, ...)
{
  va_list argList;

  char    time  [16];
  char    argout[256];
  char    out   [256];

  va_start(argList, format);
  sprintf(argout, format, argList);
  va_end(argList);

  LOG_GetTimeString(time);
  sprintf(out, "> %s > %s", time, argout);

  LOG_SendString(out);
  return;
}
, которую вызываю:
Код:
LOG_SendPrintf("%s","System logging is enabled.\n");
Получаю в argout мусор. Почему? Что я делаю не так?


Последний раз редактировалось __bl__ 08 мар 2017, 01:49, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GCC + va_list
СообщениеДобавлено: 08 мар 2017, 01:05 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
arglist - не пачка аргументов, а один указатель.
Каноническое решение - звать не sprintf, а парную ей функцию vsprintf, которая ждёт как раз такой указатель.

Бонус: gcc умеет variadic macros, для простых задач может оказаться удобнее (хотя я рекомендую воздерживаться и от сложных макросов, и от printf-подобных функций)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GCC + va_list
СообщениеДобавлено: 08 мар 2017, 01:17 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 712
Откуда: Украина, Харьков
Спасибо получилось!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GCC + va_list
СообщениеДобавлено: 08 мар 2017, 01:24 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
Ещё, если не хотите граблей - поставьте своей функции __attribute__ ((format (printf, 2, 3))) - хотя бы warning на неправильное использование получите (однажды вы её точно вызовете с аргументами, не соответствующими формату, это судьба всех printf).
Читать https://gcc.gnu.org/onlinedocs/gcc-3.2/ ... butes.html со слова printf.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB