Направления программирования. История создания языка Си. Особенности языка, страница 30

а) Нижняя граница Heap (куча, множество)  области определяется стандартным указателем Heap Org, который содержит абсолютный адрес начала динамической памяти. Верхняя граница Heap – области определяется указателем Heap End.  Текущее значение указателя, разделяющего занятую и незанятую части Heap – области, содержит указатель Heap – Ptr .  При каждом новом выделении памяти система управления Heap -  областью передвигает указатель Heap – Ptr вверх  (в сторону увеличения адресов памяти).

При работе с динамической памятью, помимо кучи, выделяется ещё один участок памяти, расположенный в самых верхних адресах DOS (свободная память).  Адрес его нижней границы хранится в указателе Free Ptr. В Турбо Паскале размером ДРОП можно управлять с помощью директивы компилятора {$M}.

Синтаксис директивы {$M}

{$M размер стека, размер динамической области}  

По умолчанию {$?M? 16.384, 655360}.

Размер стека – в пределах: 1024-65534

Размер ДРОП – 0 – 655360

Указатель в Паскале занимает 4 байта памяти (2 слова). Первое слово дает смещение адреса, второе – адрес сегмента.

В Турбо Си в OC MS-DOS и микропроцессорах семейства 8086 (80286, 80386, 80486) размер указателя зависит от модели памяти, задаваемой при компиляции программы. Модель памяти по умолчанию – small (маленькая).  Под код  программы отводится сегмент размером 64 К. Стек, куча и статические данные размещаются в одном сегменте, размером  64 К. Такая модель памяти подходит для многих маленьких и средних задач. Указатели в такой модели занимают только два байта (близкие указатели – модификатор REAL), т.е., следовательно, содержат смещение внутри фиксированного сегмента памяти. Кроме этой  имеется ещё пять моделей памяти:      

-  Tiny – минимальная. Общий размер кода, данных и стека – 64 Кбайт. Все указатели ближние.

-  Medium – модель памяти для больших программ, для которых не требуется держать в памяти большой объем данных. Для кода, но не для данных используются дальние указатели (far – 4 байта).  Объем  памяти данных и стека – 64 Кбайт, программа может занимать до 1 Мбайта. 

-  Compact – этот метод используется в тех случаях, когда размер кода невелик, но требуется адресация большого объема  данных (1 Мбайт) , но не для кода (64Кбайт).

-  Large и Huge – модели памяти для очень больших программ. Для кода и для данных используются дальние указатели. Модель Huge к тому же ещё и отменяет ограничение размера памяти, выделяемой под статические данные.

 Пример: VAR P:^INTEGER;

BEGIN

NEW (P);

END.  

После выполнения процедуры NEW (P);  указатель P приобретает значение, равное тому,  которое до сих пор имел  текущий указатель Heap Ptr, а значение указателя Heap Ptr будет увеличено на 2, т.к. длина внутреннего представления типа integer, с которым связан указатель Р, равна 2 байта. Если указатель ссылается на тип данных для которых требуется память больше,  чем доступно для распределения в куче,  то в этом случае происходит ошибка выполнения программы. Поэтому,  перед тем как использовать стандартные процедуры распределения динамической памяти, необходимо проверит наличие требуемого объема памяти в куче.

Пример:  

FUNCTION CHECK (VAR P: PIONTER; SIZE: WORD): BOOLEAN;

BEGIN

CHECK: = false;

if SIZE  > MAXAVAIL then EXIT;

CHECK: =true;   {Выделение памяти состоялось}

GETMEN (P, SIZE);

END.

Функция MAXAVAIL возвращает размер в байтах наибольшего непрерывного участка памяти в куче, т.е. выполнение условия SIZE  > MAXAVAIL говорит о том, что нет сплошного фрагмента памяти, который необходимо выделить по запросу GETMEN (P, SIZE).

п. 18. Графический режим.

Управление экраном в графическом режиме производится с помощью функций, прототипы которых записаны в заголовочном файле GRAPHICS.H.

Отличие графического окна от текстового заключается в том, что левый верхний угол окна имеет координаты (0,0) а не (1,1) . По умолчанию графическое окно равно полному экрану. Прежде чем использовать графические  функции нужно установить видеоадаптер в графический режим.