Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 18.05.2013, 21:18   #1
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 576
Репутация: 161

skype: ilya10009
По умолчанию заранее не известно количество аргументов

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

icq: 446843180
skype: phoenix_proger
По умолчанию

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

https://www.google.ru/search?q=c%2B%...hrome&ie=UTF-8
Ezhik Kihze вне форума   Ответить с цитированием
Старый 18.05.2013, 22:10   #4
SAMOUCHKA
Участник клуба
 
Регистрация: 07.08.2011
Адрес: Димитровград
Сообщений: 576
Репутация: 161

skype: ilya10009
По умолчанию

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

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

skype: ilya10009
По умолчанию

Код:
#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;
}
Так одни единицы показывает
__________________
eremeew.ilya@yandex.ru
SAMOUCHKA вне форума   Ответить с цитированием
Старый 18.05.2013, 23:12   #7
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,410
Репутация: 2502

icq: 438888048
По умолчанию

Код:
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,324
Репутация: 1138
По умолчанию

Цитата:
Сообщение от 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


01:50.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.