реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> va_parameters
FormatCft
сообщение Jan 24 2009, 14:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 331
Регистрация: 22-07-08
Из: Р О С С И Я
Пользователь №: 39 145



Доброго времени суток!
Задачка такая подвернулась:
Дано:
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.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2009, 15:33
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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... Короче - мороки много и скорее всего будет непереносимо.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
FormatCft
сообщение Jan 24 2009, 18:57
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 331
Регистрация: 22-07-08
Из: Р О С С И Я
Пользователь №: 39 145



Цитата(Сергей Борщ @ Jan 24 2009, 20:33) *
...



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


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

===

Может тогда кто на исходничек пальцем покажет где живет эта функция?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 24 2009, 19:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Идём на http://koders.com и ищем. Там этого добра навалом...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2009, 19:28
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(FormatCft @ Jan 24 2009, 20:57) *
Знаю, что есть функция vsprintf (buffer,format, args), о которой узнал от ZltIgo.

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SergeiCh
сообщение Jan 24 2009, 19:55
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415



Фрагмент из 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;
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 11:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016