Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: va_parameters
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
FormatCft
Доброго времени суток!
Задачка такая подвернулась:
Дано:
1)
Код
void f_one(char * format, ...);

2)
Код
void f_two(char * format, ...);
{
  va_list args;
  va_start (args, format);

  f_one (format, args); 

  va_end (args);
}

Правильно ли я делаю?

В литературе что-то эти фокусы не очень раздвинуты.

Т.е. мне нужно чтобы в функцию f_one передавались те же самые параметры, что и в функцию f_two.
Сергей Борщ
Цитата(FormatCft @ Jan 24 2009, 16:21) *
Правильно ли я делаю?
Нет. Задача в общем виде решаема только через дополнительную функцию:

Код
void f_one_body(char * format, va_list args);

void f_one(char * format, ...)
{
    va_list args;
    va_start (args, format);
  
    f_one_body (format, args); 
  
    va_end (args);
}

void f_two(char * format, ...);
{
    va_list args;
    va_start (args, format);
  
    f_one_body (format, args); 
  
    va_end (args);
}
Происходит это от того, что в вашем варианте f_two должна передать в f_one стековый фрейм, размер которого ей не известнен. Наверное, если в вашем компиляторе фрейм передается по указателю, можно как-то извернуться и передать в f_one указатель на стековый фрейм, переданный f_two. Но компилятор при вызове f_one будет пытаться сформировать стековый фрейм с этим указателем в виде содержимого, как того требует прототип функции. Значит надо будет заводить указатель на фиктивную функцию с параметром в виде указателя на стековый фрейм и вызывать f_one через этот указатель с явным приведением к типу f_one... Короче - мороки много и скорее всего будет непереносимо.
FormatCft
Цитата(Сергей Борщ @ Jan 24 2009, 20:33) *
...



Знаю, что есть функция vsprintf (buffer,format, args), о которой узнал от ZltIgo.


Найти бы её в оригинале и поковырять.

===

Может тогда кто на исходничек пальцем покажет где живет эта функция?
scifi
Цитата(FormatCft @ Jan 24 2009, 21:57) *
Может тогда кто на исходничек пальцем покажет где живет эта функция?

Идём на http://koders.com и ищем. Там этого добра навалом...
Сергей Борщ
Цитата(FormatCft @ Jan 24 2009, 20:57) *
Знаю, что есть функция vsprintf (buffer,format, args), о которой узнал от ZltIgo.

Найти бы её в оригинале и поковырять.
Поковырять на предмет чего? Она так же получает третий аргумент типа va_list, как и f_one_body(). Исходники одной из реализаций есть в репозитории avr-libc.
SergeiCh
Фрагмент из stdio.c at91lib

Код
signed int vprintf(const char *pFormat, va_list ap)
{
    return vfprintf(stdout, pFormat, ap);
}

signed int fprintf(FILE *pStream, const char *pFormat, ...)
{
    va_list ap;
    signed int result;

    // Forward call to vfprintf
    va_start(ap, pFormat);
    result = vfprintf(pStream, pFormat, ap);
    va_end(ap);

    return result;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.