Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр1.doc
Скачиваний:
3
Добавлен:
19.09.2019
Размер:
1.03 Mб
Скачать

10.2 Передача параметров в процедуры и функции

Как было сказано выше (!), список фактических параметров должен соответствовать списку формальных параметров по количеству (очевидно), порядку следования (очевидно), по типу (как это?).

Если передача данных осуществляется по значению, то значение фактического параметра должно быть присвоено переменной, являющейся формальным параметром. Если передача данных осуществляется по адресу, то переменной, являющейся фактическим параметром, должно быть присвоено «новое» значение в подпрограмме. В любом случае необходима совместимость по присваиванию. Например, легко понять, что при описании формального параметра массива не может использоваться описатель массива вида array [Ind] of type, поскольку в вызывающей программе, в этом случае, невозможно описать переменную того же типа, то есть, совместимую с формальным параметром. Вот как следует поступать:

program factich_par;

type mass=array [1..10] of real;

var i:integer;

m:mass;

procedure pr_mass(m:mass);

var i:integer;

begin

for i:=1 to 10 do write(m[i]:10:5); writeln

end;

begin

for i:=1 to 10 do read(m[i]);

pr_mass(m)

end.

Указанный механизм передачи данных в подпрограмму позволяет обрабатывать в подпрограмме только массивы, определенного в вызывающей программе типа. Это хорошее «паскалевское» решение. В качестве некоего послабления (и отклонения от принципов строгой типизации данных) в ТР (не в стандарте!) можно воспользоваться следующим механизмом передачи массивов в подпрограмму, называемым «открытым массивом». При описании открытого массива указывается лишь базовый тип, в качестве фактического параметра может использоваться любой массив с тем же базовым типом, в качестве индексного типа используется диапазон 0..N, где N – номер максимального элемента индексного типа фактического параметра:

var i:integer;

m:array [0..10] of real;

procedure pr_mass(m:array of real{Open array};n:integer);

var i:integer;

begin

for i:=0 to n do write(m[i]:10:5); writeln

end;

begin

for i:=0 to 10 do read(m[i]); readln;

pr_mass(m,10)

end.

10.3 Глобальные переменные. Перекрытие (экранирование)

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

Каждый объект (константа, тип данных, переменная или подпрограмма), описанный в программе на Паскале, имеет свою область «видимости» (соответствующее описание имеет свою область действия). Область действия описания начинается с места описания и заканчивается концом блока (оператором end), в котором выполнено описание. Для программы, структура которой условно изображена на схеме, подпрограмма А «видна» в любой части программы после ее описания. Подпрограмма В определена для секции действий программы. Подпрограммы А1 и А2 могут использоваться в секции действий подпрограммы А, причем подпрограмма А1 может быть использована в подпрограмме А2. Ни подпрограмма А1, ни подпрограмма А2 не могут выть использованы вне описания подпрограммы А. Подпрограмма А может быть вызвана в описании подпрограммы В (в секции действия В, или в секциях действия В1, В2, В21 и В22).

Аналогично определяется область действия описания типов данных, констант и переменных. Объект (подпрограмма, константа, тип данных или переменная) «виден» в тексте программы с места описания, до конца блока, в котором находится описание. Объект, использованный в блоке, входящем в область «видимости» его описания, называется глобальным по отношению к этому блоку. Использование глобальных объектов для обмена данными между программой и подпрограммой является альтернативой для механизма формальных и фактических параметров. Выбор способа передачи данных (для каких данных использовать механизм глобальных параметров, а для каких механизм формальных и фактических параметров) является одним из важнейших вопросов разработки проекта программы (не зависимо от того, на каком языке программирования будет реализован проект).

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

Program prog;

var i,x:integer; {глобальные переменные}

procedure p1(u:integer; var v:integer);

var i,y:integer; {локальные переменные}

begin

x:=1;

i:=2; y:=3;

writeln(x,i,y,u,v);

u:=7; v:=8;

end;

Begin

x:=0; i:=0;

writeln(x,i);

p1(i,i);

writeln(x,i);

end.

Результат работы программы:

00

12300

18