Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

13.3.2 Використання завершуючих обробників виключень

(_try/_finally)

Управління завершення включає в себе дві компоненти:

  • по-перше, є блок кода, який слідує за ключовим словом _try, поміщений в фігурних дужках. Він називається тілом захищеного кода і складається з одного чи кількох операторів, які можуть прямо чи непрямо заявляти виключення;

  • за ним слідує ключове слово _finally з блоком кода, який називається блоком завершення(також міститься у фігурних дужках). Оператори блоку завершення виконуються завжди, коли управління покидає тіло захищеного кода;

__try

{

/*тіло*/

}

__finally

{

/*блок-обробник виключення*/

}

Якщо управління послідовно переходить від захищеного тіла до блока завершення, то говорять, що тіло захищеного кода завершилось нормально.

Анормальне завершення відбувається, коли управління залишає захищене тіло внаслідок

  • використання оператора goto, break чи continue

  • виклику функції longjump()

  • заявленого виключення

Блок завершення може викликати функцію AbnormalTermination() щоб вияснити, як завершився захищений код. Розглянемо приклад, який демонструє обробку завершення:

#include <except.h>

#include<stdio.h>

void func(void)

{ /*Grab_A_Resourse();*/

__try

{

/*щось трапилось*/

return;

}

__finally

{

/*Release_The_Resourse();*/

printf(“__finally:Захищений блок завершився%s\n”,

AbnormalTermination()?”анормально”:”нормально”);

}

}

int main()

{

func();

return 0;

}

Комбіноване використання кадрованої та завершуючої обробки

Використовуючи вкладені блоки, можна комбінувати обидва варіанти обробки:

void funcA() /*Якщо заявляється*/

{ /* виключення, порядок*/

__try /*виконання такий:*/

{ /*1. вираз фільтра*/

__try /*2. обробник виключення*/

{ /*3. обробник завершення*/

/*захищений код*/

}

__except(фільтруючий вираз)

{

/*обробник виключення*/

}

}

void funcB() /*Якщо заявляється*/

{ /* виключення, порядок*/

__try /*виконання такий:*/

{ /*1. вираз фільтра*/

__try /*2. обробник завершення*/

{ /*3. обробник виключення*/

/*захищений код*/

}

__finally

{

/*обробник завершення*/

}

}

__except(фільтруючий вираз)

{

/*обробник виключення*/

}

}

Відмітимо, що

  • управління виключеннями С++(try/throw/catch) не може використовуватись в модулях мови С

  • синтаксис упрввління завершення (__try/__finally) не може використовуватись в модулях С++

  • кадроване управління С може використовуватись в модулях С++. Для реалізації кадрованого обробника в модулі С++ необхідно використовувати пару ключових слів try/__except чи try/except.

Контрольні запитання

1. Як синтаксично організована робота з виключеннями в С++ ?

2. Як синтаксично організована робота з виключеннями в С ?

3. Чи можна згенерувати виключення на тип чи вказівник на тип, що не має void-конструктора копіювання ?

4. Чи здійснюється контроль специфікацій виключень в С++ ?

5. Як викликаються деструктори, коли виключення генерується в конструкторі ?

6. Чи можна повертати об’єкти(чи якісь повідомлення) в конструкторах ?

7. В чому специфіка роботи з ієрархіями виключень ?

8. Які специфічні класи виключень існують в С++ ? Як вони використовуються ?

9. В чому специфіка структурного управління виключеннями ?

10. Як синтаксично реалізоване кадроване управління виключеннями ?

11. Як синтаксично реалізоване кадроване управління виключеннями ?

12. Як використовується кадроване управління виключеннями для перехоплення виключень процессора ?

13. Чи можна поєднувати кадровану та завершуючу обробку ?

Завдання 13

1.Написати програму, у якій викидається деяке виключення у випадку помилки відкриття файлу.Визначити тип виключення як деякий клас Error, який містить інформацію про стан потоку(відповідних прапорців) та методи, що видають відповідні повідомлення про помилку.

2. Описати деякий клас, в якому виключення може викидатись з конструктора у випадку, коли не вистачає пам’яті. У відповідному обробнику передбачити виділення пам’яті шляхом знищення непотрібних файлів.

3.Написати власну функцію terminate(), яка викликається у випадку, коли для виключення не знайдено відповідного обробника.

4. Написати власну функцію unexpected(), що викликається у випадку порушення списку допустимих виключень.

Завдання 14

Розглянемо кілька глобальних задач, які можуть бути розв’язаними за допомогою ООП-підходу. Відмітимо, що постановки задач є далеко неповними . Деталізацію неоднозначних моментів покладаємо на читача. Приклади реалізації деяких з цих задач можна знайти у вказаній нижче літературі.

1. Написати програму моделювання роботи аеродрому( можна використати клас Літак та похідні від нього). Аєродром може обслуговувати одночасно не більше k літаків. Якщо посадки вимагає більше к літаків, лишні повинні стояти в черзі. Якщо паливо закінчується, літак падає. Аеродром обслуговує кожен літак деякий фіксований час, що залежить від його типу. Процес надходжень літаків вважати пуассонівським з деяким параметром (інтервал між надходженням літаків виражається співвідношенням:

,

де -деякий параметр, -випадкова величини, що має рівномірний розподіл на (0,1).) Аеродром повинен функціонувати заданий час. Процес функціонування відобразити графічно. (детальніше див.[4])

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

Сам океан можна задати за допомогою статичного двомірного масив у вказівників на клас Океан , що є полем класу Океан . Кожен елемент масиву при ініціалізації є адресою елемента одного з трьох похідних від базового класу класів (Риба, Хижак, Перешкода) або NULL якщо в певному місці океану нічого немає. (Детальна постановка - див.[5])

3. Нехай маємо позитивно , негативно заряджені та нейтральні однотипні частинки, розміщені

а) у обмеженій області площини

б) в трьохвимірному просторі.

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

4. Побудувати модель повітряної битви літаків (кораблів тощо).

а) є лише два однотипних ворожих літаки, що не рухаються (зависли в повітрі), які по черзі стріляють один в одного випадковим чином. Битва закінчується, якщо один з літаків переміг. (Клас Літак має поля: життя, координати , функції стрільби.)

б) Запрограмувати попередній випадок, зробивши літаки рухомими.

в) Надати літакам додатковий параметр - область видимості. Якщо один з літаків потрапляє в “область видимості” іншого, вистріл другого відбувається майже напевне (з невеликою ймовірністю схиблення).

г) Ввести поля паливо та боєприпаси. Якщо паливо закінчується, літак стає

нерухомим.

д) Поширити останній варіант на групу об’єктів

е) Вводити в бій літаки різних типів(типи визначаються максимальними значеннями найпростіших параметрів - кількість боєприпасів, кількість прального).

є) Добавити можливість дозаправки та відновлення боєприпасів в повітрі через введення особливих транспортних літаків, які також можуть збиватись

ж) Ввести n типів зброї на літаках та n відповідних системи захисту від кожного виду зброї . Якщо певний тип захисту “пробитий”, відбувається зменшення змінної “життя” літака.

з) Ввести бази, де дуже пошкоджені літаки можуть ремонтуватись та відновлювати запаси палива та боєприпасів. На базах можуть будуватись літаки з однаковою інтенсивністю (можна зробити цей параметр випадковим, наприклад що має пуассонівський розподіл). Якщо поле життя літака стає меншим деякої константи, але не нульовим, літак повинен повернутися на базу.

и) ввести можливість нападу на ворожі аєродроми та їх знищення.

Координати ворожих баз спочатку невідомі. Аєродроми мають потужну систему захисту.

5.Моделювання організму.

а) Ввести клас клітина як базовий для клітин різних типів. Вважаємо, що є 3 типи клітин: звичайна клітина, клітина, що генерує антитіла (плазмоклітина), клітина-вірус (що має додаткове поле-потужність чи силу вірусу) . Візуально кожна клітина являє собою коло певного радіусу. Вона має молекулу ДНК (статичне поле), що являє собою скінченну послідовність двохвимірних векторів-напрямків поділу . В момент поділу клітини породжуєть нова(екземпляр того ж класу), яка приєднується до базової в напрямку вектора поділу, заданого черговою позицією молекули ДНК . При цьому статичний індекс позиції ДНК збільшується на одиничку. Кожна з утворених клітин сама починає ділитсь (тобто всі клітини діляться. ) Можливість поділу в заданому напрямі зумовлюється візуальним зображенням. Процес формування конструкції продовжується доти, доки величина статичного індексу позицій ДНК не буде дорівнювати її довжині.

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

в) Описати вірусну клітину, як особливий тип клітини. Можна вважати що довільна клітина чи група клітин в певний момент часу можуть стати вірусними. При виникненні вірусної клітини виникає конфліктна ситуація, під час якої зростає температура сусідніх здорових клітини (закон зростання залежить від потужності вірусу, наприклад , де p -потужність вірусної клітини, s-деяка константа) і далі всього організму (закон -подальшої зміни- див. п а) ). Антитіла рухаються з певною швидкістю (фіксованою для кожного організму) в напрямку збільшення температур. Якщо в якийсь момент часу сумарна потужність антитіл в сусідніх з вірусною клітинах стає більшою потужності вірусної клітини, остання стає здоровою і набуває кількість антитіл, що дорівнює різниці іх вихідної сумарної кількості в клітинах, що боролися з вірусною, та потужності віруса(вірусної клітини). Тоді боротьба починається з іншою вірусною клітиною , температури перерозподіляються. Якщо в клітини всі сусіди стали “здоровими”, її температура стає рівною температурі сусідів. Якщо потужність вірусу така, що кількість антитіл сусідньої клітини не може компенсувати її, вірус заражує відповідну клітину і вона сама стає вірусом потужності, рівної різниці потужності вірусу та кількості антитіл в ній. Якщо заражено більше половини клітин органірму, він гине.

г) ввести залежність потужності вірусів від температури організму

Деякі міркування на закінчення.

С++ - це потужний засіб створення програмного забезпечення в рамках об’єктно-орієнтованого підходу. Як бачимо, в С++ реалізовані структури даних, що ідеально підходять для моделювання об’єктів реального світу. Екземпляри класів С++ мають свою внутрішню структуру, свої властивості, що визначаються функціями-членами. Чим більше методів та полів даних має клас - тим “розумнішими” є його представники. Все як і в реальному світі. Прогулюючись з песиком, ми передаємо йому команди повідомлення: “стояти”,”голос”,”до мене”. Чим розумніша істота, тим різноманітніші повідомлення вона розуміє і може на них відреагувати. Всередині класів ховаються всі особливості програмної реалізації, суть алгоритмів взаємодії між об’єктами. Тому і розмір main() - функції в таких програмах буває скороченим до мінімуму. Вона складається лише з повідомлень, що передаються об’єктам. Розглянемо, наприклад, моделювання екологічної системи Океан. В роботі [3 ] main()-функція має вигляд:

main()

{ Ocean* myOcean=new Ocean;

myOcean->initialize();

myOcean->run(); }

Функція run() містить цикл виду

for(int i=0; i<N; i++) елемент. process();

Тут process() - це деяка функція-член класу , яка запускає процес “життєдіяльності” для кожного елемента океану. Бачимо, що всі особливості програмної реалізації моделі заховані у класах. Завдяки цьому створюється ідеальна модель . Елементи можуть “жити”, “розмножуватись”, вести себе по відношенню до сусідів згідно з заданим алгоритмом їх поведінки. Причому програміст абсолютно не управляє цим процесом. Система самоорганізується , функціонує самостійно згідно з законами, заданими у описах класів. В main-функції немає ніякого аналізу ситуацій, ніяких викликів функцій. Лише функція process(), яка еквівалентна народженню об’єкта, втіленню його у віртуальний світ океану. Окремі елементи океану, об’єкти певних класів, ніби стають реальними живими об’єктами. Уявімо собі, що хочемо написати таку саму програму без використання об’єктного підходу, користуючись лише засобами процедурного програмування. Тоді ми просто заплутаємось у описах та аналізі величезної кількості взаємозв’язків між елементами даних та функціями їх обробки, у описі властивостей елементів океану та їх взаємодії. Очевидно, що створити аналогічну програму без використання засобів ООП буде значно важче.

Відмітимо, що при постановці задач в об’єктно-орієнтованих мовах можна використовувати термінологію реальних об’єктів, які моделюються. Підзадачі в завданні 14.4 можна переформулювати так: “навчимо літак рухатись”, “навчимо літак бачити” і т д. Оскільки мова йде про реальні об’єкти, властивості яких добре відомі , то конкретизувати постановку задач , можливо, і непотрібно. Важливо лише, щоб програміст розумів кінцеву ціль створення даної моделі. Тоді він вже сам може вибрати чи створити собі такі типи даних, які максимально підходять для розв’язання саме його задачі.

Легкість у створенні та використанні типів даних користувача в об’єктно-орієнтованих мовах робить сам процес програмування дуже захоплюючим. Програміст відчуває себе творцем свого власного віртуального світу. Як відмічає професор В.А.Сухомлин , за допомогою об’єктно-орієнтованого програмування можна досягнути “ефекту занурення користувача у його ж семантичні світи, де він може почувати себе істинним творцем”. Давайте замислимося над тезою: людина - істинний творець. Виходячи з такого положення, людина може робити з своїм творінням все, що їй заманеться. Адже вона сама - творець. У віртуальному світі все просто: захотів - натиснув клавішу комп’ютера і знищив якесь комп’ютерне творіння, захотів - створив його. Але цей віртуальний світ часто є відображенням реального, є моделлю тих чи інших процесів , що відбуваються у реальному світі. Тоді відчуття творця, наділеного безмежними можливостями у віртуальному світі, може в якійсь мірі підсвідомо перенестись у реальний світ. Ідеологія особистого домінування, знищення всього , існуючого в інших формах, насильства та жорстокості ( яка нерідко пропагується в комп’ютерних іграх) знаходить підтримку у підсвідомості людини, оскільки вона притаманна тілесній стороні людської сутності. Виходячи з концепції “людина - творець” можна прийти до виправдання всього найганебнішого, що є в нашій цивілізації. Тому дуже важливо, щоб в процесі творення цих “семантичних світів” не породжувалася ілюзія всемогутності людини, людського розуму, особистої геніальності. Адже необмеженість приводить до обмеженості, а обмеженість - до необмеженості. Відчуття своєї досконалості та неперевершеності призведе , безсумнівно, з часом до обмеженості і відсталості, а відчуття обмеженості та недосконалості призводить , як правило, до максимального вдосконалення та прогресу.

Наша цивілізація все більше і більше комп’ютеризується. Від об’єкта вивчення невеликою групою науковців для вирішення суто обчислювальних задач комп’ютер перетворився у потужний інструмент обміну інформації, без якого скоро не зможе обійтись жодна цивілізована людина За допомогою комп’ютера людина зараз може отримати все, що її цікавить: кінофільми, музика, книги, ціни на товари та послуги, найновіші наукові розробки. Все швидко, надзвичайно якісно та зручно. Увібравши в себе найвищі технічні досягнення людства, комп’ютер стає вінцем людського творіння, найнеобхіднішим предметом кожної людини, атрибутом нашої цивілізації. Але тенденція до всепоширеності комп’ютерів, захоплення ними усіх сфер людського життя , на мою думку, несе у собі ряд негативних моментів.

Будучи колосальним засобом збереження, передачі та обробки інформації, комп’ютер водночас представляє собою потужний інструмент впливу на людину. Комп’ютер стає передовим полем боротьби за людську душу. Через комп’ютер надходить потік найрізноманітнішої інформації, реклами, в тому числі і реклами “між кадрами”. Численні комп’ютерні ігри насаджують ідеологію вбивств та насильства, що надзвичайно сильно деформує людську психіку (і особливо дитячу).

Сучасна динаміка створення програмного забезпечення приводить до того, що багато людей вже не бачить необхідності в тому, щоб програмувати: все одно спеціалізовані фірми створять краще програмне забезпечення. І вони дійсно створюють. Але при цьому насаджують своє бачення світу, свою філософію і стиль мислення, свої закони. І виділяється категорія людей, користувачів, які тільки поглинають цю колосальну кількість програмного забезпечення, вивчають його, поступово втрачаючи навики написання програм. Таких людей, очевидно, переважна більшість. Переважна більшість людей зараз вже купує комп’ютери лише заради розваг та зручностей, які вони собою представляють. І аж ніяк не для інтелектуального вдосконалення, яке несе сам процес створення програмного забезпечення. Та й навіть ті, що пишуть програми, не можуть зараз обійтись без потужних фірмових програмних продуктів. Інакше просто опинишся на одвірку технічного прогресу. Разом з нав’язуванням програмних продуктів відбувається нав’язування і чужого світогляду, чужих законів існування. Безсумнівно, що це є обмеження свободи людської особистості. Людина , можливо, і не хоче працювати саме з такими програмами чи з такими типами комп’ютерів, які нав’язує їй, наприклад, фірма IBM . Але вона змушена це робити, бо фірма IBM стала монополістом і створила відповідний світ з відповідними законами. І якщо хтось не хоче підкорятись цим законам, то його чекають самі негативні для нього наслідки.

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

В процесі роботи з комп’ютером постійно існує єфект “чарівної палички”: одного легкого поруху руки з маніпулятором достатньо для того, щоб річ, яка тебе цікавить, з’явилась на екрані. А це , в свою чергу, поступово може створити ілюзію всемогутності . Людина надзвичайно легко звикає до того, що будь-яке її бажання виконується. Легко уявити собі, що відбувається, якщо такий стереотип переноситься у людське суспільство.

Постійно сприймаючи замість реального світу лише його комп’ютерне відображення,

світ через екран комп’ютера, людина поступово може заповнити свою область несвідомого спрощеним “віртуальним” світом”. Але ж якими далекими від реальності є його закони та об’єкти! Скільки мільйонів і мільярдів “полів даних” повинен мати справжній літак, не говорячи вже про океан! Хіба ж можна порівняти його з реальним об’єктом ? І якою елементарною та немічною виглядає будь-яка комп’ютерна модель , яким би геніальним програмістом вона не була створена, перед величчю реального світу, створеного Творцем. Лише мізерну частину цього реального світу ми можемо усвідомити. Інше ж ми ”бачимо” на рівні підсвідомості, не розуміючи, не усвідомлюючи його. І коли область несвідомого заповнюється спрощеним віртуальним світом, то це може призвести,на мою думку, до негативних деформацій душі, обмеженості людського світосприйняття .

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

Література.

1.Бруно Бабе . Просто и ясно о Borland C++.

2.Том Сван. Освоение Borland C++ 4.5, “Диалектика”, Киев, 1996

3.В.Ю. Романов. Программированиє на язике С++., М., “Компьютер”, 1993

4. Стефан Дьюхарст, Кєти Старк Программирование на С++, Киев, НИИПФ ”ДиаСофт”, 1993

5. Ричард Вайнер, Льюис Пинсон, С++ изнутри, Киев, НИИПФ ”ДиаСофт”, 1993

156