
- •Лекция 1. Основы языков программирования.
- •Лекция 2. Способы записи алгоритмов.
- •Лекция 3. Знакомство с языком Паскаль.
- •Лекция 4. Структура программы на языке Паскаль.
- •Лекция 5. Стандартные типы данных.
- •5.1 Целые типы
- •5.2 Вещественные типы
- •5.3 Символьный тип.
- •5.4 Ограничительные типы.
- •5.5 Перечислимые типы.
- •Л.6. Операторы языка Паскаль Ввод исходных данных.
- •Расчет.
- •Стандартные функции Турбо Паскаля
- •Стандартные процедуры
- •Константы
- •Вывод результатов
- •Лекция 7. Операторы условий if, case
- •7.1 Оператор безусловного перехода
- •7.2 Условный оператор
- •7.3 Оператор варианта
- •Лекция 8. Операторы цикла for, while, repeat
- •8.1 Оператор цикла с предусловием.
- •8.2 Оператор цикла с постусловием.
- •8.3 Оператор цикла с параметром.
- •Лекция 9. Одномерные и двумерные массивы.
- •Работа с массивами
- •Инициализация элементов массива
- •Лекция 10. Процедуры и функции в Паскаль.
- •Лекция 11. Параметры в процедурах.
- •11.1 Механизм параметров.
- •11.2. Параметры - значения.
- •11.3. Параметры - переменные.
- •11.4. Безтиповые параметры.
- •Лекция 12. Типы данных, определяемые пользователем. Записи.
- •Лекция 13. Работа с файлами. Обработка ошибок в Паскаль.
- •13.1 Файловые типы
- •13.2 Операции ввода-вывода Write, Read
- •13.3. Перемещение по файлу.
- •13.4 Обработка ошибок ввода - вывода
- •13.5 Текстовые файлы
- •13.6 Файлы без типа.
- •Лекция 14. Модули и внешние файлы в Паскаль.
- •15.1. Компиляция и использование модулей
- •15.2. Компиляция и поиск модулей.
- •15.3. Стандартные модули
- •Лекция 15. Динамические структуры данных.
- •15.1 Ссылочные типы и указатели.
- •15.2 Статические переменные.
- •15.3. Создание и удаление динамических переменных.
- •15.4. Установка размеров динамической памяти.
- •Лекция.16. Графические возможности языка Паскаль.
- •Лекция17. Практическое применение языка Паскаль в решении технологических и экологических задач
15.2 Статические переменные.
Pascal допускает возможность образовывать новые переменные в любой момент работы программы без учета ее статической структуры и допускается уничтожение созданных переменных в произвольный момент выполнения.
Переменные, созданием и уничтожением которых может явно управлять программист, называются динамическими переменными.
Динамические переменные, количество которых и место расположения в памяти заранее не известно, невозможно обозначит идентификаторами. Поэтому единственным средством доступа к динамическим переменным является указатель на место их текущего расположения в памяти. На принципе обращения к динамическим переменным посредством указателей (ссылок) на них и основаны все соответствующие средства языка Pascal.
Для распределения памяти под локальные переменные отводится специальный сегмент оперативной памяти (сегмент стека). Образование динамических переменных реализуется в другой области памяти, которая существует отдельно от стекового сегмента и называется кучей (heap) или динамической памятью.
15.3. Создание и удаление динамических переменных.
Основные действия над динамическими переменными - создание и уничтожение - реализуется в языке Pascal стандартными процедурами New и Dispose.
Процедура New предназначена для создания динамических переменных определенного типа или, что тоже самое, отведение памяти в куче для хранения динамической переменной. Единственным параметром New является переменная ссылочного типа:
в динамической области памяти отводится место для хранения переменной, тип которой совпадает с базовым типом указателя – параметра;
переменной, переданной в параметре присваивается указатель на определенную область памяти.
var
p : ^Person;
begin
New (p);
…
Приведет к отведению в куче области памяти, достаточной для хранения записи типа Person, и присваиванию указателя на эту область переменной p. Доступ возможен только через указатель!
P^.Name := 'Иван';
P^.Sex := male;
….
Если при выполнении New размещение новой переменной в куче не хватает памяти, то значение указателя, переданного в параметре, не изменится. При этом выполнение программы не прекращается и никаких сообщений выдано не будет, поэтому в дальнейшем работать с указателем нельзя. Для избежания этой ситуации следует проверять текущее состояние динамической памяти перед каждым обращением к New. Это можно сделать с помощью стандартной функции MaAvail, которая возвращает максимальный размер непрерывного участка свободной памяти.
Если необходимо создать динамическую переменную типа Longint:
Var
Pl: ^Longint;
Begin
If MaxAvail>=4 then
New(pl)
Else
Writeln('исчерпана динамическая память');
…..
В общем случае для определения размера необходимой памяти можно воспользоваться стандартной функцией size of.
If MaxAvail >= size of(Person) then
P:=new(person);
….
Кроме того в языке имеется функция MemAvail, которая в отличие от MaxAvail определяющую наибольшую свободную непрерывную область, определяет общий объем свободных областей.
Для освобождения памяти используется процедура Dispose. Параметр должен совпадать с базовым типом процедуры и быть ранее объявленным new.
Var
P: ^Person;
Begin
New(p);
(Действия с указателем P)
dispose(p);
end.
Иногда при работе с динамическими переменными возникает проблема потерянных ссылок.
Program Ssylka;
Type
Pperson = ^ person
Person = record
….
End;
Procedure GetPerson;
Var
P: Pperson;
Begin
P:=new(Pperson);
End;
…
Begin
Writeln(MemAvail);
GetPerson;
Writeln(MemAvail);
End.