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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
csrnsdrfg1
4 / 4 / 0
Регистрация: 30.03.2012
Сообщений: 34
#1

создание ф-ии с плавающим кол-вом аргументов неизвестного типа. (С / С++) - C++

04.04.2012, 23:01. Просмотров 821. Ответов 2
Метки нет (Все метки)

Как создать такую? Иными словами, интересует принцип работы (в плане приема аргументов) ф-ии printf (); Ведь в нее можно передавать любое кол-во аргументов. Более того, мне кажется, что в ее определении эти аргументы не имеют определенного типа данных, т.к. пришлось бы использовать операции приведения типа, что влечет за собой неприятные последствия некоторых трансляций (напр. из unsigned в signed), значит, вполне возможно, что передается поток единиц и нулей, которые , после анализа спецификаторов, транслируются в типы. Это так или, что скорее всего, принцип хитрее? Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2012, 23:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос создание ф-ии с плавающим кол-вом аргументов неизвестного типа. (С / С++) (C++):

Функция с переменным кол-вом аргументов char vs int - C++
#include <iostream> #include <cstdio> using namespace std; void func (int amount, ...)

Множество аргументов неизвестного типа, аналог printf() - C++
Я должен создать функцию, которая принимает неизвестное заранее количество аргументов, наподобии printf(). Как мне их объявить и как потом...

Шаблон с ограниченным кол-вом типов - C++
Всем хорошего настроения. Допустим у нас есть код #include <iostream> template<typename MyType> void MyFunc(MyType a){ ...

Вывести слово с максимальным кол-вом символов - C++
Добрый день. Я хожу к репетитору по программированию (с++). Пока просто пытаюсь понять азы. На дом было дано задание, которое заключается в...

Передача неизвестного количества аргументов в функцию, как реализовать? - C++
Вот есть функция и в нее будут передаваться какие-то аргументы, причем заранее не известен их тип и количество (там уже в зависимости от...

Строка: удалить лишние пробелы и определить слово с минимальным кол-вом согласных в строке - C++
мое задание : удалить лишние пробелы и определить слово с минимальным кол-вом согласных в строке.... вот моя задача... я удалил лишние...

2
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
05.04.2012, 13:28 #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdio.h>
 
/*
 * Определяет макросы, необходимые для перебора необязательных аргументов
 */
#include <stdarg.h>
 
enum ArgType
{
    INT = 1,
    DOUBLE = 2,
    END_OF_LIST = 0
};
 
/* Функция, принимающая неопределённое количество аргументов. Здесь для
 * идентификации аргументов предназначен обязательный массив с их типами, в
 * printf для этого используется форматная строка (в которой с каждым типом
 * сопоставлен спецификатор типа %type)
 */
double average(enum ArgType *args, ...)
{
    double sum = 0.0;
    int count = 0;
    
    /*
     * Указатель на очередной необязательный параметр
     */
    va_list ap;
    
    /*
     * Инициализируем указатель. Поскольку нам известен тип (а значит, и размер)
     * последнего обязательного параметра, то указательн а первый необязательный
     * параметр инициализируется адресом &args + 1
     */
    va_start(ap, args);
    
    /*
     * Перебираем необязательные параметры с учётом форматного массива
     */
    while (args[count] != END_OF_LIST)
    {
        /*
         * Выбираем тип параметра
         */
        switch (args[count])
        {
        case INT:
            /*
             * Макрос va_arg просто интерпретирует sizeof(int) байт, начиная с
             * адреса ap, как значение типа int (в общем случае того типа,
             * который передан макросу вторым аргументом), а также смещает
             * указатель ap на размер этого типа
             */
            sum += (double)va_arg(ap, int);
            
            break;
            
        case DOUBLE:
            sum += va_arg(ap, double);
            
            break;
            
        default:
            va_end(ap);
    
            return sum / count;
            
            break;
        }
        
        ++count;
    }
    
    /*
     * Необходимо завершить перебор необязательных параметров
     */
    va_end(ap);
    
    return sum / count;
}
 
int main(void)
{
    /*
     * В printf вместо args используется форматная строка, в которой вперемешку
     * с обычными символами идут специальные спецификаторы, по одному на каждый
     * стандартный тип
     */
    enum ArgType args[] = {INT, DOUBLE, INT, INT, DOUBLE, END_OF_LIST};
    
    printf("%lf\n", average(args, 1, 2.5, 3, 4, 5.5));
    
    return 0;
}
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
05.04.2012, 13:46 #3
А на плюсах круче=)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
template<typename... Args>
double average_impl(const double res, const size_t count, const Args&... args)
{
   return res / count;
}
 
template<typename... Args, typename T>
double average_impl(const double res, const size_t count, const T& value, const Args&... args)
{
   return average_impl(res + static_cast<double>(value), count, args...);
}
 
template<typename... Args>
double average(const Args&... args)
{
   return average_impl(0.0, sizeof...(args), args...);
}
 
int main()
{
   std::cout << average(1,2,3,4,5) << std::endl;
}
http://liveworkspace.org/code/659860748f93165c58f8252ad66044cf
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2012, 13:46
Привет! Вот еще темы с ответами:

Аргументы неизвестного типа - C++
Хорошего дня :) Дело не очень важное и не очень срочное так как вариант решения уже есть... Но если кто-то поделится мыслями, буду...

Ввод числа неизвестного типа - C++
Как можно сделать ввод с клавиатуры числа тип которого заранее неизвестен? Используя функции

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

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


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

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

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