16 Вопрос
Кроме перечисленного типа можно вводить ограниченные или интервальные типы.
Пример:
Type
Year = 1900..2000;
Letter = "A".."Z";
Левая и правая константы задают диапазон значений и их называют соответственно верхней и нижней границей ограниченного типа.
Константы в определении ограниченного типа должны относиться к одному и тому же базовому типу (целому, символьному, порядковому).
Базовый тип констант определяет допустимость операций над данными ограниченного типа.
Пример:
Type
Days = (Mo, Tu, We, Th, Fr, Sa, Su);
WeekEnd = Sa..Su;
Var
W: WeekEnd;
. . . . . . . . . . . .
Begin
. . . . . . . . . . . .
W:= Sa;
. . . . . . . . . . . ,
Так как тип-диапазон наследует все свойства базового типа, но с ограничениями, связанными с его меньшей мощностью,
то Ord(W) вернёт значения S , в то время как Pred(W) приведёт к ошибке.
И перечисляемый и ограниченный типы относят к простому типу.
Простой тип - это такой тип, который в некоторый момент времени хранит только одно значение.
Low (функция)
Возвращает самое низкое значение диапазона параметра.
Объявление
Function Low(X) : <тип параметра>;
Режим
Windows, Real, Protected
Замечания
Тип результата равен типу параметра X или индексному типу параметра X, где X является идентификатором типа или ссылкой на переменную.
Для этого типа: Low возвращает
Перечислимый тип самое низкое допустимое значение типа
Массив самое низкое допустимое значение индекса массива
Строковый тип возвращает 0
Открытый массив возвращает 0
Строковый параметр возвращает 0
{ Пример программы для функции Low }
var
A : array[1 .. 100] of Integer;
I : Integer;
type TDay = (Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday, Sunday);
const DayName : array[TDay] of String [2] =
('Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс');
var
Day : TDay;
Hours : array[TDay] of 0 .. 24;
begin
for I := Low(A) to High(A) do
A[I] := 0;
for Day := Low(TDay) to High(TDay) do
begin
Write('Сколько часов проработал в ', DayName[Day], ' ? ');
ReadLn(Hours[Day]);
end;
end.
High (функция)
Возвращает самое высокое значение в диапазоне параметра.
Объявление
Function High(X) : <тип параметра>
Режим
Windows, Real, Protected
Замечания
Тип результата равен типу параметра X или индексному типу параметра X, где X является идентификатором типа или ссылкой на переменную.
Для этого типа: High возвращает
Перечислимый тип самое высокое допустимое значение типа
Массив самое высокое допустимое значение индекса массива
Строковый тип обьявленную длину строки
Открытый массив значение типа Word, содержащее число элементов в
открытом массиве минус один.
Строковый параметр значение типа Word, содержащее число элементов в
строковом параметре минус один
{ Пример программы для функции High }
procedure Sum(X : array of Real) : Real;
var
I : Word;
S : Real;
begin
S := 0;
for I := 0 to High(X) do
S := S + X[I];
Sum := S;
end;
Приведение типов переменных
Ссылка на переменную одного типа может быть преобразована в
ссылку на переменную другого типа с помощью приведения типов пе-
ременных.
┌─────────────┐ ┌───┐ ┌──────────┐ ┌───┐
приведение ───>│идентификатор├──>│ ( ├──>│ссылка на ├──>│ ) ├─>
типов │ типа │ └───┘ │переменную│ └───┘
└─────────────┘ └──────────┘
Когда приведение типов применяется к ссылке на переменную,
ссылка на переменную рассматривается как экземпляр типа, предс-
тавленного идентификатором типа. Размер переменной (число байт,
занимаемых переменной) должен быть равен размеру типа, представ-
ленного идентификатором типа. После приведения типа переменной
можно указать один или несколько квалификаторов, если это допус-
кается указанным типом.
Примечание: Определять допустимость приведения типа
должен программист.
Приведем несколько примеров приведения типов переменных:
type
TByteRec = record
lo, hi: byte;
end;
TWordRec = record
low, high: word;
end;
TPtrRec = record
ofs, seg: word;
end;
PByte = ^Byte;
var
B: byte;
W: word;
L: longint;
P: pointer;
begin
W := $1234;
B := TByteRec(W).lo;
TByteRec(W).hi := 0;
L := $1234567;
W := TWordRec(L).lo;
B := PByte(L)^;
P := Ptr($40,$49);
W := TPtrRec(P).seg;
Inc(TPtrRec(P).Ofs,4);
end.
Обратите внимание на использование для доступа к младшим и
старшим байтам слова типа TByteRec: это соответствует встроенным
функциям Lo и Hi, только над левой частью в операции присваивание
может выполняться приведение типа. Отметим также, что для доступа
к младшим и старшим словам длинного целого, а также к смещению и
адресу сегмента указателя используются типы TWordRec и TPtrRec.
Borland Pascal также полностью поддерживает приведение типов
для процедурных типов. Например, имея следующие описания:
type
Func = function(X: Integer): Integer;
var
F: Func;
P: Pointer;
N: Integer;
вы можете построить следующие присваивания:
F := Func(P); { присвоить F значение процедурного типа в P }
Func(P) := F; { присвоить P значение процедурного типа в F }
@F := P; { присвоить F значение-указатель в P }
P := @F; { присвоить P значение-указатель в F }
N := F(N); { вызвать функцию через F }
N := Func(P)(N); { вызвать функцию через P }
Обратите в частности внимание на операцию получения адреса
@, которая применяется к переменной процедурного типа. Ее можно
использовать в левой части присваивания. Кроме того, отметьте
приведение типа на последней строке при вызове функцию через пе-
ременную-указатель.