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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 21:18   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию заранее не известно количество аргументов

С++
Ест функция принимает аргументы одного типа. проблема в том, что их количество заранее не известно и может быть любым. Как тут можно поступить? Можно конечно много раз перегрузить Но это много писанины.
На сколько я знаю в джаве есть выход из такой ситуации. А в с++?
SAMOUCHKA вне форума Ответить с цитированием
Старый 18.05.2013, 21:46   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вспоминаем функцию printf к примеру.
но функции нужно как то узнать что аргументы кончились.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.05.2013, 21:49   #3
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

https://www.google.ru/search?q=c%2B%...hrome&ie=UTF-8
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 18.05.2013, 22:10   #4
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

компилятор на это не ругается
Код:
void f(int i, ...);
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вспоминаем функцию printf к примеру.
но функции нужно как то узнать что аргументы кончились.
задача примерно такая
Код:
class Test
{
private:
    int size;
    int *p
public:
    Test(int s)
    {
        p = new int[size];
    }
    void set(int i, ...);// Вот тут надо иницилизировать массив
};
SAMOUCHKA вне форума Ответить с цитированием
Старый 18.05.2013, 22:22   #5
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Может это? http://www.rsdn.ru/forum/cpp/418970.1
Fanyuus вне форума Ответить с цитированием
Старый 18.05.2013, 22:34   #6
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Код:
#include <iostream>

using namespace std;

class Test
{
    private:
        int size;
        int *p;
    public:
        Test(int s)
        {
            size = s;
            p = new int[size];
        }
        ~Test(){delete []p;}
        void set(int _i, ...)
        {
            for(int i = 0; i < size; i++)
                p[i] = _i;
        }
        void show()
        {
            for(int i = 0; i < size; i++)
                cout<<p[i]<<endl;
        }
};

int main()
{
    Test t(5);
    t.set(1, 2, 3, 4, 5);
    t.show();
    return 0;
}
Так одни единицы показывает
SAMOUCHKA вне форума Ответить с цитированием
Старый 18.05.2013, 23:12   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
void set(int _i, ...)
{
    int *f = &_i;
    for(int i = 0; i < size; ++i, ++f)
        p[i] = *f;
    }
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 18.05.2013, 23:35   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
С++
Ест функция принимает аргументы одного типа. проблема в том, что их количество заранее не известно и может быть любым. Как тут можно поступить? Можно конечно много раз перегрузить Но это много писанины.
На сколько я знаю в джаве есть выход из такой ситуации. А в с++?
1. гугли: variadric template
Плюсы: самый эффективный, быстрый, надежный способ
Плюсы: возможные ошибки детектятся времени компиляции.
Минусы: новичкам тяжело писать и трудно читать такой код.

2. Имитация переменного количества аргументов. Выглядит она примерно так:

Код:
void Foo() {...}

void Foo(const Arg a1, const Arg2 a2= Empty(), const Arg3 a3= Empty() ) {...}
Принцип действия этой техники: можно запустить Foo совсем без аргументов, либо придется ввести хотя бы один аргумент.

Тип аргумента должен уметь принимать инициализироваться неким типом Empty, который символизирует "пустоту".

Принимающая сторона должна уметь проанализировать: пуст ли этот конкретный аргумент, или нет.

Плюсы: удобно применять для имитации переменного количества аргументов в мета-программировании в те времена, когда компиляторы ещё не поддерживали variadric template

Минусы: код тяжело писать и читать новичкам.

3. Если аргументы одинаковые - функция может принимать вектор аргументов.

Плюсы: простота реализации
Минусы: возможные ошибки детектятся времени выполнения

4. Элипсы (тем самые, что тебе тут уже насоветовали)

Плюсы: отсутствуют
Минусы: возможные ошибки детектятся времени выполнения
Минусы: легко допускают трудно обнаружаемые баги
Минусы: есть ограничения: один из аргументов должен просигналить функции об окончании списка аргументов. Если по ничайности этого не сделать - принимающая сторона в принципе будет не способна обнаружить такую ошибку, не сможет поднять тревогу. Не запуститься аварийный блок кода. Последствия - не предсказуемы.
_Bers вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Известно количество детей, проживающих в каждой из квартир. Составить программу, находящую сколько детей в многодетных семьях саша аврамов Паскаль, Turbo Pascal, PascalABC.NET 2 22.03.2013 08:20
Найти все слова-числа, т.е. такие, которые состоят только из цифр. Известно, что количество цифр в каждом числе не более 9 (девяти vikichocolate Помощь студентам 1 21.12.2011 00:12
Динмассив в цикле. Количество элементов заранее неизвестно. ASP.NET Stilet ASP.NET 2 09.11.2010 10:30
Создать поочередно заранее неизвестное количество листов в книге ShamanK Microsoft Office Excel 1 01.05.2010 18:40