Материал: metodichka_u_praktika

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Різниця між командами StepInto і StepOver

Коли ви починаєте процес відладки, з'являється панель інструментів Debug. З безлічі представлених на ній кнопок найчастіше задіюються StepInto (четверта справа у верхньому ряду) і StepOver(третя справа). У обох випадках програма буде запущена на виконання в покроковому режимі, а в тексті програми виділяється той рядок, який зараз буде виконаний.

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

Цю команду зручно застосовувати в тих випадках, коли в програмі робиться звернення до стандартної функції або створеної вами підпрограми, яка вже була протестована.

Давайте виконаємо покрокову відладку нашої програми.

Як видно з рис.15, у вікні редагування з'явилася стрілка (її називають індикатором трасування), вказуюча на рядок програми, яка буде виконана на наступному кроці. В даний момент вона вказує на функцію print_them().

Рис. 3.15. Вікно редагування після того, як тричі була виконана команда StepInto або StepOver

Має сенс виконати цю функцію як одне ціле. Для цього виберемо команду StepOver. Функція буде виконана, і індикатор трасування вкаже на перший виклик функції printf(). Тепер три рази натискуйте клавішу [F10], поки стрілка не зупиниться напроти функції scanf().

У цей момент вам потрібно перейти у вікно програми і у відповідь на запрошення Would you like to continue(Y/N) ввести Y і натискувати [Enter] (рис. 16).

Відразу після цього на екрані з'явиться повідомлення про помилку (рис.17). Це повідомлення згенерувало програмою після спроби виконає функцію scanf(). Давайте спробуємо розібратися, в чому, власне, полягає проблема.

Рис.16. Введіть "Y" і натискуйте [Enter], аби продовжити виконання програми

Рис.17. Відладчик повідомляє про помилку в програмі

Помилка пов'язана з некоректним використанням функції scanf(). Функція scanf() чекає вказівки адреси елементу пам'яті для заповнення. Розглянемо таке вираження: scanf("%C", continu);

Як бачите, тут вказується не адреса змінної, а сама змінна. Аби вказати адресу, потрібно помістити оператора узяття адреси (&) перед continu. Внесіть виправлення до вираження, аби воно виглядало таким чином: scanf("%C" &continu);

Збережете файл і знов виберіть команду RebuildAll.

Додаткові засоби відладки

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

Точки останову найпростіше розставляти за допомогою кнопки Breakpoint (перша справа) панелі інструментів Build. Для цього досить встановити курсор на потрібному рядку програми і клацнути на вказаній кнопці. Якщо ж виділений рядок вже містить точку останову, то після клацання на кнопці Breakpoint вона, точка останову, буде видалена. При виборі команди Go програма виконуватиметься від поточного місця розташування курсора до найближчої точки останову.

Звернемося до нашої програми. Ми знаємо, що всі рядки програми до виклику функції scanf() відмінно працюють. Аби не витрачати час на покрокове виконання всіх рядків, які вже були перевірені раніше, поставимо точку останову на 20-му рядку, що містить виклик функції scanf().

Є і інший спосіб завдання точок останову — за допомогою діалогового вікна Breakpoints (рис. 18), що викликається командою Breakpoints... з меню Edit. За умовчанням при клацанні на кнопці із стрілкою відкривається контекстне меню, в якому першим пунктом вказується команда створення точки останову на тому рядку, де в даний момент у вікні редагування знаходиться курсор. У нашому випадку це рядок 20.

Рис.18. Завдання точки останову

Робота з точками останову

Передбачимо, що ви поставили точку останову в рядку програми, що містить виклик функції scanf{). Тепер виберіть команду Go— або з меню, або натискує клавішу [F5]. Звернете увагу, що виконання програми уривається не на першому рядку програми, а на рядку, що містить точку останову.

Далі можна продовжити виконання програми в покроковому режимі або проаналізувати поточні значення змінних. Нас цікавить, чи буде функція scanf() працювати коректно після того, як до програмного коду були внесені зміни. Виберіть команду StepOver, перейдіть до вікна програми, введіть букву Y у верхньому регістрі і натискуйте клавішу [Enter]. (Ми застосували команду StepOverдля того, аби уникнути покрокового аналізу відладчиком всіх операторів функції scanf(). При виборі команди StepIn з'являється пропозиція вказати місцезнаходження файлу SCANF.C) Все відмінно! Відладчик не видав вікна з повідомленням про помилку. Але чи означає це, що всі проблеми дозволені? Аби відповісти на це питання, досить буде проаналізувати поточне значення змінної continuе.

Вікно QuickWatch

Команда QuickWatch... відкриває діалогове вікно QuickWatch(мал. 3.19), яке дозволяє по ходу виконання програми аналізувати значення змінних. Простий спосіб визначити значення змінної за допомогою даного вікна полягає в тому, що курсор поміщається на імені змінної у вікні редагування, а потім натискується комбінація клавіш [Shift+F9]. Виконайте вказану операцію із змінною continu.

Рис. 19. Діалогове вікно QuickWatch

Тепер, коли ми визначили, що змінна continuе має правильне значення, можна продовжити виконання програми до кінця, вибравши в меню Debug команду Go (рис. 20).

Рис. 20. Виправлена версія програми

Частина II

У зв'язку з тим, що сьогодні рівень складності програмного забезпечення дуже високий, розробка застосувань Windows з використанням лише якої-небудь мови програмування (наприклад, мови C) значно важко. Програміст повинен витратити масу часу на вирішення стандартних завдань по створенню багатовіконного інтерфейсу. Реалізація технології скріплення і вбудовування об'єктів - OLE - зажадає від програміста ще складнішої роботи.

Аби полегшити роботу програміста практично всі сучасні компілятори з мови C++ містять спеціальні бібліотеки класів. Такі бібліотеки включають практично весь програмний інтерфейс Windows і дозволяють користуватися при програмуванні засобами більш високого рівня, ніж звичайні виклики функцій. За рахунок цього значно спрощується розробка застосувань, що мають складний інтерфейс користувача, полегшується підтримка технології OLE і взаємодія з базами даних.

Подібні засоби автоматизованого створення застосувань включені в компілятор Microsoft Visual C++ і називаються MFC AppWizard. Заповнивши декілька діалогових панелей, можна вказати характеристики застосування і отримати його тексти, забезпечені обширними коментарями. MFC AppWizard дозволяє створювати одновіконні і багатовіконні застосування, а також застосування, що не мають головного вікна, -вместо його використовується діалогова панель. Можна також включити підтримку технології OLE, баз даних, довідкової системи.

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

Потрібно відзначити, що MFC AppWizard створює тексти застосувань лише з використанням бібліотеки класів MFC (Microsoft Foundation Class library). Тому лише вивчивши мову C++ і бібліотеку MFC, можна користуватися засобами автоматизованої розробки і створювати свої застосування в найкоротші терміни.

Бібліотеки динамічного завантаження (DLL)

Оскільки API складається з великого числа функцій, може скластися враження, що при компіляції кожної програми, написаної для Windows, до неї підключається код досить значного об'єму. Насправді це не так. Функції API містяться вбиблиотеках динамічного завантаження (Dynamic Link Libraries, або DLL), які завантажуються в пам'ять лише в той момент, коли до них відбувається звернення, тобто при виконанні програми. Розглянемо, як здійснюється механізм динамічного завантаження.

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

Переваги використання MFC

Як уже згадувалося, MFC – це базовий набір (бібліотека) класів, написаних на мові С++ і призначених для спрощення і прискорення процесу програмування для Windows. Бібліотека містить багаторівневу ієрархію класів, що налічує близько 200 членів. Вони дають можливість створювати Windows-приложения на базі об'єктно-орієнтованого підходу. З точки зору програміста, MFC є каркасом, на основі якого можна писати програми для Windows.

Бібліотека MFC розроблялася для спрощення завдань, що стоять перед програмістом. Як відомо, традиційний метод програмування під Windows вимагає написання досить довгих і складних програм, що мають ряд специфічних особливостей. Зокрема, для створення лише каркаса програми таким методом знадобиться близько 75 рядків коди. По мірі ж збільшення складності програми її код може досягати воістину неймовірних розмірів. Проте та ж сама програма, написана з використанням MFC, буде приблизно в три рази менше, оскільки більшість приватних деталей прихована від програміста.

Однією з основних переваг роботи з MFC є можливість багатократного використання однієї і тієї ж коди. Оскільки бібліотека містить багато елементів, загальних для всіх Windows-приложений, немає необхідності кожного разу писати їх заново. Замість цього їх можна просто успадковувати (кажучи мовою об'єктно-орієнтованого програмування). Крім того, інтерфейс, що забезпечується бібліотекою, практично незалежний від конкретних деталей, що його реалізовують. Тому програми, написані на основі MFC, можуть бути легко адаптовані до нових версій Windows (на відміну від більшості програм, написаних звичайними методами).

Ще однією істотною перевагою MFC є спрощення взаємодії з прикладним програмним інтерфейсом (API) Windows. Будь-яке застосування взаємодіє з Windows через API, який містить декілька сотів функцій. Значний розмір API утрудняє спроби зрозуміти і вивчити його целіком. Частенько навіть складно прослідити, як окремі частини API связанны один з одним! Але оскільки бібліотека MFC об'єднує (шляхом інкапсуляції) функції API в логічно організовану безліч класів, інтерфейсом легшає значно управляти.

Оскільки MFC є набором класів, написаних на мові С++, тому програми, написані з використанням MFC, має бути в той же час програмами на С++. Для цього необхідно володіти відповідними знаннями. Спершу необхідний уміти створювати власні класи, розуміти принципи спадкоємства і уміти перевизначати віртуальні функції. Хоча програми, що використовують бібліотеку MFC, зазвичай не містять дуже специфічних елементів з арсеналу С++, для їх написання проте потрібні солідні знання в даної області.

Зауваження. Невелике число класів, визначених в бібліотеці, не пов'язаний безпосередньо з програмуванням під Windows. Це, зокрема, класи, призначені для створення рядків, управління файлами і обробки особливих ситуацій. Інколи звані класами загального призначення, вони можуть використовуватися як Windows-, так і не- Windows-застосуваннями.

Про принципи пристрою застосування розповідалося вище. Тепер розглянемо, як воно створюється за допомогою Visual C++. Спочатку розберемо одне важливе поняття - проект. До цих пір застосування розглядалося, як тільки як сукупність об'єктів базових і похідних класів. Але для забезпечення роботи застосування потрібне щось більше - разом з описом класів необхідний опис ресурсів, пов'язаних із застосуванням, потрібна довідкова система і тому подібне Термін "проект" якраз і використовується, коли мається на увазі такий загальніший погляд на застосування.

У середовищі Visual C++ можна будувати різних типів проектів. Такі проекти після їх створення можна компілювати і запускати на виконання. Фірма Microsoft розробила спеціальний інструментарій, що полегшує і прискорюючий створення проектів в середовищі Visual C++. Наприклад, майстер MFC AppWizard (exe) дозволяє створити проект Windows-приложения яке має одиндокументний, багатодокументний або діалоговий інтерфейс і використовує бібліотеку MFC.

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

Типи майстрів проектів

У середовищі Visual C++ можна будувати різних типів проектів. Такі проекти після їх створення можна компілювати і запускати на виконання. Фірма Microsoft розробила спеціальний інструментарій, що полегшує і прискорюючий створення проектів в середовищі Visual C++.

Розглянемо деяких типів проектів, які можна створювати за допомогою різних засобів (майстрів проектів) Microsoft Visual C++:

MFC AppWizard (exe) – за допомогою майстра застосувань можна створити проект Windows-приложения яке має одиндокументний, багатодокументний або діалоговий інтерфейс. Одиндокументне приложеие може надавати користувачеві у будь-який момент часу працювати лише з одним файлом. Багатодокументне застосування, навпаки, може одночасно представляти декілька документів, кожен у власному вікні. Призначений для користувача інтерфейс діалогового застосування є єдиним діалоговим вікном.

MFC AppWizard (dll) – цей майстер застосувань дозволяє створити структуру DLL, засновану на MFC. За допомогою його можна визначити характеристики будующей DLL.

AppWizard ATL COM – цей засіб дозволяє створити елемент управління ACTIVEX або сервер автоматизації, використовуючи нову бібліотеку шаблонів ACTIVEX (ACTIVEX Template Library - ATL). Опції цього майстра дають можливість вибрати активний сервер (DLL) або виконуваний зовнішній сервер (exe-файл).

Custom AppWizard – за допомогою цього засобу можна створити призначені для користувача майстри AppWizard. Призначений для користувача майстер може базуватися на стандартних майстрах для застосувань MFC або DLL, а також на існуючих проектах або містити лише определеямые розробником кроки.

DevStudio Add-in Wizard – майстер доповнень дозволяє створювати доповнення до Visual Studio. Бібліотека DLL розширень може підтримувати панелі інструментів і реагувати на події Visual Studio.

MFC ACTIVEX ControlWizard - майстер елементів управління реалізує процес створення проекту, що містить один або декілька елементів управління ACTIVEX, заснованих на елементах управління MFC.

Win32 Application – цей майстер дозволяє створити проект звичайного Window-приложения. Проект створюється незаповненим, файли з вихідним кодом в нього слід додавати уручну.

Win32 Console Application – майстер створення проекту консольного застосування. Консольна застосування – це програма, яка виконується з командного рядка вікна DOS або Windows і не має графічного інтерфейсу (вікон). Проект консольного застосування створюється порожнім, передбачаючи додавання файлів вихідного тексту в нього уручну.

Win32 Dynamic-Link Library – створення порожнього проекту бібліотеки, що динамічно підключається. Установки компілятора і компонувальника будуть налаштовані на створення DLL. Вихідні файли слід додавати уручну.

Win32 Static Library – цей засіб створює порожній проект, призначений для генерації статичної (об'єктною) бібліотеки. Файли з вихідним кодом в нього слід додавати уручну.

Робота № 1

Мета роботи:

Навчитися використовувати Microsoft Visual Studio для розробки програм на мові С++. Отримати практичні навики з середовищем візуальної розробки програм.

Створення консольного застосування

  1. Запускаємо Microsoft Visual C++ 6.0.

  2. Створюємо консольне застосування:

  • File -> New -> Project -> Win 32 Console Application.

  • У полі Project name вписуємо ім'я проекту (lab_01).

  • У полі Location встановлюємо дорогу до проекту.

  • Клацаємо кнопку ОК.

  • Створюємо порожній проект (вибираємо An empty project).

  • Клацаємо кнопку Finish, потім ОК.

  1. Додаємо файл в проект:

Источник: https://studfile.net/preview/14533173/