Работа с неопределённым числом параметров
СинтаксисЯзык C предоставляет возможность работать с неопределённым числом параметров в функциях. Синтаксис объявления функции следующий. тип_возврата имя_функции(список_основных_параметров, тип_данных имя_параметра, ...) Здесь первый параметр имя_параметра необходим обозначения имени списка параметров и последующей ссылки обработчиками на список. Макросы-обработчикиОбработка параметров происходит при помощи следующих макросов Они объявлены в заголовке <stdarg.h> и их синтаксис следующий type va_arg(va_list argptr, type); Макросы va_arg, va_start и va_end работают вместе, чтобы сделать возможной передачу функции переменного числа аргументов. Самым распространенным примером функции, которая принимает переменное число аргументов, является функция printf(). Тип va_list определен в заголовке <stdarg.h>(а в среде языка C++ — в заголовке <cstdarg>). ОписаниеОбщая процедура создания функции, которая может принимать переменное количество аргументов, такова. Функция должна иметь по крайней мере один известный параметр(может и больше), указываемый до переменного списка параметров. Крайний справа известный параметр называется last_parm. Его имя используется в качестве второго параметра в обращении к макросу va_start(). Прежде чем можно будет получить доступ к любому параметру из списка параметров переменной длины, необходимо инициализировать указатель на аргумент argptr, обратившись к макросу va_start(). После этого параметры возвращаются посредством обращения к макросу va_arg() с передачей значения параметра type, которое представляет собой тип следующего параметра. Наконец после прочтения всех параметров до возвращения из функции необходимо вызвать макрос va_end(), чтобы гарантировать корректное восстановление стека. Если макрос va_end() не вызывается, высока вероятность аварийного отказа программы. ПримерВ следующей программе применяется функция sum_series(), которая возвращает сумму ряда чисел. Первый аргумент содержит количество аргументов, перечисленных за ним. В этом примере суммируются первые пять элементов следующего ряда чисел. 1 1 1 1 1 - + - + - + —— ... + - 2 4 8 16 2n Результат равен 0.968750. /* Пример списка аргументов переменной длины сумма ряда . * /
#include <stdio.h>
#include <stdarg.h>
double sum_series(int, ...);
int main(void)
{
double d;
d = sum_series(5, 0.5, 0.25, 0.125, 0.0625, 0.03125);
printf("Сумма ряда равна %f\n",d);
return 0;
}
double sum_series(int num, ...)
{
double sum = 0.0, t;
va_list argptr;
/* Инициализируем указатель argptr. */
va_start(argptr, num);
/* Суммируем ряд. */
for(; num; num--) {
t = va_arg(argptr, double);
sum += t;
}
/* Реализуем корректное завершение. */
va_end(argptr);
return sum;
}
|