Главная » Free Pascal » Обработка строковой информации Free Pascal

0

Free Pascal поддерживает работу со строковыми константами и переменными четырех типов: String, PChar, AnsiString и WideString.

Тип String (строка) появился в самой первой версии Паскаля. Строки такого

типа сейчас принято называть короткими строками, т. к. максимальное количест- во символов, присутствующих в значениях этого типа, не превосходит 255. Таким ограничением короткие строки обязаны способу их представления в оперативной памяти компьютера. Короткое строковое значение, содержащее k символов, зани- мает в памяти k + 1 байт, в первом из которых хранится текущая длина строки (т. е. число k), а в следующих — однобайтовые значения кодов символов в кодировке ASCII. Короткие строки с фиксированной максимальной длиной, задаваемой поль- зователем, объявляются следующим образом:

type

S20 = String [20]; var

s1 : S20;

s2 : String [35];

Строка s1, объявленная неявно, может принимать любые строковые значения, содержащие не более 20 символов. Превышение указанной длины влечет за собой отсечение лишних хвостовых символов без какого-либо предупреждения. Для хра- нения значения строковой переменной s2, объявленной явно, во время работы про- граммы будет выделено 36 байт, первый из которых резервируется под указание фактической длины.

К любому символу короткой строки можно обратиться по индексу — порядко- вому номеру символа в строке:

± s1[1] — первый символ в строке s1;

± s1[2] — второй символ в строке s1

и т. д.

В байте с именем s1[0] находится текущая длина строки s1. Если старый доб- рый Паскаль позволял некоторые вольности с извлечением длины по явному обра-

щению к нулевому байту (например, m:=ord(s1[0]);) и даже изменение этой дли- ны по прихоти программиста (например, s1[0]:=char(5);), то в более поздних системах программирования такие попытки блокируются. Для определения длины текущего значения следует использовать системную функцию Length (например, m:=Length(s1);).

До тех пор, пока строковой переменной не присвоено значение, в байте длины

находится 0, и такая строка называется пустой. Очистить строку, т. е. сделать ее пустой, можно и с помощью следующего присваивания:

s1:=”;

Присваивание строке нового значения "уничтожает" предыдущее значение, хо- тя чистка лишних хвостовых байтов при этом не делается (для уменьшения време- ни выполнения операции):

s1:=’Hello, world!';

s1:=’Привет!';

И хотя после второго присвоения значения меньшей длины в байтах s1[8], s1[9], … сохранились буквы ‘world!’, к новому значению они уже отношения не имеют — просто занимают место на выделенном участке памяти. Если переменной s1 в последующем будет присвоено более длинное значение, то байты s1[8], s1[9], … будут затерты новыми данными.

Если указание о длине в явном или неявном объявлении строковой переменной

отсутствует, то для хранения ее значения в памяти выделяется 256 байт, что равно- сильно объявлению s3:String[255]. В языке Free Pascal появился эквивалент тако- го объявления:

var

s3:ShortString;

Строки типа PChar были заимствованы Паскалем из языка C, где используется другой способ хранения строковых данных: вместо указания длины, предшест- вующей символьному значению, цепочка символов s1, s2, …, sk завершается при- знаком конца строки — нулевым байтом. Для строк такого типа в англоязычной литературе существуют термины Zstring (аббревиатура от Zero string) и null- terminated string. В языке Free Pascal длина строк типа PChar не ограничена и ос- новное их назначение — передача строковых данных в программы, написанные на языке C или C++. С точки зрения внутреннего представления имя строковой пере- менной типа PChar является указателем на строковое значение, располагаемое ком- пилятором в "куче", где каждый символ представлен однобайтовым кодом ASCII. Обращение к такому указателю по имени строки типа PChar соответствует выборке или изменению значения всей строки. К символам строки типа PChar также можно обращаться по индексу, который отсчитывается от 0. Большинство операций, вы- полняемых над строками типа PChar, сосредоточено в модуле Strings. Читатели, знакомые с функциями обработки строк по языкам C, C++, найдут много похожих названий функций и процедур, встречавшихся в заголовочном файле string.h.

Строки типа AnsiString представляют собой данные символьного типа неогра- ниченной длины. Они уже фигурировали в языке Object Pascal и активно использо- вались в разных версиях визуальных сред Delphi. Их внутреннее представление в системе Free Pascal довольно хитроумное. Имя переменной типа AnsiString также является указателем на значение, находящееся в куче, но в отличие от PChar этот указатель типизирован, т. е. "знает" не только адрес, но и длину значения. В куче наряду со значением строки хранится еще и счетчик ссылок на данное значение. Если со значением связана единственная активная переменная s1 типа AnsiString, то в счетчике ссылок находится 1. Если значение переменной s1 присваивается другой переменной s2 того же типа, то содержимое s1 не копируется на новое ме- сто. Вместо этого выполняются следующие операции:

± из содержимого счетчика ссылок s2 вычитается 1. Если счетчик ссылок стал равен 0, то область памяти, занимавшаяся предыдущим значением s2, освобо- ждается;

± к содержимому счетчика ссылок на значение s1 прибавляется 1, и указатель s1 переписывается в s2. Таким образом, при повторном присвоении длинного зна- чения в куче сохраняется единственный экземпляр данного, и на этом эконо- мится время выполнения операции.

Строковые данные типа WideString (дословно — "широкая" строка) напоми- нают по способу хранения значения типа PChar, т. е. они закачиваются признаком конца строки. Однако для кодировки символов широких строк используются двух- байтовые коды таблицы Unicode. Признак конца строки, содержащий нулевой код, здесь также двухбайтовый.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии