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

Поля і методи: сховані і загальнодоступні

Поля і методи в описі об'єктного типу можуть оголошуватися як сховані, або як загальнодоступні. Відповідні розділи в описі об'єкта відкриваються директивами PRTVATE і PUBLIC. От так можна використовувати директиви в описі типу Dot із програми, з яким ми мали справу в попередньому розділі:

Dot=object

private

a, b :integer;

public

constructor Init (x,y:integer);

procedure Show; virtual;

private

procedure Hide; virtual;

procedure Move (Da, Db: integer);

public

destructor Done;

end;

У цьому прикладі в якості схованих оголошені поля А и В, а також методи Hide і Move. У той же час методи Init, Show і Done мають тут статус загальнодоступних. Читач уже зрозумів, що кожна чергова директива PRVATE чи PUBLIC скасовує дію попередньої директиви. При цьому, якщо в описі типу зазначених директив нема, за замовчуванням вважається, що всі поля і методи цього типу загальнодоступні.

Поля і методи об'єкта, оголошені після директиви РRVАTЕ, будуть доступні тільки в межах даної програми чи модуля. Однак якщо цей об'єкт міститься в підключеному до програми модулі, ідентифікатори прихованих полів і методів виявляться для програміста невидимі. При цьому сам об'єкт буде цілком відкритий для використання. Для чого це потрібно? Наприклад, якщо це комерційний додаток, цілком природно, що його творці обмежують доступ користувачів до подробиць реалізації даного додатка (у результаті додатком можна користатися, але його не можна модифікувати на свій смак). Крім того, часто має сенс обмежити доступ до деяких полів і методів об'єкта, щоб програміст випадково (по недогляду) не вніс у них змін, які можуть спричинити непередбачені наслідки.

Системно- залежні розширення

У даній главі зосереджені описи вбудованих у Turbo Pascal засобів, орієнтованих на безпосередній доступ до можливостей операційного середовища, в оточенні якого працює система Turbo Pascal, - операційної системи MS-DOS, a також до оперативної пам'яті і пристроїв персонального комп'ютера.

Набір цих засобів включає безпосередній доступ до оперативної пам'яті по фізичних адресах, включаючи настроювання Pascal-змінних на конкретну адресу, доступ до портів (також по їх номерах), виклик переривань і функцій операційної системи, явну роботу з кодами команд центрального процесора. Сюди ж примикає оверлейний механізм, який дозволяє будувати великі програми, що перевершують по розмірах об’эм оперативної пам'яті.

Дані засоби в сукупності дозволяють у максимальный ступені використовувати можливості апаратури й операційної системи персонального комп'ютера і значно збільшують потужність мови Turbo Pascal. Для детального ознайомлення із системно-орієнтованими розширеннями мови варто звернутися до фірмових матеріалів поТurbоРаsсаl

Налагодження змінних

Як відомо, пам'ять під змінні приділяється автоматично при вході в ту підпрограму, де вони описані. Однак Тurbо Pascal містить засоби, що дозволяють впливати на розміщення змінних в оперативній пам'яті. Конкретно, є два способи завдання розташування змінних. По-перше, можна визначити розміщення змінної в тій області пам'яті, що уже відведена для збереження деякої іншої змінної. Наприклад, нехай у поточному (чи в деякому охоплюючому) блоці описана змінна А.Тоді опис змінної В виду

var В : Т absolute A;

де Т - деякий тип, задає розміщення змінної в тій же області пам'яті, у якій міститься перемінна А. Важливо розуміти, що у випадку такого опису нова область для збереження змінної В НЕ ВИДІЛЯЄТЬСЯ. Крім того, істотним є той факт, що змінні А и В можуть бути будь-яких (зокрема, різних) типів і отже можуть займати різні об’єми пам'яті. Ніяких перевірок на цей рахунок не робиться. Таким чином, можна вважати, що приведений приклад задає розміщення змінних А и В ПОЧИНАЮЧИ з тої самої адреси.

Таке сполучення пам'яті для різних змінних використовується, в основному, для досягнення більшої ефективності об'єктного коду, а також для виключення громіздких операцій перетворення типів у деяких спеціальних випадках.

Розглянемо кілька прикладів.

У випадку інтенсивних операцій над рядками приходиться досить часто звертатися до стандартної функції Length, яка повертає поточну довжину рядка-параметра. З іншого боку, структура представлення рядків у пам'яті однозначно визначає нульовий байт рядка як місце збереження її поточної довжини. Тому можна використовувати, таку техніку роботи з рядками: крім опису самого рядка, увести додаткову змінну типу byte:

var

S : string[80];

L : byte absolute S;

Пам'ять під змінну L буде відведена там же, де по визначенню розміщений нульовий байт рядка. Отже, значення змінної завжди буде збігатися з результатом виклику Length (S). Природно, доступ до байта з довжиною за допомогою простої змінної приводить до більш компактного тексту програми і більш ефективному коду.

Наступний приклад ілюструє сполучення в пам'яті, змінних різних типів. Наступне опис:

var

I : longint;

R : record;

HiI, Loi : word

end

L absolute I;

уможливлює безпосереднє звертання до частин змінної I за допомогою конструкцій R.Hi і R.Loi. Tаким чином, Turbo Pascal, власне кажучи, допускає ще один спосіб неявного перетворення типів.

Конструкція зі службовим словом absolute застосовна і до параметрів підпрограм. Так, якщо параметр процедури специфікований як безтиповий, то можна інтерпретувати цей параметр необхідним чином, наприклад:

procedure P ( var Par );

var

M : array[1..100] of real absolute Par;

begin

end;

Усередині процедури P безтиповий параметр Par буде трактуватися як масив зі ста дійсних чисел, при цьому фактичний параметр може іменувати змінну будь-якого типу. Ще раз нагадаємо, що ніяких перевірок на відповідність у таких випадках не робиться, тому при роботі з такими змінними необхідна підвищена акуратність.

Другий спосіб настроювання дозволяє розмістити змінну довільного типу в деякомусь (буд-якому) місці оперативної пам'яті, починаючи з заданої фізичної адреси, що повинна бути зазначеною після службового слова absolute у виді пари "сегмент : зсув". Наприклад, опис:

var CrtMode : byte absolute $0040:$0049

визначає розташування змінної CrtMode у сегменті з адресою $0040 і зсувом відносно початку цього сегмента $0049. Цей спосіб настроювання змінних застосовується, в основному, для ефективного доступу до внутрішніх даних операційної системи і вимагає особливої уважності і точного знання адрес розташування системної інформації. Обидві константи у випадку завдання фізичної адреси повинні бути цілого типу і не можуть виходити за межі діапазону $0000 . . $FFFF (тобто 0 . . 65535).

Як приклад розглянемо техніку прямого звертання до відеопам'яті дисплейного адаптера, що часто використовується для побудови багатовіконних інтерфейсів і систем меню в текстовому режимі роботи дисплея.

Відомо, що для кольорового адаптера область пам'яті, у якій зберігається "образ" екрана дисплея в текстовому режимі роботи, починається із сегмента з адресою $B800 (точніше, така адреса власної відеопам'яті адаптера); у цій відеопам'яті кожному знакомісцю (одній позиції символу на екрані) відповідає два байти: один байт для коду відображуваного символу й один байт для колірних атрибутів символу (колір фону, колір самого символу, ознака мерехтіння). Таким чином, для звичайного режиму роботи дисплея (25 рядків по 80 символів у рядку) можна в такий спосіб описати структуру відеопам'яті

var

ColorBuffer : array[1..25,1..80] of

record

Symbol : char;

Attribute : byte

end

absolute $B800:$0000;

Далі в програмі присвоювання окремим елементам масиву ColorBuffer будуть приводити до негайного відображення отриманих значень на екрані (при цьому необхідно ще знати структуру байта з колірними атрибутами). Так наприклад, використовуючи системні константи, що позначають припустимі кольори, можна в такий спосіб формувати зображення на екрані:

with ColorBuffer[13,40] do

begin Symbol := '*';

Attribute := (Red shi 4) and Yellow

end;

Цей оператор виведе в середину екрана символ '*' жовтого кольору на червоному фоні.