Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C _Учебник_МОНУ

.pdf
Скачиваний:
206
Добавлен:
12.05.2015
Размер:
11.12 Mб
Скачать
Package file name TBtnNClick можна задати:

Об’єктно-орієнтоване програмування

539

 

 

Search path – каталоги, в яких C++ Builder шукатиме unit нового класу. Якщо у попередньому пункті було зазначено повний шлях до власного каталогу, C++ Builder автоматично допише його до Search path; тому залишиться лише перевірити, чи правильно це було зроблено;

– шлях та ім‟я файла пакета. Для компонента

C:\STUDENTS\SEMESTR2\ТС104\Ivanov\MyCompn.bpk

Package description – коментар до пакета. Цей параметр заповнювати необов‟язково.

Після зазначення усіх параметрів і натискання кнопки “ОК” буде виконано спробу трансляції бібліотек, які входять до складу пакета, з виведенням відповідного вікна:

Незалежно від успішності виконання трансляції та реєстрації пакет буде створено і з‟явиться відповідне діалогове вікно з переліком бібліотек:

Головне меню цього діалогового вікна має такі опції: Compile – трансляція компонентів;

Add – долучення компонентів до пакета; Remove – вилучення компонентів;

Install – реєстрація компонентів у палітрі; Options – параметри пакета.

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

540

Розділ 14

 

 

При цьому новий компонент буде розміщено на сторінку MyClasses палітри компонентів, зазначену у функції Register (див. п. 14.9.2). Залишається позакривати усі діалогові вікна компіляції та перевірити правильність роботи новоствореного компонента.

Для розміщення нового компонента на формі слід перейти до вкладки MyClasses палітри компонентів, на якій розміщено піктограму цього компонента. Зовнішній вигляд цієї піктограми нічим не відрізняється від батьківської кнопки Button, але при наведенні на неї курсора можна побачити її ім‟я BtnNClick. Ім‟ям та надписом першого такого компонента, розташованого на формі, буде BtnNClick1. Після запуску програми при кожному натисканні цієї кнопки на ній буде дописуватись інформація про кількість натискань (див. форму на стор. 534).

Описана послідовність дій буде подібною при інсталяції будь-якого новоствореного компонента.

Питання та завдання для самоконтролю

1)Чим подібні і чим відрізняються у C++ поняття структури та класу?

2)Що таке інкапсуляція?

3)Що називається класом?

4)Чим відрізняється оголошення класу від визначення класу?

5)Чи можливо визначити метод класу поза класом?

6)Як співвідносяться поміж собою поняття об‟єкта та класу?

7)Для чого потрібна секція private в оголошенні класу? Наведіть приклади полів чи методів, які доцільно вміщувати у цю секцію.

8)Для чого потрібна секція public оголошення класу?

9)Що таке конструктор та коли він викликається?

10)Чи може клас мати декілька конструкторів?

11)Що таке деструктор і коли він викликається?

12)Чи може в класі бути декілька деструкторів?

13)Що таке конструктор за замовчуванням та коли він викликається?

14)Що таке конструктор копіювання та коли він викликається?

15)Що таке успадкування? Наведіть приклади.

16)Що таке ієрархія класів?

17)Як оголошується похідний клас?

Об’єктно-орієнтоване програмування

541

 

 

18)Що означає специфікатор protected?

19)Чи буде правильним твердження: створення похідного класу потребує докорінних змін у базовому класі?

20)Чи буде правильним твердження: якщо конструктор похідного класу не визначено, то об‟єкти цього класу використовуватимуть конструктори базового класу?

21)Що таке поліморфізм? Наведіть приклади.

22)Що означає специфікатор virtual?

23)Яка функція називається суто віртуальною?

24)Що таке абстрактний клас?

25)Що означає специфікатор DYNAMIC?

26)Які елементі є основними у класі компонентів?

27)Який клас є базовим для усіх візуальних компонентів?

28)Який клас є базовим для усіх віконних компонентів?

29)Який клас є базовим для графічних компонентів?

30)Назвіть методи класу TControl та їхнє призначення.

31)Назвіть методи класу TWinControl та їхнє призначення.

32)Назвіть послідовність процесу створення нового компонента?

33)Для чого потрібна інсталяція компонента?

Розділ 15

Налагодження програм

Створювання нової програми на практиці доволі рідко відбувається без помилок. Розрізнюють помилки компіляції, які називають також помилками першого рівня (див. підрозд. 15.1), помилки, які виникають на етапі компонування (див. підрозд. 15.3), і помилки етапу виконування, які називають також помилками другого рівня (див. підрозд. 15.4). Окрім помилок, компілятор виводить зауваження і попередження щодо виявлення неточностей у програмі (див. підрозд. 15.2).

Виправлення помилок потребує від програміста глибоких знань мови та середовища програмування. Слід пам‟ятати, що помилки можуть проявлятися не в тому місці програми, де їх було припущено. Складність усунення помилок полягає також у тому, що різні помилки можуть призводити до однакових проявів.

15.1 Помилки компіляції

Помилки компіляції (помилки першого рівня) пов‟язані з помилковим записом команд, тобто це орфографічні й синтаксичні помилки. При виявленні такої помилки компілятор C++ Builder зупиняється на рядку з командою, в якій знайдено помилку. У нижній частині екрана з‟являється текстове вікно, яке містить відомості про всі знайдені у проекті помилки (Error), зауваження (Hints) й попередження (Warnings). Кожен рядок цього вікна містить таку інформацію: ім‟я файла, в якому знайдено помилку, номер рядка з помилкою і пояснювальний опис характеру помилки чи зауваження. Для швидкого переходу до конкретного рядка з помилкою слід двічі клацнути у рядку з її описом. Зауважимо, що одна помилка може спричинити за собою інші помилки, котрі зникнуть після її виправлення. Тому помилки слід виправляти послідовно, зверху донизу, і після виправлення кожної помилки зберігати і компілювати програму знов.

Без виправлення помилок (Error) запустити програму на виконання не вдасться, оскільки йдеться про синтаксичні помилки і компілятор не може перекласти текст програми на машинну мову. Зауваження (Warning) не перешкоджають запуску програми, але допомагають виправляти логічні помилки (помилки другого рівня), якщо програміст зверне на них увагу.

Розглянемо спочатку синтаксичні помилки. Повідомлення про такі помилки розпочинається текстом [C++ Error], після чого йде назва файла (Unit1.cpp) і у круглих дужках номер рядка, в якому знайдено помилку, тоді стоїть двокрапка і код помилки (наприклад E2379) з пояснювальним описом помилки. Деякі описи допомагають однозначно діагностувати помилку і виправити її. На жаль, більшість помилок насправді виникає не в тому рядку, на який вказує компілятор. Далі спочатку в табл. 15.1, а потім докладно з прикладами рисунків наведено найбільш поширені помилки компіляції, їхні причини й рекомендації щодо виправлення.

 

 

Налагодження програм

543

 

 

 

 

Таблиця 15.1

 

 

Помилки компіляції

 

 

 

 

 

 

 

 

 

Форма повідомлення про помилку

Характер помилки

 

 

 

 

 

 

 

1

[C++ Error] Unit1.cpp(N): E2379

Пропущено крапку з комою в N-му чи

 

 

Statement missing;

у попередньому (N-1)-му рядку

 

 

 

2

[C++ Error] Unit1.cpp(N): E2268

Неправильний запис імені функції чи

 

 

Call to undefined function '...'

не долучено заголовний файл, у якому

 

 

 

оголошено цю функцію

 

 

 

3

[C++ Error] Unit1.cpp(N): E2235

Пропущено дужки у виклику функції,

 

 

Member function must be called or

яка міститься в N-му рядку

 

 

 

 

its address taken

 

 

 

 

4

[C++ Error] Unit1.cpp(N): E2316

Неправильно створено заголовок

 

 

 

 

'_fastcall TForm::Button1Click

відгуку на подію Button1Click

 

 

 

 

(TObject*)'is not a member of 'TForm1

 

 

 

 

 

 

 

 

5

[C++ Error] Unit1.cpp(N): E2089

Неможливо створити відгук на подію

 

 

Identifier 'Button2Click' cannot

Button2Click, оскільки не всі фігурні

 

 

have a type qualifier

дужки закрито у попередній функції

 

6

[C++ Error] Unit1.cpp(N): E2451

Змінну x не було оголошено

 

 

 

 

Undefined symbol 'x'

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

 

 

 

написано з помилкою

 

 

 

7

[C++ Error] Unit1.cpp(N): E2238

Багаторазове оголошення змінної х

 

 

Multiple declaration for 'x'

в одній області видимості

 

 

 

8

[C++ Error] Unit1.cpp(N): E2134

Кількість фігурних дужок,

 

 

 

 

Compound statement missing }

що відкриваються й закриваються,

 

 

 

 

 

не збігається, а саме не вистачає

 

 

 

 

 

закритої фігурної дужки у тексті

 

 

 

 

 

програми, який розміщено вище

 

 

 

9

[C++ Error] Unit1.cpp(N): E2121

Пропущено (чи помилково поставлено)

 

 

Function call missing )

круглу дужку, яка закриває список

 

 

 

параметрів при викликанні функції

 

10

[C++ Error] Unit1.cpp(N): E2227

Кількість параметрів при викликанні

 

 

Extra parameter in call to

функції перевищує їхню кількість

 

 

 

 

pow(double, double)

за синтаксисом

 

 

 

11

[C++ Error] Unit1.cpp(N): E2193

Кількість параметрів є менша, аніж

 

 

Too few parameters in call to

цього вимагає синтаксис функції

 

 

 

 

'pow(double, double)'

 

 

 

 

12

[C++ Error] Unit1.cpp(N): E2030

Присутність break у цьому місці

 

 

 

 

Misplaced break

програми не має сенсу

 

 

 

13

[C++ Error] Unit1.cpp(N): E2054

Неможливо встановити до якого if

 

 

Misplaced else

належить else

 

 

 

 

 

 

 

 

14

[C++ Error] Unit1.cpp(N): E2034

Суперечка типів: не можна присвоїти

 

 

Cannot convert 'int' to 'char'

змінній типу char значення типу int

 

15

[C++ Error] Unit2.cpp(N): E2356

Невідповідність типу прототипу

 

 

 

 

Type mismatch in redeclaration

функції та її визначення (реалізації)

 

 

of 'sum(int, int)'

 

 

 

 

 

 

 

 

 

 

544

Розділ 15

 

 

 

 

 

Закінчення табл. 15.1

 

 

 

 

 

 

 

Форма повідомлення про помилку

Характер помилки

 

 

16

 

[C++ Error] Unit1.cpp(N): E2040

Оголошення припинено некоректно.

 

 

 

 

Declaration terminated

Помилка внаслідок неправильного ро-

 

 

 

 

incorrectly

зташування операторних дужок чи то

 

 

 

 

 

дійсно некоректного оголошення

 

 

17

 

[C++ Error] Unit2.cpp(N): E2308

Помилка виникає внаслідок

 

 

 

 

do statement must have while

неправильного розташування

 

 

 

 

 

фігурних дужок в операторі

 

 

 

 

 

do-while

 

 

18

 

[C++ Error] Unit2.cpp(N) E2308

Рядок не завершено, тобто в кінці

 

 

 

 

Unterminated string or character

рядка пропущено лапки (")

 

 

 

 

constant

 

 

 

 

 

 

 

 

 

19

 

[C++ Error] Unit1.cpp(N): E2376

Пропущено одну чи обидві дужки

 

 

 

 

If statement missing (

в умові оператора if чи умову напи-

 

 

 

 

 

сано з синтаксичними помилками

 

 

20

 

[C++ Error] Unit1.cpp(N): E2378

Відсутня крапка з комою

 

 

 

 

For statement missing ;

як розділювач складових частин

 

 

 

 

 

оператора for

 

 

21

 

[C++ Error] Unit1.cpp(N): E2060

Неприпустима операція

 

 

 

 

Illegal use of floating point

над дійсним числом

 

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

втаблиці помилок.

1)[C++ Error] Unit1.cpp(N): E2379 Statement missing;

Таке повідомлення вказує на те, що пропущено крапку з комою в N-му чи то у попередньому (N-1)-му рядку (рис. 15.1). Для усунення помилки в кінці попереднього рядка слід поставити крапку з комою (якщо вона є відсутня).

Рис. 15.1. Помилка Е2379: пропущено крапку з комою

Окрім того, ця помилка виникає, коли компілятор сподівається на крапку з комою, а зустрічає інший символ, наприклад, якщо у математичному виразі стоїть зайва дужка (рис. 15.2). Для усунення помилки слід перевірити правиль-

Налагодження програм

545

ність формули, кількість та відповідність дужок, що відкриваються й закриваються.

Рис. 15.2. Помилка Е2379: зайва дужка у математичному виразі

2) [C++ Error] Unit1.cpp(N): E2268 Call to undefined function

'close'

Причиною такої помилки може бути:

неправильний запис імені функції. Так, у прикладі на рис. 15.3 функцію Сlose() написано з маленької літери;

ім‟я функції написано правильно, але не долучено заголовний файл, у якому оголошено цю функцію (рис. 15.7). Наприклад, така помилка виникне, якщо використовувати у програмі математичні функції і не написати на початку програми:

#include <math.h>

В такому разі для усунення помилки слід долучити необхідний заголовний файл.

Рис. 15.3. Помилка Е2268: ім‟я функції написано неправильно

3) [C++ Error] Unit1.cpp(N): E2235 Member function must be called or its address taken

Пропущено порожні дужки у виклику функції Close() (рис. 15.4). Для усунення помилки слід поставити дужки.

546

Розділ 15

Рис. 15.4. Помилка Е2235: пропущено порожні дужки у виклику функції

4) [C++ Error] Unit1.cpp(N): E2316 '_fastcall TForm::

Button2Click(TObject*)' is not a member of 'TForm1'

Така помилка (рис. 15.5) виникає, якщо заголовок відгуку на подію Button2Click написати власноруч (як відомо, система сама має створити цей заголовок). Слід вилучити написаний заголовок, повернутися на форму і створити відгук на подію коректно.

Рис. 15.5. Помилка Е2316: заголовок відгуку на подію написано власноруч

5) [C++ Error] Unit1.cpp(N): E2089 Identifier 'Button2Click' cannot have a type qualifier

Така помилка належить до прихованих помилок. Складається враження, що все написано правильно (рис. 15.6). Але за уважного розглядання виявляється, що за кілька рядків до помилки відсутня закрита фігурна дужка і компіляторові “здається”, що функція відгуку на подію Button2Click міститься всередині функції відгуку події Button1Click, а вкладення функцій одна в одну в С++ не дозволяється. Слід поставити пропущену дужку – і помилка зникне.

Налагодження програм

547

Рис. 15.6. Помилка Е2089: пропущено закриту дужку у попередній функції

6) [C++ Error] Unit1.cpp(N): E2451 Undefined symbol 'x'

Така помилка виникає з двох причин: змінну не було оголошено перед використанням (рис. 15.7) або ім‟я змінної написано з помилкою (наприклад, не збігається регістр літер). Для усунення помилки слід оголосити змінну або, якщо її вже було оголошено, перевірити правильність імені.

Рис. 15.7. Помилка Е2451: не оголошено змінну х

Зауважимо, що змінну може бути оголошено в іншій області видимості. У прикладі на рис. 15.8 змінну і оголошено усередині циклу та вважається за невідому поза циклом. У такому разі слід оголосити змінну разом зі змінною s поза циклом або використовувати іншу змінну.

548

Розділ 15

Рис. 15.8. Помилка Е2451: змінну і оголошено в іншій області видимості

7) [C++ Error] Unit1.cpp(N): E2238 Multiple declaration for 'x'

Така помилка виникає, коли змінна оголошена двічі в одній області видимості (рис. 15.9). Слід вилучити повторне оголошення (у рядку 19 вилучити double і залишити х=-2.5;)

Разом з цією помилкою йде помилка

[C++ Error] Unit1.cpp(N): E2344 Earlier declaration of 'x'

Вона вказує на рядок, у якому відбулося попереднє оголошення змінної х.

Рис. 15.9. Помилка Е2238: змінну х оголошено двічі

Окрім помилок, на рис. 15.9 можна бачити попередження:

[C++ Warning] Unit1.cpp W8004 'x' is assigned a value that is never used

Детальніше про попередження див. далі підрозд. 15.2.

8) [C++ Error] Unit1.cpp(N): E2134 Compound statement missing }

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

Таке ж саме повідомлення видається, коли фігурну дужку закрито несвоєчасно (див. рис. 15.6).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]