Обычно не типизированные параметры используются при работе с областями памяти.
Примеры использования: процедуры сравнения областей памяти разного размера.
Type
Vector = array [1..5]of integer;
Point= record
X,y:integer;
End;
Const
Vec1:vector = (1,2,3,4,5);
Vec2:vector = (1,2,3,1,2);
P:point = (x:1;y:1);
Var
N:integer;
{$R-}
Function egual (var s,d,size:word):Boolean;
Type
Integers = array [0..1] of integer;
Var
N:integer;
Begin
N:=0;
While (n<> size) and (integers(d)[n]=integers (s)[d]) do
Inc (n);
Egual=n=size;
End;
Begin
N:=10;
Writeln(egual (vec1,vec2,size of (vector)));
Writeln (egual (vec1,vec2,3));
Writeln(egual (vec1,vec2, size of (integer)*n));
Writeln(egual (vec1,vec2[4],2));
Writeln(egual (vec1,p,2));
End.
Пример: Инициализации переменных, при этом вместе со значением в качестве параметра передается функция
Type
Type = (tbyte,tword,tchar);
Procedure init (var x,t:type; v:word);
Begin
Case t of
Tbyte:byte (x):=v;
Tword:word(x):=v;
Tchar:char (x):=v;
End;
Часто не типизированный параметр используется при работ со стандартными процедурами, например:
Move
BlockWrite
BlockRead
FillChar
FillChar (var V,nbyte:word;z:byte [char]);
Данная процедура заполняет участок памяти, на первый элемент который указывает параметр V, размер передается второму параметру. Третий параметр указывает значение, которое будет помещено в память.
|
|
Пример.
Var
S:string[7];
….
Fillchar(s, size of (s), ‘a’);
S[]|___________________________________
Множества и перечислимые типы не рекомендованы, передача через не типизированные параметры, так как они имеют особое машинное представление.
Опережающее описание подпрограмм.
Так как текст программ транслируется в выполнимый код последовательно с верху в низ (в визуальном восприятии пользователя), то типизированные – переменные, константы, подпрограммы должны описываться до того, как будут использоваться. В противном случае компилятор считается не определенным имя неизвестным и приходится перемещаться вверх по тексту, объявляя неизвестные компилятору данные. Однако в случае с подпрограммами этого можно избежать, используя опережающее описание подпрограмм применяя директиву Forward.
Синтаксис описания
Procedure P1; Forward;
Function f1 (x:byte):char; Forward;
……
Procedure p1;
Begin
……
End;
Function f1;
Begin
……..
End;
Указание директивы Forward говорит о том, что описание процедур или функций откладывается на потом, при чем при описании реализации функций или процедур, определяется ранее с директивой Forward; списанные параметры можно не указывать. Очень часто директива Forward; используется в случае взаимных обращений подпрограмм друг к другу
Пример
Procedure P1 (y:type x y);forward;
Procedure P2 (x: type x y);
Begin
P1 (p);
….
End;
Procedure P1;
Begin
P2(q);
….
End;
В данном случае не обходимо осуществлять конкретный выход из выполнения подпрограмм, чтобы не было зацикливание вызовов переполнение стека локальными переменными и параметрами.