Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Stud_1_1 / LecRus / MainPart.doc
Скачиваний:
101
Добавлен:
03.03.2016
Размер:
5.03 Mб
Скачать

Var sin : integer;

Тогда для обращения к функции синуса нужно использовать составное имя: y:=System.sin(x).

Разумеется, такие переопределения затрудняют понимание программы и применять их не рекомендуется.

Модуль Crt (Cathod ray tube - электронно-лучевая трубка) позволяет использовать все возможности дисплея и клавиатуры, включая управление режимами экрана, расширенные коды клавиатуры, цвет, окна и звуковые эффекты. Ниже перечислены некоторые процедуры и функции модуля Crt.

ClrScr (от слов Clear Screen) - очищает экран и помещает курсор в левый верхний угол.

ClrEol - очищает все символы, начиная от позиции курсора до конца строки, без перемещения курсора.

Delay(m:word) - задержка решения на m миллисекунд.

GotoXY(x,y:byte) - установка курсора в столбец , строку .

WhereX : byte - выдача номера текущего столбца.

WhereY : byte - выдача номера текущей строки.

KeyPressed : boolean - логическая функция для анализа нажатия клавиши.

ReadKey: char - функция, возвращающая символ нажатой клавиши.

Sound(Hz:word) - включение звука с частотой тона Hz в герцах.

NoSound - выключение звука.

Примечание. Процедуры и функции модуля Crt, как и модуля System, считаются предопределенными (предописанными), но не стандартными. Поскольку имя модуля System не записывается в составе фразы Uses, то формальным признаком стандартной функции или процедуры является отсутствие сообщения об ошибке от компилятора при отсутствии в программе фразы Uses.

Такое же замечание справедливо также для модулей Dos, Graph, Overlay.

Модуль Dos. С помощью этого модуля реализуется ряд программ операционной системы и программ обработки файлов. Ниже приведены несколько процедур модуля Dos.

GetDate(Var Year, Month, Day, DW : word) - считывает год, месяц, число и день недели с календаря ПЭВМ.

SetDate(Var Year,Month,Day: word) - устанавливает год, месяц и число в календаре ПЭВМ.

GetTime(Var Hour, Min, Sec, Sec100 : word) - считывает текущее время (часы, минуты, секунды, сотые доли секунды) по таймеру ПЭВМ.

SetTime(Hour, Min, Sec, Sec100 : word) - устанавливает текущее время на таймере ПЭВМ.

FindFirst - осуществляет поиск файла с заданным именем в файловой системе.

Модуль Printer. Это небольшой модуль, созданный для облегчения использования в программе устройства печати. Он описывает текстовый файл Lst и связывает его с устройством Lpt1.

Модуль Graph. Модуль реализует библиотеку из более чем 50 графических подпрограмм, выполняющих вычерчивание, закрашивание и штриховку графических изображений (точка, прямая, окружность и т.д.).

Модуль Overlay. Модуль используется для формирования оверлейных программ больших размеров, превышающих емкость доступной оперативной памяти.

М О Д У Л И П О Л Ь З О В А Т Е Л Я

Модули пользователя - это инструмент для создания больших программ, что определяется следующими их свойствами:

- каждый модуль, входящий в состав программы, может иметь объем до 64 Кбайт;

- модуль представляет собой отдельно хранимую и независимо компилируемую единицу;

- количество модулей не ограничивается, оно определяется лишь доступным объемом свободной памяти.

Модуль разделяется на три части: секция интерфейса, секция реализации и секция инициализации.

Общая структура модуля:

Заголовок модуля состоит из зарезервированного слова Unit и следующего за ним идентификатора, являющегося именем модуля. Имя модуля должно быть уникальным. Предполагается, что имя модуля совпадает с именем файла, в котором хранится данный модуль. Например, модуль с заголовком Unit BasUnit должен находиться в файле с именем 'BasUnit.pas'. Следствием последнего обстоятельства является то, что имя модуля, как и имя файла, должно состоять не более чем из восьми символов.

Интерфейсная часть начинается со служебного слова Interface. Если в данном модуле используются другие модули (стандартные или модули пользователя), то после слова Interface должно следовать предложение Uses с именами используемых модулей. Интерфейсная часть может содержать описания констант, типов, переменных, процедур и функций. Эти описания считаются глобальными, их может использовать любой другой модуль, во фразе Uses которого указано имя данного модуля.

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

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

В секции реализации могут быть свои описания констант, типов и переменных, используемых только при работе этого модуля. Здесь могут содержаться также процедуры и функции, заголовки которых отсутствуют в секции интерфейса; эти процедуры и функции недоступны для других модулей и могут быть активизированы только при работе данного модуля.

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

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

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

Здесь в модуле DesUnit размещены описания глобальных констант, типов и переменных (Des - от слова description, описание). Секция реализации этого модуля пустая. В модуле BasUnit сосредоточены базовые служебные процедуры и функции, используемые во многих других модулях (функция знака, процедуры контроля наличия файлов, двоичного поиска, группировки массивов, вывода массива на экран, удаления стека и т.п.). В модуле WinUnit записаны процедуры для организации многооконного интерфейса (включение и отключение курсора, сохранение и восстановление экрана, формирование различного типа меню и т.п.). Модули ParUnit1, ParUnit2, ParUnit3 содержат процедуры и функции, реализующие различные режимы работы программы. В основной программе Example производится выбор режима ее работы путем активизации позиций меню и обращения к соответствующим процедурам.

Компиляция модуля возможна как из интегрированной среды Турбо Паскаля (turbo.exe), так и с помощью компилятора командной строки (tpc.exe). Так как модуль не является непосредственно выполняемой единицей, то в результате его компиляции образуется дисковый файл с расширением tpu, при этом имя этого файла копируется с имени файла с исходным текстом модуля. Компиляция модуля возможна, если к началу компиляции созданы все нестандартные модули с расширением tpu, имена которых перечислены в предложении Uses данного модуля.

Как известно, все переменные, которые описаны в разделах Var, размещаются в двух сегментах памяти: в сегменте данных и в сегменте стека. При этом сегмент стека используется для локальных переменных, а сегмент данных – для глобальных переменных и типизированных констант.

Локальными считаются все переменные, которые описаны в блоках процедур и функций, глобальными – те, что описаны вне пределов этих блоков. Следовательно, сегмент данных используется не только для переменных, описанных в разделе Var основной программы, но и в разделах Var, расположенных в секциях интерфейса и реализации данной программы. Хотя последние две группы переменных расположены в одном сегменте памяти, но между ними имеется существенная разница:

- переменные, описанные в секции реализации, могут быть использованы лишь при работе данного модуля;

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

Разумеется, эти ограничения обеспечиваются во время компиляции программы.

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

С Х Е М А Р А С П Р Е Д Е Л Е Н И Я П А М Я Т И

П Р О Г Р А М М Ы Н А Т У Р Б О П А С К А Л Е

На следующей странице изображена схема распределения памяти ПЭВМ для программы на Турбо Паскале.

Часть памяти занимает ядро операционной системы. Остальная память предоставляется для программы пользователя.

Префиксный сегмент программы PSP (Program Segment Prefix) - это область длиной 256 байт, которая строится операционной системой при загрузке файла exe. Дальше располагается образ exe-файла, т.е. копия файла в оперативной памяти.

Каждому программному модулю соответствует сегмент его кода. Основная программа занимает первый сегмент. Дальше располагаются сегменты модулей в порядке, обратном их перечислению в предложении Uses. Последний сегмент занимает модуль System.

Размер отдельного сегмента не должен превышать 64 Кбайта.

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

Сегмент стека отводится для локальных переменных процедур и функций, размещаемых здесь при их активизации. По умолчанию размер этого сегмента 16 Кбайт, однако его можно изменить директивой компилятора $M .

Свободная память

Динамически распределяемая

область памяти

Оверлейный буфер

Сегмент стека

Глобальные переменные

Типизированные константы

Сегмент кода модуля System

Сегмент кода первого модуля

(Сегменты кода других модулей)

Сегмент кода последнего модуля

Сегмент кода основной программы

Префиксный сегмент программы

Размер динамической области памяти также можно регулировать директивой $M . По умолчанию максимальный размер этой области принимается равным 1 Мбайт. Каждая отдельная динамическая переменная может занимать область памяти размером не более 64 К.

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в папке LecRus