Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.
Как пример
// это типа функтора. принимает один произвольный аргумент и далее сколько хочет пользователь
// разных аргументовtypedef void (*fn1) (int val, ...);
// здесь некий код который использует произвольный функтор
// необходимые функтору параметры тоже здесьvoid perfOp(int* val, fn1 f, ...)
{
va_list args;
if (f)
{
va_start(args, f);
// здесь фукктор вызывается с параметрами, но это не работает
f(val, args);
va_end(args);
}
}
void someOp(int* val, ...)
{
va_list args;
int a,b,c;
va_start(args, val);
a = va_arg(args,int); // не 3
b = va_arg(args,int); // не 1
c = va_arg(args,int); // не 5
va_end(args);
// что то полезное
}
// в идеале хотелось бы передавать разные функции, вполне определенные
// как напримерvoid anotherOp(int* val, int a, int b, int c)
{
// что то полезное
}
int main(int argc, char* argv[])
{
int val = 2;
perfOp(&val, someOp, 3, 1, 5);
perfOp(&val, anotherOp, 3, 1, 5);
return 0;
}
Re: C, вызов функции с переменным количеством параметров
Здравствуйте, playnext, Вы писали:
P>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.
никак.
олсо Си не нужен, есть С++ с вариадиками.
In Zen We Trust
Re: C, вызов функции с переменным количеством параметров
Здравствуйте, playnext, Вы писали:
P>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.
Понятно, спасибо.
Еще один вопрос, наверно глупый, но тем не менее.
Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров
при этом ничего не парсить в первой, например
void fn1(int a, ...);
void fn2(int a, ...);
fn1(int a, ...)
{
fn2(a, ...);// как то сюда передать все параметры
}
Re[3]: C, вызов функции с переменным количеством параметров
Здравствуйте, playnext, Вы писали:
P>Здравствуйте, andyp, Вы писали:
A>>Здравствуйте, playnext, Вы писали:
P>>>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.
A>>Способ делать нечто похожее в с — у вложенной функции аргумент должен быть типа va_list. Подробности: A>>http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c A>>http://c-faq.com/varargs/handoff.html
P>Понятно, спасибо. P>Еще один вопрос, наверно глупый, но тем не менее. P>Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров P>при этом ничего не парсить в первой, например
P>
P>void fn1(int a, ...);
P>void fn2(int a, ...);
P>fn1(int a, ...)
P>{
P>fn2(a, ...);// как то сюда передать все параметры
P>}
P>
нет такого способа.
на С++ пиши — там всё есть
In Zen We Trust
Re[4]: C, вызов функции с переменным количеством параметров
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, playnext, Вы писали:
P>>Здравствуйте, andyp, Вы писали:
A>>>Здравствуйте, playnext, Вы писали:
P>>>>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.
A>>>Способ делать нечто похожее в с — у вложенной функции аргумент должен быть типа va_list. Подробности: A>>>http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c A>>>http://c-faq.com/varargs/handoff.html
P>>Понятно, спасибо. P>>Еще один вопрос, наверно глупый, но тем не менее. P>>Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров P>>при этом ничего не парсить в первой, например
P>>
P>>void fn1(int a, ...);
P>>void fn2(int a, ...);
P>>fn1(int a, ...)
P>>{
P>>fn2(a, ...);// как то сюда передать все параметры
P>>}
P>>
A>нет такого способа. A>на С++ пиши — там всё есть
Жаль что нет. У меня требование использовать только только C.
Re: C, вызов функции с переменным количеством параметров
Здравствуйте, playnext, Вы писали:
P>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.
Хотя в чистом С и нельзя сформировать динамически новый набор аргументов для функции с переменным числом параметров, но если очень надо, то выход обычно есть — нужно просто использовать платформозависимые библиотеки. Самая, наверное, популярная — libffi — и там уже реализован вызов функции с переменным числом параметров.
Впрочем, если есть возможность чтобы вложенные функции не имели бы переменного числа параметров, то лучше переписать свой код именно так (один из вариантов как это сделать уже упоминался выше — передавать в них va_list).
Так libffi применяется обычно только если совсем нет возможности внести требуемые изменения. Например, когда из Python программы нужно вызывать функцию на C. Ведь в этом случае альтернативой будет переписывание всего С-кода на Python или наоборот, что уже совсем тяжело. На фоне этого вызов из программы на С функции на C через libffi выглядит как минимум странно. Но работать, конечно, будет.
Re[3]: C, вызов функции с переменным количеством параметров
Здравствуйте, playnext, Вы писали:
P>Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров P>при этом ничего не парсить в первой, например
Я в своих проектах первым делом объявляю аналоги vsprintf , а уж затем сами sprintf.
void _fn1(int a, va_list argptr);
void _fn2(int a, va_list argptr);
void fn2(int a, ...)
{
va_list argptr;
va_start(argptr, a);
_fn2(a, argptr);
va_end(argptr);
}
void fn1(int a, ...)
{
va_list argptr;
va_start(argptr, a);
_fn2(a, argptr);
va_end(argptr);
}
Re[3]: C, вызов функции с переменным количеством параметров
Здравствуйте, playnext, Вы писали:
P>Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров P>при этом ничего не парсить в первой, например
Здравствуйте, playnext, Вы писали:
P>Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров P>при этом ничего не парсить в первой, например
P>
P>void fn1(int a, ...);
P>void fn2(int a, ...);
P>fn1(int a, ...)
P>{
P>fn2(a, ...);// как то сюда передать все параметры
P>}
P>
Не существует. Но вот такое сделать можно. ПО крайней мере в VC++ работает.
void fn2(int n, void* p) {
va_list vl = (va_list)p;
int i;
int val;
for (i=0;i<n;i++)
{
val=va_arg(vl,int);
printf ("%d",val);
}
va_end(vl);
}
void fn1(int n, ...)
{
va_list vl;
va_start(vl,n);
fn2(n,vl);
}