- •Історична довідка
- •Характеристика й особливості мови
- •Алфавіт мови
- •Службові (зарезервовані) слова.
- •Структура програми мови Turbo Pascal
- •Процедури введення-виведення. Деякі вбудовані функції Турбо-Паскаля.
- •Функції числових параметрів.
- •Базові управляючі конструкції Турбо-Паскаля Оператори умовного переходу.
- •Оператори циклів у Паскалі
- •Концепція типів даних. Типи даних в мові Pascal
- •Дійсні типи
- •Бульовий (логічний) тип
- •Символьні і рядкові змінні
- •1. Символьний тип
- •2. Рядковий тип
- •Перерахований та обмежений типи
- •1. Перерахований тип
- •2. Обмежений тип
- •1. Поняття масиву. Одномірні масиви
- •2. Багатомірні масиви
- •3. Сортування і пошук
- •Множинний тип
- •Тип запис
- •Процедури і функції
- •Формальні і фактичні параметри. Механізм параметрів
- •Параметри - значення
- •Параметри-змінні
- •Безтипові параметри
- •Приведення типів.
- •Процедурні типи
- •Рекурсія Рекурсивні визначення
- •Рекурсивні підпрограми
- •Алгоритми з поверненням. Розв’язок задачі про рух коня
- •Алгоритми з поверненням. Розв’язок задачі про вісьмох ферзів
- •Модулі в Турбо Паскалі
- •Модуль crt
- •1. Керування екраном
- •2. Робота з клавіатурою
- •3. Інші можливості
- •Графіка в Турбо Паскалі
- •1. Включення і вимикання графічного режиму.
- •2. Побудова елементарних зображень
- •3. Виведення текстової інформації.
- •Файли в мові програмування Pascal
- •Установчі і завершальні операції
- •Операції введення-виведення
- •Обробка помилок введення-виведення
- •Переміщення по файлу
- •Спеціальні операції
- •Текстові файли
- •Двійкові файли
- •Статичні і динамічні змінні
- •Покажчики
- •Стан покажчика
- •Установка розмірів динамічної пам'яті
- •Сумісність і перетворення посилкових типів
- •Динамічні структури даних
- •Динамічні змінні: інші види списків, стек і черга.
- •1. Інші види списків
- •2. Стек і черга
- •Дерева і пошук у деревах
- •1. Визначення й описи структур даних
- •2. Алгоритми
- •Змішані таблиці
- •Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування
- •Інкапсуляція
- •Спадкування
- •Віртуальні методи і поліморфізм
- •Конструктори, динамічні об'єкти і деструктори
- •Поля і методи: сховані і загальнодоступні
- •Системно- залежні розширення
- •Налагодження змінних
- •Оверлеї
- •Переривання і системні виклики
- •Доступ до пам'яті і портів
- •Перевизначення переривань
Поля і методи: сховані і загальнодоступні
Поля і методи в описі об'єктного типу можуть оголошуватися як сховані, або як загальнодоступні. Відповідні розділи в описі об'єкта відкриваються директивами 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;
Цей оператор виведе в середину екрана символ '*' жовтого кольору на червоному фоні.