Понятие глобальных и локальных переменных введено в языке Паскаль из-за наличия в нем понятия блочной структуры. Любая программа, процедура и функция представляют собой блок со своей областью описаний и могут содержать внутри этого блока описания других процедур и функций, а также обращения к ним. Программа и совокупность описанных в ней процедур и функций образует блочную структуру. Блок, содержащий в своем разделе описаний другой блок (процедуру и функцию), называется внешним по отношению к нему. Блок, содержащийся в разделе описаний некоторого блока, называется внутренним или подблоком.
Блочномодульный принцип организации программ в языке Турбо Паскаль.
Локальные и глобальные переменные.
Понятие глобальных и локальных переменных введено в языке Паскаль изза наличия в
нем понятия блочной структуры. Любая программа, процедура и функция представляют
собой блок со своей областью описаний и могут содержать внутри этого блока описания
других процедур и функций, а также обращения к ним. Программа и совокупность
описанных в ней процедур и функций образует блочную структуру. Блок, содержащий в
своем разделе описаний другой блок (процедуру и функцию), называется внешним по
отношению к нему. Блок, содержащийся в разделе описаний некоторого блока,
называется внутренним или подблоком. Объекты, описанные внутри какого либо
подблока, являются по отношению к нему локальными и недоступны внешним блокам,
т.е. на них можно ссылаться только внутри блока, в котором они описаны. Константы,
переменные, типы, описанные в блоке program, называютсяглобальными. Казалось бы,
проще иметь дело вообще только с глобальными переменными, описав их все в program.
Но использование локальных переменных позволяет системе лучше оптимизировать
программы, делать их более наглядными и уменьшает вероятность появления ошибок.При
написании программ, имеющих вложенные модули, необходимо придерживаться
следующих правил:
1.
2.
3.
Описывать идентификаторы в том блоке, где они используются, если это возможно.
Если один и тот же объект (переменная, тип, константа) используются в двух и
более блоках, то описать этот объект надо в самом внешнем из них, содержащем все
остальные блоки, использующие данный объект.
Если переменная, используемая в процедуре, должна сохранить свое значение до
следующего вызова этой процедуры, то такую переменную надо описать во внешнем
блоке, содержащем данную процедуру.
Локализация переменных дает программисту большую свободу в выборе
идентификаторов. Так, если две процедуры a и b полностью отделены друг от друга (т.е. не
вложены одна в другую), то идентификаторы в них могут быть выбраны совершенно
произвольно, в частности, могут повторяться. В этом случае совпадающим
идентификаторам соответствуют разные области памяти, совершенно друг с другом не
связанные.
Пример.
var k: integer;
procedure a;
var x, z: real;
begin
{ через x, z обозначены две величины –
локальные переменные для a;
k – глобальная переменная для a }
…………………………………
end;
procedure b;
var x, y: integer;
begin
{ через x, y обозначены две другие величины –
локальные переменные для b;
k – глобальная переменная для b }…………………………………
end;
begin
{ k – единственная переменная, которую
можно использовать в основной ветке программы }
…………………………………
end.
Если один и тот же идентификатор описан в блоке b и второй раз описан во
вложенном в b блоке c, то надо помнить, что эти два одинаковых идентификатора
соответствуют разным ячейкам памяти.
var
i: integer;
a: real;
procedure p(var d: real);
var i: integer;
begin
i := 3;
d := i + 10 * d;
end;
begin
a := 2.0;
i := 15;
p(a);
writeln(' i = ', i, ' a = ', a);
readln
end.
Глобальным переменным i и a отводятся две ячейки памяти. Первыми выполняются
операторы a := 2.0 и i := 15. Затем вызывается процедура p(a). В процессе
работы p отводится ячейка для локальной переменной i и туда засылается число 3. После
окончания работы процедуры p эта ячейка i программой «забывается». После возврата на
оператор writeln программа знает только одну ячейку i – глобальную, т.е. ту, которая
содержит число 15. Поэтому программа выдаст на печать i = 15, a = 23.0, т.к. a = 3 + 10 *
2.Если локальная и глобальная переменная принадлежат к одному и тому же сложному
типу, то этот тип надо описать в разделе type, а сами переменные описывать через этот
общий тип.Пример.
type ab = array[1..3] of real;
var a: ab;
procedure q;
var b: ab;
…………………………..
end;