В системе Турбо Паскаль определен ряд стандартных модулей TPU Они обеспечивают функции ввода-вывода, работы со строками, управления экраном дисплея, работы с принтером и т.п. В процессе работы компилятора система генерирует коды только для строк, не содержащих вызов каких-либо функций, а вместо генерации кодов для этих функций подключает (уже в процессе компоновки) соответствующий стандартный модуль. Рассмотрим назначение этих модулей подробнее:
1. SYSTEM TPU включает все стандартные процедуры и функции, которые объявлены в стандартном ANSI Паскале (Ln, Exp, Sin, Cos и т.д.), а также обеспечивает работу с командной строкой. По сути, это системная библиотека Турбо Паскаля.
2. DOS.TPU включает стандартные процедуры для работы с функциями операционной системы MS-DOS и объявления вспомогательных глобальных переменных.
3. CRT.TPU содержит библиотеку процедур, которые работают с клавиатурой и дисплеем, обеспечивая полное управление ими и получение информации об их состоянии.
- 131 -
4. PRINTER.TPU обеспечивает быстрый и легкий доступ к принтеру.
5. GRAPH.TPU дает возможность использовать более пятидесяти графических высокоуровневых процедур.
6. OVERLAY.TPU обеспечивает полную поддержку и администрирование оверлейных структур программ.
7. WIN.TPU является приложением к модулю CRT. Предоставляет новые возможности при работе с окнами.
8. TURBO3.TPU, GRAPH3.TPU обеспечивают совместимость программ, написанных на Турбо Паскале версии 3.0 и использующих его процедуры, функции и глобальные переменные. В нашей книге эти модули рассматриваться не будут.
Ряд модулей включаются в библиотеку поддержки языка Турбо Паскаль, которая именуется TURBO.TPL (Turbo Pascal Library). Состав этой библиотеки может изменяться с помощью утилиты TPUMOVER.EXE. Помните: модуль SYSTEM.TPU всегда должен быть в составе TURBO.TPL.
Подключение модулей TPU к программе осуществляется на этапе трансляции строкой примерно следующего вида:
USES
DOS, CRT, Printer;
Модуль System не надо объявлять — он включается в тело программы по умолчанию.
Многие из системных модулей вводят глобальные переменные, которые размещаются в той же области памяти (сегменте данных) что и глобальные переменные использующей модули программы. При этом уменьшается объем свободного пространства для хранения переменных (сегмент данных ограничен размером 64K). Потребление сегмента данных системными модулями показано в таблице:
Модуль -- Объем привносимых переменных
System -- 664 байт
CRT -- 20 байт
DOS -- 6 байт
Printer -- 256 байт
Overlay -- 24 байт
Graph -- 1070 байт
Turbo3 -- 256 байт
Graph3 -- 0 байт
- 132 -
Часть III. Средства языка Турбо Паскаль
Глава 7. Массивы, записи и множества в деталях
При программировании реальных задач необходимым условием удачного решения является правильный выбор формы представления данных. Каждый тип данных Паскаля определяет и виды действий над данными, и от того, насколько программное представление соответствует структуре обрабатываемых данных, зависит размер и эффективность программы. В этой главе мы рассмотрим основные структурные типы Турбо Паскаля и особенности их применения.
7.1. Массивы (Array) и работа с ними
Массив — это регулярная структура данных, объявляемая специальной конструкцией языка
Array [ диапазоны индексов ] of ТипКомпонентов
Наиболее часто массив используют для хранения значений векторов, например:
VAR
V : Array [ 1..3 ] of Real;
объявляя тем самым структуру из трех значений типа Real, проиндексированных заданным диапазоном целых чисел (V[1], V[2] и V[3]). Если индексация компонентов (элементов) массива задается числовым диапазоном, как в приведенном примере, то надо соблюдать лишь два требования: во-первых, диапазон не должен принадлежать типу LongInt, т.е. он обязан «уместиться» максимум в типе Word, a во-вторых, произведение количества компонентов массива, задаваемого диапазоном индексов, на размер компонента в байтах, не может превышать 65520 байт (почти 64K). Последнее требование является общим не только для всех массивов, но и для прочих структур данных. Таким образом, могут быть описаны массивы
- 133 -
Array [9..99] of Char; { массив из 91 элемента }
Array [-10.. 10] of LongInt; { массив из 21 элемента }
Это очень удобно, так как позволяет не заботиться о приведении индексов к диапазону 1..N, как, например, приходится поступать при работе с Фортраном или некоторыми версиями Бейсика.
В общем случае ничто не обязывает объявлять диапазон индексов массива числами. В качестве индексов можно использовать любые перечислимые типы, как встроенные, так и вводимые. Индексы могут задаваться по-прежнему диапазоном, а если диапазон соответствует всему типу, то можно вместо него просто записать имя этого перечислимого типа:
TYPE
Monthtype = ( January, February, March, April, May );
ComplectType = Array [ MonthType ] of Word;
SpringType = Array [ March..May ] of Word;
VAR
Complect : ComplectType; { пять элементов типа Word }