Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Стан покажчика

Для покажчика, після того як він оголошений у розділі опису змінних, можливі три стани. Покажчик може містити адресу деякої змінної, "порожній” адресу NIL або мати невизначений стан. Перший випадок пояснень не потребує. В другому випадку, коли потрібно, щоб покажчик нікуди не вказував, йому присвоюється спеціальне значення NIL. Що ж стосується невизначеного стану, то воно має місце відразу після початку роботи програми (до того як покажчику буде присвоєна яка-небудь адреса в пам'яті чи значення NIL), або після звільнення пам'яті, на яку даний покажчик посилається.

Якщо когось бентежить "покажчик, який нікуди не вказує", то це можна представити як посилання на область пам'яті, у якій ніяка інформація ніколи не розміщується. Значення NIL — це константа, яку можна присвоїти будь-якому покажчику.

Може виникнути питання, у чому різниця між невизначеним станом покажчика і випадком, коли його значення дорівнює NIL? Оскільки NIL— значення конкретне, хоча і нікуди що не вказує, можна сказати, що два покажчики, що містять NIL, мають рівні значення. У той же час значення двох покажчиків у невизначеному стані рівними визнати не можна.

Установка розмірів динамічної пам'яті

Як уже говорилося, більшість реальних прикладних програм активно використовують динамічні змінні. Це зв'язано як з великою гнучкістю цього механізму, так і з чуттєвим для великих програм обмеженням на загальний об’єм статичних змінних. За замовчуванням для купи виділяється весь об’єм наявної оперативної пам'яті, доступній операційній системі, за винятком пам'яті для коду програми і статичних змінних. Таким чином, розмір динамічної пам'яті може досягати 400K і більш. Однак у ряді випадків такий об’єм є надлишковим чи навіть неприпустимим (зокрема, Pascal-програма, що займає всю оперативну пам'ять, не в змозі здійснити виклик якої-небудь іншої програми, розміщеної в окремому Ехе-файлі). Крім того, деякі програми можуть узагалі не використовувати динамічну пам'ять.

Сказане визначає необхідність засобів керування розмірами динамічної пам'яті, використовуваною програмою. У мові Turbo Pascal для цього служить директива компілятора $M. Ця директива повинна розташовуватися на початку тексту програми і має три цілочисельних параметри, що повинні розділятися комами. Перший параметр визначає максимальний розмір пам'яті, що виділяється під стек локальних змінних, а два наступних параметри задають мінімальний і максимальний розміри динамічної пам'яті.

Приклади директиви $M:

{$M 10240,0,200000}

{$M 16384,1024,650000}

{$M 1024,0,0}

Завдання мінімального розміру динамічної пам'яті (другий параметр) носить обмежувальний характер і встановлює той об’єм необхідної пам'яті, при відсутності якого програма взагалі НЕ МОЖЕ ВИКОНУВАТИСЯ. Якщо цей параметр є 0, то програма буде запущена в будь-якому випадку.

Третій параметр задає максимальний розмір потрібної динамічної пам'яті і носить рекомендаційний характер. Іншим словами, розмір динамічної пам'яті буде визначатися перед початком роботи програми виходячи з реальної наявності вільної оперативної пам'яті, але не буде перевищувати зазначений у цьому параметрі об’єм. Якщо при запуску програми в оперативній пам'яті знаходяться які-небудь програми (наприклад, резидентна частина системи Norton Commander) чи запуск виконується з інтегрованого середовища Turbo Pascal, що саме має досить значний розмір, то реальний об’єм динамічної пам'яті, відведеної програмі, може бути менше замовленого.

За замовчуванням передбачається наявність директиви

{$M16384,0,655360}

тобто під стек виділяється l6K байт, під динамічну пам'ять - уся вільна оперативна пам'ять, доступна операційній системі.

Варто мати на увазі, що, крім директиви $M у тексті програми, можна установити обговорювані розміри за допомогою альтернативи Options/Memory Sizes в інтегрованому середовищі чи передавати їх як параметри при виклику компілятора командного рядка.