Открытые строковые параметры
Открытые строковые параметры могут описываться двумя спосо- бами:
- с помощью идентификатора OpenString; - с помощью ключевого слова string в состоянии {$P+}.
Идентификатор OpenString описывается в модуле System. Он обозначает специальный строковый тип, который может использовать- ся только в описании строковых параметров. В целях обратной сов- местимости OpenString не является зарезервированным словом и мо- жет, таким образом, быть переопределен как идентификатор, задан- ный пользователем.
Когда обратная совместимость значения не имеет, для измене- ния смысла ключевого слова string можно использовать директиву компилятора {$P+}. В состоянии {$P+} переменная, описанная с клю- чевым словом string, является открытым строковым параметром.
Для открытого строкового параметра фактический параметр мо- жет быть переменной любого строкового типа. В процедуре или функ- ции атрибут размера (максимальная длина) формального параметра будет тем же, что у фактического параметра.
Открытые строковые параметры ведут себя также как парамет- ры-переменные строкового типа, только их нельзя передавать как обычные переменные другим процедурам или функциям. Однако, их можно снова передать как открытые строковые параметры.
В следующем примере параметр S процедуры AssignStr - это открытый строковый параметр:
procedure AssignStr(var S: OpenString; begin S := '0123456789ABCDEF'; end;
Так как S - это открытый строковый параметр, AssignStr можно передавать переменные любого строкового типа:
var S1: string[10]; S1: string[20]; begin AssignStr(S1); { S1 := '0123456789' }
AssignStr(S2); { S2 := '0123456789ABCDEF' } end;
В AssingStr максимальная длина параметра S та же самая, что у фактического параметра. Таким образом, в первом вызове AssingStr при присваивании параметра S строка усекается, так как максимальная длина S1 равна 10.
При применении к открытому строковому параметру стандартная функция Low возвращает 0, стандартная функция High возвращает описанную максимальную длину фактического параметра, а функция SizeOf возвращает размер фактического параметра.
В следующем примере процедура FillString заполняет строку заданным символом до ее максимальной длины. Обратите внимание на использование функции High для получения максимальной длины отк- рытого строкового параметра.
procedure FillStr(var S: OpenString; Ch: Char); begin S[0] := Chr(High(S)); { задает длину строки } FillChar(S[1], High(S), Ch); { устанавливает число символов } emd;
Значения и параметры-константы, описанные с использованием идентификатора OpenString или ключевого слова string в состоянии {$P+}, не являются открытыми строковыми параметрами. Они ведут себя также, как если бы были описаны с максимальной длиной стро- кового типа 255, а функция Hingh для таких параметров всегда возвращает 255.
Открытые строковые параметры передаются занесением в стек сначала указателя на строку, а затем слова, содержащего атрибут размера (максимальную длину строки).
Открытые параметры-массивы передаются занесением в стек сна- чала указателя на массив, а затем слова, содержащего атрибут раз- мера (число элементов массива минус 1).
При использовании встроенного ассемблера, значение, возвра- щаемое для открытого параметра с помощью стандартной функции High, можно получить, загружая слово непосредственно под открытым параметром. В данном примере это демонстрирует процедура FillString, заполняющая строку до ее максимальной длины указанным символом.
procedure FillString(var Str: OpenString; Chr: Char); assebmler; asm LES DI,Str { ES:DI = @Str } MOV CX,Str,Str.Word[-2] { Cx = igh(Str) } MOV AL,CL CLD STOSB { установить Str[0] } MOV AL,Chr REP STOSB { установить Str[1..High] } end;