Конспект лекций Часть II одесса, 2003


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


Download 0.65 Mb.
Pdf ko'rish
bet7/26
Sana17.06.2023
Hajmi0.65 Mb.
#1526920
TuriКонспект
1   2   3   4   5   6   7   8   9   10   ...   26
Bog'liq
atki188 c konspekt 2

Функции с переменным числом параметров 
Если список формальных параметров заканчивается многоточием
это означает, что при её вызове на этом месте можно указать ещё несколько 
параметров. Проверка соответствия типов для этих параметров не выполня-
ется, char и short передаются как int, а float – как double. В качестве примера 
можно привести функцию printf, прототип которой имеет вид: 
int printf (const char*, …) 
Это означает, что вызов функции должен содержать по крайней мере один 
параметр типа char* и может либо содержать, либо не содержать другие па-
раметры: 
printf("Введите исходные данные"); //один параметр 
printf("Сумма: %5.2f рублей", sum); 
//два параметра 
printf("%d %d %d %d", a,b,c,d);
//пять параметров 
Для работы с функциями с переменным числом аргументов исполь-
зуются величины va_list, va_start, va_arg и va_end. Они описаны в заголовоч-
ном файле 
Тип va_list предназначен для хранения указателя на очередной аргу-
мент.
Макрос va_start инициализирует этот указатель, он устанавливает 
аргумент arg_ptr на начало списка необязательных параметров и имеет вид 
функции с двумя параметрами: 
void va_start(arg_ptr, prav_param); 
Параметр prav_param должен быть последним обязательным параметром вы-
зываемой функции, а указатель arg_ptr должен быть объявлен с предопреде-
лением в списке переменных типа va_list в виде:
va_list 
arg_pt; 
Макрос va_start должен быть использован до первого использования 
макроса va_arg. 
Макрос va_arg возвращает значение очередного аргумента, каждый 
его вызов приводит к продвижению указателя, хранящегося в va_list. Макро-
команда va_arg обеспечивает доступ к текущему параметру вызываемой 
функции и тоже имеет вид функции с двумя параметрами: 
type_arg va_arg (arg_ptr, type); 
Эта макрокоманда извлекает значение типа type по адресу, заданному указа-
телем arg_ptr, увеличивает значение указателя arg_ptr на длину использован-
ного параметра (длина type) и таким образом параметр arg_ptr будет указы-
вать на следующий параметр вызываемой функции. Макрокоманда va_arg 
используется столько раз, сколько необходимо для извлечения всех парамет-
ров вызываемой функции. 
После перебора аргументов, но до выхода из функции с переменным 
числом аргументов необходимо обратиться к макросу va_end. Он устанавли-
вает указатель списка необязательных параметров на NULL. 


Одесский колледж компьютерных технологий “СЕРВЕР” 
13
Пример. Функция вычмсляет среднее значение произвольной после-
довательности целых чисел. Поскольку функция имеет переменное число 
параметров будем считать концом списка значение равное -1. Поскольку в 
списке должен быть хотябы один элемент, у функции будет один обязатель-
ный параметр. 
#include
int main(){ 
int 
n; 
int sred_znach (int, …); 
n=sred_znach 
(2,3,4,-1); 
//вызов с четырьмя параметрами 
cout<<"n="<n=sred_znach 
(5,6,7,8,9,-1); //вызов с шестью параметрами 
cout<<"n="<return 
0; 

int sred_znach (int, …); 
{ 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); 


Download 0.65 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   10   ...   26




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling