C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как передать список аргументов переменной длины в другую функцию?  (Прочитано 1378 раз)
dimchik_b
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 95


Как передать список аргументов переменной длины в другую функцию?
« : 17 Октябрь 2015, 22:15:04 »

Есть функция с аргументами переменной длины. Из нее надо вызвать другую функцию, тоже с аргументами переменной длины. Вопрос в том, как передать туда аргументы? Вот, что-то типа такого:
Код
int Bprintf (char* Format, ...)
  {
  Beep (1000,10);
  return printf (char* Format, /*And what here?*/ );
  }
 
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Как передать список аргументов переменной длины в другую функцию?
« Ответ #1 : 19 Октябрь 2015, 10:19:26 »

stackoverflow:
Код
#include
 
int maxof(int n_args, ...)
{
   va_list ap;
   va_start(ap, n_args);
   int max = va_arg(ap, int);
   for(int i = 2; i n_args; i++) {
       int a = va_arg(ap, int);
       if(a > max) max = a;
   }
   va_end(ap);
   return max;
}

Код
void format_string(char *fmt,va_list argptr, char *formatted_string);
 
 
void debug_print(int dbg_lvl, char *fmt, ...)
{    
char formatted_string[MAX_FMT_SIZE];
 
va_list argptr;
va_start(argptr,fmt);
format_string(fmt, argptr, formatted_string);
va_end(argptr);
fprintf(stdout, "%s",formatted_string);
}
Записан
dimchik_b
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 95


Re: Как передать список аргументов переменной длины в другую функцию?
« Ответ #2 : 19 Октябрь 2015, 11:04:42 »

Первый пример - это не о том, а второй наставил на путь истинный - использовать vprintf вместо printf. Но именно printf использовать в моем примере не получится, видимо, никак.
Записан
Asher
Администратор


Сказали спасибо: +111/-5
Offline

Сообщений: 425


Re: Как передать список аргументов переменной длины в другую функцию?
« Ответ #3 : 19 Октябрь 2015, 19:34:18 »

здравствуйте.

если возвращаемое значение не важно, то можно так:
Код:
#define Bprintf(fmt,...) {Beep (1000,10);printf(fmt,__VA_ARGS__);}
попробуйте поискать по словам "проброс эллипсиса"
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #4 : 22 Октябрь 2015, 06:10:41 »

Стандартное решение - использовать функцию, которая принимает переменную типа va_list (список аргументов) в качестве параметра, например vprintf. Легкого и универсального способа передачи ... в ... нет.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.092 секунд. Запросов: 19.