Руководство по языку B.Pascal 7

       

Открытые строковые параметры


Открытые строковые параметры могут описываться двумя спосо- бами:

- с помощью идентификатора 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;



Содержание раздела







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий