- •ФУНКЦИИ ИСПОЛЬЗУЮТСЯ ДЛЯ НАВЕДЕНИЯ ПОРЯДКА В ХАОСЕ АЛГОРИТМОВ.
- •ФУНКЦИИ
- •Функция — это именованная
- •Объявление и определение функций.
- •ОБЪЯВЛЕНИЕ И ОПРЕДЕЛЕНИЕ ФУНКЦИЙ.
- •Объявление функции
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •[класс] тип имя ([список_параметров]) [throw(исключения)] {тело функции}
- •Функцию можно определить как встроенную с помощью модификатора inline.
- •ОБЪЯВЛЕНИЕ И ОПРЕДЕЛЕНИЕ ФУНКЦИЙ.
- •Значения локальных переменных между вызовами одной и той же функции не сохраняются.
- •Механизм возврата из функции в вызвавшую ее функцию реализуется оператором
- •ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ.
- •Примеры:
- •Параметры
- •При вызове функции:
- •Существует два способа передачи параметров в функцию:
- •ПАРАМЕТРЫ ФУНКЦИИ.
- •Пример:
- •По умолчанию параметры любого типа,
- •ПЕРЕДАЧА МАССИВОВ В КАЧЕСТВЕ ПАРАМЕТРОВ.
- •ПЕРЕДАЧА МНОГОМЕРНЫХ МАССИВОВ В КАЧЕСТВЕ ПАРАМЕТРОВ.
- •Функцию можно вызвать через указатель на нее.
- •void f(int a ){/*...*/ } // определение функции
- •ПЕРЕДАЧА ИМЕН ФУНКЦИЙ В КАЧЕСТВЕ ПАРАМЕТРОВ.
- •Чтобы упростить вызов функции, в ее заголовке можно указать значения параметров по умолчанию
- •Пример:
- •Функции с переменным числом параметров
- •ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •В качестве примера можно привести
- •ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •За правильность выбора дополнительных аргументов из
- •ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •Функции с переменным числом параметров 41
- •МАКРОКОМАНДА VA_START.
- •Функции с переменным числом параметров 43
- •МАКРОКОМАНДА VA_ARG.
- •Функции с переменным числом параметров 45
- •ПРИМЕР ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ.
- •ЗАМЕЧАНИЯ К ПРИМЕРУ.
- •Поскольку компилятор не имеет информации для контроля типов, вместо функций с переменным
- •Рекурсивные
- •РЕКУРСИВНЫЕ ФУНКЦИИ.
- •Пример:
- •РЕКУРСИВНЫЕ ФУНКЦИИ.
Функции с переменным числом параметров 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