Лекции.Орг


Поиск:




Типы данных в Object Pascal




Object Pascal унаследовал от базового языка Borland Pascal все его особенности и достоинства.

Так же, как и в Borland Раscal, в Delphi все используемые типы данных можно разделить на две основные группы. К первой относятся стандартные типы, предопределенные спецификацией языка Pascal. На основе этих типов разработчик может описывать собственные типы данных, которые относятся ко второй группе.

К простым числовым типам относятся: Integer, Cardinal, ShortInt, SmallInt, LongInt, Int64, Byte, Word, LongWord, Real, Real48, Single, Double, Extended, Comp, Currency. Для процесса обучения достаточно использования Integer для хранения целочисленных значений и Real для вещественных значений.

Для символьных данных базовым является тип Char. На его основе созданы два дополнительных типа – AnsiChar и WideChar для использования двух кодировок символов ANSI и Unicode.

В Delphi 4 расширены возможности логического типа данных. Помимо базового типа Boolean можно использовать дополнительные типы ByteBool, WordBool, LongBool. Эти типы необходимы для обеспечения совместимости с функциями Windows и другими средами разработки.

Введены новые типы для хранения строковой информации. Тип AnsiString предназначен для создания переменных, хранящих тексты произвольной длины. Тип WideString осуществляет динамическое выделение памяти для хранения текста. Текст должен быть представлен в кодировке Unicode. Многие функции и процедуры по работе со строковыми данными отличаются от функций и процедур Турбо Паскаля (см. приложение 1 файла материалов).

Массивы стали открытыми, их размер можно задавать динамически. В четвертой версии Delphi появились многомерные динамические массивы.

Статические массивы можно описывать по старым правилам, например:

 

Var a: Array [1..5] Of Real;

 

При описании параметров функции или процедуры допускается следующий вариант:

 

Function Prim (a: Array Of Real): Real

 

Массивы в функции передаются как динамические, то есть вместе с адресом массива передается и число элементов массива.

В Object Pascal длина динамических массивов определяется во время выполнения программы. Описав переменную как a1: Array Of Real;, мы имеем указатель, который будет соответствовать массиву вещественных чисел. Память под него выделяется процедурой SetLength:

 

SetLength(a, 5);

 

В динамических массивах нумерация начинается только с 0. Хотя это по природе своей указатели, знак разыменования (^) не применяется.

Дальнейшим развитием идеи динамических массивов являются многомерные динамические массивы:

 

Var aa: Array Of Array Of Real;

 

В функции SetLength после имени переменной нужного типа можно задать сразу все размерности массива, например: SetLength(aa, 10, 5).

В практике программирования встречаются ситуации, когда передаваемое переменной значение может иметь неизвестный заранее тип данных. Для таких случаев в Delphi существует тип Variant. Вариант – тип данных, позволяющий хранить данные любых типов, кроме структурных. Переменная-вариант занимает в памяти дополнительные два байта, в которые помещается информация о действительном типе переменной. Эта информация позволяет компилятору создать код, который будет осуществлять необходимое преобразование типов на этапе прогона программы. В переменную-вариант можно поместить: целое или вещественное число; логическое выражение; строку; время и/или дату; OLE-объект; массив произвольной размерности и длины. Следующий пример иллюстрирует использование вариантов.

 

Var V1, V2, V3, V4, V5: Variant;

i: Integer; s: String;

Begin

V1:= 1; V2:= 1234.5678; V3:= ‘Строка символов’; V4:= ‘1000’;

V5:= V1 + V2 + V3 // Получится число 2235.5678

i:= V1; // i = 1

s:= V3; // s = ‘Строка символов’

i:= V4; // i = 1000

s:= V5; // s = ‘2235.5678’

End;

Тип дата-время определяется идентификатором TDateTime и предназначен для хранения даты и времени. Тип дата-время занимает 8 байт и представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной – время. Над данными этого типа определены те же операции, что и над вещественными числами, а в выражениях этого типа могут участвовать константы и переменные целого и вещественного типов. Существуют стандартные процедуры и функции по работе с данными дата-время. Вот некоторые из них:

Date – возвращает текущую дату;

DateToStr (d: TDateTime) – преобразует дату в строку символов;

DateTimeToStr(d: TDateTime) – преобразует дату и время в строку символов;

Time – возвращает текущее время;

TimeToStr(T: TDateTime) – преобразует время в строку.

Исключительные ситуации

Теоретически, можно создать приложение, в котором ошибки отсутствуют. На практике вероятность возникновения ошибки при выполнении приложения напрямую зависит от его сложности. Исключительные ситуации возникают при некорректных действиях программы: при делении на ноль, при попытке открыть несуществующий файл, при выходе за пределы выделенной области динамической памяти и т.д.

Помимо проблем с самой программой, сбой может возникнуть и в операционной системе. Он может быть вызван программными или аппаратными причинами.

При разработке приложений в Delphi программист имеет возможность использовать несколько механизмов, обеспечивающих обработку исключитель­ных ситуаций. Это и специальные операторы языка Object Pascal и классы, предназначенные для программирования реакции на ошибки.

Исключительная ситуация – это нештатное событие, которое может повлиять на дальнейшее выполнение программы. Современный компилятор выдает код, который перехватывает любое такое событие, предотвращает нежелательные последствия, сохраняет необходимые данные о состоянии программы. С точки зрения Object Pascal исключительная ситуация – это объект.

Для обработки исключительных ситуаций предназначен класс Exception.

Тип Exception порождает многочисленные дочерние типы, соответствую­щие часто встречающимся случаям ошибок ввода/вывода, распределения памяти и т. п. Exception и его потомки представляют собой исключение из правила, предписывающего все объектные типы именовать с буквы “Т”. Имена потомков типа Exception начинаются с”Е”.

Приведем примеры классов, обрабатывающих исключительные ситуации:

EOutOfMemory – недостаточно места в куче;

EOutOfResources – нехватка системных ресурсов;

EInvalidPointer – недопустимый указатель;

EDivByZero – ошибка целочисленного деления на ноль;

ERangeError – число или выражение выходит за допустимый диапазон;

EIntError – любая ошибка в целочисленных вычислениях;

EInvalidOp – неверная операция;

EZeroDivide – попытка деления на ноль;

EOverflow – переполнение с плавающей точкой;

EСonvertError – ошибка преобразования в функциях StrToInt или StrToFloat;

С перечнем стандартных классов исключений можно познакомиться в справочной литературе или в справочной системе, встроенной в Delphi.

Для обработки исключений в Object Pascal предусмотрен механизм защищенного блока:

 

Try

<операторы>

Except

<обработчики исключений>

Else

<операторы>

End;

 

Порядок выполнения операторов:

1) сначала выполняются операторы секции Try … Except;

2) если операторы выполнены без возникновения исключительной ситуации, работа защищенного блока на этом прекращается и управление получает оператор, стоящий за End;

3) если при выполнении части Try возникло исключение, управление получает соответствующий обработчик в секции Except, а если таковой не найден – первый из операторов, стоящих за словом Else.

Имеется возможность использовать эту конструкцию без части Else.

 

Например:

Try

Z:= X/Y;

Except

Z:= 1.1e+38;

End;

 

В блоке Except могут располагаться обработчики исключений:

 

On <класс исключения> Do <оператор>;

 

Здесь On, Do – ключевые слова; <класс исключения> – класс обработки исключения; <оператор> – любой оператор Object Pascal, кроме оператора передачи управления Goto на метку вне блока Except. Имя класса служит своеобразным ключом выбора, а собственно обработка осуществляется оператором, стоящим за Do. Обработчик исключения – совокупность операторов On <класс исключения> Do <оператор>, определяющая действия программы в зависимости от класса исключения

Поиск нужного обработчика осуществляется с начала списка вниз до тех пор, пока не встретится класс, способный обрабатывать исключение данного типа. Если подходящего класса не обнаружено, управление передается операторам, стоящим за словом Else, а если таковых нет, выполняется умалчиваемая обработка исключения.

 

Try

...

Except

On ERangeError Do...;

On EDivByZero Do...;

On EIntError Do...;

End;

 

Среда Delphi при каждой исключительной ситуации перехватывает управление программой. Такое поведение среды отменяется с помощью опции Tools/Environment Options, где на странице Preference нужно отменить переключатель Break on exception.

Если для программиста важен лишь сам факт возникновения исключения и несущественен тип связанной с ним ошибки, он может опустить в секции Except … End обработчики вместе со словом Else, оставив в ней лишь необходимый код реакции на любую ошибку:

 

Try

...

Except

ShowMessage(‘Ошибка!’);

...

End;

Приведение типов данных

На операции с переменной определенного типа компилятор обычно налагает ограничения, разрешая выполнение только тех операций, которые характерны для указанного типа данных. Иногда компилятор автоматически осуществляет приведение типов, например при присвоении целого значения действительной переменной. В Delphi существуют операции приведения типов IS и AS.

В операции IS определяется, принадлежит ли данный объект указанному типу или одному из его потомков. Выражение

 

AnObject IS TMyClass

 

возвращает True, если переменная AnObject ссылается на образец объектного типа TMyClass или одного из его потомков.

Сама по себе IS не является операцией задания типа. В ней лишь проверяется совместимость объектных типов. Для корректного приведения типа объекта применяется операция AS:

 

With AnObject AS TMyClass Do...

 

В операции AS сначала проверяется совместимость типов с помощью операции IS. Если типы несовместимы, запускается обработчик исключительной ситуации. Таким образом, в конструкции AS операция явного приведения типа оказывается заключенной в безопасную оболочку.





Поделиться с друзьями:


Дата добавления: 2016-11-18; Мы поможем в написании ваших работ!; просмотров: 1378 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Либо вы управляете вашим днем, либо день управляет вами. © Джим Рон
==> читать все изречения...

827 - | 692 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.