Объявления
Имя каждого идентификатора должно быть объявлено в вашем исходном коде.
Объявляя идентификатор для какого-либо типа, например переменной или
константы, Вы определяете ее размер и свойства.
Паскаль - это структурированный язык. Каждая программа, модуль,
процедура и функция определяют блок. Блоки могут быть вложенными в
другие блоки. Структура блока производит интерпретацию идентификаторов,
таких как константы, переменные, типы и так далее. Идентификаторы
могут иметь различные значения.
Если идентификатор объявлен, то он определен от точки его описания до
конца внутреннего блока, который содержит описание. Это - область действия
идентификатора. Переопределение идентификатора не позволяется в
пределах того же самого блока, в котором он был объявлен. Только во
вложенных блоках идентификатор может быть переопределен. Однако новый
идентификатор не ссылается на старый идентификатор. Фактически старый
идентификатор удаляется до конца вложенного блока.
В дополнение к традиционному синтаксису Паскаля, TMT Паскаль также
позволяет локальные объявления блока. Они описаны ниже в руководстве.
Идентификатор не может быть вставлен в программу до его объявления. Имя типа может
использоваться как основной тип указателя, если имя объявлено в
описании типа, которое содержит ссылку. Например:
type
CoordPtr = ^Coordinate;
Coordinate = record;
x, y : Integer;
end;
Как Вы можете видеть -
Coordinate упомянута до ее объявления.
Вышеупомянутое объявление допустимо вследствие того, что
Coordinate
объявлена в том же самом описании типа что и
CoordPtr.
Есть несколько объявлений, возможных под TMT Паскалем. Они включают:
Описание типа
Описание метки
Описание констант
*Описание переменных
*Описания локального блока
Описание типа
Описанию типа предшествует зарезервированное слово
type.
type Идентификатор = ТипИдентификатора;
Идентификатор - фактическое имя нового типа, который Вы
определяете.
ТипИдентификатора - тип идентификатора.
ТипИдентификатора может быть следующим:
Другой тип String Pointer File
Поддиапазон array set function
Перечисляемый record procedure Text
Некоторые примеры описания типов:
type
Float = Extended;
Int = Integer;
Filename = array [0..8] of Char;
Fnameptr = ^Filename;
Seasons = (Winter, Spring, Summer, Autumn);
Описание метки
TMT Паскаль допускает два типа меток. Метка может быть или
положительным целым числом (0 ... 2147483647) или идентификатором.
Перед использованием меток в вашем коде, метка должна быть объявлена.
Описанию метки предшествует зарезервированное слово
label.
label Идентификатор [, идентификатор];
Описание констант
Есть два типа констант, и TMT Паскаль интерпретирует их по разному.
Константы, которые объявлены без указания типа, не могут быть изменены в программе.
Типизированные константы - это те же самые переменные (описанные ниже),
однако они содержат начальное значение. Эти константы могут быть
изменены в программе. Описанию константы предшествует
зарезервированное слово
const.
const Идентификатор [:ТипИдентификатора] = Выражение;
Идентификатор - фактическое имя определенной константы.
ТипИдентификатора, который не является обязательным, определяет
тип константы. Если тип определен, то константа - это та же самая переменная
с начальным значением.
Выражение присваивается константе и должно быть
вычислено во время компиляции. Ниже приведены нетипизированные
константы, которые не могут быть изменены:
const
Digit = '0'..'9';
MaxSize = 100;
Msg = 'This is a string constant';
Типизированные константы могут иметь любой тип, кроме файла, процедуры
или функции. Некоторые примеры типизированных констант:
type
Coordinate = record
x,y : Integer;
end;
const
Originpos : Coordinate = (x:0; y:0);
Name : String = 'Hello World!';
StrSize : Integer = 100;
Ary : array[False..True] of Byte = (10,15);
См. также:
Целые и вещественные числовые константы
Строковые константы
Описание переменных
Переменные хранят данные во время выполнения программы. Описанию
переменной предшествует зарезервированное слово
var.
var Идентификатор [,Идентификатор]: ТипИдентификатора;
Идентификатор - фактическое имя определяемой переменной.
ТипИдентификатора определяет тип переменной. Переменные, в
отличие от констант, изначально не инициализированы. Их значение до
инициализации не определено. Также возможно определить абсолютный
адрес переменной. Следующий
ТипИдентификатора определяет
зарезервированное слово
Absolute.
var
Идентификатор [,Идентификатор]: ТипИдентификатора absolute Адрес;
Адрес может быть или идентификатор или целое число, указывающий
смещение. Если
Адрес - идентификатор, тогда TMT Паскаль
вычисляет его смещение. Абсолютные карты переменной для адреса,
следующего после слова
Absolute. Этот идентификатор должен
быть объявлен до использования
Absolute. Если переменная
абсолютна из другого, оба адреса содержат те же самые данные,
однако типы могут быть различны. Следующее - примеры описания переменных.
const
BuffSize = 900000; // 900K
var
HugeBuff : array [0..BuffSize] of Char;
i,j,k,l : Integer;
Buffptr : Longint;
p : Pointer absolute Buffptr;
Alpha : Char;
Absolute может обращаться к полям записей и объектов. Также,
адрес глобального поля записи/объекта может использоваться в пределах
инициализации нетипизированных констант. Кроме того, можно
использовать рекурсивную инициализацию:
type rec = record
next: ^rec;
buffer: array [1..10] of char;
buf_adr: pointer;
end;
const cyclic: rec = (next: @cyclic; buf_adr: @cyclic.buffer);
Описания локального блока
Очень часто необходимо объявить местную переменную с короткой
продолжительностью жизни. Каждый должен делать это в разделе описаний
программы или в теле процедуры. Это не всегда удобно, особенно если
есть огромная программа со сложным алгоритмом. Для этого случая
специальная конструкция была включена TMT Паскаль. Она называется
Локальным или Вложенным Блоком. Такой блок - обычное составное
объявление, которое начинается с нового зарезервированного слова
declare, и состоит из двух частей - описания и выполнения:
declare
<часть описания>
begin
<часть выполнения>
end;
Эти операторные скобки могут использоваться в любом месте, где
допустимо использование структур.
Пример:
program DeclDemo;
{$ifndef __CON__}
Эта программа должна компилироваться для MS-DOS,
OS/2 или консольного режима Win32
{$endif}
var
b: Integer;
begin
declare // первый локальный блок
var
a: Integer;
procedure pr_int (a: Integer);
var
i: Integer;
begin
for i := 1 to a do
declare //второй локальный блок
var
k: Integer;
begin
k := a div i;
Writeln (a, ' div ', i, ' = ', k);
end;
end;
begin
a := 1;
Writeln (a);
b := 10;
pr_int (b);
end
end.
Этот пример содержит два локальных блока, один из них находится в
теле программы, а другой находится в теле процедуры. Первый локальный
блок объявляет переменную
а и процедуру
pr_int, второй объявляет одну
локальную переменную
k. Таким образом сфера
а и
pr_int - интерьер
"первого локального блока", а сфера
k - интерьер "второго локального
блока".