Основы алгоритмизации и программирования. Часть третья. Структурированные типы данных. Асламова В.С - 27 стр.

UptoLike

53
передаваемых по ссылке параметров типа string длины фактических и
формальных параметров должны совпадать.
Тип директивы V- эти длины могут быть различными.
Пример:
{*$V - *} {иначе выдаётся ошибка несовпадения типов
для процедур dies и jenes }
program; {использование строки в качестве параметра}
type w = string[10];
var a:string[20];
procedure das( x:w);
begin
writeln(x ,_ _ _ длина х:, ord(x[0]):5);
end;
procedure dies(var x:w);
begin
writeln(x ,_ _ _ длина х:, ord(x[0]):5);
end;
procedure jenes(x:string);
begin
writeln(x,_ _ _ длина х:, ord(x[0]):5);
end;
begin
writeln(введите строку в 15 символов:);
readln(a);
writeln(a,_ _ _ длина а:,ord(a[0]):5);
das(a); {будут напечатаны первые десять символов из а
}
dies(a); {будут напечатаны все символы из а}
jenes(a); {будут напечатаны все символы из а}
end.
При передаче параметра по значению производится поверхностная
проверка на соответствие типов. Несмотря на разную длину параметров х и а
компилятор при передаче параметра по значению не классифицирует
ошибку. Правда, при передаче параметров «лишние» символы отсекаются и
в
х передаются только первые 10 символов. На передачу параметров по
значению директива {*$V±*} никакой роли не играет.
При передаче параметров по ссылке проверка типов формальных и
фактических параметров требует полного соответствия. При директиве
{*$V+*} компилятор выдаёт сообщение об ошибке “type
mismatch”(несовпадение типов).
54
Но, согласно директиве {*$V-*}, обработка ведётся не так, как это
имело место при передаче параметров по значению. Поскольку теперь в
процедуру dies передаётся начальный адрес а, то процедура выдаёт все
символы из а, в том числе и те, которые выходят за пределы 10 указанных в
описании символов.
Для того, чтобы писать процедуры и
функции, работающие с любыми
строковыми типами, нужно описывать формальные параметры
исключительно типом string (без указания длины) и компилировать
программу в режиме {$V-}. Это даст процедурам и функциям гибкость и
безотказность данных.
При описании параметров произвольным строковым типом нельзя
конструировать типы в описаниях процедур, функций, например:
Function xstr(S:string[32]):string[6]; - неверно!
Корректным будет следующее описание:
Type str1 = string[32];str2:= string[6];
Function xstr(S:str1):str2;
Встроенная процедура FILLCHAR позволяет заполнить всю строку
каким-либо одним символом.
var S:string;
begin……………..
fillchar (S[1],80,*); S[0]:=chr(80);…………………end.
Здесь S[1] указывает, что надо заполнять строку с первого элемента.
Можно начать заполнение и с любого другого элемента. В данном случае
строка заполняется с 1 – го элемента 80 звёздочками (*).
Так как строка «закрашивается» принудительно, то ей надо сообщить,
сколько символов в ней
стало, т.е. записать в S[0] символ с кодом равным её
новой длине.
Первоначально строка содержит «мусор», и всегда рекомендуется
перед использованием инициализировать строки пустыми значениями или
чем-нибудь ещё.
При использовании процедуры Fillchar всегда есть риск «выскочить»
за пределы, отводимые данной строке, и заполнить символами рабочую
память данных. Компилятор таких ошибок не замечает, и вся
ответственность лежит на программисте.
передаваемых по ссылке параметров типа string длины фактических и                 Но, согласно директиве {*$V-*}, обработка ведётся не так, как это
формальных параметров должны совпадать.                                     имело место при передаче параметров по значению. Поскольку теперь в
      Тип директивы V- эти длины могут быть различными.                     процедуру dies передаётся начальный адрес а, то процедура выдаёт все
                                                                            символы из а, в том числе и те, которые выходят за пределы 10 указанных в
        Пример:
                                                                            описании символов.
   {*$V - *}                {иначе выдаётся ошибка несовпадения типов             Для того, чтобы писать процедуры и функции, работающие с любыми
                              для процедур dies и jenes }                   строковыми     типами,    нужно     описывать    формальные    параметры
   program;            {использование строки в качестве параметра}
                                                                            исключительно типом string (без указания длины) и компилировать
   type w = string[10];
   var a:string[20];                                                        программу в режиме {$V-}. Это даст процедурам и функциям гибкость и
   procedure das( x:w);                                                     безотказность данных.
   begin
                                                                                  При описании параметров произвольным строковым типом нельзя
     writeln(x ,′_ _ _ длина х:′, ord(x[0]):5);
   end;                                                                     конструировать типы в описаниях процедур, функций, например:
   procedure dies(var x:w);                                                         Function xstr(S:string[32]):string[6];         - неверно!
   begin
     writeln(x ,′_ _ _ длина х:′, ord(x[0]):5);                                     Корректным будет следующее описание:
   end;                                                                             Type str1 = string[32];str2:= string[6];
   procedure jenes(x:string);
   begin                                                                            Function xstr(S:str1):str2;
     writeln(x,′_ _ _ длина х:′, ord(x[0]):5);                                    Встроенная процедура FILLCHAR позволяет заполнить всю строку
   end;
                                                                            каким-либо одним символом.
   begin
     writeln(′введите строку в 15 символов:′);                                    var S:string;
     readln(a);                                                                   begin               ..
     writeln(a,′_ _ _ длина а:′,ord(a[0]):5);
                                                                                  fillchar (S[1],80,′*′); S[0]:=chr(80);          end.
     das(a);              {будут напечатаны первые десять символов из а}
     dies(a);             {будут напечатаны все символы из а}                     Здесь S[1] указывает, что надо заполнять строку с первого элемента.
     jenes(a);            {будут напечатаны все символы из а}               Можно начать заполнение и с любого другого элемента. В данном случае
   end.                                                                     строка заполняется с 1 – го элемента 80 звёздочками (*).
      При передаче параметра по значению производится поверхностная               Так как строка «закрашивается» принудительно, то ей надо сообщить,
проверка на соответствие типов. Несмотря на разную длину параметров х и а   сколько символов в ней стало, т.е. записать в S[0] символ с кодом равным её
компилятор при передаче параметра по значению не классифицирует             новой длине.
ошибку. Правда, при передаче параметров «лишние» символы отсекаются и             Первоначально строка содержит «мусор», и всегда рекомендуется
в х передаются только первые 10 символов. На передачу параметров по         перед использованием инициализировать строки пустыми значениями или
значению директива {*$V±*} никакой роли не играет.                          чем-нибудь ещё.
      При передаче параметров по ссылке проверка типов формальных и               При использовании процедуры Fillchar всегда есть риск «выскочить»
фактических параметров требует полного соответствия. При директиве          за пределы, отводимые данной строке, и заполнить символами рабочую
{*$V+*}     компилятор     выдаёт    сообщение     об    ошибке    “type    память данных. Компилятор таких ошибок не замечает, и вся
mismatch”(несовпадение типов).                                              ответственность лежит на программисте.

                                     53                                                                              54