Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Параметры-константы




Условие – параметр передается в подпрограмму, но изменять его подпрограмма не должна. Нежелательно передавать параметр как

параметр-переменную. Можно передать как параметр-значение, но если этот параметр имеет большой размер (массив, запись и т.д.), то копии могут занять большую часть стека или даже переполнить его. Это ведет к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурного типа, передается своим адресом, но предусмотрена его защита от изменений (версия 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...