Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: функция (макрос?) DEBUG
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
toweroff
Добрый вечер!

Хочется реализовать дебажную функцию, чтобы было что-то типа

DEBUG("Var rct=%d\n", rct);

в общем аналог printf

Все упирается в то, что fputc уже переопределен для других целей. Нужно как-то в этой DEBUG задействовать sprintf и отправлять это дело по дебажному USART

Подскажите, как? Или как вообще такие вещи делаются? Где-то встречал подобное некоторое время назад, да позабыл где, никак не найду sad.gif
aaarrr
Код
#include <stdarg.h>

char buff[12345];

int my_printf(const char *fmt, ...)
{
     va_list ap;
     int n = 0;

     va_start(ap, fmt);
     if((n = vsnprintf(buff, sizeof(buff), fmt, ap)) > 0)
     {
         // Отправляем строку
     }
     va_end(ap);
     return n;
}
toweroff
Спасибо!
CrimsonPig
Цитата(toweroff @ Sep 20 2015, 19:10) *
Добрый вечер!

Хочется реализовать дебажную функцию, чтобы было что-то типа

DEBUG("Var rct=%d\n", rct);

в общем аналог printf
Подскажите, как? Или как вообще такие вещи делаются? Где-то встречал подобное некоторое время назад, да позабыл где, никак не найду sad.gif


Google: "variadic macros"
zltigo
QUOTE (CrimsonPig @ Sep 20 2015, 22:35) *
Google: "variadic macros"

Это для другого - для обертки функций с переменным числом аргуменов в макросы. Тоже, конечно, удобно для отладочных макросов, например:
CODE
#define dprintf( debug_flags, args ... ) if( debug_flags & debug_config ){ xprintf( args ); }

но не то, что хотел Автор.

CrimsonPig
Цитата(zltigo @ Sep 20 2015, 21:00) *
Это для другого - для обертки функций с переменным числом аргуменов в макросы. Тоже, конечно, удобно для отладочных макросов, например:
но не то, что хотел Автор.


Ну не знаю, чего ТС конкретно хотел, но получить макросы (с разделением debug/release) и работающие как printf (с переменным числом параметров) это точно к variadic macros.
а что уж внутри делать с va_arg, это как пойдет.
zltigo
QUOTE (aaarrr @ Sep 20 2015, 21:39) *
CODE
     int n = 0;
}

"= 0" глаз режет sad.gif.
Ну и в общем лишний промежуточный буфер, который в общем случае очевидно придется перекидывать в какой-то другой, который уже будет разгружаться.

aaarrr
Цитата(zltigo @ Sep 20 2015, 23:06) *
"= 0" глаз режет sad.gif .

Лишний, да. Просто код выкорчевал неаккуратно.

Цитата(zltigo @ Sep 20 2015, 23:06) *
Ну и в общем лишний промежуточный буфер, который в общем случае очевидно придется перекидывать в какой-то другой, который уже будет разгружаться.

ТС хотел sprintf, пример дан.
zltigo
QUOTE (aaarrr @ Sep 20 2015, 23:13) *
ТС хотел sprintf, пример дан.

В принципе годится, просто указатель буфера vsnprintf() двигать нужно в буфере. Тогда этот-же буфер и для разгрузки использовать можно.
P.S.
Я для отладки использую свой простенький, но зато максимально быстрый "printf()".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.