Допустим у нас есть функция
void foo(int a, ...)
и функция
void bar(int a, ...)
Вопрос: как в функции bar() можно вызвать функцию foo() так, что бы добавить пару своих аргументов и передать все которые ей пришли?
Например: вызываем bar(1,2,3,4,5) и нужно что бы в функции bar было вызвано foo(1, 10, 2, 3, 4, 5, 20).
P. S. Функции не обязательно должны принимать int.
Например
typedef void (*EndFunction)(...);
void endFunction(double a, double b, int c, void* d) {
}
EndFunction someEndFunction = (EndFunction) endFunction;
void recieverFunction(SomeParamStack* stack, ...) {
if(stack->empty()) someEndFunction(/* вот тут нужно поместить список аргументов */);
else switch (stack->getNextType()) {
case(ST_INT) : {
recieverFunction(stack,/* аргументов */,stack->getInt(),);
break;
}
case(ST_DOUBLE) : {
recieverFunction(stack,/* аргументов */, stack->getDouble());
break;
}
case(ST_POINTER) : {
recieverFunction(stack,/* аргументов */, stack->getPointer());
break;
}
}
}
int main ( int argc, char **argv ) {
SomeParamStack stack;
stack->pushPointer(0);
stack->pushInt(3);
stack->pushDouble(2.2);
stack->pushDouble(1.1);
recieverFunction(stack);
}
Сделать функцию, принимающую список параметров - по аналогии с vprintf - не годится?
void foo(int count, va_list vlist)
{
if (count == 0) return;
va_list ap;
va_copy(ap,vlist);
printf("Count = %d, value = %d\n",count,va_arg(ap,int));
foo(count-1,ap);
va_end(ap);
};
void foo(int count, ...)
{
va_list ap;
va_start(ap,count);
foo(count,ap);
va_end(ap);
}
int main(int argc, const char * argv[])
{
foo(5,1,2,3,4,5);
}
void foo(double a,...) //Так объявляется функция с заранее неизвестным числом параметров
{
double *P=&a; //Взятие адреса у первого параметра
double sum=0; //Инициализация значения суммы в ноль
while (*P) //Пока встречаются параметры и параметр не равен 0
{
sum=sum+(*P);//Прибавляем к сумме то что взяли по адресу P
P++; //Адресная арифметика. Смена текущего адреса на следующий
}
cout<<sum<<endl; //Вывод результата на экран
}
void bar(double a,...)
{
double *P=&a;
double i=0, fooi=0;;
double[] fooArgs = new double[] { 1, 3, 5, 7, 9 };
double[] *resArgs = new double[500];
foo
while (*P)
{
sum=sum+(*P);//Адресная арифметика. Смена текущего адреса на следующий
resArgs[++i] = fooArgs[++fooi];
resArgs[++i] = (*P);
}
foo(resArgs);
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости