- •Содержание
- •Раздел 1.Подпрограммы Общие сведения
- •Процедуры Описание процедур
- •Вызов процедур
- •Процедуры без параметров
- •Процедуры с параметрами
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры-переменные без типа
- •Параметры процедурного типа
- •Использование производных типов в качестве параметров подпрограмм
- •Принцип локализации имен
- •Функции Описание функций
- •Вызов функции
- •Рекурсивные подпрограммы
- •Директивы
- •Библиотечные модули пользователя Общие сведения
- •Структура модуля Unit
- •Особенности работы с модулями
- •Подключение к программе внешнего файла
- •Раздел 2.Простейший ввод-вывод Процедуры ввода из стандартного текстового файла Input
- •248 15 4 70 Значения 1-й строки
- •11 Значения 2-й строки
- •Процедуры вывода в стандартный текстовый файл Output
- •Раздел 3.Записи Структура записи
- •Записи без вариантной части
- •Записи с вариантами
- •Оператор присоединения With
- •Константа-запись
- •Раздел 4.Множества Общие сведения
- •Конструктор множества
- •Задание множественного типа
- •Операции над множествами
- •Ввод / вывод значения множественной переменной
- •Типизованные константы-множества
- •Раздел 5.Файлы Общие сведения
- •Процедура Assign
- •Файлы с типом
- •Процедура Assign
- •Процедура Rewrite (f)
- •Процедура Write (f, v1 [, v2, … , vn])
- •Процедура Reset (f)
- •Процедура Read (f, V [, v2, …, vn])
- •Функция Eof(f)
- •Процедура Seek (f, n)
- •Функция Filepos (f)
- •Функция Filesize(f)
- •Процедура Close (f)
- •Текстовые файлы
- •Процедура Assign (f, Name)
- •Процедура AssignСrt(f)
- •Процедура Append (f)
- •Процедура Rewrite (f)
- •Процедура Reset (f)
- •Процедура Read ([f,] v1 [, v2, …, vn])
- •Процедура Readln [([f] [,] [v1, v2, …, vn])]
- •Процедура Write ([f,] e1 [, e2, …, en])
- •Процедура Writeln([f,][e1,e2, …,en])
- •Процедура Close(f)
- •Процедура SetTextBuf (f, Buf [, Size])
- •Процедура Flush (f)
- •Сравнительная характеристика представления информации в файлах с типом и текстовых файлах
- •I. Представление числовой информации.
- •II. Представление текстовой информации.
- •Файлы без типа
- •Процедуры Reset и Rewrite
- •Процедура Blockread
- •Процедура Blockwrite
- •Проверка операций ввода-вывода
- •Раздел 6.Ссылочный тип (тип указатель) Общие сведения
- •Методы работы с динамическими переменными
- •Процедуры New и Dispose
- •Процедуры Getmem и Freemem
- •Процедуры Mark и Release
- •Раздел 7.Динамические структуры данных Динамические цепочки Структура динамической цепочки
- •Формирование цепочки
- •Поиск элемента в цепочке
- •Удаление элемента из цепочки
- •Вставка элемента в цепочку
- •Линейный однонаправленный список
- •Двунаправленные списки
- •Вставка элемента
- •Создание двунаправленного кольцевого списка с заглавным звеном
- •Удаление элемента
- •Поиск элемента
- •Очереди и стеки
- •Очередь lifo
- •Очередь fifo
- •Общие сведения
- •Способы организации таблиц
- •Однонаправленный список.
- •Однонаправленный список с упорядоченными записями.
- •Однонаправленный список с отдельным хранением текста записи.
- •Представление в виде массива.
- •Двоичное дерево.
- •Двоичные деревья Структура двоичного дерева
- •Построение дерева
- •Поиск записи в дереве
- •Включение записи в дерево
- •Удаление записи из дерева
- •Раздел 8.Оверлеи Общие сведения
- •Правила оформления оверлейных программ
- •Инициализация работы оверлеев
- •Включение администратора оверлеев
- •Обработка ошибок администратора
- •Размещение оверлейного файла в ems-памяти
- •Управление оверлейным буфером
- •Литература Основная и дополнительная литература
- •Перечень наглядных пособий, методических указаний, методических материалов и используемых в учебном процессе технических средств
Процедуры Getmem и Freemem
Использование процедур Getmem и Freemem – это второй метод работы с динамическими переменными.
Вызов процедуры Getmem имеет следующий формат:
Getmem (P, Size);
Здесь P - указатель любого типа, Size – выражение типа Word.
Процедура Getmem выделяет из Heap-области (хип-область, область кучи, область динамической памяти) блок памяти заданного размера Size (порождает динамическую переменную размера Size) и адрес этого блока присваивает ссылочной переменной P. Максимальный размер блока – 65521байт (64К байта – $F (смещение)).
Для освобождения блока памяти, занимаемого динамической переменной, используется процедура Freemem:
Freemem (P, Size)
Здесь P – указатель произвольного типа, которому предварительно было присвоено значение процедурой Getmem или оператором присваивания; значение Size должно точно соответствовать размеру переменной, размещенной до этого процедурой Getmem.
Процедура Freemem уничтожает динамическую переменную P^, занимаемая ею память считается свободной, значение P становится неопределенным.
Таким образом, действие процедур Getmem/Freemem аналогично действию процедур New/Dispose – порождается и уничтожается динамическая переменная.
Пример 6.8.
Эквивалентные фрагменты программ, использующие процедуры Getmem/Freemem и New/Dispose.
Type
T = <Тип>;
Var
P: ^T;
…
B egin
New (P); Getmem (P, Sizeof(T));
… Эквивалентны …
Dispose (P); Freemem (P, Sizeof(T));
В общем случае процедуры Getmem/Freemem дают большую свободу действий по сравнению с процедурами New/Dispose, так как позволяют работать без привязки к конкретному типу переменных.
Пример 6.9.
Использование процедур Getmem/Freemem. Различная интерпретация выделенной области памяти.
Type
Zap = Record
X, Y: Integer;
End;
St = String [20];
Var
P: Pointer;
Begin
Getmem (P, 100); {Выделение блока памяти размером 100 байт, адрес
этого блока присвоен ссылочной переменной Р}
Zap(P^).X := 124; {Интерпретация выделенной области как записи –
блоку памяти, связанному с указателем Р,
присваивается тип Zap}
Zap(P^).Y := 47; {Интерпретация выделенной области как записи}
…
Real(P^) := 0.213; {Интерпретация выделенной области как Real}
…
St(P^) := ’ПРОГРАММИРОВАНИЕ’; {Интерпретация выделенной области
как строки}
…
Freemem (P, 100); {Освобождение блока памяти размером 100 байт}
…
Процедуры Mark и Release
Процедуры Mark (пометить) и Release (освободить) позволяют повысить эффективность работы с динамической памятью.
Обращение к процедуре Mark имеет следующий вид:
Mark (P1);
Здесь P1 – переменная типа указатель, ссылающаяся на переменную какого угодно типа.
Процедура Mark присваивает своему параметру P1 адрес начала свободной области динамической памяти.
Помеченная область с помощью процедур New или Getmem используется для размещения отдельных динамических переменных.
Когда данные динамические переменные окажутся ненужными, занимаемую ими память можно освободить. Для этого используется процедура Release с тем же параметром, что и в предыдущем обращении к процедуре Mark:
Release (P1);
Процедура Release освобождает память, начиная с адреса, полученного в результате выполнения последней процедуры Mark. Значение указателя P1 после выполнения процедуры Release равно Nil.
Схематически представление работы с динамической памятью без и с использованием процедур Mark/Release иллюстрирует Рисунок 6 .55.
Рисунок 6.55 - Схематическое представление работы с динамической памятью без и с использованием процедур Mark/Release
Параметр процедуры Mark нельзя использовать в качестве параметра процедур New, Getmem и его нельзя изменять (по крайней мере до его использования в соответствующей процедуре Release).
Возможна вложенность процедур Mark. Тогда каждой процедуре Mark соответствует своя процедура Release.
Пример 6.10.
Использование вложенных процедур Mark/Release.
Var
P1, P2: Pointer;
P, Q, X: ^Integer;
…
B egin
Mark (P1);
…
New (P);
…
Внешние процедуры
Mark/Release
…
Mark (P2);
…
New (X);
…
Release (P2);
…
Release (P1);
…
В одной и той же программе не рекомендуется использовать одновременно процедуры Dispose или Freemem и Mark/Release, так как это может привести к непредсказуемым результатам (механизмы управления свободной памятью для процедур Dispose, Freemem и Mark/Release существенно различаются).
В общем случае вместо любой автоматической переменной в программе можно использовать динамическую переменную.
Основное достоинство использования динамических переменных – экономия памяти компьютера.
Недостатки использования динамических переменных по сравнению с автоматическими:
удлиняется текст программы за счет использования процедур New/Dispose, Mark/Release, Getmem/Freemem;
снижается наглядность программы за счет использования переменной с указателем (динамической переменной);
снижается быстродействие программы за счет необходимости во время ее выполнения размещать порожденную динамическую переменную в памяти машины, за счет формирования значения соответствующего указателя и за счет усложнения доступа к значению динамической переменной.