
- •Лекция 4. Подпрограммы.
- •Структура процедур и функций (Лекция 2).
- •Здесь локальные разделы описаний:
- •Пример. Подпрограммы циклического сдвига влево.
- •Основная программа и результат (текст функции Binary для краткости опущен).
- •Перегрузка подпрограмм
- •При анализе списка модификаторы Var, Const, Out не
- •Параметры по умолчанию
- •Тогда в основной программе можно использовать следующие обращения
Лекция 4. Подпрограммы.
1.Структура процедур и функций.
2.Перегрузка подпрограмм.
3.Параметры по умолчанию
Структура процедур и функций (Лекция 2).
Структура процедуры.
Procedure <Имя>[(<Список формальных параметров>)]; [<Локальные разделы описаний>]
Begin
[<блок исполняемых операторов>]
End;
Структура функции.
Function <Имя>[(<Список формальных параметров>)] : <Тип>;
[<Локальные разделы описаний>]
Begin
[<блок исполняемых опеpатоpов>]
<Имя>:=<Результат - переменная или выражение того же типа, что и тип функции>;
End; <Имя>==result;
Здесь локальные разделы описаний:
[Unit1,..] |
<подключение своих модулей> |
[Label] |
<раздел описания меток> |
[Const] |
<раздел описания констант> |
[Type] |
<раздел описания типов> |
[Procedure] |
<раздел описания процедур> |
[Function] |
<раздел описания функций> |
[Var] |
<раздел описания переменных> |
<Список формальных параметров>== [!Var, Const, Out!]<Имя1> : <Тип1>;
[!Var, Const, Out!]<Имя2> : <Тип2>; и т.д. через точку с запятой с указанием типа. Спецификатор Var указывается, если параметр является входным и он же выходной, т.е. для тех параметров, которые изменяют свое значение.
Спецификатор Out указывается только для выходных параметров (результата).
Спецификатор Const указывается, чтобы запретить изменение параметра

Пример. Подпрограммы циклического сдвига влево.
Procedure CyclShl(Var b : byte); Begin
b:=((b and $80) shr 7) + (b shl 1);
End;
Старший разряд становится |
А все остальные сдвигаются влево. |
на место младшего |
Старший разряд пропадает |
Procedure CyclShla(b : byte; Out bcycl : byte); Begin
bcycl:=((b and $80) shr 7) + (b shl 1); End;
Function CyclShlb(const b : byte) : byte; Begin
result:=((b and $80) shr 7) + (b shl 1);
End;

Основная программа и результат (текст функции Binary для краткости опущен).
Var b, bcycl : byte; BEGIN
b:=$96; writeln(Binary(b));
CyclShl(b);
writeln(Binary(b)); CyclShla(b, bcycl); writeln(Binary(bcycl));
writeln(Binary(CyclShlb(bcycl)));
Readln;
END.
Перегрузка подпрограмм
Две или несколько одноименных процедуры или функции должны быть объявлены как перегружаемые, если они
имеют отличающийся список формальных параметров. В нашем случае, этому условию соответствуют две первые процедуры. В заголовке должно быть указано ключевое слово overload;
Procedure CyclShl(Var b : byte); overload; Begin
b:=((b and $80) shr 7) + (b shl 1); End;
Procedure CyclShl(b : byte; Out bcycl : byte); overload;
Begin
bcycl:=((b and $80) shr 7) + (b shl 1); End;
При анализе списка модификаторы Var, Const, Out не
учитываются, а принимается во внимание только отличия в типах, в числе и порядке следования разнотипных
параметров. Примеры.
Procedure CyclShl(Var b : byte); overload; Procedure CyclShl(b : byte); overload; //Ошибка - // списки одинаковы.
Procedure CyclShl(b : byte; Out bcycl : byte); overload;
Procedure CyclShl(Out bcycl : byte b : byte); overload; //Ошибка – параметры одного типа
Procedure CyclShl(b : byte; Out bcycl : byte); overload;
Procedure CyclShl(b : byte; Out bcycl : word); overload;// Так можно
Параметры по умолчанию
Функция может иметь несколько параметров со значениями по умолчанию. Они должны находиться в конце списка параметров. Например, на основе ранее рассмотренных подпрограмм можно составить функцию циклического сдвига на n позиций влево со значением по умолчанию n=1.
Function CyclShkN(b : byte; n : integer = 1) : byte;
Var i : integer;
Begin
for i:=1 to n do b:=CyclShlb(b); result:=b;
End;
Тогда в основной программе можно использовать следующие обращения
b:=CyclShkN(b); writeln(Binary(b)); //Сдвиг на 1 b:=CyclShkN(b,0); writeln(Binary(b));//Нет сдвига b:=CyclShkN(b,5); writeln(Binary(b));//Сдвиг на 5
Следует избегать совместного использования перегружаемых подпрограмм с параметрами по умолчанию из-за возможных коллизий.
Например следующие объявления формально имеют разные списки параметров и могут считаться перегружаемыми
Function CyclShkN(b : byte; n : integer = 1) : byte; overload;
Function CyclShkN(b : byte) : byte; overload;
Но что делать компилятору, если он встречает обращение? b:=CyclShkN(b);
Какую функцию вызывать? Это и есть коллизия.