Easyelectronics.ru

Электроника для всех
Текущее время: 21 окт 2018, 13:23

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

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

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

Есть функция:
Код:
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
Сообщения: 2524
Откуда: Санкт-Петербург
arglist - не пачка аргументов, а один указатель.
Каноническое решение - звать не sprintf, а парную ей функцию vsprintf, которая ждёт как раз такой указатель.

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


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

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


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2524
Откуда: Санкт-Петербург
Ещё, если не хотите граблей - поставьте своей функции __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