Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные Паскаль.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
780.93 Кб
Скачать

2.3 Создание и удаление динамических переменных

Для работы с динамическими переменными в модуле System языка Турбо Паскаль предусмотрено несколько процедур и функций.

В случае типизированных указателей динамические переменные создают с помощью процедуры new(p), которая выделяет в динамической памяти столько байтов, сколько требуется для хранения переменной заданного указателем р типа, а указателю р присваивается адрес первого байта выделенной в памяти ячейки.

В случае нетипизированных указателей динамические переменные создают с помощью процедуры getmem(p, size), которая выделяет в динамической памяти столько байтов, сколько указано переменной size, а указателю р присваивается адрес первого байта выделенной в памяти ячейки.

Для освобождения динамически выделенной для типизированных указателей памяти можно использовать процедуру dispose(p), которая очищает память, указанную ссылкой р.

В случае нетипизированных указателей для очистки динамической памяти предусмотрена процедура freemem(p, size), которая освобождает size байтов, начиная с адреса р.

После очищения (освобождения) указатели сохраняют свои значения, однако при этом указывают уже на несуществующие динамические переменные. Поэтому рекомендуется всем высвободившимся указателям присвоить значение nil.

При выделении динамической памяти полезными являются функции memavail и maxavail, первая из которых возвращает общий размер свободной динамической памяти в байтах, а вторая – размер наибольшего непрерывного участка свободной памяти.

Например,

var

p: ^real;

. . . . .

if maxavail > sizeof (real) then new(p);

. . . . .

2.4 Динамические массивы

Рассмотрим работу с динамическими массивами на примере программы перемножения прямоугольных матриц, размер которых заранее не известен, но может быть определён динамически.

Размеры перемножаемых матриц должны быть согласованы, а именно количество столбцов первого сомножителя должно равняться количеству строк второго.

Так как размер переменных заранее не известен, то процедуры new и dispose применить нельзя.

Для данной задачи подходят стандартные процедуры getmem и free­mem.

Процедура getmem (var d: pointer; m: word) создаёт динамическую переменную указанного размера и присваивает значение адреса ссылочной переменной d. Если в памяти ЭВМ не хватает места для размещения переменной, то появляется сообщение об ошибке.

Процедура freemem (var d: pointer; m: word) как и процедура dispose освобождает память, отведённую под динамическую переменную, и делает эту память доступной для другого использования. Точно также после этого указателю d обязательно нужно присвоить значение nil.

Пример 1.

program Mult_Matr;

uses Crt;

type

Index_Of_Row = array [1..100] of ^VectColumn;

VectColumn = array [1..100] of integer; {здесь Index_Of_Row – имя типа ссылочных переменных, имеющих базовый тип динамического массива, VectColumn – имя типа ссылочной переменной типа "массив целых чисел"}

matrix = record {matrix – переменная типа "запись"}

N_rows, N_column: word; {Номер строки (ряда), номер столбца}

index: ^Index_Of_Row; {index – ссылка (указатель) на вектор-столбец VectColumn, длина которого равна числу строк матрицы Index_Of_Row. Каждый элемент столбца VectColumn сам является указателем на вектор-строку}

end;

var

A, B, C: matrix; {А и В – исходные матрицы, С – матрица – результат перемножения матриц А и В}

IndexSize, ElemSize, I, K: word; (* Размеры индекса и элемента матрицы, I, K – счётчики. Ссылка на элемент матрицы А имеет вид: A.index ^[I]^[K] *)

M, N: longint; (* Размеры матрицы *)

procedure CreateMatrix( var A: matrix; r c: word ); {Процедура создания матрицы}

var

j, k: word;

begin

with A do

begin

N_rows:= r; N_column:= c;

j:= N_rows * SizeOf (Pointer);

inc ( IndexSize, j );

GetMem (index^[j], k);

for k := 1 to N_column do

index^[j]^[k] := -5 + random (11);

end;

end;

begin

………………..

end.