Допустим у нас есть функция
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);
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
В лаунчере на С++ должны поочерёдно запускаться несколько других приложенийКомадны запуска для всех приложений одинаковые - например,
Данные об успешности студентов записано в N строках символов, каждый из которых имеет следующую структуру: фамилия и др, № зачетной книжки,...
Не могли бы объяснить отличие выполнение кода на рекурсивном спуске и возврате (с примером)? Как вообще определить, что программа выполняется...