CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мысли о Паскале

Владислав ДЕМЬЯНИШИН nitromanit@mail.ru

(Продолжение, начало см. МК № 46, 51—52, 4, 6—7, 10 (165, 170—171, 175, 177—178, 181))

Символьные массивы

Расскажу немного об одномерных массивах, состоящих из элементов типа Char. Если в качестве индекса символьного массива используется ограниченный целый тип, то такие массивы называются строками, например:

Pascal имеет некоторые дополнительные средства для работы с такими массивами. Во-первых, имеется возможность записывать конкретные значения строковых массивов с помощью изображения строки и использовать их в присваиваниях и передаче параметров:

Изображение строки (то, что справа) строится из цепочки символов, составляющих строковый массив, и заключается в одинарные кавычки (апострофы). Если необходимо задать апостроф внутри самой строки, то он удваивается. Допускается формирование строк с использованием десятичных кодов символов и специальных обозначений (см. главу «Символьный тип» в МК № 51 (170)). В этом случае строка составляется в виде слитной последовательности различных способов представлений символов, чередующихся в произвольном порядке, например:

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

То допустимы следующие операции:

В результате выполнения этой программы на экран дисплея будет выведено сообщение: Строковый массив.

Обратите внимание, что в присваиваниях строк символьным массивам необходимо точное соответствие длин строк размерам массивов. Так, в символьный массив S1 длиной 9 символов заносится строковое изображение (значение), состоящее тоже из 9 символов.

Аналогично инициализируется и символьный массив S2. Следует иметь в виду, что операция конкатенации для символьных массивов НЕ допускается в правых частях присваиваний; например, оператор

вызовет ошибку компиляции Error 26: Type mismatch (несоответствие типов), независимо от размера символьного массива S. В подобных случаях необходимо использовать строки переменной длины (читайте далее «Строковые типы»).

Ошибки в работе с регулярными типами

Обсуждение регулярных типов я хотел бы завершить рассмотрением вопросов, связанных с ошибочными ситуациями, возникающими при их использовании. В первую очередь это относится к достаточно частым случаям вывода значения индекса за допустимые пределы. В простейших вариантах такие ошибки обнаруживаются при компиляции программы. Например, для массива

обращение вида

Является некорректным, так как индекс «11» не принадлежит ограниченному типу 0..10, и вызовет прекращение трансляции с выдачей соответствующего диагностического сообщения Error 76: Constant out of range (значение вне допустимого предела).

Однако оператор присваивания

компилятор не может квалифицировать как ошибочный, так как его корректность зависит от текущих значений индексов j и j–1. Если в процессе выполнения программы значение j лежит в диапазоне от 1 до 10, то этот оператор выполнится правильно; в противном случае будет зафиксирована ошибка времени выполнения.

Следует понимать, что при трансляции подобных операторов компилятор обычно вставляет в объектный код программы операции проверки на принадлежность текущих значений индексов допустимым диапазонам. Такие вставки увеличивают размер кода и замедляют выполнение, но делают программу более надежной.

Turbo Pascal позволяет частично управлять характером формирования объектного кода, относящегося к доступу к элементам массивов, посредством директивы компилятора $R. Так, если в тексте программы указана директива {$R+} то компилятор будет порождать код, производящий такие проверки. Этот режим принят по умолчанию. Директива {$R-} приводит к «облегченному» объектному коду, не содержащему проверок. В последнем случае выход индекса за пределы допустимого диапазона НЕ ПРИВЕДЕТ к прекращению работы программы; обращение к «несуществующему» элементу массива даст неопределенный результат, что может сделать ход дальнейшего выполнения программы непредсказуемым, т. е., возможно, вы сможете наблюдать на экране всякие блипы, свипы и другие спецэффекты :-).

Как правило, при создании своих программ я применяю следующую тактику. В процессе разработки, отладки и тестирования необходимо сохранять действие директивы {$R+} в пределах всей программы. Только на завершающих этапах разработки, когда после ряда проверок я уже более-менее уверен в правильности и надежности работы программы, я позволяю себе установить директиву {$R-}, сокращающую объектный код. При этом можно сохранить действие проверок для некоторых потенциально опасных участков программы, заключив их в такой блок:

Строковые типы (строки)

Строковые типы являются одним из наиболее полезных и часто используемых расширений языка Pascal, реализованных в Turbo Pascal’е. Строковый тип обобщает понятие символьных массивов, так как позволяет динамически изменять длину строки.

Строковый тип данных определяет множество символьных цепочек произвольной длины (от нуля до заданного числа). Для определения строкового типа используется служебное слово string, вслед за которым в квадратных скобках указывается максимальная длина строки, например:

В приведенном примере переменная MyLine в качестве своего значения может иметь любую последовательность символов (каждый из которых имеет стандартный тип char) произвольной длины (в пределах от 0 до 80 символов). Значение строковой переменной может быть присвоено оператором присваивания, либо прочитано из некоторого файла, например, текстового (см. главу «Файловые типы и ввод-вывод») соответствующей процедурой, например:

В качестве изображения строк может использоваться та же конструкция, что и для символьных массивов. Кроме того, аналогично таким массивам для строк определена операция конкатенации +.

В определении строкового типа максимальная длина строки может быть задана целым числом или константой целого типа (но не типизированной константой!) Указание максимальной длины может быть опущено; в этом случае подразумевается число 255 (такая длина является максимально возможной для строковых типов). Так, следующие два описания эквивалентны:

Таким образом, важнейшее отличие строк от обычных символьных массивов заключается в том, что строки могут динамически изменять свою длину. Например, если после присваивания

длина строки составит 15 символов, то следующее присваивание:

увеличит ее длину до 29 символов.

Замечу, что механизм динамических строк реализован в Turbo Pascal’е весьма просто, поэтому память под переменные строкового типа отводится по максимуму, а используется лишь часть этой памяти, реально занятая символами строки в данный момент. Более точно, для описанной строковой переменной длиной N символов отводится N+1 байтов памяти, из которых N байтов предназначены для Рис. 1хранения символов строки, а один байт — для значения текущей длины этой строки. Это можно пояснить следующим рисунком (Рис. 1).

Элементы строки нумеруются целыми числами, начиная с единицы. Приведенный рисунок показывает, что байт с текущей длиной строки можно считать как бы нулевым ее элементом. Это обстоятельство иногда используется для определения текущей длины строки, например:

Хотя в некоторых специальных случаях такой доступ является оправданным, для определения текущей длины строки, как правило, используют стандартную функцию Length, единственный параметр которой — выражение строкового типа или строковая переменная. Эта функция возвращает целое значение, равное текущей длине строки-параметра.

Кроме операции конкатенации, значения строковых типов могут сопоставляться через операции сравнения: < (меньше), <= (меньше или равно), > (больше), >= (больше или равно), = (равно), <> (не равно), при выполнении которых действует следующие правила:

• более короткая строка всегда меньше более длинной;

• если длины сравниваемых строк равны, то происходит поэлементное сравнение символов этих строк с учетом лексикографической упорядоченности значений стандартного символьного типа char. Например, строка ‘ABCD’ меньше строки ‘ACDE’, так как первые их символы равны (‘A’), а вторые не равны, символ же ‘C’ имеет ASCII-код больший, чем код символа ‘B’.

Замечу, что в случае присваивания строковой переменной строкового выражения с длиной большей, чем максимально допустимая для данной переменной, происходит обрубание строки до максимальной длины этой переменной. Эта ситуация не считается ошибочной, поэтому прерывания выполнения программы в данном случае не происходит, например:

Доступ к отдельным элементам строки производится аналогично доступу к элементам одномерного символьного массива.

Однако следует помнить: изменяя содержимое строки как массива, нужно корректировать длину этой строки в соответствии с ее новыми размерами. Так, в примере

продемонстрирована распространенная ошибка. Предполагается, что данная программа должна сформировать строку из 26 символов, содержимым которой является последовательность заглавных букв латинского алфавита. Однако на экран будет выведен только один символ ‘A’. Суть совершенной ошибки заключается в том, что присваивание значений элементам строки НЕ ВЛИЯЕТ на ее текущую длину, которая была установлена равной единице при первом присваивании. Чтобы получить желаемый результат, надо переписать цикл так:

(здесь мы каждый раз увеличиваем строку Str на один символ, при этом автоматически корректируется длина строки), или просто вставить перед оператором WriteLn(Str) строку Str[0]:=char(26); что заранее установит длину строки Str равной 26 символам.

Кроме стандартной функции Length, язык Turbo Pascal имеет еще несколько полезных стандартных процедур и функций для работы со строками.

Эта функция выполняет сложение строк-параметров, которых может быть произвольное количество. Каждый параметр может быть выражением строкового типа или строкой. Если длина результирующей строки превышает 255 символов, то она обрубается до 255 символов. Данная функция эквивалентна операции конкатенации, хотя работает медленнее.

Функция возвращает часть строки S длиной Count символов, начиная с символа под номером Index.

Эта процедура удаляет из строки S фрагмент этой строки длиной Count символов, начиная с символа с номером Index.

Процедура вставляет строку Source в строку S, начиная с символа Index строки S.

Данная функция производит поиск строки-фрагмента Substr в строке S и возвращает номер позиции найденного фрагмента в строке S.

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov