Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




Примерами функций с переменным числом параметров являются функции из

библиотеки функций языка СИ, осуществляющие операции ввода-вывода информации

(printf,scanfит.п.).

При вызове функции с переменным числом параметров в вызове этой функциизадается любое требуемое число аргументов. В объявлении и определении такойфункции переменное число аргументов задается многоточием в конце спискаформальных параметров или списка типов аргументов.Все аргументы, заданные в вызове функции, размещаются в стеке. Количествоформальных параметров, объявленных для функции, определяется числом аргументов,которые берутся из стека и присваиваются формальным параметрам. Программистотвечает за правильность выбора дополнительных аргументов из стека иопределение числа аргументов, находящихся в стеке.

Программист может разрабатывать свои функции с переменным числом параметров. Для обеспечения удобного способа доступа к аргументам функции с переменнымчислом параметров имеются три макроопределения (макросы) va_start, va_arg,va_end, находящиеся в библиотекеstdarg.h. Эти макросы указывают на то,что функция, разработанная пользователем, имеет некоторое число обязательныхаргументов, за которыми следует переменное число необязательных аргументов.Обязательные аргументы доступны через свои имена как при вызове обычнойфункции. Для извлечения необязательных аргументов используются макросыva_start, va_arg, va_end в следующем порядке.Макрос va_start предназначен для установки аргумента arg_ptr на началосписка необязательных параметров и имеет вид функции с двумя параметрами:

voidva_start(arg_ptr,prav_param);

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

va_listarg_ptr;

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

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

При вызове функции необходимо явно или неявно задать число параметров. Такое задание должно быть предусмотрено программистом разработке функции.

Рассмотрим применение этих макросов для обработки параметров функции

вычисляющей минимум произвольной последовательности целых чисел.

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

Пример:

#include

intmin(int x1, int x2, int, x3,...);

int main() {    }

int minint x1, int x2, int, x3,...)

{

inti=0, minimum=0;

va_listuk_arg;

va_start(uk_arg,x1); /* установка указателя uk_arg на первый необязятельный параметр */

if (x1!=-1) minimum=x1; /*  проверка на пустоту списка */

else return 0;

while ( (i=va_arg(uk_arg,int))!=-1) /*выбор очередного значения*/

{                     

minimum = min(minimum,i) ;                   

}

va_end(uk_arg);    /* закрытие списка параметров */

return (sum/j);

}

 

Шаблоны функций

Шаблоны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).

Шаблоны позволяют создавать параметризованные классы и функции. Параметром может быть любой тип или значение одного из допустимых типов данных.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 472.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...