ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
