- •1. Абстрагирование типов
- •1.1. Понятие типа данных
- •1.1.1. Простые типы
- •1.1.2. Абстрактные типы
- •2. Идентификация объектов
- •2.1. Именование
- •2.2. Указание
- •2.2.1. Организация адресного пространства оперативной
- •2.2.2. Понятие указателя
- •2.2.3. Действия над указателями
- •2.2.4. Связывание идентификатора объекта с его
- •3. Время жизни объекта. Классы памяти
- •3.1. Понятие “времени жизни” объекта
- •3.2. Классы памяти
- •3.2.1. Статическая память
- •3.2.2. Автоматическая память
- •3.2.3. Динамическая память
- •4. Динамические структуры данных
- •4.1. Метод вычисляемого и хранимого адреса.
- •4.2. Понятие динамической структуры данных
- •4.3. Линейные динамические структуры данных (списки)
- •4.3.1. Основные виды списков
- •4.4. Односвязные списки
- •4.4.1. Включение узла в начало списка
- •4.4.2. Создание списка из n узлов за счет добавления
- •4.4.3. Создание списка из n узлов за счет добавления
- •4.4.4. Исключение узла из начала списка
- •4.4.5. Перестановка указателя
- •4.4.6. Поиск в списке узла по заданному условию
- •4.4.7. Включение нового узла в список за тем узлом, на
- •4.4.8. Исключение из списка узла за тем узлом, на
- •4.4.9. Исключение из списка узла, на который предварительно
- •4.4.10. Разрушение списка
- •4.4.11. Программный модуль, реализующий операции
- •4.5. Односвязные циклические списки
- •4.6. Двусвязные списки
- •4.6.1. Включение нового узла в список за тем узлом, на
- •4.6.2. Исключение из списка узла, на который
- •4.7. Ортогональные списки (мультисписки)
- •4.8. Разнородные списки
- •4.9. Управление динамической памятью
- •4.9.1. Администратор кучи
- •4.9.2. Алгоритмы выделения участков памяти по запросу
- •4.9.3. Фрагментация
- •4.9.4. Накопление мусора
- •4.9.5. Висящие ссылки
- •5. Множественная интерпретация объектов
- •5.1. Совместимость типов. Приведение и преобразование типов
- •5.2. Методы совмещения типов
- •5.2.1. Запись с вариантной частью
- •5.2.2. Использование директивы absolute
- •5.2.3. Параметры без типа
- •5.2.4. Открытые массивы
- •5.2.5. Наложение масок с помощью указателей
- •6. Рекурсивные структуры данных
- •6.1. Итерация и рекурсия в программировании
- •6.1.1. Понятие рекурсии
- •6.1.2. Итеративная и рекурсивная схема организации
- •6.2. Задача о “ханойских башнях”
- •6.3. Виды рекурсивных структур данных
- •6.3.1. Арифметические выражения
- •6.3.2. Динамические линейные структуры данных: списки
- •6.3.3. Иерархические линейные структуры данных: наборы
- •6.4. Эффективность рекурсивных вычислений
- •7. ИерархическиеНелинейные структуры данных.Деревья
- •7.1. Деревья общего вида
- •7.2. Бинарные деревья
- •7.3. Представление бинарных деревьев
- •7.3.1. Представление бинарных деревьев на статической
- •7.3.2. Представление бинарных деревьев на
- •7.4. Алгоритмы обхода бинарных деревьев
- •7.5. Виды бинарных деревьев
- •7.5.1. Сбалансированные деревья
- •7.5.2. Дихотомические деревья (деревья поиска)
- •7.5.3. Деревья выражений
- •7.6. Программный модуль, реализующий операции
- •Список рекомендуемой литературы
5. Множественная интерпретация объектов
5.1. Совместимость типов. Приведение и преобразование типов
Языки программирования со строгой типизацией построены на основе соблюдения концепции типов, в соответствии с которой все операции, определенные в языке, могут применяться только к операндам совместимых типов. Два типа считаются совместимыми, если:
оба ини есть один и тот же тип;
оба вещественные;
оба целые;
один тип есть тип-диапазон второго типа;
оба являются типами-диапазонами одного и того же базового типа;
оба являются множествами, составленными из элементов одного и того же базового типа;
один тип – есть тип-строка, а другой – тип-строка или символ;
один тип есть любой указатель, а другой – нетипизированный указатель;
оба есть процедурные типы с обинаковым типом результата (для функций), количеством параметров и типом взаимно соответствующих параметров.
Два объекта совместимы по представлению, если размеры их элементов хранения равны. Объектысовместимы по присваиванию, если в элемент хранения объекта одного типа может быть занесено значение элемента хранения другого объекта или значение выражения. Совместимость по присваиванию реализуется через приведение и преобразование типов.
Приведение типавозможно только для объектов, совместимых по представлению. Приведение типа состоит в следующем: определяя тип объекта, мы определяем представление (структуру) элемента хранения объекта данного типа. Но если“взглянуть”на образ объекта в памяти с точки зрения машинного представления другого типа, то можно трактовать тот же самый элемент хранения как принадлежащий другому типу. Для этого используются функции приведения типов:
Функция приведения:
Имя_типа ( Имя_переменной )
Имя_типа ( Выражение ).
Функции приведения типа определены как для стандартных, так и для пользовательских типов. Функции приведения типов могут использоваться как в левой, так и в правой части оператора присваивания, т.к. приведение типа не изменяет внутреннего представления объекта, а изменяет только его интерпретацию.
Type |
| ||||
Rec = array [1…4] of byte; |
| ||||
Var A:Rec;L: longint; b: byte;w: word; |
| ||||
begin |
| ||||
А[1]: = …; А [2]: =…; А [3]: =…; А[4]: =…; |
{ инициализация массива } | ||||
L: = LongInt ( А ); |
{ приведение типа Rec к типу LongInt в правой части оператора присваивания } | ||||
. . . |
| ||||
L: = 123456; |
{ инициализация переменной L } | ||||
b: =Rec ( L ) [3]; |
{ приведение типа LongInt к типу Rec в правой части оператора присваивания } | ||||
Rec ( L ) [1]: = 10; |
{ приведение типа LongInt к типу Rec в левой части оператора присваивания } | ||||
. . . |
| ||||
w:=word( -6 ); |
{ приведение типа Integer к типу Word: w = 65530 ( см. 1.1.1 ) } | ||||
end. |
|
Преобразование типаизменяет внутреннее представление объектов, т.е. их элементы хранения. При выполнении преобразования к типу большей мощности, у которого размер элемента хранения больше, значения атрибутов объекта будут целиком записаны в младшие байты. Если выполняется преобразование к типу меньшей мощности, от элемента хранения объекта берутся только младшие байты. Таким образом, в результате преобразования типа длина внутреннего представления объекта может как увеличиться, так и уменьшиться.
Преобразование типа может быть явным, неявным и автоопределенным. Неявное преобразованиевозможно в выражениях, составленных из вещественных и целочисленных переменных, переменные типаINTEGERавтоматически преобразуются к типуREAL, и все выражение в целом приобретает вещественный тип.Явные преобразованиясвязаны с использованием специальных функций преобразования, определенных в языке, аргументы которых принадлежат одному типу, а значения - другому.
function Chr( X: byte ): char; |
{ возвращает символ с заданным порядковым номером X } |
function Ord( X:любой порядковый тип): longint; |
{ возвращает порядковый номер, соответ- ствующий значению X порядкового типа } |
function Odd( X:любой порядковый тип): boolean; |
{ проверяет, является ли аргумент нечетным числом } |
function Round( R: real ): longint; |
{ округляет значение R вещественного типа до ближайшего целого } |
function Trunc( R: real ): longint; |
{ усекает значение вещественного типа путем отбрасывания дробной части } |
function Hi( X: word ): byte; |
{ возвращает старший байт аргумента X } |
function Lo( X: word ): byte; |
{ возвращает младший байт аргумента X } |
Автоопределенное преобразованиесвязано с использованиемтолько в правой части оператора присваиванияфункций преобразования вида:
Имя_типа ( Имя_переменной )
Имя_типа ( Выражение ).
Функции преобразования типа определены как для стандартных, так и для пользовательских типов.
Var L: longint;W: word; |
|
begin |
|
integer ( ‘d’ ); |
{ преобразованием типа Char к типу Integer } |
byte ( 534 ); |
{ преобразование типа Word к типу Byte } |
. . . |
|
W:=word ( L ); |
{ преобразование типа LongInt к типу Word } |
. . . |
|
end. |
|