Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Локальные и глобальные переменные

Напомним, что каждый модуль (процедура, функция, программа) состоит из заголовка (procedure…, function…, program…) и блока.

Если блок какой-либо процедуры p1 содержит внутри процедуру p2, то говорят, что p2 вложена в p1.

Пример.

procedure p1(x: real; var y: real);

    var c: integer;

    procedure p2(var z: real);

        …………………….

    end;

    begin

        …………………….

    end;

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

Пример.

procedure t1;

    var y1, y2: real;

    procedure sq1;

        var a, b, c, d: real;

        begin

            { Переменные a, b, c, d являются локальными для sq1,

               область их действия – процедура sq1 }

            ……………………………………

        end;

    begin

        { Переменные y1, y2 - нелокальные для sq1,

           область их действия – t1 и sq1 }

    end;

Константы, переменные, типы, описанные в блоке program, называются глобальными. Казалось бы, проще иметь дело вообще только с глобальными переменными, описав их все в program. Но использование локальных переменных позволяет системе лучше оптимизировать программы, делать их более наглядными и уменьшает вероятность появления ошибок.

 

При написании программ, имеющих вложенные модули, необходимо придерживаться следующих правил:

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

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

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

Локализация переменных дает программисту большую свободу в выборе идентификаторов. Так, если две процедуры 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;

В этом примере переменные a и b описаны через общий тип ab. Если же локальная и глобальная переменные описаны одинаково, но не через общий тип, то программа может «не понять», что эти переменные принадлежат одному типу.

Пример.

var a: array[1..3] of real;

procedure q;

    var b: array[1..3] of real;

    ……………………….

end;

В этом примере переменные a и b – одинаковые массивы, т.е. типы этих переменных одинаковы, но программа, тем не менее, «не считает», что a и b принадлежат одному типу. Это происходит из-за того, что описание массивов дано в разных блоках.