- •I. Теоретические сведения.
- •1.1. Понятие модуля.
- •1.2. Использование модуля.
- •1.3. Структура модуля.
- •2. Статические и динамические структуры
- •3. Динамическое размещение данных
- •4. Указатели.
- •4.1. Описание указателя.
- •4.2. Выделение динамической памяти.
- •4.3. Задание значения указателю.
- •4.4. Операция разыменования.
- •4.5. Освобождение динамической памяти.
- •4.5.3. Освобождение фрагментов динамической памяти.
- •5. Динамический массив
- •5.1. Необходимость использования средств работы с динамической памятью при обработке массивов.
- •5.2. Описание интерфейсов для статического и динамического массивов.
- •6. Восходящая отладка программ (снизу вверх)
- •II. Контрольные вопросы.
- •III. Последовательность выполнения индивидуального задания.
- •5. Драйверы запуска подпрограмм
- •IV. Требования к разработке программы.
- •V. Требования к оформлению отчета.
Технология программирования
Лабораторный курс
доцента кафедры информационных систем и компьютерных технологий
Пановой Т.В. (panova_tat@rambler.ru)
Лабораторная работа №2
Тема:
Парадигма модульного программирования на примере обработки динамических массивов с использованием восходящей разработки
Цель: формирование навыков
определения различий между статическим и динамическим массивами;
создания в динамической памяти массива как совокупности однотипных данных;
обработки динамического массива, используя операции с указателями;
оформления подпрограмм обработки в отдельном модуле;
написания драйверов для восходящей отладки.
I. Теоретические сведения.
1. Модульное программирование
При проектировании программ больших размеров применяется технология модульного программирования, которая предполагает выделение групп подпрограмм в отдельные библиотеки – модули, компилируемые отдельно от основной программы.
1.1. Понятие модуля.
Модуль – это автономно компилируемая программная единица, включающая в себя раздел объявлений программных ресурсов, предназначенных для использования другими модулями и программами, раздел описаний объявленных подпрограмм и локальных объектов модуля и инициирующую часть, операторы которой исполняются перед началом работы программы, использующей этот модуль.
Модуль, в отличие от программы, не может быть запущен на выполнение самостоятельно.
1.2. Использование модуля.
Для использования библиотеки (модуля) после заголовка программы и глобальных директив компилятора задается специальное предложение
Uses <список_имен_модулей>;
Исходный текст модуля располагается в файле с расширением .pas. Транслируется модуль отдельно от программы и помещается после трансляции в файл с расширением .tpu, а затем на этапе компоновки (сборки) модуль подключается к оттранслированной программе.
1.3. Структура модуля.
1.3.1. Заголовок модуля состоит из зарезервированного слова Unit и следующего за ним имени модуля:
Unit <имя_модуля>;
1.3.2. Интерфейсная часть начинается с зарезервированного слова Interface, содержит объявления всех глобальных объектов модуля, доступных программам и модулям, к которым подключена данная библиотека.
Interface
<объявления>
1.3.3. Часть реализации начинается с зарезервированного слова Implementation, следуют описания всех подпрограмм, объявленных в интерфейсной секции, а также в ней могут быть объявлены локальные для модуля объекты:
Implementation
<описания>
1.3.4. Часть инициализации является необязательной, начинается с операторной скобки begin и состоит из операторов, исполняемых до передачи управления основной программе и обычно используемых для подготовки к ее работе.
Заканчивается модуль операторной скобкой end с точкой.
2. Статические и динамические структуры
Структура данных – это совокупность физически и логически взаимосвязанных данных.
Статическая структура данных – это совокупность фиксированного количества данных постоянной размерности с неизменным характером связей между ними.
Переменные статических структур могут изменять только свое значение, а их структура и множество допустимых значений остаются неизменными, поэтому размер памяти, занимаемой такими переменными, остается постоянным.
Динамическая структура данных – это совокупность данных, количество, размерность и характер взаимосвязей между которыми могут меняться в процессе выполнения программы, поэтому размер памяти, занимаемый такой структурой, заранее может быть неизвестен.
3. Динамическое размещение данных
Динамическое размещение данных предусматривает использование динамической памяти.
Динамическая память (куча) – это часть оперативной памяти компьютера, предоставляемой программе при ее работе, за вычетом сегмента данных (не более 64 Кбайт), стека (16 Кбайт по умолчанию), памяти, используемой системными и резидентными программами, и кода исполняемой программы. По умолчанию размер динамической памяти зависит от всей доступной оперативной памяти компьютера (не менее 200 – 300 Кбайт, а обычно существенно больше).
Размер динамической памяти можно устанавливать из среды TURBO PASCAL или из самой программы специальными директивами компилятора.
Куча (HEAP-область) первоначально всегда свободна и заполняется от нижних адресов в области кучи. Состояние кучи можно отслеживать при помощи специально предопределённых в языке Pascal переменных типа указатель (Pointer):
HeapOrg содержит адрес начала кучи, и её значение не изменяется в процессе выполнения программы;
HeapPtr содержит адрес начала непрерывного, ещё неиспользованного участка кучи, и каждый раз, когда в куче размещается новая величина, значение этого указателя изменяется на размер этой переменной;
HeapEnd содержит адрес конца кучи;
FreeList – переменная модуля System, которая указывает на список свободных блоков динамически распределяемой области памяти.