Вложенные подпрограммы

Число уравнений вложенности может быть добавлено большим, но на практике не превышает уравнений вложенности подпрограммы относится и охватывающий её подпрограммы точно так же, как охватывает подпрограмму относящийся к основной программе. Вложенная подпрограмма могут вызываться только внутри охватывающий. Для вложенной подпрограммы глобальные переменные считается переменной охватывающую подпрограмму все глобальный переменные основной программы.

Особенности:

Переменные – индексы 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+}

…..

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: