Параметры-константы
Условие – параметр передается в подпрограмму, но изменять его подпрограмма не должна. Нежелательно передавать параметр как параметр-переменную. Можно передать как параметр-значение, но если этот параметр имеет большой размер (массив, запись и т.д.), то копии могут занять большую часть стека или даже переполнить его. Это ведет к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурного типа, передается своим адресом, но предусмотрена его защита от изменений (версия 7.0). Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово const. Действие слова const распространяется до ближайшей точки с запятой, т.е. в пределах одной группы. Пример function NewString (const s:string):string; Тип параметра-значения может быть любым, кроме файлового. При вызове подпрограммы на месте параметра-константы в качестве фактического параметра можно использовать любое выражение совместимого для присваивания типа, не содержащего файловую компоненту. Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра. Пример Функция вычисления максимального элемента в массиве. function max(const mas: tarr;n: byte): integer; var ma:integer; i:byte; begin ma:=mas[1]; for i:=1 to n do if ma<mas[i] then ma:=mas[i]; max:=ma; end; Пример const a: integer = 5; b: integer = 7; procedure inc(var c: integer; b: integer) begin c:= c+c; b:= b+b; writeln(‘удвоенные: ’,c: 5, b: 5); end; begin writeln(‘исходные: ’,a: 5, b: 5); inc(a,b); writeln(‘результат: ’,a: 5,b: 5); end.
b – параметр-значение При вызове вычисляется значение, полученный результат копируется во временную память и передается подпрограмме.
Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, т.к. в этом случае изменяется копия фактического параметра. а – параметр-переменная При вызове подпрограмме передается сама переменная (адрес переменной). Изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. В случае параметра-константы в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычисленное значение. Компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы. Пример может служить иллюстрацией механизма «закрывания» глобальной переменной одноименной локальной: хотя b объявлена как глобальная, в теле процедуры её «закрывает» локальная, объявленная как параметр-значение. Параметры-переменные используются как средство связи с внешним миром: с помощью этих параметров подпрограмма может передавать своей работы вызывающей программе. Всегда возможна передача результатов и через глобальные переменные. Оценка вариантов передачи результатов работы подпрограммы вызывающей программе - злоупотребление глобальными связями делает программу запутанной, трудной в понимании и сложной в отладке; - рекомендуется, где это возможно, использовать передачу результатов через фактические параметры-переменные; - с другой стороны, описание всех формальных параметров, как параметров-переменных нежелательно по двум причинам: во-первых, это исключает возможность вызова подпрограммы с фактическими параметрами в виде выражений, что делает программу менее компактной, во-вторых, в подпрограмме возможно случайное использование формального параметра. По этой причине параметры – переменные следует объявлять только те, через которые подпрограмма в действительности передает результаты вызывающей программы. Чем меньше параметров объявлено параметрами – переменными и чем меньше в подпрограмме используется глобальных переменных, тем меньше опасность получения непредусмотренных решений и в программе побочных эффектов, связанных с выводом подпрограммы, тем проще программа в понимании и отладке. По этой же причине не рекомендуется использовать параметры – переменные в заголовке функции: если результатом работы функции не может быть единственное значение, то логичнее использовать процедуру или разбить алгоритм на несколько подпрограмм.
Необходимо отметить следующий момент при объявлении параметра – значения осуществляется копирование фактических параметров во временную память. Если этим параметром будет массив большой размерности, то для сокращения затрат времени и памяти можно осуществить, объявив этот параметр параметром – константой. Он не копируется во временную память, однако его любые изменения в теле подпрограммы невозможны – за этим следит компилятор. Локализация имен Вывод подпрограммы осуществляется простым упоминанием имени процедуры в операторе вызова процедуры или именем функции в выражении. Каждая процедура или функция описывается в разделе объявлений (заголовок и тело). В заголовке объявляются – имя и формальные параметры. За заголовком следует тело подпрограммы. В разделе объявления подпрограмм могут быть описаны подпрограммы низшего уровня, в них – описание других подпрограмм (вложенные подпрограммы). Пример Структура вложенной программы. program first; procedure A; procedure A1; ........... begin .......... end; {A1} procedure A2; ............ begin .......... end; {A2} begin {A}; ............ end; {A} procedure B; procedure B1; begin ........... end; {B1} procedure B2; procedure B21; …………… Все имена, описанные внутри подпрограммы, локализуются в ней, т.е. они «невидимы» снаружи. Другими словами, из основной программы можно обращаться к процедурам А и В, но нельзя вызвать вложенные процедуры А1, А2, В1, В2, В21, В22. Это относиться не только к именам подпрограмм, но и к любым именам, объявленных в них (типам, константам, переменным и меткам). Все имена в пределах подпрограммы, в которой они объявлены, должны быть уникальными и не могут совпадать с именем самой подпрограммы. При входе в подпрограмму низшего уровня становятся доступны не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. Из подпрограммы В21 можно вызвать подпрограмму А, используя имена, объявленные в основных подпрограммах, в подпрограмме В и В2 и затем обращаться к ним.
Пример Program var v1:...; procedure A; var v2:...; begin ... end;{A} procedure B; var v3:...; procedure B1; var v4:...; ………. procedure B11; var v5:...; …………….. Из подпрограммы В11 доступны все 5 переменных v1, v2, v3, v4, v5, из В1 доступно 4 переменных v1, v2, v3, v4. В основной программе доступна всего лишь одна переменная v1.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|