Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгор_ТХТК_пособие.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.6 Mб
Скачать

If Not Eof(FilComp) then

Begin

Read(FilComp,Comp2);

If Comp1.Cena>Comp2.Cena then

Begin {Перестановка начинается}

Seek(FilComp,k);

Write(FilComp,Comp2);

Write(FilComp,Comp1);

Perest:=True; {Перестановка}

End;

End;

k:=k+1;

End;

Close(FilComp);

End;

Writeln(’Конец работы, нажмите клавишу Enter’);

Readln;

End.

Глава 10 Динамические структуры данных

10.1 Распределение памяти при выполнении программ

Напомним, что Турбо Паскаль, разработанный фирмой Borland, работает под управлением MS-DOS. В Турбо Паскале нет специальных средств, поддерживающих работу с дополнительной памятью, поэтому адресное пространство компьютера составляет 1 Мбайт. Рассмотрим распределение памяти для выполнимого кода на Турбо Паскале (рис. 1).

Верхняя граница памяти ms-dos

Область памяти для динамических переменных (куча)

Оверлейный буфер (если необходим)

Стек для хранения локальных переменных и параметров

Сегмент данных

Рабочий код системного модуля (System)

Рабочие коды подключаемых модулей

Рабочий код основного блока программы

Префикс сегмента программы

Рисунок 1 - Распределение памяти при выполнении программы

При запуске программы (ЕХЕ-файла) MS-DOS организует в памяти нечто вроде анкеты на этот файл длиной 256 байт, которая называется префиксов структуры программы. После префикса начинается код ЕХЕ-файла. Код ЕХЕ-файла состоит из рабочего кода системного модуля, рабочих кодов подключаемых модулей и рабочего кода основного блока программы. Статические глобальные переменные основного блока и все типизированные константы включая локальные, располагаются в сегменте данных, общий объем которого не может в сумме превышать 64К. За сегментом данных следует облаем стека. В ней располагаются локальные переменные и параметры-значения процедур и функций во время их работы по вызову. Область стека не может превышать 64К (обычно 16К). Стек заполняется от своей верхней границы (она может быть назначена директивой компилятору $М) по направлению к началу, т.е. к старту сегмента. Выше стека программа отводит себе память под буфер для работы оверлеев - перекрывающихся частей программ. Если они не используются, то буфер не отводится. Еще выше располагается область памяти для размещения динамических переменных и структур данных, называ­емая областью кучи или просто кучей (еще она называется Heap-областью).

По мере того, как программы становятся более сложными и требуется; работа с большим количеством данных, область объемом в 64К, зарезервированная в Турбо Паскале для данных, может оказаться недостаточной, чтобы; содержать все необходимые программе данные.

Предположим, есть программа, требующая массива в 400 строк по 100 символов каждая. Для этого массива требуется примерно 40К, что меньше максимума в 64К. Если остальные переменные помещаются в оставшиеся 24К, массив такого объема проблемы не представляет. Но если нужно два таких массива? Это потребует 80К. Чтобы работать с большими объемами данных, нужно использовать динамически распределяемую область памяти.

Динамически распределяемая область памяти - это вся память, которую операционная система делает доступной для программы и которая не используется ее кодом, сегментом данных и стеком. Объемом распреде­ляемой динамической памяти можно управлять с помощью директивы компилятора $М.

Известно, что все переменные, встречающиеся в программе, должны быть описаны. Перед началом выполнения программы каждой переменной для размещения ее значений выделяется место в сегменте данных. Размер выделяемого места зависит от типа переменной. Например, для переменной типа Integer выделяется 2 байта. Обращение в программе к объекту, размещенному в некотором месте памяти, осуществляется с помощью имени переменной. Соответствие между переменной и сопоставленным ей местом в памяти сохраняется для описанных в программе переменных на всем протяжении выполнения программы.IB Паскале имеются средства, позволяю­щие заниматься отведением и освобождением памяти для размещения объектов того или иного типа непосредственно по ходу выполнения програм­мы. Память в этом случае отводится в динамической области. Данные, размер которых задается непосредственно во время выполнения программы, называются динамическими. Для объявления динамических данных в Паскале используется ссылочный тип, называемый еще типом-указателем. С помощью ссылочного типа можно объявлять переменные, значением которых будет адрес ячейки памяти.