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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2011, 22:42   #1
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию Использование (...) в с++

Здравствуйте. Возник такой вопрос, вот в луа в функцию можно передать неопределнное количество аргументов:
Код:
function prob1()
prob2(1,2,3,4,5) -- передаем аргументы, колчество практически не ограничено
end

function prob2(...)
local tab_arg = {...} --помещаем все аргументы в таблцу
local count_arg = #tab_arg -- определяем количество аргументов
local one_arg = tab_arg[1] -- подобным образом используем аргументы
end
Можно ли что-то подобное типа передачи неопределенного количества аргументов в функцию? Заранее спасибо!

Последний раз редактировалось Byurrer; 05.04.2011 в 23:16.
Byurrer вне форума Ответить с цитированием
Старый 05.04.2011, 23:13   #2
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

ну, когда вы передаете несколько элементов, они запихиваются в массив
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 05.04.2011, 23:19   #3
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

kaljan775 а можно пример такого использования?
Byurrer вне форума Ответить с цитированием
Старый 06.04.2011, 09:12   #4
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Необходимо использовать va_list, va_start и va_end.
Все достаточно просто. Вот пример:

Код:
#include <stdarg.h>
#include <iostream>

void foo(int num, ...)
{
    va_list arguments;
    int sum = 0;

    va_start(arguments, num);
 
    for (int x = 0; x < num; x++)
    {
        sum += va_arg(arguments, int);
    }

    std::cout << sum << std::endl;

    va_end(arguments);
}

int main()
{
    foo(3, 2, 3, 4);
    foo(4, 25, 16, 89, 14);

    return 0;
}
В начале мы объявляем переменную arguments, где будет хранится список всех аргументов. Макросом va_start инициализируем список аргументов, значениями после num.
Затем бегаем циклом по списку, извлекая из него следующий элемент макросом va_arg, подразумевая что тип элемента - int. Извлеченное значение сразу складываем с переменной sum.
Потом просто печатаем результат на экран.
Собственно в функции main происходит вызов функции с разным количеством элементов. в обоих случаях происходит печать суммы всех элементов.
oleg kutkov вне форума Ответить с цитированием
Старый 06.04.2011, 11:25   #5
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

oleg kutkov спасибо огромное за ясный пример и разъяснение! Но возник следующий вопрос: аргументы функции foo(...) должны быть только одного типа? Или можно передавать разные типы?
И как я понял при вызове foo(3, 2, 3, 4); первое число это количество аргуметов?
А что делает va_end(arguments);?

Последний раз редактировалось Byurrer; 06.04.2011 в 11:50.
Byurrer вне форума Ответить с цитированием
Старый 06.04.2011, 13:11   #6
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Цитата:
Сообщение от Byurrer
Но возник следующий вопрос: аргументы функции foo(...) должны быть только одного типа?
В данном случае да, т.к. в va_arg(arguments, int); мы каждый раз явно указываем объект какого типа хотим получить.

Цитата:
Сообщение от Byurrer
И как я понял при вызове foo(3, 2, 3, 4); первое число это количество аргуметов?
Да.

Цитата:
Сообщение от Byurrer
А что делает va_end(arguments);?
Очищает список. Это обязательно действие, после разбора и обработки всех аргументов.

Вообще существуют разные способы работы с переменным числом аргументов.
Советую почитать эту статью: http://www.rsdn.ru/forum/cpp/418970.1.aspx
Там Вы сможете найти ответы на все свои вопросы
oleg kutkov вне форума Ответить с цитированием
Старый 06.04.2011, 13:51   #7
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

oleg kutkov спасибо большое, буду читать!
Byurrer вне форума Ответить с цитированием
Старый 06.04.2011, 15:04   #8
ekzo
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 12
По умолчанию

подскажите пожалуйста,у меня стоит windows 7 и 64 разрядный процессор,какую лучше программу использовать для программирования на С++?
ekzo вне форума Ответить с цитированием
Старый 06.04.2011, 18:08   #9
Byurrer
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 77
По умолчанию

ekzo с++ билдер 6, с++ 2010 - они у меня оба сейчас стоят, и оба работают, и стоит у меня 7 windows -64 разрядная.
Byurrer вне форума Ответить с цитированием
Старый 06.04.2011, 19:41   #10
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Это сишный метод. В C++ (0x) есть variadic templates. Если компилятор не переварит, то можно скомпилить на http://ideone.com/.
Функция с переменным числом параметров. Строки выводит, а соседние числа складывает и выводит.
Код:
#include <cstdarg>
#include <iostream>

template <class... TT>
void foo();

template <class... TT>
void foo(const char* s, TT... tail);

template <class... TT>
void foo(int n1, int n2, TT... tail);

template <class... TT>
void foo(int n, TT... tail);


template <class... TT>
void foo()
{
}

template <class... TT>
void foo(const char* s, TT... tail)
{
    std::cout << s << ' ';
    foo(tail...);
}

template <class... TT>
void foo(int n1, int n2, TT... tail)
{
    foo(n1 + n2, tail...);
}

template <class... TT>
void foo(int n, TT... tail)
{
    std::cout << n << ' ';
    foo(tail...);
}


int main()
{
    foo("BlaBlaBla", 1, 2, 3, "qq", 512, 512);
}
Somebody вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование BusinessSkinForm Kity19 Компоненты Delphi 2 03.02.2011 19:43
Использование ComboBox Василь Microsoft Office Excel 11 24.04.2009 17:16
Использование while и while do prikolist Общие вопросы C/C++ 20 06.04.2009 18:40
Использование фокуса prikolist Общие вопросы C/C++ 1 27.03.2009 22:57