Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/27: Рейтинг темы: голосов - 27, средняя оценка - 4.74
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280

функции с переменным количеством параметров

11.09.2011, 00:46. Показов 6126. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
для некоторого класса необходимо чтобы его конструктор принимал переменное количество параметров.
как это делается - понятно.
я использую va_list и т.д. из varargs.h
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
сейчас я делаю так
C++
1
2
3
4
5
    AddToList(frst);
va_list ap;
va_start(ap,frst);
while (AddToList(va_arg(ap,int)) > 0);
va_end(ap);
пока параметры больше нуля они добавляются в список с помощью AddToList(int);
но после последнего переданого параметра va_arg возвращает случайное число(наверно тож со стека)
его конечно можно отсеять проверкой на малый диапазов(обычно этот "мусор" очень большой по модулю) но есть вероятность что попадется малое значение и запишется в список - а это очень плохо!
собственно вопрос:
можно ли вообще как-то узнать сколько параметров было передано или еще каким-то образом правильно отсеять мусор?

P.S. как замену можно конечно первым параметром передавать количество аргументов(это все-же лучше чем случайный мусор) но тоже не очень удобно и надежно(можно не правильное количество передать и хотелось бы чтоб пользователь класса вообще не задумывался о количестве аргументов)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.09.2011, 00:46
Ответы с готовыми решениями:

Функции с переменным числом параметров
Помогите пожалуйста исправить ошибку в программе!!! Проблема в том, что не учитывается степень разряда при переводе в восьмеричную...

Функции с переменным количеством параметров
Прописываю в заголовке: void __fastcall TestClass::Test(int x, ...); компилятор выдает ошибку: Conflicting type modifiers В C++...

Функции по переменным количеством параметров
нужна помощь по работе с такой функцией .. Искал в книге Страуструпа, не понял пример, помогите, как правильно описать и реализовать такую...

29
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 01:10
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
template<typename... T>
void func(const T&... args) {
   std::cout << sizeof...(args) << std::endl;
}
 
int main() {
   func();
   func(1);
   func(1,2);
   func(1,2,3);
}
http://liveworkspace.org/code/... 2722b598ed
7
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2011, 08:22
Цитата Сообщение от niXman Посмотреть сообщение
typename...
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
0
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
11.09.2011, 13:38  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
Жаль, что такие вкусняшки почти никем пока не поддерживаются.(
да очень жаль - так как мой компилятор(VS 2010) не понимает такой записи
в любом случае спасибо
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 14:32
Deviaphan, SalterOk, могу только посочувствовать.
0
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.09.2011, 15:40
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.09.2011, 16:03
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от xAtom Посмотреть сообщение
Все Microsoft-кие компилеры не поддерживают такую конструкцию, не нужно злоупотреблять этим
Не уж то первая половина фразы является причиной для принятия во внимание второй её половины? Стандарт принят, в стандарте есть шаблоны с переменным числом аргументов, и в последних gcc компиляторах они реализованы. То, что этого ещё не сделал Microsoft - только его проблемы.

Не по теме:

P.S. Сам юзаю студию, но в дополнение к ней всегда есть свеженькая версия mingw.

3
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 18:52
Цитата Сообщение от xAtom Посмотреть сообщение
не нужно злоупотреблять этим.
естественно. не нужно злоупотреблять такими компилерами.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.09.2011, 18:58
Цитата Сообщение от silent_1991 Посмотреть сообщение
То, что этого ещё не сделал Microsoft - только его проблемы.
виндузовые проекты как правило ведут на msvc, так что логично учитывать возможности компилятора
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2011, 19:03
Цитата Сообщение от alex_x_x Посмотреть сообщение
виндузовые проекты как правило ведут на msvc
никогда такого не замечал...

ладно, прекращаем оффтопить.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.09.2011, 14:06
Цитата Сообщение от SalterOk Посмотреть сообщение
для некоторого класса необходимо чтобы его конструктор принимал переменное количество параметров.
как это делается - понятно.
я использую va_list и т.д. из varargs.h
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
сейчас я делаю так
- недаром в printf и scanf есть строка формата аля "d%s%p" - посчитали сколько параметров приводить надо(в данном случае 3) и юзаем va_list. Вели в функцию в качестве доп аргумента строку формата и отталкиваемся от числа параметров в ней в чём проблема то????
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
12.09.2011, 14:14
Если параметров не много и их типы постоянны, то можно использовать конструктор с параметрами по умолчанию.

Использовать (...) в конструкторе, ИМО, не кошерно.)
0
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
12.09.2011, 16:52  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
недаром в printf и scanf есть строка формата аля "d%s%p" - посчитали сколько параметров приводить надо(в данном случае 3) и юзаем va_list. Вели в функцию в качестве доп аргумента строку формата и отталкиваемся от числа параметров в ней в чём проблема то????
мне это не совсем подходит так как это по сути обвертка над динамическим массивом разного размера, глубины и типа.
а в конструктор собственно и передается информация о размерах и количестве
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
12.09.2011, 16:58
Цитата Сообщение от SalterOk Посмотреть сообщение
бвертка над динамическим массивом разного размера
Так может стоит использовать std::vector?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.09.2011, 16:59
Цитата Сообщение от SalterOk Посмотреть сообщение
а в конструктор собственно и передается информация о размерах и количестве
- как вариант передавай первым аргументом число аргументов и всё
0
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
12.09.2011, 17:05  [ТС]
ну я уже собственно решил передавать первым параметром количество пока не Microsoft не реализует
стандарт как в примере niXman
вот небольшой пример как я делаю:
C++
1
2
3
4
5
6
DMDM<int> t(4,1,3,5,8); //создается 4-мерный массив типа int
int ew = t(0,1,4,6);  //аналогично t[0][1][4][6];
//только я так и не понял как сделать с квадратными скобками
DMDM<float> rew(3,1000,1000,1000);  
// 3-мерный массив типа float с размерами 1000х1000х1000
DMDM<std::string> str(3,5,6,7); //тут все так само
Добавлено через 3 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
Так может стоит использовать std::vector?
я понимаю что это лучше но я это делаю для тренировки(первый шаблонный класс и т.д.)

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
как вариант передавай первым аргументом число аргументов и всё
ну я уже так и делаю - реализация класса легче но не так удобно для использования
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.09.2011, 17:11
Цитата Сообщение от SalterOk Посмотреть сообщение
ну я уже так и делаю - реализация класса легче но не так удобно для использования
- ну вот и норм вариант, зачем вдаваться в мудрёный разбор va_list, если сразу в него число параметров можно ввести
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
13.09.2011, 12:30
Почему не юзать чистый сишный код?

Добавлено через 2 минуты
Или передавать вектор параметров или ссылок на них?
0
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
13.09.2011, 17:14  [ТС]
Цитата Сообщение от outoftime Посмотреть сообщение
Почему не юзать чистый сишный код?
это какой например?
без классов и всей их прелести??
Цитата Сообщение от outoftime Посмотреть сообщение
Или передавать вектор параметров или ссылок на них?
работа с этим классом должна быть как можно больше похожа на обычный статический многомерный массив
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
13.09.2011, 18:52
Цитата Сообщение от SalterOk Посмотреть сообщение
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
Прочтите литературу еще раз или глубже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2011, 18:52
Помогаю со студенческими работами здесь

Массив в функции с переменным количеством параметров
Добрый день. Не могу разобраться, как в функции с переменным количеством параметров сделать указатель на элемент массива. Ниже код, на...

Функции с переменным количеством параметров в языке C ++
Реализовать функцию конкатенации (сцепления) произвольного количества C-строк с динамическим изменением длины результирующей строки.

Функции с переменным количеством параметров, stdarg.h. Исправить код
Почему не работает? В итоге получается 0, а если в функции все что надо заменить с float на int, то работает правильно. В чем ошибка? ...

Шаблон функции с переменным количеством параметров и среднее арифметическое
Никак не могу придумать, как вычислить среднее арифметическое. Получилось найти сумму, а вот количество элементов постоянно меняется и...

Шаблон с переменным количеством параметров
У меня компилятор Visual Studio 2012, но не работает следующий код: #include &lt;iostream&gt; #include &lt;string&gt; void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой
Programma_Boinc 10.04.2026
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой Если на Windows стоит дискретная NVIDIA или AMD — можно отдать её вычислительную мощность реальным исследованиям. . . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru