Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal_lectures_small.doc
Скачиваний:
13
Добавлен:
23.03.2015
Размер:
339.46 Кб
Скачать
      1. Вызов процедур и функций

Синтаксис вызова процедур и функций одинаков:

<вызов процедуры или функции>::= <имя процедуры или функции> ["(" <фактический параметр> {";" <фактический параметр> ")"].

Как отмечалось ранее, отличие состоит в том, что вызов процедуры – это отдельный оператор, а вызов функции – это частный случай фактора (сомножителя) в выражении.

Типы, количество и последовательность фактических параметров должны соответствовать описаниям в списке формальных параметров.

Пример. Если в программе описаны переменные V, D, h типа Real и функция CircleS из примера в предыдущем пункте, можно вычислить объем цилиндра диаметром 0,8 метров и высотой 1,2 метра следующим образом:

D:=0.8; h:=1.2; {Задаются исходные данные}

V:=h*CircleS(D/2); {Вычисляется объем цилиндра}

Во второй строке в функцию CircleS передается радиус, как диаметр, деленный пополам. Результат выполнения функции CircleS (площадь круга в основании цилиндра) умножается на высоту цилиндра h, и значение объема заносится в переменную V.

      1. Локализация (области видимости) имен. Глобальные и локальные объявления.

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

Имя, определенное во вложенном блоке, во внешнем блоке недоступно.

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

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

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

Элементы, объявленные в процедуре или функции, доступны только внутри соответствующей процедуры или функции, а также в процедурах и функциях, вложенных в эту процедуру или функцию после места объявления соответствующего элемента. Они не доступны в блоке программы и в других процедурах и функциях, вложенных непосредственно в блок программы. Такие элементы называют локальными.

      1. Статическое и динамическое выделение памяти переменным

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

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

Стек – это такой тип организации памяти, при котором последний элемент, загруженный в стек, извлекается в первую очередь. Соответственно, первый загруженный элемент извлекается из памяти последним. Поэтому стек называют также очередью LIFO (Last In, First Out). Доступ к стеку осуществляется через "верхушку стека".

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]