Число уравнений вложенности может быть добавлено большим, но на практике не превышает уравнений вложенности подпрограммы относится и охватывающий её подпрограммы точно так же, как охватывает подпрограмму относящийся к основной программе. Вложенная подпрограмма могут вызываться только внутри охватывающий. Для вложенной подпрограммы глобальные переменные считается переменной охватывающую подпрограмму все глобальный переменные основной программы.
Особенности:
Переменные – индексы For-циклов должны быть описаны во вложенной подпрограмме, даже если одноименные переменные описаны в охватывающей подпрограмме. Область меток является локальной, то есть нельзя планировать переходы с помощью оператора Go to из вложенной процедуры в охватывающей, а так же в основном блоке программы, или из основного блока процедуры.
Структура вложенности
Var
«глобальные переменные»
Procedure P1 ();
«локальные переменные Р1»;
……….
Procedure P2 ();
«локальные переменные Р2»;
……….
Begin
«тело Р2»;
|
|
…….
End;
Begin
«тело Р2»;
…….
«вызов Р2»;
End;
Begin
……….
«вызов Р1»;
…….
End.
Пример
Type
Massiv_1 =Array [1..5] of word;
Cost
A: Massiv_1= (1,2,3,4,5);
B: Massiv_1=(5,6,7,8,9);
Procedure Def_ Massiv _1(Var p,p1: Massiv_1;n:byte);
Var
I:byte;
K:string;
Procedure Out (p: Massiv_1);
Var
I:byte;
Begin
Write(k,’ ’);
For i:= 1 to 5 do
Write (p[i]:4);
Writeln;
End;
Begin
K:=’массив ’;
For i:=1 to 5 do
Begin
P[i]:=p[i]+n;
P1[i]:=p1[i]+n;
End;
Out (a);
Out (b);
End;
Begin
Def _ Massiv_1(a,b,1);
Out (a);
Readln;
End.
Подпрограмма Функции без побочного эффекта.
Определяет и выводит гласные буквы латинского алфавита
Содержащиеся в введенных строках.
Uses crt;
Type
Tstring=string[100];
Const
Mn_glas: set of char = [‘a’,’e’,’u’,’o’,’i’];
Function glass_str (str_x:tstring):Boolean;
Var
I:byte;
Begin
Glas_str:=false;
For i:=to length (str_x) do
If str _x[i] in mn_glas then
Begin
Glas_str:=true;
Break;
End;
End;
Var
Str_1,str_2:tstring;
Begin
Clrscr;
Write(‘Строка 1: ’);
Readln(str_1);
Write(‘Строка 2: ’);
Readln(str_2);
Writeln(‘ Гласные в строке 1 ’, glass_str(str_1));
Writeln(‘ Гласные в строке 2 ’, glass_str(str_2));
Readkey;
End.
Лекция №5
Подпрограммы. Дальний и ближний вызов подпрограмм. Опережающее описание подпрограмм. Рекурсивные подпрограммы.
Дальний и ближний вызов подпрограмм.
Дальний вызов
В этом случае всегда за заголовком подпрограммы следует директива far.синтаксис записи
Procedure p (k:char);far;
Begin
…….
End;
При таком определении компилятор создает код подпрограммы, который рассчитан на дальнюю модель вызова, что предполагает вызов подпрограммы, из любого сегмента кода. Поэтому в этом случае с подпрограммами связанный полный адрес, состоящий из адреса сегмента и адреса смещения. Дальний вызов в основном используется при передачи функциональных или процедурных параметров при создании оверлейных структур, при замещении системных подпрограмм своими подпрограмма, при написании своих прерываний и т.д. Эквивалент директива Far используются директивы:
|
|
1. {$F+} – устанавливается дальняя модель вызова.
2.{$F-} – отключает дальнюю модель вызова.
По умолчанию устанавливается {$F-}. Директиву {$F-} принято устанавливать если перед этим была установлено {$F+}
Ближний вызов.
Ближний вызов устанавливается:
1. По умолчанию, когда не указанна директива Far и {$F+}
2. Является явной отметкой и ближнем вызове подпрограмм директивы Near
Синтаксис записи
Procedure p (k:char);near;
Begin
…….
End;
Или
{$F+}
…..
Ближняя модель вызова предала, что подпрограмма будет вызываться только в пределах одного сегмента кода, который выделяется основной программой и каждому используемому модулю. в этом случае с подпрограммой связан лишь адрес смещения относительно сегмента. Ближняя модель экономит память и некоторое время при вызове подпрограммы. Экономия памяти наблюдается при отсутствии ключей компиляции