![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Процедуры с объявлениями.
Дополнительно к переменным, которые являются параметрами процедуры, могут быть объявлены локальные переменные для использования в пределах процедуры. Эти переменные могут скрывать другие, объявленные вне процедуры. Существование переменных в различных местах поднимает вопрос области видимости переменных. Для иллюстрации использования локальных переменных предлагается библиотека операций по сравнению строк.
Новые идеи: объявление локальной переменной в процедуре, область видимости переменной, разрешение конфликтов имен переменных, сравнение строк, лексикографический порядок.
Параметры, как и другие переменные, используются в операторах программы. Однако, при выполнении формальные параметры заменяются соответствующими фактическими, переменными программы, которые существуют вне процедуры. Следовательно, выполнение процедуры проходит с использованием только переменных, объявленных в вызывающей программе. Однако иногда переменные, используемые в процедуре должны используются для хранения промежуточных значений, значения которых не влияют на вызывающую программу. Например, процедура для обмена значений двух переменных с использованием третьей была написана как
PROCEDURE SwitchThese2(VAR V1, V2, temp: CHAR); BEGIN Temp: = V1; V1: = V2; V2: = Temp END с использованием Temp как параметра. При использовании процедуры для обмена двух переменных, скажем, One и Two, вызывающая программа должна была предоставить третью, временную переменную, например
SwitchThese2(One, Two, Ch) обменяет значения One и Two и также поместит в Ch старое значение One. Возможность объявления локальных переменных в CF Pascal позволяет таким переменным как Temp быть скрытыми внутри процедуры. Например:
PROCEDURE Exchange(VAR Ch1, Ch2: CHAR); {Обменивает Ch1 и Ch2} VAR Temp: CHAR; BEGIN Temp: = Ch1; Ch1: = Ch2; Ch2: = Temp END
Как и формальные параметры Ch1 и Ch2, локальная переменная Temp не известна и не может быть использована извне процедуры Exchange. Оператор процедуры
Exchange(One, Two)
обменяет значения One и Two. Exchange может быть проще описан для повторного использования, поскольку он использует и изменяет только две переменные вместо трех.
Существование локальных переменных скоротечно. Они входят в состояние выполнения в начале выполнения оператора процедуры, аналогично тому как переменные программы попадают в состояние выполнения в начале выполнения программы и они пропадают из состояния выполнения когда выполнение процедуры завершается. Таблицы выполнения показывают поведение переменных в процедурах также, как они делали это для программ. Например, программа
PROGRAM Copy2(INPUT, OUTPUT); {Копирует первые два символа из INPUT в OUTPUT} PROCEDURE CopyChar(VAR F1, F2: TEXT); {Копирует в F2 следующий символ их F1} VAR Ch: CHAR; BEGIN {CopyChar} IF NOT EOF(F1) THEN BEGIN READ(F1, Ch); WRITE(F2, Ch) END END; {CopyChar} BEGIN {Copy2} CopyChar(INPUT, OUTPUT); CopyChar(INPUT, OUTPUT); WRITELN END. {Copy2}
имеет следующую таблицу выполнения.
Локальная переменная Ch перестает существовать в состоянии выполнения в местах отмеченных знаком параграфа. Хотя оба процедурных оператора вызывают CopyChar один за другим, значение Ch теряется, действительно переменная перестает существовать между вызовами CopyChar. Внутри процедуры могут быть не только объявления локальных переменных, но и объявления локальных процедур. Локальные процедуры могут вызываться только в пределах процедуры, где они объявлены, и полностью невидимы за ее пределами. Значение, которое приходит в состояние выполнения для локальной процедуры – это ее текст. В целом дела с объявлениями внутри процедур обстоят примерно также, как и с объявлениями в программе за исключением того, что идентификаторы могут быть использованы только в пределах процедуры и входят и выходят из состояния выполнения при каждом вызове процедурного оператора.
|