Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глобальные и локальные имена

Поиск

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

Понятие глобальных и локальных имен имеет смысл только относительно некоторого блока.

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

Локальные имена - это имена, которые действуют в пределах блока подпрограммы, это внутренние имена подпрограммы.

К локальным именам относятся формальные параметры и все имена, описанные в блоке подпрограммы. Вне блока подпрограммы локальные имена неопределены.

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

В Паскале данные, описанные в блоке программы, хранятся в так называемом статическом сегменте памяти; память под них распределяется при компиляции.

Локальные данные подпрограммы хранятся в специальной области оперативной памяти – стеке; память под эти данные распределяется каждый раз при вызове подпрограммы и освобождается при завершении работы подпрограммы. Если имеется цепочка вложенных обращений к подпрограммам, например, программа вызывает подпрограмму Р1, Р1 вызывает подпрограмму Р2, а Р2 – Р3, то схема заполнения стека будет соответствовать рис. 15; порядок освобождения стека: сначала уходит Р3, затем Р2, затем Р1.

Важными являются понятия области действия имени и времени жизни данных.

Область действия имени - э то часть программы, в которой имя может быть доступно. Таким образом, область действия локального имени - блок подпрограммы, в которой оно объявлено; глобального – весь текст программы от места объявления до последнего слова End (с точкой). Глобальное имя доступно в подпрограмме только в том случае, если в подпрограмме оно не объявлено еще раз.

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


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

Program Primer; Var a,i:real; Procedure p1; Var i:real; Begin... a:=...; i:=...; End{p1}; Procedure p2; Var i:real; Begin... a:=...; i:=...; End{p2}; Begin {раздел действий программы} i:=...; a:=...; р1; р2; р2 End. a-глобальная переменная, под нее отведена одна ячейка в статическом сегменте памяти, которая доступна программе и процедурам р1 и р2. Под переменную с именем i программы отводится ячейка памяти статического сегмента; под переменные i процедур память в стеке распределяется столько раз, сколько раз осуществляется вход в блок процедур (в нашем примере три раза: при вызове р1 и при каждом вызове р2); при выходе из блока (т. е. при завершении работы процедуры) ячейка с именем i каждый раз освобождается. Так как в каждой процедуре имеется локальное имя i, глобальное i программы в процедурах недоступно.

В данной программе область действия переменной а – вся программа, включая процедуры, время ее жизни – все время работы программы. Область действия глобальной переменной i – текст программы, за исключением процедур; время ее жизни – все время работы программы. Область действия локальной i – текст процедуры, в которой она объявлена, время ее жизни – время работы соотвествующей процедуры.

Рекомендации

1. Не стоит делать глобальными промежуточные переменные (например, i в программе вычисления выражения примера §2.3.2), потому что:

1) это делает подпрограмму менее универсальной, так как приводит к появлению непонятного пользователю "стыка" - промежуточной глобальной переменной;

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

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

program primer2_4;

{вычисление минимальных значений элементов строк матрицы a[3*5]}

Type matr=array[1..3,1..5] of real;

mas= array[1..3] of real;

Var a:matr; min:mas; {далее-раздел процедур и функций}

Procedure minstr;

Var i,j:integer;

Begin

for i:=1 to 3 do

begin

min[i]:=a[i,1];

for j:=1 to 5 do

if min[i]>a[i,j] then

min[i]:=a[i,j];

end

End{minstr};

Procedure matrin;

Var i,j:integer;

Begin

Writeln('Введите матрицу размером 3*5');

for i:=1 to 3 do

for j:=1 to 5 do

read(a[i,j]);

readln;

End{matrin};

Procedure masout;

Var i:integer;

Begin

Writeln('Минимальные значения строк матрицы ');

for i:=1 to 3 do

writeln(' ',min[i]);

End{masout};

{далее - раздел действий программы}

Begin

matrin;

minstr;

masout;

readln

End.

Основное назначение подпрограмм в такой программе – упростить программу и сделать ее более наглядной за счет укрупнения операторов. Заметим, однако, что использование глобальных переменных для передачи данных между процедурами имеет существенные недостатки, а именно:

1) делает процедуры менее универсальными и затрудняет их повторное применение, как в пределах одной программы, так и в других программах.

2) усложняет автономную отладку подпрограмм.

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



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 607; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.143.150 (0.01 с.)