Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2015, 17:29   #1
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию Узнать количество аргументов, которые были переданы в функцию

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

Есть функция с переменным числом аргументов:

Код:
void Func(int a,...){

    int argValue = a;              // get 1 argument

    va_list args;
    va_start(args, a);

    argValue = va_arg(args, int);  // get 2 argument
    argValue = va_arg(args, int);  // get 3 argument
    argValue = va_arg(args, int);  // get 4 argument
    //  ...
    va_end(args);
}
Как определить, какое количество аргументов было передано в функцию?

Заранее благодарен.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 11.08.2015 в 17:32.
Krasiosoft вне форума Ответить с цитированием
Старый 11.08.2015, 18:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.cplusplus.com/reference/c...end/?kw=va_end
Т.е. когда va_arg вернет NULL - значит все.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2015, 18:54   #3
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
когда va_arg вернет NULL - значит все
Такое можно применить, если переменные, передаваемые в функцию, не могут быть нулем. А как быть, если они могут быть нулем?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 11.08.2015, 19:00   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Передать количество аргументов в качестве первого аргумента.
waleri вне форума Ответить с цитированием
Старый 11.08.2015, 19:09   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Понимаю, что можно самому передавать количество, но в данном случае было бы удобнее, чтоб это определялось автоматически.

Видел такое решение:

Код:
void func(int a, ...){   
    int *p = &a;
    int count = 0;    
    while (*p)         
    { 
      p++;             
      count++;         
    }    
}
Но я бы не стал подобное применять, т.к. аргументы могут быть переданы и не через стек.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 11.08.2015, 19:14   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Аргументы ... всегда в стеке.
Это решение ищет 0.

Стандартного способа подсчитать количество аргументов нет.
waleri вне форума Ответить с цитированием
Старый 11.08.2015, 19:25   #7
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Аргументы ... всегда в стеке.
Это точно?

Во многих местах не рекомендовали брать указатель и самому проходиться по нему, а использовать именно va_start, va_arg, va_end.

И если это так, тогда зачем вообще нужны va_start, va_arg, va_end?

Цитата:
Сообщение от waleri Посмотреть сообщение
Это решение ищет 0.
а, да... выходит это тоже самое, что и предложил Stilet
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 11.08.2015 в 19:28.
Krasiosoft вне форума Ответить с цитированием
Старый 11.08.2015, 20:38   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

C++ и удобство - понятия несовместимые. Указатели - это что-то типа хака, который работает сегодня на этой платформе, где-то там в другом месте поломается, поэтому лучше пользовать va_start, va_arg, va_end и не загоняться по их реализации.
pu4koff вне форума Ответить с цитированием
Старый 11.08.2015, 21:07   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Krasiosoft
Не парься - передавай vector. Надежнее будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2015, 21:39   #10
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не парься - передавай vector
Наверно так и буду делать. Изначально думал, что функцией с переменным числом аргументов это будет проще сделать.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить функцию, подсчитывающую количество слов списка, которые начинаются и оканчиваются одной и той же буквой Dark Illusion Паскаль, Turbo Pascal, PascalABC.NET 0 18.03.2013 23:26
узнать количество значений которые вернул SimpleDataSet Kreadlling БД в Delphi 1 13.04.2012 09:47
как прервать выполнение всех функций которые были запущены setTimeout Arassir JavaScript, Ajax 1 20.10.2011 16:20
узнать количество слов, которые содержат букву "у". C++ kop Помощь студентам 0 14.05.2011 09:12
как работать с компанентами, которые были созданы программно? morgonXak Компоненты Delphi 6 20.12.2010 18:38