Динамическая память 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.