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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Присвоение значения указателю на функцию http://www.cyberforum.ru/cpp/thread36535.html
Есть укзатель на функцию. Есть перегруженная функция. как присвоить указателю нужный нам вариант этой перегруженной функции?
C++ C++ и eclipse Приветствую! Кто-нибудь пробовал "подружить" С++ со средой eclipse ? Интересны мнения. Скачал некоторое время назад плагин CDT (C++ Development Tools) для eclipse, скачал бесплатный компилятор cygwin. Вроде бы подружил и с компилятором, и с отладчиком. Но есть подозрения, что я не все уголки "спилил напильником". Если кто-то работал - поделитесь ЛИЧНЫМ опытом работы в этой среде (имеется... http://www.cyberforum.ru/cpp/thread36370.html
C++ Strncpy
Напишите пожауйста на С аналог функции Strncpy
компилятор C++
Всем привет! Пользовался CodeBlock (в нем не подключаются директивы с графикой) и Visual Studio 2005 (он какой то сложный не могу разобраться) Подскажите пожалуйста норм компилятор. что б возможностей по-больше было и не очень закрученый как VS.
C++ Параллельная программа для метода холецкого с помощью openMp и mpi http://www.cyberforum.ru/cpp/thread36102.html
Товарищи,помогите пожалуйста с параллельным программированием: надо написать параллельную программу для метода холецкого с помощью openMp и mpi!и еще потоков!
C++ Гда можно скачать с++? у кого есть с++ дайте, или хоть ссылочку где скачать можно киньте! подробнее

Показать сообщение отдельно
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
28.05.2009, 06:36     Функция с переменным числом параметров
Программист может разрабатывать свои функции с переменным числом параметров. Для обеспечения удобного способа доступа к аргументам функции с переменным числом параметров имеются три макроопределения (макросы) va_start, va_arg, va_end, находящиеся в заголовочном файле stdarg.h. Эти макросы указывают на то, что функция, разработанная пользователем, имеет некоторое число обязательных аргументов, за которыми следует переменное число необязательных аргументов. Обязательные аргументы доступны через свои имена как при вызове обычной функции. Для извлечения необязательных аргументов используются макросы va_start, va_arg, va_end в следующем порядке.

Макрос va_start предназначен для установки аргумента arg_ptr на начало списка необязательных параметров и имеет вид функции с двумя параметрами:

void va_start(arg_ptr,prav_param);

Параметр prav_param должен быть последним обязательным параметром вызываемой функции, а указатель arg_prt должен быть объявлен с предопределением в списке переменных типа va_list в виде:

va_list arg_ptr;

Макрос va_start должен быть использован до первого использования макроса va_arg.

Макрокоманда va_arg обеспечивает доступ к текущему параметру вызываемой функции и тоже имеет вид функции с двумя параметрами

type_arg va_arg(arg_ptr,type);

Эта макрокоманда извлекает значение типа type по адресу, заданному указателем arg_ptr, увеличивает значение указателя arg_ptr на длину использованного параметра (длина type) и таким образом параметр arg_ptr будет указывать на следующий параметр вызываемой функции. Макрокоманда va_arg используется столько раз, сколько необходимо для извлечения всех параметров вызываемой функции.

Макрос va_end используется по окончании обработки всех параметров функции и устанавливает указатель списка необязательных параметров на ноль (NULL).

Рассмотрим применение этих макросов для обработки параметров функции вычисляющей среднее значение произвольной последовательности целых чисел. Поскольку функция имеет переменное число параметров будем считать концом списка значение равное -1. Поскольку в списке должен быть хотя бы один элемент, у функции будет один обязательный параметр.

Пример:

#include
int main()
{ int n;
int sred_znach(int,...);
n=sred_znach(2,3,4,-1);
/* вызов с четырьмя параметрами */
printf("n=%d",n);
n=sred_znach(5,6,7,8,9,-1);
/* вызов с шестью параметрами */
printf("n=%d",n);
return (0);
}
int sred_znach(int x,...);
{
int i=0, j=0, sum=0;
va_list uk_arg;
va_start(uk_arg,x); /* установка указателя uk_arg на */
/* первый необязятельный параметр */
if (x!=-1) sum=x; /* проверка на пустоту списка */
else return (0);
j++;
while ( (i=va_arg(uk_arg,int))!=-1)
/* выборка очередного */
{ /* параметра и проверка */
sum+=i; /* на конец списка */
j++;
}
va_end(uk_arg); /* закрытие списка параметров */
return (sum/j);
}
Так.
Для вашей задачи достаточно поменять последнюю строку на
C++
1
return (sum);
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru