- •1.1. Как начать работу с турбо паскалем
- •1.2. Функциональные клавиши
- •1.3 Текстовый редактор
- •1.4. Основные приемы работы в среде турбо паскаля
- •Глава2. Знакомство с языком турбо паскаля
- •Глава 2 знакомство с языком турбо паскаля
- •2.1. Ваша первая программа
- •2.2. Типы данных
- •2.3. Преобразования типов и действия над ними
- •2.4. Операторы языка
- •2.5. Массивы
- •2.6. Процедуры и функции
- •2.7. Примеры программ
- •Глава3.Элементы языка
- •Глава 3
- •3.1. Алфавит
- •3.2. Идентификаторы
- •3.3. Константы
- •3.4. Выражения
- •3.5. Операции
- •3.6. Структура программы
- •Глава 4. Типы данных
- •4.1. Простые типы
- •4.2. Структурированные типы
- •4.3. Строки
- •4.4. Совместимость и преобразование типов
- •Глава 5. Файлы
- •Глава 5
- •5.1. Доступ к файлам
- •5.2. Процедуры и функции для работы с файлами
- •5.3. Текстовые файлы
- •5.4. Типизированные файлы
- •5.5. Нетипизированные файлы
- •Глава 6. Указатели и динамическая память
- •6.1. Динамическая память
- •6.2. Адреса и указатели
- •6.4. Выделение и освобождение динамической памяти
- •6.5. Использование указателей
- •6.6. Процедуры и функции для работы с динамической памятью
- •6.7. Администратор кучи
- •Глава 7. Типизированные константы
- •7.1. Константы простых типов и типа string
- •7.2. Константы-массивы
- •7.3. Константы-записи
- •7.4. Константы-множества
- •7.5. Константы-указатели
- •Глава 8. Процедуры и функции
- •Глава 8
- •8.1. Локализация имен
- •8.2. Описание подпрограммы
- •8.3. Параметры-массивы и параметры-строки
- •8.4. Процедурные типы. Параметры-функции и параметры-процедуры
- •8.5. Нетипизированные параметры-переменные
- •8.6. Рекурсия и опережающее описание
- •8.7. Расширенный синтаксис вызова функций
- •Глава 9. Модули
- •Глава 9
- •9.1. Структура модулей
- •9.2. Заголовок модуля и связь модулей друг с другом
- •9.3. Интерфейсная часть
- •9.4. Исполняемая часть
- •9.5. Инициирующая часть
- •9.6. Компиляция модулей
- •9.7. Доступ к объявленным в модуле объектам
- •9.8. Стандартные модули
- •Глава 10. Объекты
- •Глава 10
- •10.1. Основные принципы ооп
- •10.2. Постановка учебной задачи
- •10.3. Создание объектов
- •10.4. Использование объектов
- •Глава 11. Другие возможности турбо паскаля
- •Глава 11
- •11.1. Внешние процедуры (функции)
- •11.2. Использование встроенных машинных кодов
- •11.3. Обращение к функциям операционной системы
- •11.4. Поддержка процедур обработки прерываний
- •11.5. Запуск внешних программ
- •11.6. Оверлей
- •11.7. Прямое обращение к памяти и портам ввода-вывода
- •11.8. Длинные строки
- •Глава 12. Встроенный ассемблер
- •Глава 12
- •12.1. Общее описание мп 8086/8088
- •12.2. Специфика встроенного ассемблера
- •Глава 13. Использование библиотеки crt
- •Глава 13
- •13.1. Программирование клавиатуры
- •13.2. Текстовый вывод на экран
- •13.3. Программирование звукового генератора
- •Глава 14. Использование библиотеки graph
- •Глава 14
- •14.1. Переход в графический режим и возврат в текстовый
- •14.2. Координаты, окна, страницы
- •14.3. Линии и точки
- •14.4. Многоугольники
- •14.5. Дуги, окружности, эллипсы
- •14.6. Краски, палитры, заполнения
- •14.7. Сохранение и выдача изображений
- •14.8. Вывод текста
- •14.9. Включение драйвера и шрифтов в тело программы
6.6. Процедуры и функции для работы с динамической памятью
Ниже приводится описание как уже рассмотренных процедур и функций, так и некоторых других, которые могут оказаться полезными при обращении к динамической памяти. ,
Функция ADDR. Возвращает результат типа POINTER, в котором содержится адрес аргумента. Обращение:
ADDR ( X )
Здесь Х- любой объект программы (имя любой переменной, процедуры, функции). Возвращаемый адрес совместим с указателем любого типа. Отметим, что аналогичный результат возвращает операция @ .
Функция CSEG. Возвращает значение, хранящееся в регистре CS микропроцессора в начале работы программы в регистре CS содержится сегмент начала кода программы). Обращение:
CSEG
Результат возвращается в слове типа WORD.
Процедура DISPOSE. Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за типизированным указателем. Обращение:
DISPOSE(TP)
Здесь ТР - типизированный указатель. При повторном использовании процедуры применительно к уже освобожденному фрагменту возникает ошибка периода исполнения. При освобождении динамических объектов можно указывать вторым параметром обращения к DISPOSE имя деструктора (подробнее см. гл.10).
Функция DSEG. Возвращает значение, хранящееся в регистре DS микропроцессора (в начале работы программы в регистре DS содержится сегмент начала данных программы). Обращение:
DSEG
Результат возвращается в слове типа WORD.
Процедура FREEMEM. Возвращает в кучу фрагмент динамической памяти, который ранее был зарезервирован за нетипизированным указателем. Обращение:
FREEMEM ( Р, SIZE )
Здесь Р - нетипизированный указатель;
SIZE - длина в байтах освобождаемого фрагмента.
При повторном использовании процедуры применительно к уже освобожденному фрагменту возникает ошибка периода исполнения.
Процедура GETMEM. Резервирует за нетипизированным указателем фрагмент динамической памяти требуемого размера. Обращение:
GETMEM ( Р, SIZE )
За одно обращение к процедуре можно зарезервировать не более 65521 байтов динамической памяти. Если нет свободной памяти требуемого размера, возникает ошибка периода исполнения. Если память не фрагментирована, последовательные обращения к процедуре будут резервировать последовательные участки памяти, так что начало следующего будет располагаться сразу за концом предыдущего.
Процедура MARK. Запоминает текущее значение указателя кучи HEAPPTR. Обращение:
MARK ( PTR )
Здесь PTR - указатель любого типа, в котором будет возвращено текущее значение HEAPPTR. Используется совместно с процедурой RELEASE для освобождения части кучи.
Функция MAXAVAIL. Возвращает размер в байтах наибольшего непрерывного участка кучи. Обращение:
MAXAVAIL
Результат имеет тип LONGINT. За один вызов процедуры NEW или GETMEM нельзя зарезервировать памяти больше, чем значение, возвращаемое этой функцией.
Функция MEMAVAIL. Возвращает размер в байтах общего свободного пространства кучи. Обращение:
MEMAVAIL
Результат имеет тип LONGINT.
Процедура NEW. Резервирует фрагмент кучи для размещения переменной. Обращение:
NEW ( ТР )
Здесь ТР - типизированный указатель.
За одно обращение к процедуре можно зарезервировать не более 65521 байта динамической памяти. Если нет свободной памяти требуемого размера, возникает ошибка периода исполнения. Если память не фрагментирована, последовательные обращения к процедуре будут резервировать последовательные участки памяти, так что начало следующего будет располагаться сразу за концом предыдущего.
Процедура NEW может вызываться как функция. В этом случае параметром обращения к ней является тип переменной, размещаемой в куче, а функция NEW возвращает значение типа указатель. Например:
type
PInt =^Integer;
var
p: Pint;
begin
p := New(PInt);
......
end.
При размещении в динамической памяти объекта разрешается в качестве второго параметра обращения к NEW указывать имя конструктора (см. гл.10).
Функция OFS. Возвращает значение типа WORD, содержащее смещение адреса указанного объекта. Вызов:
OFS ( X )
Здесь Х- выражение любого типа или имя процедуры.
Функция PTR. Возвращает значение типа POINTER по заданному сегменту SEG и смещению OFS. Вызов:
PTR ( SEG, OFS )
Здесь SEG - выражение типа WORD, содержащее сегмент;
OFS - выражение типа WORD, содержащее смещение.
Значение, возвращаемое функцией, совместимо с указателем любого типа.
Процедура RELEASE. Освобождает участок кучи. Обращение:
RELEASE ( PTR )
Здесь PTR - указатель любого типа, в котором предварительно было сохранено процедурой MARK значение указателя кучи. Освобождается участок кучи от адреса, хранящегося в PTR, до конца кучи. Одновременно уничтожается список всех свободных фрагментов, которые, возможно, были созданы процедурами DISPOSE или FREEMEM.
Функция SEG. Возвращает значение типа WORD, содержащее сегмент адреса указанного объекта. Вызов:
SEG ( X )
Здесь X - выражение любого типа или имя процедуры.
Функция SIZEOF. Возвращает длину в байтах внутреннего представления указанного объекта. Вызов:
SIZEOF ( X )
Здесь X - имя переменной, функции или типа. Например, везде в программе из примера 6.1 вместо константы SIZEOFREAL можно было бы использовать обращение SIZEOF(REAL).