Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2014_2015 / LECT7_new1.pptx
Скачиваний:
7
Добавлен:
27.12.2015
Размер:
1.12 Mб
Скачать

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

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

Вэтом случае заголовок функции имеет вид: тип имя_ф-и(список_аргументов, . . .)

Вданном случае список аргументов включает в себя конечное число обязательных аргументов (этот список не может быть пустым), после которого ставится многоточие на месте неопределенного числа параметров.

Для работы с этими параметрами в файле stdarg.h определен тип списка va_list и три макроса: va_start, va_arg и va_end.

Макрос va_start имеет синтаксис:

void va_start(va_list ар, lastfix) - начинает работу со списком, устанавливая его указатель ар на первый передаваемый в ф-ю аргумент из списка с неопределенным числом аргументов.

Параметр lastfix - имя последнего из обязательных аргументов ф-и.

Макрос va_arg имеет синтаксис:

type va_arg(va_list ap, type) - возвращает значение очередного аргумента типа type из списка. Перед вызовом значение ар должно быть установлено вызовом va_start или va_arg. Каждый вызов переводит указатель ар на следующий аргумент.

Макрос va_end имеет синтаксис:

void va_end (va_list ap) - завершает работу со списком, освобождая память. Он должен вызываться после того, как с помощью va_arg прочитан весь список аргументов.

!!!ОШИБКА: не в том месте вызван va_end - непредска-

Ф-я average, которая рассчитывает среднее значение

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

void average(char* message, int mes_size, …)

{

Int A = 0, i=0, arg=1; va_list ap; va_start(ap, mes_size); while(arg!=0)

{

arg= va_arg(ap, int); i++;

A+=arg;

}

va_end (ap);

Функцию average можно было бы организовать иначе,

не вводя специальную конечную метку в список (в приведенном примере --- 0), а предваряя список аргументов параметром N, указывающим размер списка:

void average(char* message, int mes_size, int N, …)

{

Int A = 0, i=0, arg=1; float mean;

va_list ap; va_start(ap, N);

for(i=0; i<n; i++) A+=va_arg(ap, int); va_end (ap);

mean=(float)(A)/((float)(i)); //явное преобр. типов printf(“%s %f”, message, mean);

}

Вызов ф-и: average(“exams 5 st”,10,5,4,4,5,5,3); Результат: exams 5 st 4.2

Встраиваемые функции inline - снижение расходов

времени на вызовы функций (особенно небольших функций).

Длина окружности:

inline double cirk(double R) { return(6.28318 * R);}

Спецификация inline перед указанием типа результата в объявлении функции «советует» компилятору сгенерировать копию кода функции в соответствующем месте, чтобы избежать вызова этой функции – эквивалентно объявлению соответствующего макроса. Множество копий кода функции, вставленных в программу, вместо единственной копии, которой передается управление при каждом вызове функции.

Компилятор может игнорировать спецификацию inline, что обычно и делает для всех функций, кроме самых небольших.

Использование функций inline может уменьшить

время выполнения программы, но при этом может

Область действия (имени, параметров, объектов) –

часть программы, в которой можно обращаться к данному имени, параметру или объекту (сфера действия в программе).

5случаев:

1)Имя определено в блоке (локальные переменные): область действия имени - от точки определения до

конца блока;

2)Формальные параметры в определении функции (форм. пар. - это локальные переменные функции) : область действия параметров – блок тела функции;

3)Метки операторов: область действия – ф-я;

4)Глобальные объекты: область действия объектов - вся программа от точки их определения или от точки их описания;

5)Формальные параметры в прототипе функции: область действия параметров - прототип.

Операции разрешения области действия

Операции разрешения области действия обозначаются двумя двоеточиями, записывае-мыми без пробела :: . В С++ 2 различных операции разрешения области действия :

унарная:

::переменная

бинарная

класс :: элемент_класса будем изучать дальше Унарная операция позволяет получить доступ к глобальной переменной из блока, в котором объявлена локальная переменная с тем же именем (выражение ::L означает глобальную переменную L, даже если в данном блоке или в одном из обрамляющих блоков объявлена локальная переменная L).

Бинарная операция позволяет сослаться на данную функцию или элемент класса, даже если имеются

одноименные переменные или функции, определенные

Область видимости (имени, параметров, объектов) –

это часть программы, в которой обращение к имени переменной, параметру или объекту позволяет реально обратиться к данному участку памяти.

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

Область видимости области действия

Область видимости может быть меньше области действия, если внутри блока, где определена переменная, имеется внутренний блок, в котором то же имя дано другой переменной (то есть, связано с другим участком памяти). Тогда во внутреннем блоке внешняя переменная теряет видимость.

#include<stdio.h> long k=0;

void main()

{

int k=1;

{

printf(“%d”, k); char k = 'A'; printf(“%c”, k); printf(“%d”, (::k)); printf(“%c”, k);

}

printf(“%c”, k);

}

результат : 1A0A1

long k

int k

char k

Динамическое распределение памяти 3 вида памяти, которую использует программа :

1)Статическая память (static memory) - хранит глобальные переменные и константы; размер определяется при компиляции.

2) Стек (stack) хранит локальные переменные, аргументы функций и промежуточные значения вычислений; размер определяется при запуске программы (зависит от ОС).

3) Куча (heap) - динамически распределяемая память; ОС выделяет память по частям (по мере необходимости).

Ряд задач - неудобно, неэффективно, а иногда и невозможно использовать только память, выделяе-мую в соответствии с явными описаниями перемен-ных в программе. Возможность создания и исполь-зования динамических переменных связана с меха-низмом указателей, т.к. динамическая переменная не имеет статически заданного имени, и доступ к такой переменной возможен только через указатель.

Соседние файлы в папке 2014_2015