C, вызов функции с переменным количеством параметров
От: playnext  
Дата: 05.03.14 19:57
Оценка: -1
Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.
Как пример

// это типа функтора. принимает один произвольный аргумент и далее сколько хочет пользователь 
// разных аргументов
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, вызов функции с переменным количеством параметров
От: Abyx Россия  
Дата: 05.03.14 20:08
Оценка: -4
Здравствуйте, playnext, Вы писали:

P>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.


никак.
олсо Си не нужен, есть С++ с вариадиками.
In Zen We Trust
Re: C, вызов функции с переменным количеством параметров
От: andyp  
Дата: 05.03.14 20:37
Оценка:
Здравствуйте, playnext, Вы писали:

P>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.


Способ делать нечто похожее в с — у вложенной функции аргумент должен быть типа va_list. Подробности:
http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c
http://c-faq.com/varargs/handoff.html
Re[2]: C, вызов функции с переменным количеством параметров
От: playnext  
Дата: 06.03.14 07:38
Оценка:
Здравствуйте, 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

Понятно, спасибо.
Еще один вопрос, наверно глупый, но тем не менее.
Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров
при этом ничего не парсить в первой, например

void fn1(int a, ...);
void fn2(int a, ...);

fn1(int a, ...)
{
fn2(a, ...);// как то сюда передать все параметры
}
Re[3]: C, вызов функции с переменным количеством параметров
От: Abyx Россия  
Дата: 06.03.14 08:45
Оценка:
Здравствуйте, 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, вызов функции с переменным количеством параметров
От: playnext  
Дата: 06.03.14 08:58
Оценка:
Здравствуйте, 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, вызов функции с переменным количеством параметров
От: watchmaker  
Дата: 06.03.14 09:37
Оценка:
Здравствуйте, playnext, Вы писали:

P>Подскажите как из функции с переменным количеством параметров вызвать другую функцию с переменным количеством паараметров. А в идеале разные функции с различными параметрами.

Хотя в чистом С и нельзя сформировать динамически новый набор аргументов для функции с переменным числом параметров, но если очень надо, то выход обычно есть — нужно просто использовать платформозависимые библиотеки. Самая, наверное, популярная — libffi — и там уже реализован вызов функции с переменным числом параметров.

Впрочем, если есть возможность чтобы вложенные функции не имели бы переменного числа параметров, то лучше переписать свой код именно так (один из вариантов как это сделать уже упоминался выше — передавать в них va_list).
Так libffi применяется обычно только если совсем нет возможности внести требуемые изменения. Например, когда из Python программы нужно вызывать функцию на C. Ведь в этом случае альтернативой будет переписывание всего С-кода на Python или наоборот, что уже совсем тяжело. На фоне этого вызов из программы на С функции на C через libffi выглядит как минимум странно. Но работать, конечно, будет.
Re[3]: C, вызов функции с переменным количеством параметров
От: acDev Россия  
Дата: 06.03.14 09:41
Оценка:
Здравствуйте, 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, вызов функции с переменным количеством параметров
От: uzhas Ниоткуда  
Дата: 06.03.14 10:16
Оценка:
Здравствуйте, playnext, Вы писали:

P>Существует ли в C возможность вызова функции с переменным количеством параметров из функции с переменным количеством параметров

P>при этом ничего не парсить в первой, например

стандартный подход для таких задач — используйте макросы
примеры тут: http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
Re: C, вызов функции с переменным количеством параметров
От: Roman Odaisky Украина  
Дата: 07.03.14 00:36
Оценка:
http://rsdn.ru/forum/cpp/2701675.1
Автор: Roman Odaisky
Дата: 22.10.07


(хотя уже не собираю)
До последнего не верил в пирамиду Лебедева.
Re[3]: C, вызов функции с переменным количеством параметров
От: Pavel Dvorkin Россия  
Дата: 07.03.14 08:02
Оценка:
Здравствуйте, 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);
}
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.