7. Процедуры и функции
51
if Equal(v1, v2, SizeOf(Vector)) then
{ ............................. }
{ Здесь сравниваются все компоненты переменных. }
if Equal(v1[1], v1[6], SizeOf(Integer)*5) then
{ ............................. }
  Здесь сравниваются первые 5 компонент переменной v1 с
  вторыми 5 компонентами  
if Equal(v1, p, SizeOf(point)) then
{ ............................. }
{ Здесь сравниваются переменные разного типа и разной длины }
7.3.5. Формальные параметры типа STRING
Стандартный (в UniPascal-е) тип STRING занимает привилегированное положение
по отношению к другим типам. При передачи параметров типа STRING не обязательно,
чтобы формальный и фактический параметры имели идентичные типы. Достаточно
только, чтобы максимальная длина фактического параметра была не меньше
максимальной длины формального. Поэтому в определении формального параметра
может стоять спецификатор максимальной длины. Например:
procedure ExpandTabs(var s: string[79]);
...
Так описанной процедуре ExpandTabs можно передавать переменные типа
string[x], где x должно быть не менше 79.
Если формальный параметр-переменная типа STRING не имеет спецификатор
длины, его тип не воспринимается как STRING[255] по умолчанию, как это было бы, если
речь шла о переменных этого типа. Например, пусть процедура определена
следующей декларацией
procedure ExpandTabs(var s: string);
...
В этом случае спецификатор длины фактического параметра передается
процедуре неявным образом. Поэтому максимальная длина так дефинированного
параметра типа STRING динамически изменяется, т.е. она неизвестна в процессе
компиляции и варьирует для разных фактических параметров. Например:
procedure ExpandTabs(var s: string);
var i: shortcard;
begin
{Эта процедура заменяет все символы  в данной строке}
i:= 0;
{необходимым числом пробелов; каждая}
repeat i:= i +1;
{табуляция заменяется таким числом пробелов,}
if s[i] = #9 then begin
{чтобы следующий символ оказался}
s[i]:= ' ';
{ в позиции 8*K +1, где K= 0, 1, ... и 8*K +1}
while i mod 8 <> 0 do begin
{больше текущей позиций}
i:= i +1;
{ из 1-вой позиции замещается 8 пробелами}
insert(' ', s, i);
{из 2-рой позиции - 7 пробелами}
end { while };
{из 3-ей - 6, ..., из 8-ой - только 1}
end { if };
until i = length(s);
end { ExpandTabs };
<<  <  GO  >  >>

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