Функции с переменным количеством параметров
В языке Си существуют функции, количество параметров в которых заранее неизвестно (когда пишется исходный код функции), точное число параметров определяется только в момент вызова. Эти функции называются функция с переменным количеством параметров.
Формат функции:
<тип_возвращаемого_значения> <имя_функции>
(<спецификация_обязательных_параметров>, …) { …. }
В таких функциях должен быть хотя бы один обязательный параметр.
Функция с переменным количеством параметров должна иметь при своем выполнении механизм определения количества параметров и их типов. Возможны два подхода:
- передача в функцию числа реально используемых параметров в качестве одного из обязательных параметров;
- добавление в конец списка параметров параметра с уникальным значением.
Во всех случаях переход от одного параметра к другому осуществляется с помощью указателей. При этом следует учитывать порядок размещения параметров в стеке. В Си по умолчанию первым в стек помещается последний параметр, при этом он имеет максимальный адрес. Можно задать противоположный порядок, если функцию определить с модификатором pascal (противоположный ему модификатор cdecl, функция имеет по умолчанию). Функции с модификатором pascal не могут иметь переменное количество параметров.
Ниже представлены две функции с переменным количеством параметров, демонстрирующих два описанных выше подхода для определения числа реальных параметров.
#include <stdio.h>
int GetSum(int n,...) // Функция считает сумму параметров n - число параметров
{
int *p=&n; // Настраиваем указатель на 1-ый параметр
int sum=0; // Начальное значение суммы
int i; // Индексная переменная
for(i=0; i<n; i++) // Суммируем n параметров
sum+=*++p; // Суммируем параметры (увеличиваем указатель на 1 и
// обращаемся по адресу)
return sum;
}
double GetProiz(double par1,...) // Функция считает произведение параметров, признак окончания списка параметров значение 0.0
{
double pr=1; // Начальное значение произведения
double *p=&par1; // Настраиваем указатель на 1-ый параметр
for(; *p; p++) pr*=*p; // Умножаем на очередной параметр пока не встретится 0
return pr;
}
void main()
{
printf("sum=%d", GetSum(5, 1, 2, 3, 4, 5)); // Будет напечатано sum=15
printf("\nproiz=%f", GetProiz(2.0, 3.0, 4.0, 1.5, 0.0));
// Будет напечатано proiz=36.000000
}
Дата добавления: 2015-08-14; просмотров: 517;