Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
системный анализ и управление.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
613.89 Кб
Скачать

Совместимость типов данных

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

Ниже дан пример, показывающий как узнать цифровой код, соответствующий букве «А» латинского алфавита:

procedure TForm1.Button1Click(Sender: TObject);

var

AChar : Char;

AnInteger : Integer;

begin

AChar := 'A';

AnInteger := Integer(AChar);

Label1.Caption := IntToStr(AnInteger);

end;

В этом примере выражение Integer(AChar) есть указание компилятору преобразовать значение переменной AChar типа Char в значение типа Integer. Такое преобразование необходимо постольку поскольку мы не можем присвоить значение типа Char переменной целого типа. Если бы мы сделали такое присваивание, минуя операцию приведения типа, компилятор выдал бы сообщение «Incompatible types: 'Integer' and 'Char'».

Приведение типов, однако, возможно не всегда. Рассмотрим следующий код:

procedure TForm1.Button1Click(Sender: TObject);

var

Pi : Double;

AnInteger : Integer;

begin

Pi := 3.14;

AnInteger := Integer(Pi);

Label1.Caption := IntToStr(AnInteger);

end;

Здесь мы пытаемся трактовать данные типа Double как данные типа Integer. Это недопустимо. Компилятор выдаст сообщение «Invalid typecast». Для преобразования вещественного значения в целочисленное необходимо использовать функции Trunc, Floor, или Ceil.

Примечание.

Функция Trunc возвращает целую часть вещественного числа

Функция Floor округляет вещественное до ближайшего целого снизу

Функция Ceil округляет вещественное до ближайшего целого сверху

Для преобразования типа указателя используется оператор as. (Указатели рассматриваются в следующем разделе, а использование оператора as объясняется ниже в разделе "Ключевые слова классов is и as."

Указатели

Указатель суть адрес переменной в памяти компьютера. Говорят, что он указывает на переменную. Таким образом, указатель косвенно связан с реальными данными.

Новый термин: Указатель есть переменная, которая содержит адрес памяти, по которому записано значение другой переменной.

Рассмотрим пример. Допустим, что в некоторую подпрограмму надо передать адрес записи. Определить адрес экземпляра записи можно с помощью оператора @ следующим образом:

var

MLRecord : TMailingListRecord;

APtr : Pointer;

begin

{ Заполним запись данными. }

APtr := @MLRecord;

SomeFunction(APtr);

end;

Переменная APtr (ее тип есть Pointer) используется для запоминания адреса записи MLRecord. В данном случае мы имеем дело с так называемым нетипизированным указателем или указателем без типа. Нетипизированный указатель просто есть адрес переменной. Существуют и типизированные указатели. Допустим что нам необходимо определить специальный тип указателей на записи TMailingListRecord. Объявление типизированного указателя имеет вид:

type

PMailingListRecord = ^TMailingListRecord;

TMailingListRecord = record

FirstName : string;

LastName : string;

Address : string;

City : string;

State : string;

Zip : Integer;

end;

Здесь тип PMailingListRecord определяется как указатель записи типа TMailingListRecord. Необходимость применения в программах типизированных указателй возникает довольно часто. В следующем разделе мы рассмотрим примеры их использования.

ПРИМЕЧАНИЕ: В приведенном выше фрагменте кода поля записи объявлены как длинные строки. Если переменные типа TMailingListRecord надо будет хранить в файле, такое объявление полей не подходит. Это связано с тем, что все записи файла должны иметь одинаковый размер (число байт). Длинные строки имеют переменную длину, поэтому нет гарантии того, что все записи будут одинаковы по длине. Если записи будут храниться в файле, для объявления строковых полей следует использовать короткие строки с явной спецификацией длины.