
- •Var «Имя переменной »:set of «базовый тип » ;
- •Построение множеств :
- •Массив множеств.
- •Операция со множествами .
- •Операция включения и исключения одиночного элемента: реализуется с помощью .
- •Достоинство и недостатки множеств:
- •1 Способ : через определение соответствие типа
- •2 Способ : в разделе описания переменных:
- •Массивы записей
- •Записи со стартовыми значениями .
- •Вложенные записи
- •Оператор присоединения.
- •Вариантные записи .
- •Глобальные и локальные переменные
- •Вызов подпрограмм .
- •Формальные и фактические параметры .
- •Параметры подпрограмм.
- •Параметры – переменные.
- •Параметры –константы.
- •Функции
- •Обособленный вызов функций
- •Вложенные подпрограммы
- •Дальний и ближний вызов подпрограмм . Дальний вызов
- •Ближний вызов.
- •Подпрограмма с не типизированными параметрами .
- •Опережающее описание подпрограмм .
- •Рекурсивные подпрограммы
- •Внешние подпрограммы.
- •Процедуры и функции как параметры подпрограмм .
- •Расположение блоков программы в памяти .
- •Сегментный и адресный типы данных .
- •Динамическое распределение памяти
- •Динамические структуры используются в следующих случаях :
- •Ссылочный тип данных . Работа с адресами.
- •Синтаксис описания переменой ссылочного типа :
- •Основные операции с ссылочными переменными
- •Операция разыменования к указателям типа pointer .
- •Присваивание разыменование ссылок
- •Операция сравнивания
- •Процедуры работы с динамической памятью
- •Выделение блока памяти.
- •Процедура освобождения памяти
- •Выделение блока памяти из кучи
- •Процедура очистки памяти
- •Процедура маркировки адреса динамической памяти.
- •Процедура освобождения памяти
- •Функции анализа свободной памяти в «куче»
- •Управление размерами динамической памяти и размером стека.
- •Предопределенные указатели Администратор дп(кучи) .
- •Особенности при выделение блоков
- •Анализ ресурсов дп при размещение динамических данных.
- •Линейные динамические списки.
- •Определение элемента однонаправленного линейного списка.
- •Организация динамических списков и операции над ними.
- •1.Организация списка типа стек.
- •2.Формирование списка типа очередь(fifo).
- •Добавление элемента
- •Просмотр списка
- •Вставка элемента
- •Удаление узла из существующего списка.
- •Удаление текущего узла списка.
- •Удаление всего списка.
- •Открытие файла на запись (перезапись).
- •Буфер ввода-вывода.
- •Запись данных в файл.
- •Чтение данных из файла(read,readln).
- •Файлы ввода/вывода. Текстовые файлы. Процедуры работы с текстовыми файлами. Запись и чтение в текстовый файл информации различного типа (числовая, строковая). Процедуры работы с текстовым файлами.
- •Запись и чтение символьной информации.
- •Запись и чтение числовой информации
- •Запись и чтение строковой информации.
- •Типизированные файлы.
- •Доступ к компонентам файла осуществляется с помощью следующих процедур:
- •Добавление записи в типизированный файл
- •Удаление записи
- •Другие функции используемые при прямом доступе
- •Не типизированные файлы и операции над ними.
- •Структура модуля .
- •Var «библиотечные переменные »
- •Раздел реализации.
- •Компиляция модулей .
- •Подключение модулей
- •Закольцованность модуля.
Процедуры работы с динамической памятью
Выделение блока памяти.
Для организации динамических структур данных в качестве базовых элементов используются ссылочные указатели, при этом в динамической памяти (кучи) выделяются блоки памяти, необходимого размера, адреса которых хранятся в ссылках или указателях, связанных с этими блоками.
Для выделение памяти под динамические переменные используется функция NEW(<параметры>); (часто используются как процедура ). Параметром этой функции являться ссылочная переменная на некоторый базовый или пользовательский тип данных. Данный тип определяет размер выделенного блока, адрес начала этого блока будет записан в ссылочный переменную параметр.
П
ример
выделение динамической памяти:
Var
I:byte;
P1,p2:^integer;
P3:^REAL;
Begin
{1}
I:=5;
New(p1);
New(p2); {2}
New(p3);
В данном случае после выполнения трех операторов NEW в динамической памяти последовательно выделятся два блока по два байта и один блок под шесть байт (реально выделенный объем будет несколько иным, смотри предопределенные указатели).
А
дреса
этих выделенных блоков будут находиться
в ссылочных переменных Р1,
Р2, Р3
соответственно. Последовательное
выделение блоков из памяти не всегда
означает, что блоки будут располагаться
друг за другом, в ряде случаев они
располагаются в различных местах памяти
на момент выделении блоков. При
последовательном выделении блоков,
блоки размещаются в сторону увеличение
адресов.
После выделение блоков в динамической памяти в них можно записать какую либо информацию используя оператор разадресации (^).
Пример применения разадрисации: в выделенные блоки помещаем
информацию.
P
1^:=10;
P2^:=p1^-4;
I:=p1^;
P3^:=i+p1^+p2^;
Особенностью оператора New является то, что она в большей степени используется с ссылочными переменными, которые указывают необходимый для выделение объем памяти. В этом случае эта функция используется, как однако её можно использовать и при работе с указателями. Для этого устанавливается ссылочный тип данных, который будет использоваться для определения размеров блока.
Пример использования ссылочной переменной.
T
ype
I_int=^integer;
Var
P:pointer;
.
.
P:=new(i_int);
{$X+}- разрешён обособленный вызов функций т.е как процедур.
При выполнении функции New объем доступной динамической памяти уменьшается, блоки памяти выделенные с помощью этой процедуры считаются администратором кучи занятыми (связанными с некоторыми ссылками) даже если этот блок не заполняется, поэтому повторный запрос на выделение блока с помощью new не может привести к тому, чтобы занятый блок был связан с другой ссылкой или указателем.
Пример:
New(p1);
New(p2);
Р1- считается занятым если даже ничего там не записано.
Процедура освобождения памяти
Dispose(<ссылка>)
Данная процедура используется для работы с типизированными ссылочными переменными, является парной функции New, оказывает противоположенное ей действие, связанное с освобождением блока памяти, тип ссылки указывает блок какого размера необходимо освободить. Адрес освобождаемого блока находиться переменной. После выполнения данной процедуры оббьем доступной памяти увеличивается.
Пример:
V
ar
P1:^integer;
.
{1}
New(p1);
P1^:=5; {2}
Dispose(p1);{3}
HeapPtr - Предопределенный указатель, который содержит адрес нижней границы свободной области кучи. Считается что после выполнения процедуры Dispose блок памяти связанный с ссылочной переменной-параметром данной процедуры удаляется из памяти, при этом ссылочная переменная считается неопределенной и поэтому если необходимо воспользоваться ею выполняется операция её инициализации каким-либо адресом (new(p1)). Фактически после выполнения процедуры Dispose блок связанный с ссылочной переменной считается свободным. Он в любой момент времени может быть занят администратором кучи при запросе на выделение блока. Объём доступной динамической памяти увеличивается, данные находящиеся в блоке не удаляются, ссылка остается определена тем же адресом (но лучше её считать неопределенной).
П
ример:
выделение и заполнения динамических
блоков.
Var
P1,p2:^integer;
.
.
New(p1);
P1^:=5;
Dispose(p1);
New(p2);
P2^:=10;
Write(p1^);
После выполнения команды Write(p1^); выведет на экран значение 10;