Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.91
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
#1

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

11.09.2011, 00:46. Просмотров 4020. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 00:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос функции с переменным количеством параметров (C++):

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

Функция с переменным числом параметров - C++
Вычисление суммы ряда значений оформить в виде функции с переменным числом параметров. прога вот: В ней не хватает как рас...

Рефакторинг: функция с большим количеством параметров - C++
День добрый. Скажите плз, гуру рефакторинга. Вот есть функция и в нее передаётся туча параметров. Как лучше исправить ситуацию? На ум...

Список параметров функции из DLL - C++
В runtime загружаю DLL'ки, вывожу список функций содержащийся в них, но так и не нашёл вариантов как экспортировать типы аргументов и...

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

С помощью функции с переменным числом параметров посчитать сумму - C++ Builder
Что не так в коде программы???? НЕ компелируется, нужно было с помощью функции с переменным числом параметров посчитать сумму!

29
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
12.09.2011, 17:05  [ТС] #16
ну я уже собственно решил передавать первым параметром количество пока не 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
12.09.2011, 17:11 #17
Цитата Сообщение от SalterOk Посмотреть сообщение
ну я уже так и делаю - реализация класса легче но не так удобно для использования
- ну вот и норм вариант, зачем вдаваться в мудрёный разбор va_list, если сразу в него число параметров можно ввести
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.09.2011, 12:30 #18
Почему не юзать чистый сишный код?

Добавлено через 2 минуты
Или передавать вектор параметров или ссылок на них?
0
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
13.09.2011, 17:14  [ТС] #19
Цитата Сообщение от outoftime Посмотреть сообщение
Почему не юзать чистый сишный код?
это какой например?
без классов и всей их прелести??
Цитата Сообщение от outoftime Посмотреть сообщение
Или передавать вектор параметров или ссылок на них?
работа с этим классом должна быть как можно больше похожа на обычный статический многомерный массив
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.09.2011, 18:52 #20
Цитата Сообщение от SalterOk Посмотреть сообщение
сложность возникла в том что с ее помощью нельзя узнать сколько параметров было передано
Прочтите литературу еще раз или глубже.
0
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
13.09.2011, 19:24  [ТС] #21
Цитата Сообщение от outoftime Посмотреть сообщение
Прочтите литературу еще раз или глубже.
какую? там где новый стандарт описывается? - в MSVC еще не реализован.
в старом (может плохо смотрел конечно) подобного нет
если не сложно - название?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.09.2011, 19:59 #22
мне кажется максимум можно сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template <typename type, size_t N>
void f(type (&a)[N]) 
{
    for (size_t i = 0; i < N; ++i) 
    {
        // init array in your case
        std::cout << "[" << i << "] = " << a[i] << std::endl;
    }
}
 
int main()
{
   int arr[] = {1,2,3,4,5,6};
   func(arr);
}
1
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
13.09.2011, 22:52  [ТС] #23
тоже вариант но я все же подожду лучших времен(соответствие стандарту)
а пока и с первым параметром пойдет
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.09.2011, 22:58 #24
Цитата Сообщение от SalterOk Посмотреть сообщение
а пока и с первым параметром пойдет
лучше подождать списки инициализации, в студии если не путаю они уже работают
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
13.09.2011, 23:19 #25
alex_x_x, в студии нет, только в gcc.
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.09.2011, 02:03 #26
у меня всего один, похожий на троллинг вопрос: зОчем юзать студию?
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
14.09.2011, 15:30 #27
niXman, зачем что она удобная и простая, нет?
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.09.2011, 17:46 #28
SalterOk, поступите правильно и сделайте одномерный массив. Для создания двумерного массива надо сделать массив массивов, трехмерного - массив массивов массивов.... и т.д. Не морочьте себе голову почем зря. Все это реализуется через единственный класс и пару typedef'ов.
0
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
14.09.2011, 18:46  [ТС] #29
Цитата Сообщение от fasked Посмотреть сообщение
SalterOk, поступите правильно и сделайте одномерный массив
ну я внутри класса так и делаю (просто пользователь работает как с многомерным массивом а внутри все сводится к подсчету индекса в одномерном массиве)
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.09.2011, 18:59 #30
Цитата Сообщение от SalterOk Посмотреть сообщение
просто пользователь работает как с многомерным массивом а внутри все сводится к подсчету индекса в одномерном массиве
Если это все делается в целях экономии памяти и увеличения скорости обработки, то честь Вам и хвала. Если же нет, то гораздо удобнее делать так:
C++
1
2
3
4
5
template <typename T>
class Array;
 
Array<Array<int> > array2d;
Array<Array<Array<int> > > array3d;
0
14.09.2011, 18:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2011, 18:59
Привет! Вот еще темы с ответами:

Функция с переменным числом параметров - C++ Builder
Хочу написать функцию очищающую произвольное число MaskEdit.Выдает ошибку в описании функции. Вот код, как правильно? void...

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.