Типы
Тип определяет вид и диапазон значений констант, переменных, процедур
и функций. Типы также определяют размер, также как операции над
идентификаторами.
TMT Pascal предоставляет мощный набор предопределенных типов, а
также возможность определения новых типов для констант и переменных.
Имеются пять основных групп типов, которые доступны в TMT Pascal. Каждая
группа содержит типы с похожими свойствами. Вот эти типы:
- Скалярные типы.
- Скалярные типы состоят из упорядоченного набора значений.
Скалярные типы включают в себя все порядковые типы также как и
вещественные типы. Символы имеют также скалярный тип.
- Порядковые типы.
- Порядковые типы входят в состав скалярных типов. Порядковые
типы включают в себя логические, символьные, перечисляемые и
целочисленные типы. Вещественные числа не относятся к порядковому
типу.
- Процедурные типы.
- Процедурные типы содержат в памяти адрес процедуры или функции.
- Ссылочные типы (Указатели).
- Ссылочные типы хранят адрес местоположения в памяти.
Ссылочные типы могут использоваться для адресации динамических
переменных.
- Структурированные Типы.
- Структурированные типы - это типы, которые содержат несколько
компонентов. К каждому компоненту можно обращаться отдельно, или
структура может быть выбрана целиком. Примеры
структурированных типов: строки, массивы, записи, множества, файлы и
объекты.
Связанные разделы:
Логические типы
Символьные Типы
Целочисленные типы
Перечисляемые типы
Типы поддиапазона
Вещественные типы
Ссылочные типы (Указатели)
Переадресация Указателя
Типы Array (Массивы)
Строковые типы
Типы Set (Множества)
Типы Record (Записи)
Файловые типы
Процедурные типы
Объектные типы
Совместимость типов
Логические типы
Тип Boolean - порядковый. Выражения этого типа могут принимать два
значения:
True (Истина) или
False (Ложь). Выражения,
которые принимают значение логического "Да" или "Нет" принадлежат к
типу
boolean. Oператорные скобки
if, while, repeat и
другие работают с выражениями типа
boolean. Следующий фрагмент
кода,
while not KeyPressed do;
вызывает паузу в выполнении программы до тех пор, пока не будет нажата
какая-либо клавиша.
KeyPressed - процедура, объявленная в
модуле
CRT. Выражение
not KeyPressed возвращает значение
типа
Boolean, которое определяет, когда закончить цикл.
Оператор
not выполняет логическое НЕ над выражением типа
Boolean,
возвращенным процедурой
KeyPressed. Константы
True и
False объявлены в модуле
System как тип
Boolean.
Модель анализа выражений типа
Boolean управляется через
директиву компилятора
$B. Заданное по умолчанию состояние -
{$B-}, так что компилятор генерирует сокращенный код. В
состоянии
{$B +} компилятор генерирует полный код.
Символьные Типы
Символьные типы занимают в памяти один байт. Они могут содержать
любой символ
ASCII, например, от '
A' до '
Z',
от '
0' до '
9', или любой
управляющий символ. Фрагмент кода, показанный ниже, показывает
различные пути инициализации символьных переменных.
var
Number, Alpha, Bell, EofMarker: Char;
begin
Number := '5';
Alpha := 'a';
Bell := ^G;
EofMarker := #27;
end.
Символ обычно заключается в одинарные кавычки. Однако, как вы могли
заметить в вышеприведенном примере, есть еще два метода представления
символов: с помощью символа (
^) и символа числа(
#).
Используйте символ (
^) для представления управляющих кодов - символов
между
0 и
31 таблицы
ASCII. Операнд
^G
устанавливает символ под номером
7, т.к.
G - это
седьмая буква алфавита. Если
^G использовать
во время выполнения программы, то прозвучит звуковой сигнал во
встроенном в компьютер динамике.
Используйте
# для представления любого символа
ASCII. В
конце вышеупомянутого примера символ, который определен как символ
номер
27 таблицы
ASCII, присваивается переменной
EofMarker. Учтите, что
#27 - это то же самое, что и
^[.
Целочисленные типы
Целочисленные типы могут содержать как положительные, так и
отрицательные целые значения в диапазоне от
-2 147 483 648 до
2 147 483 647. Другие диапазоны также поддерживаются. Каждая
целочисленная переменная занимает два байта в памяти. Ниже приведен
список предопределенных целочисленных типов.
Целочисленные типы
Тип Диапазон Размер
Byte 0 до 255 1
ShortInt -128 до 127 1
Integer -32 768 до 32 767 2
SmallInt -32 768 до 32 767 2
Word 0 до 65 535 2
LongInt -2 147 483 648 до 2 147 483 647 4
DWORD 0 до 4 294 967 295 4
LongWord 0 до 4 294 967 295 4
Cardinal 0 до 4 294 967 295 4
На процессорах
Intel 386 и выше операции с типом
longint (4 байта)
выполняются быстрее, чем с типом
integer (2 байта). Это происходит
потому, что на этих процессорах 32-битные регистры.
Перечисляемые типы
Перечисляемые типы - это порядковые типы, которые представлены
набором значений, определенных в списке идентификаторов.
Перечисляемые типы определены следующим образом:
идентификатор [,идентификатор]
Каждый
идентификатор - это константа нового типа. Идентификаторы в
перечисляемых типах являются назначенными значениями, первое из
которых равно нулю, второе - единице и т.д. Например, следующий
перечисляемый тип содержит семь дней недели:
Type Week = (Sun, Mon, Tue, Wed, Thu, Fri, Sat);
В типе
Week, идентификатор
Sun имеет нулевое значение
(номер),
Mon равен единице,
Tue равно 2 и т.д.
Перечисление ограничено 256 элементами.
Типы поддиапазона
Типы поддиапазона ограничивают значения, допустимые для данного типа.
Поддиапазон должен содержать константы порядкового типа, а компоненты
диапазона должны быть одинакового типа. Типы поддиапазона определены
следующим образом:
выражение .. выражение;
где первое выражение - это самое малое значение диапазона, а второе
выражение - самое большое значение. Пример:
type
Digits = '0'..'9';
Values = 0..$F;
Вещественные типы
Вещественные типы данных содержат как целую, так и дробную части,
известные также как числа с плавающей запятой. Каждый вещественный
тип состоит из целой части, дробной части, и экспоненты, которая
является степенью числа десять.
TMT Pascal следует стандарту IEEE для представления числа с плавающей
запятой. Есть четыре вещественных типа данных, доступных под TMT
Pascal:
real, single, double и
extended.
Тип Real.
Типы
Real располагаются в диапазоне от
2.9 x 10E-39 до
1.7 x 10E38 и имеют от 11 до 12 значащих цифр. Каждый требует 6 байт
для хранения в памяти. Внутренний формат типа
Real TMT
Pascal отличается от Borland.
Тип Single.
Типы
Single располагаются в диапазоне от
1.5 x 10E-45
до
3.4 x 10E38 и имеют от 6 до 7 значащих цифр. Каждый требует 4 байт
для хранения в памяти.
Тип Double.
Типы
Double располагаются в диапазоне от
5.0 x 10E-324
до
1.7 x 10E308 и имеют от 15 до 16 значащих цифр. Каждый требует
8 байт для хранения в памяти.
Тип Extended.
Типы
Extended, наибольшие из всех вещественных типов,
располагаются в диапазоне от
1.9 x 10E-4951 до
1.1 x 10E4932 и имеют 19 значащих цифр. Каждый требует 10 байт для хранения в памяти.
Ссылочные типы (Указатели)
Ссылочные типы содержат адрес идентификатора или динамически
распределенной памяти. Ссылочные типы требуют двойного слова
(32 бита) для хранения в памяти. В защищенном режиме указатели
содержат 32-битное смещение и сегмент - приемник для
сегмента данных. Таким образом указатели подобны целочисленному
типу
Longint. Чтобы распределять динамические переменные,
см. главу Heap Management. Ссылочный тип должен указывать на
определенный тип. Ссылочные типы определены следующим образом:
^Typename
Ссылочному типу может быть присвоена константа
nil. Когда
присвоена константа
nil, указатель не обращается ни к какому
местоположению в памяти.
Pointer (Указатель) - предопределенный
нетипизированный ссылочный тип.
Pointer совместим со всеми
другими ссылочными типами.
TMT Pascal поддерживает следующие математические операции с
указателями.
Пример:
p2 := p1 + 1000;
p1 := p2 - $FF;
inc(p1, 15);
dec(p2);
Здесь
p1 и
p2 - переменные типа
Pointer.
Переадресация Указателя
Переадресация используется, чтобы обратиться к объекту, на который
указывает ссылочный тип. Используйте
Переменная^
Для переадресации ссылочного типа. Важно обратить внимание, что
ссылочные типы указателя должны указывать на определенное
местоположение памяти прежде, чем они будут переадресованы.
Иначе данные, на которые ссылаются, будут не определены.
Типы Array (Массивы)
Типы
array (массивы) содержат последовательность компонентов
различного типа. Каждый компонент обозначен индексом, который также
имеет определенный тип. Массивы определены следующим образом:
array [Ordinalindex [,OrdinalIndex]] of Arraytype;
где
OrdinalIndex - это один из следующих порядковых типов:
integer, char, enumeration, Boolean или
subrange.
Идентификатор
Arraytype может быть любого типа, включая другой
тип
array. Примеры массивов:
array [Boolean] of Char;
array [Char] of Integer;
array [1..255] of Double;
Квадратные скобки используются, чтобы обратиться к компоненту массива.
Обращение к элементу массива определено следующим образом:
ИмяМассива [выражение [,выражение]];
Где
Выражение имеет тот же тип, что и индекс. Выражение должно
также лежать в пределах диапазона индекса. Ошибка во время выполнения
программы генерируется, если значение выражения лежит вне индексного
диапазона и проверка диапазона включена,
$R+.
Строковые типы
Строки - это массивы символов. Максимальный размер строкового типа -
255 символов. В следующем примере объявлены две строковые переменные,
одна с определенным размером, другая с максимальным размером 255
символов.
S1: String[100];
S2: String;
Переменная
S1 содержит только первые 100 символов строки.
S2
может содержать до 255 символов. TMT Паскаль резервирует один байт,
который содержит размер строки. Этот байт размера сохранен в байте,
который предшествует первому символу строки. Например,
S2 := 'Hello World';
Представлен в памяти как
#11,Hello World
Все операции со строками, также как функции и процедуры, которые
возвращают или изменяют строки, усекают строки, которые превышают
255 символов.
Типы Set (Множества)
Типы
Set определяют поднабор множества значений. Порядковое
значение элементов множества должно располагаться между 0 и 255.
- Символы
- Перечисляемые тип
- Положительные целые числа
- Поддиапазон трех вышеупомянутых
- Порядковые типы
Каждое значение в множестве определено одним битом, поэтому каждое
значение подобно типу
Boolean. Примеры множеств:
type
set of 0..7;
set of '0'..'9';
set of Char;
set of Word; - Это не может быть обработано ВР
Типы Record (Записи)
Записи - это структуры, которые содержат компоненты различных типов.
Каждый компонент записи называется полем. Различные разделы - части
записей, могут иметь многократные определения. Тип
Record
определен следующим образом:
record
СписокПолей
end
где СписокПолей определен как:
[[ФиксированнаяЧасть] | [ФиксированнаяЧасть;] [ПеременнаяЧасть]];
где ФиксированнаяЧасть - это:
Поле [; Поле];
где Поле - это
идентификатор [,идентификатор] : ТипИдентификатора;
ПеременнаяЧасть определена как:
case
[идентификатор:] ИмяТипа of Вариант [;Вариант];
где Вариант это:
Caserange [,Caserange] : (СписокПолей);
где Caserange - это:
выражение [..выражение];
С надлежащим пониманием типов записей TMT Паскаля, могут быть
определены очень мощные типы. Примеры записей:
type
Coordinate = record
x,y : Integer;
end;
Values = record
case Way: Boolean of
True : (RValue : Extended);
False : (IValue : Longint);
end;
Для обращения к полям записи определяют переменную соответствующего
типа (в примере это тип
Coordinate). После имени переменной
ставится точка (.), а затем - имя поля. В вышеуказанном примере
обращение к полям
х, у будет выглядеть следующим образом:
Coordinate.x
Coordinate.y
Файловые типы
Файловые типы - это структуры, которые содержат компоненты любого
типа, кроме другого файлового типа. Файловые типы определены
следующим образом:
File [of Componenttype];
Если
Componenttype не определен, и составляющие типы не
обозначены, тогда файл является нетипизированным. Нетипизированные
файлы используются для обращения к файлам независимо от их структуры.
Текстовые файлы относятся к файлам символов ASCII, сгруппированных в
строки. Текст - это предопределенный тип.
Определения записей, используемые внутри TMT Паскаля, также объявлены
в модуле
System.
TFileRec используется для типизированных и нетипизированных
файлов.
type TFileRec = object
magic : ^TFileRec;
name : string;
handle : Longint;
rec_len : Longint;
state : %flags;
rd_proc,
wr_proc : function (F: Longint; Buf: Pointer; Len: Longint; var Act:
Longint): Longint;
procedure check_magic;
procedure check_opened;
procedure check_readable;
procedure check_writeable;
procedure io_error(code: Integer);
end;
PFileRec = ^TFileRec;
TTextRec - это внутренний формат переменной текстового типа.
type TTextRec = object(TFileRec)
buffer : array [0..63] of Char;
index : Longint;
len_buf : Longint;
max_buf : Longint;
buf_adr : Pointer;
function Eof: Boolean;
procedure init;
procedure fill_buf;
procedure fill_chr;
procedure skip_spaces;
procedure get_n_char(n: Integer);
end;
PTextRec = ^TTextRec;
Внутренний Тип
%flags объявлен как:
type %flags = set of %file_state;
где
%file_state - это:
type %file_state =
(
%file_readable, //00h
%file_writeable, //01h
%file_opened, //02h
%file_assigned, //03h
%file_eof, //04h
%file_text, //05h
%file_file, //06h
%file_fileof, //07h
%file_tty, //08h
%file_special, //09h
%file_settextbuf //0Ah
);
Процедурные типы
Процедурные Типы содержат адрес процедуры или функции. Процедурные
Типы сопровождаются блоками данных и кода и определены следующим
образом:
procedure идентификатор [(СписокПараметров)];
или
function идентификатор [(СписокПараметров)] : ВозвращаемыйТип;
ВозвращаемыйТип - это тип данных, возвращаемых функцией.
СписокПараметров определен как:
Параметр [;Параметр];
где Параметр - это:
[var] идентификатор [,идентификатор] : ИмяТипа;
var определяет переменный параметр. Примеры процедурных типов:
procedure PrintAt(X, Y: Integer; S: String);
function Max(Value1, Value2: Integer) : Integer;
procedure GetDir(Driver: Byte; var S: String);
Важно!
Обратите внимание, что в отличие от указателей,
процедурные типы занимают 8 байт. Помимо адреса надлежащей процедуры,
сохраняется локальная граница. Это позволяет формировать процедурные
типы вне местных процедур.
Объектные типы
Объектные Типы подобно записям содержат компоненты различных типов.
Однако, в отличие от записей, объекты могут содержать методы и быть
унаследованы. Полное описание объектных типов может быть найдено в
разделе
Расширения ООР
Совместимость типов
Есть три уровня совместимости типов. Каждый уровень наряду с его
ограничениями перечислен ниже в порядке от наиболее ограниченного к
наименее ограниченному.
Эквивалентные Типы.
Два типа эквивалентны, только если они оба определены в одном и том
же описании типа. Это описание должно быть из следующих:
- Имя типа объявлено в описании типа.
- Переобъявленный тип.
- Неназванный тип, используемы в описании.
Совместимые Типы.
Два типа совместимы, если выполняется одно из следующих условий:
- Оба эквивалентны.
- Один тип является поддиапазоном другого.
- Оба являются поддиапазоном какого-либо типа.
- Оба типа целочисленные.
- Оба типа вещественные.
- Оба типа строковые.
- Один тип символьный или массив символов, а другой тип строковый.
- Оба типа множественные и их базовые типы совместимы.
- Оба - массивы символов с одинаковой длиной.
Присваиваемые Типы.
Тип присваиваем другому типу, если выполняется одно из следующих условий:
- Оба типа совместимы.
- Вещественному типу присваивается целый тип.
- Строковому типу присваивается символьный тип.
- Строке присваивается массив символов количеством менее 256.
- Оба процедурных типа имеют одинаковые параметры.