2010-12-11 2 views
2

Я пытаюсь создать свою собственную функцию printf, но она не работает. Результат представляется правильным форматом, но параметры не получаются правильно, кажется, и я получаю значения мусора. Я использую GCC. См. Код ниже.Почему мои варидические аргументы не работают в C?

void con_printf(char *fmt, char attr, ...) 
{ 
    char *s = printf_buffer; 
    va_list args; 
    va_start(args, fmt); 
    vsnprintf(s, CON_TMPSIZE, fmt, args); 
    va_end(args); 
    while(*s != '\0') 
    { 
     con_putchr(*s, attr); 
     s++; 
    } 
    con_flush(); 
} 

printf_buffer определяется как CON_TMPSIZE байт длиной, которая составляет 128 байт в этой версии. Это для небольшого микроконтроллера, но я ожидаю, что этот принцип применим к любому процессору.

Я называю это так:

con_printf("LOOP a %d\n", 0, 10); 
con_printf("LOOP b %d\n", 0, 12); 

Я ожидаю, что петлевой 10 должны быть напечатаны на первой линии, а LOOP б 12 на следующий, но я получаю петлевой 542 и LOOP б 542.

+0

Пожалуйста, покажите нам номер вызывающий абонент, а аргументы передаются в – EvilTeach

+0

@EvilTeach - добавлен кода вызывающего –

ответ

4

С указанием va_start, с которого начинаются переменные аргументы.

Поскольку переменный список аргументов вашей функции начинается после того, как attr, вам необходимо:.

va_start(args, attr); 
+0

Спасибо за ваши но он все еще не работает. Выход не изменился с того, чем он был. –

+0

Хм. Я запускал свою виртуальную машину, запускал этот код, и это дало мне ожидаемые результаты. На какой машине компилируется ваш код? –

+0

Он работает на микроконтроллере, dsPIC33FJ128GP802. –

Смежные вопросы