Содержание
- 2. Для выделения памяти типизирован-ному указателю служит стандартная процедура new(): New (P); где P – имя указателя;
- 3. Динамические переменные Для освобождения памяти одновремен-но из-под нескольких переменных применяют процедуры: Mark (P); она вызывается до
- 4. Указатели на процедуры и функции Указатели на подпрограмму являются переменной процедурного (функциональ-ного) типа: Имя функции (процедуры)
- 6. Скачать презентацию
Слайд 2
Для выделения памяти типизирован-ному указателю служит стандартная процедура new():
New
Для выделения памяти типизирован-ному указателю служит стандартная процедура new():
New
(P); где P – имя указателя;
[new можно исп. и в виде функции]
Но для указателя типа Pointer исп.:
Getmem (P; Size);
где Size - к-во байт памяти.
За одно обращение к куче getmem может зарезервировать 65 521 байт памяти.
Для освобождения памяти, выделенной процедурой (функцией) new(), исп.:
Dispose (P);
От getmem освобождает память
Freemem (P; Size);
После освобождения памяти значение указателя становится неопределенным, поэтому во избежание проблем его лучше сразу же "обнулить":
dispose(p);
p:= nil;
[new можно исп. и в виде функции]
Но для указателя типа Pointer исп.:
Getmem (P; Size);
где Size - к-во байт памяти.
За одно обращение к куче getmem может зарезервировать 65 521 байт памяти.
Для освобождения памяти, выделенной процедурой (функцией) new(), исп.:
Dispose (P);
От getmem освобождает память
Freemem (P; Size);
После освобождения памяти значение указателя становится неопределенным, поэтому во избежание проблем его лучше сразу же "обнулить":
dispose(p);
p:= nil;
Динамические переменные
И+ПРГ
Слайд 3
Динамические переменные
Для освобождения памяти одновремен-но из-под нескольких переменных применяют процедуры:
Mark
Динамические переменные
Для освобождения памяти одновремен-но из-под нескольких переменных применяют процедуры:
Mark
(P);
она вызывается до начала выделения памяти и записывает в указатель P адрес начала динамической памяти (из переменной HeapOrg). Затем можно процедурой
Release (P);
освободить участок памяти занятый до момента вызова release, начиная с адреса записанного в mark.
Вспомогательные функции:
Maxavail – длина в байтах самого длинного свободного участка памяти
(тип функции longint),
Memavail – полный объем свободной динамической памяти в байтах
(тип функции longint),
Sizeof (X) – объем в байтах занимае-мый X, где X – либо имя переменной любого типа, либо имя типа
(тип функции word).
она вызывается до начала выделения памяти и записывает в указатель P адрес начала динамической памяти (из переменной HeapOrg). Затем можно процедурой
Release (P);
освободить участок памяти занятый до момента вызова release, начиная с адреса записанного в mark.
Вспомогательные функции:
Maxavail – длина в байтах самого длинного свободного участка памяти
(тип функции longint),
Memavail – полный объем свободной динамической памяти в байтах
(тип функции longint),
Sizeof (X) – объем в байтах занимае-мый X, где X – либо имя переменной любого типа, либо имя типа
(тип функции word).
И+ПРГ
Слайд 4
Указатели на процедуры и функции
Указатели на подпрограмму являются переменной процедурного (функциональ-ного)
Указатели на процедуры и функции
Указатели на подпрограмму являются переменной процедурного (функциональ-ного)
типа:
Имя функции (процедуры) – это константа процедурного типа, поэтому присваивание происходит без операции взятия адреса @ , т.к. в этом типе имя подпрограммы - и есть адрес точки входа в неё.
type fun = function (x : real) : real;
var pf : fun;
(* конкретная функция *)
function f (x : real) : real : far;
Begin
……………………… (* тело функции *)
End;
pf := f;
В переменной pf теперь содержится адрес точки входа в функцию f, и можно вызывать её так: y := pf(x);
Функция должна компилироваться в режиме дальней адресации - far, ведь адрес должен содержать сегмент и смещение, а без far – одно смещение, т.к. компилятор формирует всего один сегмент кода.
Имя функции (процедуры) – это константа процедурного типа, поэтому присваивание происходит без операции взятия адреса @ , т.к. в этом типе имя подпрограммы - и есть адрес точки входа в неё.
type fun = function (x : real) : real;
var pf : fun;
(* конкретная функция *)
function f (x : real) : real : far;
Begin
……………………… (* тело функции *)
End;
pf := f;
В переменной pf теперь содержится адрес точки входа в функцию f, и можно вызывать её так: y := pf(x);
Функция должна компилироваться в режиме дальней адресации - far, ведь адрес должен содержать сегмент и смещение, а без far – одно смещение, т.к. компилятор формирует всего один сегмент кода.
И+ПРГ
- Предыдущая
И+ПРГ_23-01 Указатели Следующая -
Pascal Указатели Динамические переменные