
C _Учебник_МОНУ
.pdf
Об’єктно-орієнтоване програмування |
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 (натиснути відповідну кнопку). Після виправлення усіх помилок та успішної компіляції виведеться вікно з відповідним повідомленням.

Об’єктно-орієнтоване програмування |
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). Для усунення помилки слід поставити дужки.


Налагодження програм |
547 |
Рис. 15.6. Помилка Е2089: пропущено закриту дужку у попередній функції
6) [C++ Error] Unit1.cpp(N): E2451 Undefined symbol 'x'
Така помилка виникає з двох причин: змінну не було оголошено перед використанням (рис. 15.7) або ім‟я змінної написано з помилкою (наприклад, не збігається регістр літер). Для усунення помилки слід оголосити змінну або, якщо її вже було оголошено, перевірити правильність імені.
Рис. 15.7. Помилка Е2451: не оголошено змінну х
Зауважимо, що змінну може бути оголошено в іншій області видимості. У прикладі на рис. 15.8 змінну і оголошено усередині циклу та вважається за невідому поза циклом. У такому разі слід оголосити змінну разом зі змінною s поза циклом або використовувати іншу змінну.
