Робота з отладчиком
Давайте від теорії перейдемо до практики. Завантажте Lazarus з новим проектом, встановіть на форму просту кнопку і збережіть проект в папку 27-01. Імена проекту, форми, модуля і кнопки змінювати не потрібно, залиште імена, дані за замовчуванням.
Далі, згенеруйте подія OnClick для кнопки, в якому напишіть наступний код:
Що ми тут робимо? Цілочисельну змінну i використовуємо в якості лічильника для циклу for. Цикл виробляємо від -3 до 3, тобто, 7 разів, включаючи нуль. У тілі циклу ми ділимо 10 на значення i. результат оформляємо у вигляді рядка і додаємо до списку рядків st. Ми вже наголошували, що подібні дії потрібно укладати в блок обробки виняткових ситуацій try-finally-end. що ми і зробили.
Якщо ви уважно вивчали курс, то неозброєним оком бачите, що при четвертому проході циклу відбудеться помилка часу виконання - розподіл 10 на нуль. Такий очевидний приклад найбільше підходить для знайомства з вбудованим отладчиком, так як ви вже знаєте, де буде помилка, і зможете проаналізувати роботу відладчика. Тому прикинемося, що не підозрюємо про помилку.
Отже, програму ми написали, зберегли, пора її компілювати. Натисніть кнопку "Запустити" на Панелі управління (або
![Ноу Інти, лекція, тестування і налагодження (invalid combination opcode operands) Ноу Інти, лекція, тестування і налагодження](https://images-on-off.com/images/150/nouintuitlektsiyatestirovanieiotladka-ba9344ae.jpg)
Мал. 27.3. Повідомлення Lazarus про помилку
Судячи з повідомлення, помилка сталася під час виконання коду 42-го рядка. Гаразд, натиснемо "ОК" і командою "Запуск -> Скинути відладчик" припинимо виконання програми. Повернемося до коду і проаналізуємо 42-й рядок (якщо ви додавали порожні рядки, то у вас буде інший номер):
Ну що, нічого кримінального тут немає, чому ж сталася помилка? Код вірний і повинен був нормально виконуватися ... Коли ви заходите в подібний глухий кут. допомогти вам може здоровий глузд і вбудований відладчик. Здоровий глузд говорить, що помилка сталася десь в тілі циклу for. А щоб скористатися отладчиком, потрібно призупинити виконання програми на цьому циклі, щоб потім через підрядник його продовжити. Для зупинки роботи програми служать так звані точки зупинки (англ. Breakpoints).
Точки останова- це рядки, перед виконанням яких відладчик припиняє виконання програми, і чекає ваших подальших дій.
Ви можете встановити одну таку точку або декілька, в різних частинах коду. Оскільки помилка виникає в 42-му рядку, розумніше буде призупинити виконання на попередній, 41-му рядку. Переведіть курсор на цей рядок, на будь-який її місце.
Встановити точку зупину можна різними способами:
Останні два способи найбільш зручні, але вибирати вам. У будь-якому випадку, рядок з встановленої точкою зупинки забарвиться червоним кольором:
Мал. 27.4. Рядок з точкою зупинки
Зняти точку зупину зручніше також останніми двома способами. Точка зупинки у нас є, знову натискаємо кнопку "Запустити". Програма починає свою роботу, натискаємо кнопку "Button1".
Мал. 27.5. Рядок, яка буде виконана далі
У нас викликів функцій немає, тому ми можемо скористатися як
Отже, натиснемо
Тут нам на допомогу приходить ще один корисний інструмент отладчика - спостереження за значеннями змінних. Скиньте програму командою "Запуск -> Скинути відладчик". Тепер знову натисніть кнопку "Запустити", а потім знову кнопку "Button1". Отладчик знову призупинив виконання програми на сходинці з циклом, однак не поспішайте натискати
![Ноу Інти, лекція, тестування і налагодження (invalid combination opcode) Ноу Інти, лекція, тестування і налагодження](https://images-on-off.com/images/150/nouintuitlektsiyatestirovanieiotladka-52109708.jpg)
Мал. 27.6. Установка спостереження за змінною
Тепер відладчик спостерігає за значеннями змінної i. але нам від цього не легше - ми не бачимо цих значень! Щоб їх побачити, потрібно вивести на екран вікно Списку спостережень. Робиться це командою "Вид -> Вікна налагодження -> Вікно спостережень" або "гарячими клавішами"
яке у нас повинно обчислюватися всередині циклу. У вікні Списку спостереження ви побачите і змінну i. і вираз. а також їх значення:
Мал. 27.7. Вікно Списку спостережень
Оскільки змінної i ще не було присвоєно значення -3, то в колонці значень ви, швидше за все, побачите 1, яким за замовчуванням була проініціалізувати наша змінна. Відповідне значення буде і у вирази. Тепер ми готові рухатися далі. натискаємо
натискаємо
виявилася невдалою, то коли змінна i дорівнює нулю. І тут вже нескладно здогадатися, чому ця помилка виникає - тому що відбувається спроба ділення 10 на 0.
![Ноу Інти, лекція, тестування і налагодження (invalid combination opcode operands) Ноу Інти, лекція, тестування і налагодження](https://images-on-off.com/images/150/nouintuitlektsiyatestirovanieiotladka-d6c6b6cd.jpg)
Мал. 27.8. Результуюче повідомлення програми
Як бачите, обчислення. де i дорівнює нулю, було пропущено.
Вбудований відладчик має і інші інструменти, з якими ви самі зможете згодом освоїтися, експериментуючи з ними.
Дякуємо за Ваш чудовий курс!
У самостійній роботі №2 при компіляції модуля MyCript.pas (ОС: Windows 7 x64, Lazarus 1.4 win64) видається помилка на код асемблера
mycript.pas (54,5) Error: Asm: [push reg32] invalid combination of opcode and operands
mycript.pas (95,5) Error: Asm: [pop reg32] invalid combination of opcode and operands
Я розумію, що курс готувався для 32 розрядних ОС, але як бути в разі 64 розрядних систем?
У обробниках пунктів меню FileCreate і FileOpen, а також в обробнику закриття форми OnClose - в цих трьох процедурах міститься один і той же код
їх перед створенням нового тексту>
if Memo1.Modified then begin
// якщо користувач згоден зберегти зміни:
if MessageDlg ( 'Збереження файлу',
'Поточний файл був змінений. Зберегти зміни?',
mtConfirmation, [mbYes, mbNo, mbIgnore], 0) = mrYes then
FileSaveClick (Sender);
end; // if
Дозвольте запитати: чи не краще було б винести цей код в окрему процедуру, наприклад - в обробник події форми OnCloseQuery? Наскільки я пам'ятаю з досвіду Delphi, виклик цієї процедури сам по собі не повинен призводити до закриття форми. А значить, її можна використовувати і в процедурах очищення Memo1 і читання з файлу. Або в Lazarus так робити не можна?