Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Освобождение динамической памяти.
4.5.1. Освобождение динамической памяти с использованием типизированных указателей определена процедура Dispose(<идентификатор_указателя>); Var P: ^integer; Begin New(P); … Dispose(P); end. После выполнения процедуры Dispose значение типизированного указателя неопределенно, поэтому теряется связь со значением, на которое он указывал. 4.5.2. Освобождение динамической памяти с использованием указателей любого вида определена процедура FreeMem(<идентификат_указателя>,<размер_освобождаемой_памяти>) идентификат_указателя – типизированный или нетипизированный указатель размер_освобождаемой_памяти – величина типа Word, которая определяет количество освобождаемой динамической памяти Var P: Pointer; Begin GetMem(P,67); … FreeMem(P,67); end. Освобождение фрагментов динамической памяти. Для освобождения целого фрагмента динамической памяти (занятого несколькими данными) перед началом выделения памяти, т. е. до применения процедур New или GetMem, в переменной-указателе запоминается текущее значение указателя HeapPtr с помощью процедуры Mark(<идентификатор_указателя>) Для освобождения фрагмента кучи, начиная от того адреса, который запомнила процедура Mark, и до конца динамической памяти определена процедура Release(<идентификатор_указателя>), Var P: Pointer; P1, P2: ^integer; begin Mark(P); GetMem(P1, …); New(P2); … Release(P); end. Вызов Release уничтожает список свободных фрагментов в куче, которые могли быть созданы до этого процедурами Dispose или FreeMem, поэтому не следует использовать одновременно механизм освобождения памяти с помощью процедур FreeMem, Dispose и Release. Динамический массив Динамическимназывается массив, память для которого выделяется во время выполнения программы, обращение к области памяти осуществляется через указатель на ее начало. 5.1. Необходимость использования средств работы с динамической памятью при обработке массивов. Необходимость использования средств работы с динамической памятью при обработке массивов возникает в случаях, когда статическая реализация неэффективна (например, размеры массивов заранее неизвестны, а резервирование памяти максимально возможного объема нерационально). Динамическая память – это фактически единственная возможность обработки массивов данных большой размерности, таких, которые настолько велики, что не могут быть размещены в сегменте данных размером в 64 Кбайт. Только в динамической памяти можно создать массив, размер которого заранее не определён. Один из возможных вариантов получения динамического двумерного массива размерности n на m: type mas = array [1..1] of integer; pmas = ^mas; matr = array [1..1] of pmas; pmatr = ^matr; var a: pmatr; n, m: integer; begin readln(n, m); GetMem (a, n*sizeof(pmas)); for i:=1 to n do GetMem (a^[i], m*sizeof(integer)); . . . . . {обращение к отдельному элементу имеет вид a^[i]^[j] } . . . . . for i:=1 to n do FreeMem (a^[i], m*sizeof(integer)); FreeMem (a, n*sizeof(pmas)); end. Описание интерфейсов для статического и динамического массивов. Понятие массив используется на уровне постановки задачи: задается или должно быть сформировано множество однотипных данных. При описании интерфейса подпрограммы – связи с программой или другими подпрограммами – необходимо знать перечень входных и выходных данных, их тип и способ размещения. Вопросы использования статического или динамического массивов связаны с эффективностью реализации подпрограммы и не должны влиять на интерфейс, поэтому следует выбрать способ описания интерфейса, позволяющий отложить решение этих вопросов, по крайней мере, до этапа разработки схемы решения. Входные и выходные данные при работе со статическим или динамическим массивом будут иметь один и тот же вид, но в случае работы с динамическим массивом его имя заменится на указатель с соответствующей спецификой его обработки. Восходящая отладка программ (снизу вверх) При восходящей отладке на начальном этапе отлаживаются отдельные подпрограммы. Поскольку подпрограммы самостоятельно выполняться не могут, для каждой из них пишется своя специальная отладочная программа – драйвер, которая, по крайней мере, должна обеспечить подпрограмму входными значениями фактических параметров и вывести выходные значения. После отладки подпрограммы ее драйвер больше не нужен. На следующем этапе подпрограммы объединяются в блоки, решающие более крупные подзадачи. В итоге все блоки объединяются в программу, решающую задачу в целом. II. Контрольные вопросы. 1. Что называется модулем? Когда используется модуль? 2. В файлах с какими расширениями находятся текст модуля и оттранслированный код модуля? На каком этапе модуль подключается к программе? 3. Назвать составные части модуля. Какое назначение имеет каждая из частей модуля? 4. Когда выполняется и в каких случаях используется секция инициализации? 5. Чем отличается статическая переменная от динамической? 6. Чем отличается статическая структура от динамической? 7. Что такое «динамическая память»? 8. Какие существуют предопределенные переменные для отслеживания состояния кучи? 9. Что такое «указатель»? Назвать виды указателей. 10. Как описать типизированный и нетипизированный указатели? 11. Какие процедуры существуют для выделения динамической памяти? 12. Как задать значение указателю? 13. Что такое «операция разыменования»? 14. Какие процедуры существуют для освобождения динамической памяти? 15. Для чего используется процедура Mark? 16. Можно ли использовать одновременно механизм освобождения памяти с помощью процедур FreeMem, Dispose и Release? 17. Что представляет собой динамический массив? 18. Когда возникает необходимость использования средств работы с динамической памятью при обработке массивов? 19. Что означает «восходящая отладка программ»? III. Последовательность выполнения индивидуального задания. Постановка задачи Согласно индивидуальному заданию, используя восходящую разработку, разработать программу обработки динамического массива. Входные данные Описать, согласно индивидуальному заданию. Выходные данные Описать, согласно индивидуальному заданию. Схема решения, алгоритм, программа При работе с динамической памятью явно разделяются такие понятия, как адрес и значение, хранящееся по этому адресу. Это разделение незаметно при работе с простыми переменными (участками памяти, выделяемыми под одно значение некоторого типа), но ярко выражено при обработке сложных структур, когда доступ к отдельным элементам осуществляется через адрес начала структуры. В зависимости от индивидуального задания задача разбивается на подзадачи, разрабатываются алгоритмы подпрограмм обработки, которые представляются в виде блок-схем. Реализация программы должна быть сделана на языке PASCAL. Драйверы запуска подпрограмм Программы-драйверы должны обеспечить подпрограммы обработки массива входными значениями фактических параметров и вывести выходные значения. |
||
Последнее изменение этой страницы: 2018-05-29; просмотров: 166. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |