7. Процедури
и 
динамична, т.е. тя е неизвестна по време на компилация и е различна за различните
фактически параметри. Например:
procedure ExpandTabs(var s: string);
var i: shortcard;
begin
{ Тази процедура замества всички символи  в }
i:= 0;
{ даден низ с необходимото количество интервали}
repeat i:= i +1;
if s[i] = #9 then begin
{ всяка табулация се заменя с толкова}
s[i]:= ' ';
{ интервали, че следващият символ да е на}
while i mod 8 <> 0 do begin
{ следващата +1 кратна на 8}
i:= i +1;
{ т.е.  в 1-ва позиция вмъква 8 интервала}
insert(' ', s, i);
{ако е във 2-ра позиция - 7 интервала}
end { while };
{ в 3-та - 6, ..., в 8-ма - само един}
end { if };
until i = length(s);
end { ExpandTabs };
Тази процедура ще даде грешка по време на изпълнение, ако се подаде такъв
параметър, че след като се разширят табулациите до необходимия брой интервали се
получи низ по-дълъг от максималния (даден като фактически параметър). Ако подобна
вероятност има и е нежелателно предизвикването на грешка, можем да добавим
допълнително условие в началото на цикъла WHILE. Това условие ще проверява дали
има място за вмъкване, т.е. дали реалната дължина на фактическия параметър
(SizeOf(s)), е по-малка от текущата (максималната дължина на низ е SizeOf(s) -1, тъй
като при представянето на низ в оперативната памет се заема един байт в повече,
представящ текущата дължина, за подробности виж глава "UniPascal в детайли").
7.4. Задаване на фактически параметри
При извикване на процедура се задава списък от фактическите параметри.
Списъкът е ограден със скоби, а отделните параметри са разделени със запетая. Всеки
фактически параметър може да бъде променлива или израз. На списъка от фактически
параметри се съпоставя списъкът от формални параметри, като на първия фактически
параметър се съпоставя първият формален и т.н. При съпоставянето е необходимо да
има съвместимост (такава, каквато се изисква за съответния вид параметър) между
типовете на формалния и фактическия параметри. Тази съвместимост трябва да бъде
съвместимост за даване на стойност, ако параметърът се предава по стойност, и
идентичност, ако параметърът се предава по адрес. От това правило изключения са
само следните случаи:
*
ако формалният параметър е нетипизиран, то фактическият параметър
може да бъде променлива от всякакъв тип;
*
ако формалният параметър е от стандартния тип BYTE, WORD или LONG-
WORD, то фактическият параметър може да бъде от всеки тип с размер
съответно 1, 2 или 4 байта;
*
компоненти на пакетирана структура не могат да бъдат предавани
параметри-променливи;
*
ако формалният параметър-променлива е от тип STRING със спецификатор
за дължина, то достатъчно е фактическият параметър да има не по-малка
максимална дължина от формалния;
<<  <  GO  >  >>

Вернуться к началу сайта