Вопрос функции. параметры. локальные глобальные описание
Локальные и глобальные переменные вс, 10/31/2010 - 18:39 — tech Напомним, что каждый модуль (процедура, функция, программа) состоит из заголовка (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. Но использование локальных переменных позволяет системе лучше оптимизировать программы, делать их более наглядными и уменьшает вероятность появления ошибок. При написании программ, имеющих вложенные модули, необходимо придерживаться следующих правил: 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; В этом примере переменные a и b описаны через общий тип ab. Если же локальная и глобальная переменные описаны одинаково, но не через общий тип, то программа может «не понять», что эти переменные принадлежат одному типу. Пример. var a: array[1..3] of real; procedure q; var b: array[1..3] of real; ………………………. end; В этом примере переменные a и b – одинаковые массивы, т.е. типы этих переменных одинаковы, но программа, тем не менее, «не считает», что a и b принадлежат одному типу. Это происходит из-за того, что описание массивов дано в разных блоках. 23 вопрос процедуры. параметры значения параметры переменные
|