2014-01-30 4 views
1

Я пытаюсь написать свои собственные функции va_args в первый раз, и у меня возникла проблема, заключающаяся в том, что большие целые числа (все еще в пределах диапазона int) усекаются до трех цифр и из заказ!va_arg возвращает только части моего целого

Вот реализация

void __sprintf(char * _string, ...) 
{ 
    int i = a_sizeof(_string); char _arg; int j =0; int format = 0; 
    va_list args; 
    va_start (args,_string); 
    for(; j < i; j++) 
    { 
    if(_string[j] == '\0') 
     break; 
    else if(_string[j] == '%') 
    { 
     format=1; 
     continue; 
    } 
    else if(format==1) 
    { 
     switch(_string[j]) 
     { 
     case 'd': 
     _arg = va_arg(args,int); 
     printi(_arg); //Prints integers over serial by converting to ASCII 
     break; 

     default: 
     continue; 

     } 
     format = 0; 
    } 
    else 
     SerialPutChar(_string[j]); 
    } 
    va_end(args); 

} 

Что я получаю, когда я пытаюсь __sprintf("%d %d %d\n",32141,6400,919911); это 141 32 то выходит. Я установил точки останова, и иногда это похоже на то, что я получил полное дерьмо.

Подозрения: реализация IAR по stdarg полной кости головы промаха использования в va_arg недостающие тонкой печати детали (которые, вероятно, выделены жирным шрифтом 14pt, но никто не читает это в любом случае)

Заранее спасибо!

+0

Попробуйте удалить пробел между 'va_start' и его списком аргументов. – Palec

ответ

3

Вы указали char _arg вместо int _arg, поэтому «усечение» целых значений.

+0

+1 Хорошие глаза. Или вы получили предупреждение? – chux

+0

wow ... это неудобно! – Andros

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

  • Нет связанных вопросов^_^