ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 25
- 26
- 27
- 28
- 29
- …
- следующая ›
- последняя »