Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Климов. Лекции / Алг_яз_Лекция_32.pptx
Скачиваний:
24
Добавлен:
14.05.2015
Размер:
983.91 Кб
Скачать

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

МАКРОКОМАНДА VA_START.

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

va_list arg_ptr;

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

42

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

МАКРОКОМАНДА VA_ARG.

Макрос va_arg используется столько раз, сколько

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

44

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

ПРИМЕР ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.

Рассмотрим применение макросов для обработки параметров функции вычисляющей среднее значение произвольной последовательности

целых положительных чисел.

Поскольку функция имеет переменное число параметров будем считать концом списка значение равное ­1.

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

46

#include <stdio.h>

 

 

 

#include <stdarg.h>

 

 

 

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);

 

 

 

}

 

 

 

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

47

int sred_znach(int x,...){ int i=0, j=0, sum=0; va_list uk_arg;

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

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);

}

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

48

ЗАМЕЧАНИЯ К ПРИМЕРУ.

Тип va_list предназначен для хранения указателя на очередной аргумент.

typedef void_FAR *va_list;

Макрос va_start инициализирует этот указатель.

Макрос va_arg возвращает значение очередного аргумента, каждый его вызов приводит к продвижению указателя, хранящегося в va_list.

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

49

Поскольку компилятор не имеет информации для контроля типов, вместо функций с переменным

числом параметров предпочтительнее пользоваться

параметрами по умолчанию или перегруженными функциями!

хотя можно представить случаи, когда переменное число параметров является лучшим решением

50

Соседние файлы в папке Климов. Лекции