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

В языке Си существуют функции, количество параметров в которых заранее неизвестно (когда пишется исходный код функции), точное число параметров определяется только в момент вызова. Эти функции называются функция с переменным количеством параметров.

Формат функции:

<тип_возвращаемого_значения> <имя_функции>

(<спецификация_обязательных_параметров>, …) { …. }

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

Функция с переменным количеством параметров должна иметь при своем выполнении механизм определения количества параметров и их типов. Возможны два подхода:

- передача в функцию числа реально используемых параметров в качестве одного из обязательных параметров;

- добавление в конец списка параметров параметра с уникальным значением.

Во всех случаях переход от одного параметра к другому осуществляется с помощью указателей. При этом следует учитывать порядок размещения параметров в стеке. В Си по умолчанию первым в стек помещается последний параметр, при этом он имеет максимальный адрес. Можно задать противоположный порядок, если функцию определить с модификатором 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.