Динамическая память Turbo Pascal
Основные стандартные и определяемые программистом указатели. Выполнение программы с помощью подпрограмм new или getmem. Освобождение динамической памяти. Указатели на процедуры и функции. Хранение адреса точки входа в функцию. Режим дальней адресации.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | доклад |
Язык | русский |
Дата добавления | 06.02.2013 |
Размер файла | 91,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
КОЛЛЕДЖ ЭКОНОМИКИ, БИЗНЕСА И ПРАВА
КАРАГАНДИНСКОГО ЭКОНОМИЧЕСКОГО УНИВЕРСИТЕТА КАЗПОТРЕБСОЮЗА
Доклад
На тему: «Динамическая память Паскаля»
Выполнил
Учащийся группы ИС-33
Коврига Юрий
Караганда 2011г.
В IBM PC-совместимых компьютерах память условно разделена на сегменты. Компилятор формирует сегменты кода, данных и стека, а остальная доступная программе память называется динамической (хипом).
Динамические переменные создаются в хипе во время выполнения программы. Обращение к ним осуществляется через указатели. С помощью этих переменных можно обрабатывать данные, объем которых до начала выполнения программы не известен. Память под такие данные выделяется блоками, которые связываются друг с другом. Этот способ хранения данных называется динамическими структурами.
Указатели
Указателем называется переменная, предназначенная для хранения адресов областей памяти. В указателе можно хранить адрес данных или программного кода. Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе -- смещение.
Указатели делятся на стандартные и определяемые программистом. Величины стандартного типаpointerпредназначены для хранения адресов данных произвольного типа:
var p : pointer;
Программист может определить указатель на данные или подпрограмму конкретного типа. Как и для других нестандартных типов, это делается в разделе type:
type pword = ^word; { читается как "указатель на word" }
...
var pw : pword;
Такие указатели называются типизированными. Можно описать указатель на любой тип данных, кроме файловых. Тип указателя на данные можно описать и непосредственно при описании переменной:
var pw : ^word;
Для указателей определены только операции проверки на равенство и неравенство и присваивания. Правила присваивания указателей:
Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти.
Указатели стандартного типа pointer совместимы с указателями любого типа.
Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.
Операция @ и функция addr позволяют получить адрес переменной:
var x : word; { переменная }
pw : ^word; { указатель на величины типа word }
...
pw := @w; { или pw := addr(w); }
Для обращения к значению переменной, адрес которой хранится в указателе, примеряется операция разадресации (разыменования), обозначаемая с помощью символа ^:
pw^ := 2; inc(pw^); writeln(pw^);
С величинами, адрес которых хранится в указателе, можно выполнять любые действия, допустимые для значений этого типа.
Стандартные функции для работы с указателями
addr(x) : pointer -- возвращает адрес х (аналогично операции @), где х -- имя переменной или подпрограммы;
seg (x) : word -- возвращает адрес сегмента для х;
ofs (x) : word -- возвращает смещение для х;
cseg : word -- возвращает значение регистра сегмента кода CS;
dseg : word -- возвращает значение регистра сегмента данных DS;
ptr (seg, ofs : word) : pointer -- по заданному сегменту и смещению формирует адрес типа pointer.
Динамические переменные
Динамические переменные создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem. Динамические переменные не имеют собственных имен -- к ним обращаются через указатели.
* Процедура new(var p : тип_указателя) выделяет в динамической памяти участок размера, достаточного для размещения переменной того типа, на который ссылается указатель p, и адрес начала этого участка заносит в этот указатель.
* Функция new(тип_указателя) : pointer выделяет в динамической памяти участок размера, достаточного для размещения переменной базового типа для заданного типа указателя, и возвращает адрес начала этого участка.
new применяется для типизированных указателей
* Процедура getmem(var p : pointer; size : word) выделяет в динамической памяти участок размером в size байт и присваивает адрес его начала указателю p. Если выделить требуемый объем памяти не удалось, программа аварийно завершается. Указатель может быть любого типа.
Пример работы с динамическими переменными
type pword = ^word;
rec = record
d : word; s : string;
end;
var p1, p2 : pword; p3 : ^rec;
В разделе исполняемых операторов программы запишем операторы
new(p1); p2 := new(pword); new(p3);
В результате выполнения процедуры new(p1) в хипе выделяется объем памяти, достаточный для размещения переменной типа word, и адрес начала этого участка памяти записывается в переменную p1. Второй оператор выполняет аналогичные действия, но используется функция new. При вызове процедуры new с параметром p3 в динамической памяти будет выделено количество байтов, достаточное для размещения записи типа rec.
Доступ к выделенным областям осуществляется с помощью операции разадресации
p1^ := 2; p2^ := 4; p3^.d := p1^; p3^.s := 'Вася';
В этих операторах в выделенную память заносятся значения.
Динамические переменные можно использовать в операциях, допустимых для величин соответствующего типа, например:
inc(p1^); p2^ := p1^ + p3^.d;
with p3^ do writeln (d, s);
программа адрес динамический память
Для освобождения динамической памяти используются процедуры Dispose и Freemem, причем, если память выделялась с помощью new, следует применять Dispose, в противном случае -- Freemem.
* Процедура Dispose(var p : pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой или функцией New, и значение указателя p становится неопределенным.
* Процедура Freemem (var p : pointer; size : word) освобождает участок памяти размером size, начиная с адреса, находящегося в p. Значение указателя становится неопределенным.
Если требуется освободить память из-под нескольких переменных одновременно, можно применять процедуры Mark и Release.
* Процедура Mark(var p : pointer) записывает в указатель p адрес начала участка свободной динамической памяти на момент ее вызова.
* Процедура Release(var p : pointer) освобождает участок динамической памяти, начиная с адреса, записанного в указатель p процедурой Mark.
При завершении программы используемая ею динамическая память освобождается автоматически.
При работе с динамической памятью часто применяются вспомогательные функции Maxavail, Memavail и Sizeof.
Указатели на процедуры и функции
Указатель на подпрограмму определяется как переменная процедурного (функционального) типа, например:
type
fun = function(x : real) : real; { функциональный тип }
var
pf : fun; { указатель на функции типа fun }
Указателю на подпрограмму можно присвоить nil, значение другого указателя того же типа или имя конкретной подпрограммы.
type
fun = function(x : real) : real; { функциональный тип }
var pf : fun; { указатель на функции типа fun }
function f(x : real) : real; far; { конкретная функция }
begin
тело функции
end;
...
pf := f;
После выполнения этого фрагмента программы в переменной pf будет храниться адрес точки входа в функцию f. Теперь функцию f можно вызвать через переменную pf:
y := pf(x);
Функция, адрес которой присваивается переменной, должна компилироваться в режиме дальней адресации. Для этого в заголовке указывается директива far или до описания функции задается ключ компиляции {$F+}.
Размещено на Allbest.ru
Подобные документы
Простые типы данных: порядковые, вещественные, дата-время. Стандартные процедуры и функции, применимые к целым типам. Кодировка символов в соответствии со стандартом ANSI. Структурированные типы: массивы; записи; множества. Указатели, динамическая память.
реферат [83,3 K], добавлен 01.12.2009Указатели как одна из наиболее трудных для освоения возможностей С и одно из наиболее мощных свойств языка программирования. Возможность моделировать передачу по ссылке и создавать и манипулировать динамическими структурами данных. Обработка списков.
дипломная работа [43,3 K], добавлен 29.01.2009Разработка программы, реализующей игру "Змейка" в среде Turbo Pascal. Возможность создания игры в модуле библиотеки crt, что позволяет использовать программу на компьютерах без графических библиотек и компьютерах, имеющих малый объём оперативной памяти.
курсовая работа [190,5 K], добавлен 02.02.2013Разработка эскизного и технического проектов программы "Helpopr" (ввод, хранение и вывод данных на дисплей по запросу пользователя). Язык программирования Turbo Pascal. Описание алгоритма программы. Требования к компьютеру и программному обеспечению.
курсовая работа [198,1 K], добавлен 03.02.2010Основы работы на языке высокого уровня Turbo Pascal. Основное оборудование и программное обеспечение. Операторы, необходимы для работы в графической среде Turbo Pascal. Запуск графического режима. Текст программы в графической среде Turbo Pascal.
лабораторная работа [12,7 K], добавлен 14.05.2011Характеристика используемой операционной системы, языка программирования. Структура программы на языке Turbo Pascal 7.1. Операторы языка Turbo Pascal. Проведение сортировки записей. Алгоритмы программы и подпрограмм. Причины возникновения ошибок.
курсовая работа [454,1 K], добавлен 13.06.2014Распределение виртуальной памяти. Страничная и сегментная организации виртуальной памяти. Сегментно-страничная организация виртуальной памяти. Преобразование виртуального адреса в физический. Упрощение адресации памяти клиентским программным обеспечением.
курсовая работа [440,7 K], добавлен 04.03.2014Анализ эффективности методов сортировки данных в языке Turbo Pascal. Разработка эскизного и технического проекта программы. Сортировка без и с использованием дополнительной памяти, за исключением небольшого стека (массива). Сортировка связанных списков.
курсовая работа [359,0 K], добавлен 23.05.2012Архитектура микроконтроллеров семейства Mega. Организация памяти. Способы адресации памяти данных. Энергонезависимая память данных. Таблица векторов прерываний. Счетчик команд и выполнение программы. Абсолютный вызов подпрограммы. Сторожевой таймер.
дипломная работа [213,9 K], добавлен 02.04.2009Программирование и структура программы на языке Turbo Pascal и MS Visual C++6.0. Вычисление площади круга. Реализация программы в системе Turbo Pascal и MS VISUAL C++6.0 для Windows. Структура окна ТРW. Сохранение текста программы в файле на диске.
лабораторная работа [3,7 M], добавлен 22.03.2012