[C] Передать переменный список параметров из функции в функцию

sevast82

Крайне редко писал функции с переменным списком параметров, поэтому возник вопрос:
Есть функция f, которая принимает переменный список параметров. Из неё вызывается функция g, тоже принимающая переменный список параметров.
Как передать g тот же список аргументов, который получает f ?
И, возможно, добавить в начало списка аргументов для g дополнительные аргументы?

Ivan8209


more /usr/src/lib/libc/gen/err.c
more /usr/src/lib/libc/stdio/printf.c

---
"Аллах не ведёт людей неверных."

Missi4ka

+1
А если словами, а не сцылкой?
Может, кто сам помнит, как это делается?

erotic

Если я правильно понял, ты предлагаешь передавать инициированный arglist?
Если нет, то поясни плиз.

Ivan8209

Я предлагаю вообще не делать такие функции на сях.
Я не знаю исходной постановки задачи, в зависимости от неё,
я бы посмотрел на опыт написания всяких там printf/scanf/err/exec,
но лучше сделать списки, записи или что-нибудь такое.
---
...Я работаю антинаучным аферистом...

Werdna

#include <stdarg.h>
начни с этого. вот кусок моего кода:

void message__(const char *file, int pos, int flags, const char *fmt, ...)
{
va_list ap;
char log_string[LOG_STRING_MAX_LEN];
va_start(ap, fmt);
vsnprintf(log_string, LOG_STRING_MAX_LEN, fmt, ap);
...
printf("%s", log_string);
...
}

erotic

Па любэ это не то. Ты тут нигде не передаешь из одной функции с переменным числом параметров параметры в другую функцию с переменным числом параметров.

sergey_m

Ты гонишь.
Вообще автору треда читать stdarg(3).

Flack_bfsp

А это что, по-твоему?
 va_list ap;
...
va_start(ap, fmt);
vsnprintf(log_string, LOG_STRING_MAX_LEN, fmt, ap);

erotic

Это ты вызываешь из своей функции message__ с переменным числом аргументов фукнцию vsnprintf с фиксированным числом аргументов, передавая ей в качестве одного из аргументов указатель на начало переданных нефиксированных аргументов функции message__
Чем это похоже на то, что, как я понимаю, хочет автор, скажем, передать в одну функциюю переменное число интов и распечатать их:
 
void my_function(int count, ...)
{
std::string format;
for (int i = 0; i < count; i++)
format += "%d\n";
printf(format, ...);
}

где printf(format, ...) означает передать в printf format и все остальные нефиксированные аргументы.

erotic

Ты гонишь.
Поясняй.

ppplva

Чем это похоже на то
Тем, что это работает так же. Нужный результат достигается без особенных ограничений.
Или тебе обязательно нужно магическое троеточие ?

erotic

Ты первый топик в теме читал?

erotic

И еще. Как ты реализуешь написанный мною выше пример, если у тебя нет похожей на printf функции, принимающий переменную va_list в качестве параметров?

ppplva

Понятно. Дело все же в троеточии.
Тогда никак. Менять язык или убивать себя апстену.

maggi14

забить стек параметрами (в цикле) и сделать переход на функцию

sergey_m

> Поясняй.
Вместо меня подискутировал .

Werdna

Па любэ это не то.

Это как раз именно то, тут тебе уже сказали что надо читать stdarg(3).
Тебе можно вручную пройтись по всем параметрам, у мне же просто повезло больше, есть vsnprintf. Кстати, в упомянутом мане есть пример кода.

erotic

Это как раз именно то, тут тебе уже сказали что надо читать stdarg(3).
Во-первых, это не мне сказали.
А во-вторых, чуве - сделай мне через это пример, который я описал вышел. Ага, давай, сделай.

sevast82

Спасибо, похоже, va_copy - именно оно.
Странно, что я его пропустил при чтении мана.

Werdna

Даже на русском есть man 3 stdarg

erotic

По ходу даже и va_copy не то. Но чувак - стоит ли, что б мы спорили?
Оставить комментарий
Имя или ник:
Комментарий: