- •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.2.3. Параметры без типа
Формальный параметр без типа внутри процедуры или функции не имеет типа и его перед использованием следует преобразовать к конкретному типу с помощью автоопределенного преобразования. Параметр без типапередаетсятолькопо ссылке. Внутри процедуры или функции должна быть определена маска, задающая вид интерпретации элементов фактического параметра, передаваемого в процедуру или функцию при вызове. Напомним, что маска – это тип. Размерность маски рекомендуется выбирать так, чтобы она была рассчитана на максимальное количество данных интерпретируемого типа, которое может разместиться в пределах сегмента. (Если размер маски превышает 65520 байт, на этапе компиляции выдается сообщение об ошибке). Тип фактического параметра может быть любым, но дополнительно в процедуру или функцию следует передавать истинную размерность фактического параметра.
Пример.ПросуммироватьNэлементов одномерных числовых массивов произвольной размерности.
. . . |
| ||||
Var |
{ фактические параметры - } | ||||
Ar_Byte1: array[1..200] of byte; |
{ интерпретируемые } | ||||
Ar_Byte2: array[1..2000] of byte; |
{ области } | ||||
Ar_Int: array[1..500] of integer; |
{ памяти } | ||||
|
| ||||
Function Sum( var X; n: word ): longint; |
{ X – параметр без типа, n – размерность массива } | ||||
Type |
| ||||
Xtype =array[0..65520] of byte; |
{Маска – одномерный массив типа Byte } | ||||
Var |
| ||||
summa: longint; i: word; |
| ||||
begin |
| ||||
summa:=0; |
| ||||
for i:=1 to n do |
| ||||
{ XType( X )[i] – автоопределенное преобразование элемента массива- параметра X к типу элемента массива-маски Byte } |
| ||||
summa:=summa + XType( X )[i]; |
{ интерпретация элементов массива X через маску } | ||||
Sum:=summa; |
| ||||
end; |
| ||||
|
| ||||
begin |
| ||||
. . . |
| ||||
writeln( Sum( Ar_Byte1, 200 ) ); |
| ||||
writeln( Sum( Ar_Int, 500 ) ); |
| ||||
writeln( Sum( Ar_Byte2, 2000 ) ); |
| ||||
. . . |
|
В качестве первого параметра функции Sum можно использовать массив любого типа и любой размерности. В теле функции выполняется автоопределенное преобразование элемента массива-параметра X к типу элемента массива-маскиByte. Если бы в теле функции была определена маска другого типа, например,Word, преобразование выполнялось бы к этому типу.
5.2.4. Открытые массивы
В качестве параметров-переменных процедуры или функции могут использоваться массивы и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра можно использовать массив любого размера, но содержать он должен элементы того же типа, что и открытый массив. Истинный размер массива-фактического параметра определяется с помощью встроенной функции HIGH. Открытый массив задается как обычный массив, но без указания индексов и трактуется как маска. Индексирование элементов массива-фактического параметра начинается с нуля, а максимальный индекс равен значению функцииHIGH.
. . . |
| |||
var |
{ фактические параметры - } | |||
Ar1: array[1..100] of integer; |
{ интерпретируемые } | |||
Ar2: array[1..1000] of integer; |
{ области памяти } | |||
s: integer; |
| |||
|
| |||
Procedure Sum( var X: array of integer; |
{ X – окрытый массив, его тип – } | |||
var summa: integer ); |
{ маска } | |||
Var i: word; |
| |||
begin |
| |||
summa:=0; |
| |||
for i:=0 to high( X ) do |
{ интерпретация элементов массива } | |||
summa:=summa + X[i]; |
{ через маску } | |||
end |
| |||
|
| |||
begin |
| |||
. . . |
| |||
Sum( Ar1,s ); writeln( s ); |
| |||
Sum( Ar2,s ); writeln( s ); |
| |||
. . . |
|