Заголовок модуля и связь модулей друг с другом
Заголовок модуля состоит из кодового слова Unit и следующего за ним имени модуля. Если, например, имеем заголовок Unit Global, то исходный текст соответствующего модуля должен размещаться в дисковом файле GLOBAL.PAS. Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением Uses <список модулей>
Здесь:
Uses - кодовое слово (англ. использует);
<список модулей> - список модулей, с которыми устанавливается связь; элементами списка являются имена модулей, отделяемые друг от друга запятыми, например: Uses Crt, Graph, Global;
Если предложение Uses... используется, оно должно открывать раздел описаний основной программы или следовать сразу за кодовым словом Interface в модуле.
Интерфейсная часть
Интерфейсная часть открывается кодовым словом Interface. В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и/или другим модулям.
При объявлении глобальных блоков в интерфейсной части пишется только их заголовок, например:
Unit Cmplx;
Interface
Type
Complex = Record
Re: Real;
Im: Real;
End;
Procedure AddC (X, У: Complex; Var R: Complex);
Procedure MulC (X, У: Complex; Var Z : Complex);
Если теперь в основной программе написать предложение Uses Cmplx; то в программе станут доступными тип Complex и две процедуры - Addc и Mulc из модуля Cmplx.
Исполняемая часть
Исполняемая часть начинается кодовым словом Implementation и содержит тела процедур и функций, объявленных в интерфейсной части. В этой части могут также объявляться локальные для модуля объекты: вспомогательные типы, константы, переменные и блоки, а также метки, если они используются в инициирующей части..
Но если заголовок блока приводится в полном виде, т.е. со списком формальных параметров и объявлением результата, он должен совпадать с заголовком, объявленным в интерфейсной части, например:
Unit Cmplx;
Interface
Type
Complex = Record
Re: Real;
Im: Real;
End;
Procedure AddC (X, У: Complex; Var Z : Complex);
Implementation
Procedure AddC;
Begin
Z.Re:= Х.Rе + Y.Re;
Z.Im:= X.Im + Y.Im;
End;
End.
Инициирующая часть
Инициирующая часть завершает модуль. Она может отсутствовать вместе с начинающим ее словом Begin или быть пустой - тогда за Begin сразу следует признак конца модуля (кодовое слово End и следующая за ним точка). В инициирующей части помещаются ис полняемые операторы, содержащие некоторый фрагмент программы. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Unit FileText;
Interface
Procedure Print(S: String);
Implementation
Var
F: Text;
Const Name = 'output.txt’;
Procedure Print;
Begin
WriteLn(F, S);
End;
{ Начало инициирующей части }
Begin
Assign(F, Name);
Rewrite(F);
{ Конец инициирующей части }
End.
59. Ключи и директивы компилятора Турбо-Паскаля.
Позволяют управлять процессами компиляции программы. Директива представляет собой комментарий со специальным синтаксисом: начинается с {$, далее пишется имя директивы (одна или несколько букв) и параметры.
В Турбо-Паскале 7.0 существует три основных вида директив:
- Директивы - переключатели. С их помощью, указывая символ (+) или (-), можно разрешать или запрещать тот или иной режим.
- Директивы с параметрами. Позволяют задавать компилятору параметры, такие как имена подключаемых файлов, размеры памяти, выделяемые под определённую задачу, и так далее.
- Условные директивы. Позволяют организовывать так называемую "условную компиляцию" частей исходного текста, благодаря чему скомпоновать программу определённым образом.
Все директивы, кроме директив-переключателей, должны иметь по крайней мере один пробел между именем директивы и параметром.
Чтобы не прописывать директивы компилятора в тексте программы можно воспользоваться пунктом "Options" меню ИПО и далее подпунктом "Compiler". Но при этом все изменения будут иметь силу при всех последующих компиляциях других программ.
Директивы-переключатели
Различаются по диапазону своего действия на глобальные и локальные:
• Глобальные - влияют на ход компиляции и выполнение всей программы,
• локальные - только на определённую часть программы.
Глобальные директивы могут быть объявлены в разделе объявлений и соглашений прежде, чем будет использовано хотя бы одно из следующих зарезервированных слов: Uses, Label, Const, Type, Procedure, Function, Begin, а Локальные директивы могут быть объявлены в любом месте программы или программного модуля.
При необходимости можно сгруппировать комментарии из нескольких директив, разделённых запятой: {$A+, B-}.
Директивы:
Выравнивание данных - (Word Align Data)
{$A+}
Тип глобальный. Делает возможным переключение между выравниванием на границу слова или байта. (Для 8086 выравнивание на границу слова игнорируется, однако для 80X86 выравнивание на границу слова означает более быстрое выполнение, поскольку адресация по всем элементам, имеющим размер в слово (чётная адресация) происходит за один цикл вместо двух. {$A+} не влияет:
1. на переменные размером в байт,
2. на поля структур или элементы массивов.
Директивы с параметрами
Включение файла для компиляции (Include Directories).
{$I < имя файла >}
Тип локальный. Сообщает компилятору о необходимости включить в компиляцию названный файл. Текст файла вставляется сразу за директивой. Расширение по умолчанию .PAS. Турбо-Паскаль допускает одновременно не более 15 входных файлов. Значит допускается вложенность до 15-ти уровней. Так же включаемый файл не может указываться в середине раздела операторов. Это означает, что все операторы между Begin и End раздела операторов должны быть в одном файле.
Компоновка объектного файла. (Object Directories).
{$L < Имя-файла >}
Тип локальный. Предписывает компилятору использовать указанный файл (.Obj) при компоновке компилируемой программы или модуля.
Директива {$L} используется для компоновки кода Ассемблера для подпрограмм, описанных External.
Размеры выделяемой памяти (Memory Sizes).
{$M < размер стека >, < размер динамической области >}.
Тип глобальный. Размер-стека - целое число от 1024 до 65520. Для модуля размер- стека игнорируется (модуль использует стек основной программы). Размер динамической области - целое число от 0 до 65360. Директива {$M} при использовании в Unit не оказывает влияния на компиляцию.
Условные директивы
Установить условие (Conditional Defines).
{$ Define < условие >}
Определяет условия, которые можно использовать в операторах условной компиляции.
Установить условие - значит с помощью данной директивы ввести некоторое слово, которое затем будет управлять компиляцией какого- либо фрагмента программы. За условием не должно следовать ничего кроме }.
Пример:
{$Define Debug}
. . . . . . . . . . . . . .
{$Ifdef Debug}
Writeln(‘Отладка’);
{$Endif}
60. Указатели и динамическая память.
Понятие динамической памяти. Объявление указателей. Выделение и освобождение динамической памяти. Использование указателей. Процедуры и функции для работы с динамической памятью.
Динамическая память - это оперативная память ЭВМ, предоставляемая Турбо-Паскалевой программе при её работе, за вычетом сегмента данных (64 К), стека (обычно 16 К) и собственно тела программы. По умолчанию размер динамической памяти определяется всей доступной памятью ЭВМ и, как правило, составляет не менее 200 - 300 Кбайт.
Указатель - это переменная, которая в хранит качестве своего значения адрес байта памяти.
В 8086 адреса задаются совокупностью двух шестнадцатиразрядных слов - сегмента и
смещения. Сегмент - участок памяти, имеющий максимальную длину 64 К и начинающийся к физического адреса, кратного 16 (то есть 0, 16, 32, 48 и т.д.). Смещение - указывает, сколько байт от начала сегмента нужно пропустить, чтобы обратиться по нужному адресу. Фрагмент памяти в 16 байт называется параграфом. Сегмент адресует память с точностью до параграфа, а смещение - с точностью до байта.
Объявление указателей
Как правило, в Турбо-Паскале указатель связывается с некоторым типом данных (типизированные указатели).
Type
PerPnt = ^PerRec;{указатель на переменную типа PerRec}
PerRec = Record
Name: String;
Job: String;
Next: PerPnt;
End;
Var
P1: ^Integer;
P2: ^Real;
В Турбо-Паскале можно объявлять указатель и не связывать его с конкретным типом данных:
Var
PP: Pointer;
Указатели такого рода называют нетипизированными. В них удобно размещать данные, структура которых меняется по ходу работы.
В Турбо-Паскале можно передавать значения только между указателями, связанными с одним и тем же типом данных.
Var
P1,P2: ^Integer;
P3: ^Real;
PP:Pointer;
Begin
P1:= P2; {- верно}
P1:= P3; {- неверно}
но можно сделать так:
PP:= P3;
P1:= PP;
так как ограничение не распространяются на нетипизированные указатели. Но подобные операции часто путают программиста и чреваты смысловыми ошибками.