
- •Федеральное агентство по образованию
- •Структурированные типы данных. Классификация
- •Массивы Определение массива
- •Обращение к элементу массива. Хранение элементов массива. Доступ к элементам массива
- •Действия над массивами
- •Поиск элемента (одномерного ) массива Поиск среди неупорядоченных элементов массива
- •Поиск среди упорядоченных элементов массива
- •Сортировка элементов (одномерного) массива
- •Линейная сортировка (сортировка отбором)
- •Сортировка методом пузырька
- •5 4 3 1 2
- •5 4 3 2 1 Метод быстрой сортировки с разделением
- •Множества
- •Объявление множеств
- •Представление в памяти переменной типа множество
- •Операторы для работы с множествами Проверка принадлежности элемента множеству
- •Операции над множествами
- •Сравнение множеств
- •Применение множеств
- •Процедуры и структурное программирование
- •Преимущества структурного программирования
- •Планирование структурированной программы
- •Метод программирования сверху вниз
- •Определение процедуры
- •Передача управления при вызовах процедур и функций
- •Функции: подпрограммы,возвращающие единственный результат
- •Понятие блока
- •Область действия и время жизни переменных
- •Особенности локальных переменных
- •Особенности глобальных переменных
- •Особенности использования процедур и функций в турбо паскале
- •Опережающее определение процедур и функций
- •Рекурсия и итерация
- •Процедуры и функции как параметры
- •Директивы подпрограмм
- •Отладка и тестирование программ, содержащих подпрограммы
- •Нисходящее тестирование и подпрограммы-заглушки
- •Восходящее тестирование и программы-тестеры
- •Рекомендации по отладке программ, содержащих подпрограммы
- •Использование отладчикадля трассировки процедур
- •Запуск внешних программ
- •Стандартные модули
- •Модуль Crt
- •Модуль Graph
- •Функции
- •Текстовые файлы
- •Нетипизированные файлы
- •Типизированные файлы
- •Прямой доступ
- •Дополнительные функции работы с файлами
- •Обработка ошибок ввода-вывода
- •Указатели и динамические переменные Статические и динамические переменные
- •Адресация памяти в Турбо Паскале
- •Карта памяти Турбо Паскаля
- •Указатели
- •Операция для получения адреса
- •Функции для работы с адресами
- •Процедуры для работы с указателями
- •Присваивание значений указателям
- •Организация ссылок
- •Динамические структурированные переменные Динамические записи
- •Динамические массивы
- •Массивы размером более 64 кбайт
- •Строки с завершающим нулем (asciiz)
- •Процедуры и функции модуля strings
- •Указатели на процедуры и функции
- •Динамические структуры данных
- •Линейные списки
- •60 Лекции по курсу «Языки программирования» Часть II
Указатели и динамические переменные Статические и динамические переменные
Переменные, объявляемые в разделе var главной программы, называются статическими переменными потому, что они являются составной частью программы и существуют в виде ячеек памяти в течение всего времени выполнения программы. Размещаются статические переменные в сегменте данных программы, память для них выделяется на этапе компиляции, а физические адреса устанавливаются на этапе загрузки.
Статические переменные в Турбо Паскале имеют следующие ограничения – их суммарный объем не может превышать 64 Кбайт. Вследствие этого, если для решения задачи требуются массивы данных больших размеров, то использование обычных (статических) переменных может привести к невозможности компиляции программы.
Выход из указанной ситуации состоит в использовании динамических переменных. Динамическими называются такие переменные, которые могут создаваться и уничтожаться в процессе работы программы. Размещаются динамические переменные в специальном участке памяти, называемом динамической памятью. В Турбо Паскале динамическая память называется кучей (heap).
Адресация памяти в Турбо Паскале
Вся основная (оперативная) память компьютера рассматривается как последовательность пронумерованных байтов. Нумерация начинается с нуля. Номер байта является его физическим адресом. В качестве адреса величины, состоящей из нескольких байтов, используется номер (адрес) начального байта.
В Турбо Паскале используется так называемый реальный режим адресации памяти. В этом режиме используются понятия: параграф, сегмент и смещение. Параграф – непрерывный участок памяти, состоящий из 16 байт, адрес которого кратен 16. Сегмент – непрерывный участок памяти, размер которого равен 65535 байтов (64 Кбайт), адрес сегмента также кратен 16 (говорят – адрес сегмента выровнен на границу параграфа). Смещение – номер конкретного байта в сегменте, то есть сдвиг данного байта относительно начала сегмента. В реальном режиме используется специальная нотация для представления адресов:
Segment:Offset
где Segment, Offset - целые положительные числа без знака, определяющие сегмент и смещение в значении адреса. При этом физический адрес определяется формулой: Address= Segment*l6+Offset.
Из того факта, что сегменты выравниваются по параграфам, следует, что один и тот же байт может иметь множество адресов в формате Segment:Offset. Действительно, имеет место равенство:
Segment:Offset=(Segment+k):(Offset-k*l6)=(Segment-k):(Offset+k*l6),
где k – целое число. Ограничения на значение k в указанном равенстве определяются тем, что по определению и сегментная составляющая, и смещение адреса не должны превышать 65535.
Карта памяти Турбо Паскаля
Распределение памяти для программы в Турбо Паскале показано на следующем рисунке.
Размеры стека и кучи определяются директивой компилятора
{$М StackSize, HeapMin, HeapMax}
где StackSize – целая константа из диапазона 1024 .. 65520, определяющая размер стека программы в байтах;
HeapMin – целая константа из диапазона 0 .. 655360, определяющая минимально необходимый размер кучи;
НеарМах – целая константа из диапазона HeapMin .. 655360, определяющая максимально возможный (желательный) размер кучи.
Заметим, что значение HeapMin выражает жесткое требование на размер кучи, если при загрузке программы для нее не может быть создана куча размером не менее HeapMin, то программа не загружается вовсе. Значение НеарМах является факультативным требованием и определяет размер кучи при избытке свободной памяти ЭВМ. Если объем свободной памяти после загрузки основных частей программы составляет V байт, где Неар-Min<V<HeapMax, то весь этот объем выделяется под кучу.