ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Створення консольних додатків за допомогою майстра в Visual C + + 6 - 2
         

     

    Інформатика, програмування

    Створення консольних додатків за допомогою майстра в Visual C + + 6 - 2

    Пам'ятається, у минулій статті «Перша програма в Microsoft Visual C + + 6.0 »я пообіцяв розповісти, як створювати консольні додатки в Visual C + + за допомогою майстра. Обіцянки я звик завжди виконувати. Значить, цим зараз і займемося. Минулого разу ми самі писали програмний код в текстовому редакторі, середа ж нам його компілювати, компонувати і запускала на виконання. Так, це її робота, але ми її ще дечим завантажимо. Я вже говорив, що середовище для того і потрібна, щоб виконувати за нас рутинну роботу. Ну що, ща продемонструємо!

    Запускаємо великий і могутній Visual C + +. Тиснемо FileNew. Далі, оскільки ми будемо створювати не просто назва файлу вихідного коду в текстовому редакторі, а проект консольного застосування (класно звучить?!), тиснемо на вкладку Projects, вибираємо Win32 Console Application (консольний додаток для Win32). Тиснемо Ok. Тепер майстер нас запитує: What Kind of Console Application do you want to create? (Яке консольний додаток слід створити?) і пропонує ось які варіанти:

    An empty project (Порожній проект).

    A simple application (Просте додаток)

    A "Hello World!" application (Додаток "Hello World!")

    An application that supports MFC (Програма з підтримкою MFC)

    Вибираєте необхідне, тиснете Finish, і середа сама за вас дещо робить. А саме, створює заготівлю консольного додатки. Ось далі будете програмувати самі, так як заготовки, хоча зазвичай і є цілком робочими програмами, по суті нічого не роблять. Хіба що інтерфейс, але обробки інформації - жодної. Це вже буде наше завдання -- напрограмміровать мозок програми. Заготівля ж - це, по суті, її рожа. Так, звичайно ж, інтимні місця програми теж у нашої влади (якщо буде потрібно):) Тим не менше, створення та організація інтерфейсу може виявитися дуже довгим, клопітно і неприємним заняттям. Дійсно, в консольних додатках це майже не відчутно (та який там на фіг інтерфейс ??!), а ось у випадку, скажімо, багатодокументним програми створення та організація інтерфейсу вручну -- дійсно величезний геморой! Але навіть у цьому за нас багато що може зробити Середа, а в тому, що треба буде робити нам самим, вона теж в змозі надати хорошу допомогу і підтримку. Це я просто до того, що середовище халяви нам надає не злічити! Однак, багатодокументним програми - справа вельми непростий, і їх ми будемо створювати і розбирати значно пізніше. Зараз же консоль, консоль і ще раз консоль!

    Ну що, давайте перепробуем, розберемо і вивчимо всі 4 варіанти, благо їх всього лише 4! По порядку, починаємо з порожнього проекту. Назвемо відповідно Listing1, Listing2, Listing3 і Listing4. Хоча можете, звичайно, як сподобається називати.

    An empty project

    Отже, якщо ми вибрали An empty project, то що ж нам зробить середу? Та по суті нічого! От зараза, так! :) Ні тобі програмного коду, ні навіть файл. cpp не створила - нифига ... Ну, насправді, дещо вона звичайно зробила: створила нам файли. dsw (workspace - робочий простір) і. dsp (project - проект) і деякі інші, порожню течку Debug для налагоджування версії програми, або Release для робочої версії.

    До речі! Для вибору активної конфігурації проекту (зазвичай це Debug (відлагоджувальна версія) або Release (робоча версія)) заходите в BuildSet Active Configuration і вибирайте. Хто не в курсі, це визначає режим компіляції проекту.

    У самому середовищі в нашому робочому просторі (вікно workspaces, вкладка FileView) з'явилися порожні татка Source Files, Header Files, Resource Files - для файлів коду програми, заголовків файлів і файлів ресурсів відповідно. Але що нам толку то з того? Адже ми могем змусити ледачу середу і побільше роботи виконати!

    A simple application

    Виберемо A simple application. Тепер вже Visual C + + спромігся-таки зробити нам файлу вихідного коду (у мене проект названий Listing2, тому і файл буде називатися Listing2.cpp), причому такого змісту вийшов файл:

    Ну що ж, це вже на щось схоже! Давайте розберемо.

    Зверху він нам навіть прокоментував те, що зробив. Далі йде # include "stdafx.h" - це підключається файл stdafx.h. А він у свою чергу відноситься до створеного все тим же майстром файлу stdafx.cpp. Файл stdafx.cpp відповідальний за створення перекомпіліровать заголовків. Що, зовсім мізки запудрити? Нічого, струшують пудру з башки, поясню людською мовою. На нашій програмі може підключатися багато різних файлів заголовків. Це можуть бути як стандартні файли, які люб'язно надає нам, наприклад, Microsoft, або ж наші власні. Так от, якщо кожен раз в проекті компілювати всі файли заново - дуже довго виходить. Але ж ми не всі файли змінювати будемо! Ті, що не змінюються або змінюються дуже рідко -- компілюються один раз при першій компіляції, а в подальшому будуть оброблятися у вже скомпільованому вигляді. Заново будуть компілюватися тільки часто змінювані файли, щоб внесені зміни відображалися на роботі програми. Це значно скорочує час компіляції проекту. Просікають логіку? То-то! Так ось у файлі stdafx.h і будуть вказуватися (підключатися) ті файли, які змінюються рідко (взагалі не змінюються) і які будуть використовуватися як вже переконфігурувати.

    Тепер ще, мабуть, виник у вас питання: коли в директиві # include використовувати лапки "", а коли кутові дужки <>, коли вказувати розширення. h або. hpp, а коли ні? - Для вказівки заголовків файлів стандартної бібліотеки не потрібно розширення. Вони розпізнаються як заголовки, тому що замість синтаксису # include "..." використовується # include <...>. І розширення. H в такому випадку не вказується. Для кожного заголовки стандартної бібліотеки мови С існує відповідний стандартний заголовки С + +. У першому випадку це буде прописуватися # include <*. h>, у другому # include <*>. Як правило, для включення бібліотечних файлів користуйтеся кутовими дужками <>, а для своїх власних - лапками "". Наприклад:

    # include // зі стандартного каталозі включаються файлів

    # include "myheader.h"// з поточного каталогу

    Нарешті, зауважу з цього приводу, що прогалини всередині <> або "" мають значення!

    # include < iostream>// не знайде

    Дивимось далі, точніше, нижче. Нижче у нас вже знайома функція main. «Але що це? Че за фигня у неї в скобочках? Як же нас так обдурили? Начебто ж функція без параметрів була! »- Нічого я нікого не обманув, я вже говорив, що в нашому прикладі в минулій статті параметрів у неї не було тільки для простоти. Однак в реалі там найчастіше вказуються аргументи, необхідні для доступу до параметрів командного рядка та їх використання в програмі. Ось це вони і є. Так що я нікого не обстебал, навпаки, я попереджав про це! І пообіцяв у цій статті про них детальніше розповісти. Що ж, виконую.

    Розумна середу нам за всіма правилами та канонами сгенерирована таку сигнатуру для функції main (тим, хто не в курсах: сигнатура на людській мові - це ім'я функції зі списком її параметрів - привчайтесь до грамотної термінології, потім окупиться!):

    int main (int argc, char * argv [])

    Знаєте, часто консольні програми організуються так, що після того, як ми здійснимо виклик програми з командного рядка, програма видає нам запрошення ввести необхідні дані. Це буває вельми незручно для користувача, напружує ... Користувачеві то полювання швидше результат отримати! Так от, якщо таких даних небагато, то було б непогано передати їх програмі ще при її запуску. Творці операціонок про це подбали: більшість операційних систем, ті ж DOS і UNIX, наприклад, дозволяють передати програми при запуску кілька параметрів (або один) (або жодного). Консоль, природно, теж таку можливість нам надає. Як я вже говорив у попередній статті, ці параметри називаються параметрами командного рядка і пишуться при виклику програми після імені самої програми через пробіл. Наприклад так:

    C:> Stebatrix.exe steb 34

    Отже, функція main, як правило, має два параметри: цілий argc і масив рядків argv. Хоча вони можуть називатися і інакше, зазвичай вони називаються саме так. Між іншим, оскільки argv у нас є масивом рядків, він може бути оголошений по-різному, наприклад:

    char * argv [] або char ** argv - перекручувати над мовою можна як завгодно (в рамках стандарту мови С + + природно). Хто не зрозумів, дивіться розділ «Мова програмування С + +», постараюся там про це (масивах і рядках) написати.

    Перший параметр argc (argument counter - лічильник аргументів (параметрів)) містить у собі кількість параметрів командного рядка.

    Другий argv (argument vector - вектор (масив) аргументів) містить в собі масив параметрів командного рядка. Оскільки параметри є символьними рядками, це буде масив рядків, причому сенс тут такий: argv має тип char * [argc 1] (не забули про нульовий елемент масиву?). Нульовим елементом масиву argv буде ім'я програми. Список аргументів обмежений нулем, то бути argv [argc] == 0. У випадку, коли командна рядок виглядає так:

    C:> Stebatrix.exe steb 34

    запустивши програму ось, що ми отримаємо:

    Тепер про параметри командного рядка, думаю, все зрозуміло. Тим не менше, полювання, мабуть програмку зробити? Давайте зробимо. Корисно буде. Зараз і подивіться, як в простому випадку можна параметри командного рядка використовувати. Отже, заготівля вихідного файлу у нас вже є (Listing2.cpp), доповніть його, щоб він виглядав так:

    Відразу хочу звернути вашу увагу на те, що підключення iostream і cstdlib можна (мабуть, вже потрібно) оголосити не в файлі Listing2.cpp, а в stdafx.h. Ці файли ми змінювати не будемо, а значить, маємо повне право. Тоді проект компілюватися буде швидше, хоча в разі нашого проекту-малютки це і не буде помітно. У такому випадку приберіть ці два рядки

    # include

    # include

    з Listing2.cpp і вставте їх в stdafx.h ось в цей місце:

    Ці два рядки повинні бути тільки в одному файлі: або Listing2.cpp, або stdafx.h - два рази одне і те ж підключати не треба!

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

    Про iostream ви вже знаєте, а ось cstdlib підключається для того, щоб скористатися функцією atoi. Ця функція має в яку сигнатуру (див. також файл stdlib.h):

    int atoi (const char * p);

    Вона перетворює рядок p, що представляє собою чисельне значення (тільки з "цифра складається) в саме чисельне значення. Те бути рядок '12345 'буде перетворена в 12345. Дуже корисна функція. Є ще дві: atof і atol, що перетворюють рядок у double і long відповідно. Якщо ж рядок не являє собою число (наприклад '123g4a ') то буде повернутий 0. От саме за допомогою функції atoi ми перетворимо символьну рядок argv [2] в ціле av2. Інакше ж не прокатит! Так от, перетворимо, а потім циклом for виводимо av2 раз рядок argv [1]. Хто не знає цикли - по-перше пора б уже знати, а по друге - ідіть в розділ «Мова програмування С + +», постараюсь знайти час і написати про них. Тепер спробуйте скомпілювати і запустити на виконання програму. - Що таке? Ніби все скомпилірувався, скомпонувати, а коли почала запускатися програма нам раптом повідомляють про помилку і пропонують відправити звіт до якоїсь там матері! ... Невже Matrix has us?! - Спокуха! Давайте розберемося. Програма повинна прийняти два параметри, а звідки вона їх візьме, коли ми запускаємо її із середовища Visual C + +, ніяких параметрів не вказуючи? Ось і саме, що нізвідки. Звідси й лажа. Ми зараз ось що зробимо: зайдемо в консоль і запустимо нашу прогу звідти. Хто не знає, як в консолі працювати (в MS-DOS), я тут пояснювати не буду ес-сно, почитайте там Фігурнова якого-небудь ... Отже давайте запустимо тепер прогу з консолі, що називається, вручну і за параметрами. Командний рядок при цьому буде мати, до наприклад, такий вигляд:

    D: Program FilesMicrosoft Visual StudioMyProjectsListing2Release> listing2 We_have_Matrix! 3

    Тільки зверніть увагу на те, що We_have_Matrix! пишемо не через пробіл, а через символ підкреслення, тому що пробілами розділяються параметри та прога так не зрозуміє (зрозуміє неправильно). Запускаємо і впивається тожеством черговий маленької перемоги над Матрицею! Но на самом то деле це ще не перемога, бою то ніякого майже не було: так, три рази на паркані написали щось, та й все. До бою ще готується і готувати треба! А тому вантажу далі. Виходить, програма прекрасно працює з консолі. А як же бути з VC + +? Так, я міг (і повинен був), звичайно, передбачити в програмі можливість отримання не тільки двох параметрів командного рядка, а й іншого їх числа. Але не зробив цього навмисно. Щоб простіше. А якщо по-справжньому, то враховувати такі нюанси необхідно. Адже і з консолі ми можемо викликати програму, не вказавши параметри або вказавши непередбачене число параметрів. Тому треба в програмі це справа обслужити: просто умовним оператором або через виключення організувати вихід проги з такого незручного положення. Але на цьому зупинятися не будемо: нам ще 2 варіанти заготовок консольних додатків треба розглянути і розібрати.

    A "Hello World!" application

    Цей варіант, відразу скажу, практично не потрібен -- чисто демонстраційна річ (показуха одна!). Ця заготовка точно така ж, як і попередня (A simple application), з тією лише різницею, що вона ще й виводить за допомогою функції printf рядок "Hello World!" на екран. Ця відмінність полягає в одному рядку коду:

    printf ( "Hello World! n");

    Ми це з вами вже вміємо, тільки з допомогою не printf, а використовуючи cout. Давайте, чи що, про функцію printf трохи і поговоримо. Щоб її використовувати, нам треба підключити. Але не турбуйтеся про це: подивіться файл stdafx.h - середа вже зробила це за нас! Ну ще б монітор ганчірочкою протирала і взагалі ціни б їй не було! :) Функція printf залишилася від мови С. Тим не менше, її дуже часто можна зустріти. Тим більше що, як я вже казав, гарний код на С буде чудово компілюватися і працювати в компіляторі для С + +. Навіть разом з кодом на С + + (правда в такому випадку проблема сумісності все ж час від часу виникає, але вона легко вирішується). З цього всього випливає, що хоча б у загальних рисах розглянути функцію printf нам треба. Сигнатура у неї така:

    int printf (const char *, ...)

    Повертає вона нам кількість виведених символів. У випадку рядка "Hello World!" їх буде 13 (не забуваємо про NULL в кінці рядка). Як параметр вона приймає рядок у стилі С (масив символів) (або ж безпосередньо рядок у лапках), причому їх може бути декілька, тоді просто через кому перерахуємо:

    printf ( "Hello", "World!", "n");

    Це також як в cout можете кілька разів використовувати <<, а в cin>>.

    До речі, хто ще не в курсі, для введення в мові С + + використовується така хреновіна: std:: cin>> і далі ім'я змінної, в яку буде записано те, що ми вводимо. У З цим займається функція gets () і ін

    Також у printf можуть зазначатися специфікатор перетворення (це наприклад коли ми значення якої-небудь змінної хочемо вивести), але докладно розмова про функції printf і потоках введення виведення піде у роздiлi «Мова програмування С + +», там цій темі буде присвячена окрема стаття. Тут же зазначу ще, що використання функції printf небажано. Хоча, можливо з нею і простіше звертатися, ніж з cout і cin, але вона має великий недолік: поганий контроль типів даних (при неявних перетвореннях типів, наприклад), що навіть у досвідчених програмістів стає іноді причиною прикрих помилок. Тому порада: використовуйте для введення/виводу засобами C + +!

    Переходимо до останнього варіанта: консольний застосунок з підтримкою MFC.

    An application that supports MFC

    Для непосвячених: MFC - Microsoft Foundation Class (базові класи Microsoft). І більше нічого про MFC писати зараз не буду, тому що MFC ми присвятимо не просто статтю, а цілий розділ! Гаразд, так і бути - напишу однією фразою: пакет MFC дає можливість розробляти GUI-додатки (GUI - Graphic User Interface -- графічний інтерфейс користувача) для Windows мовою C + + з використанням багатого набору бібліотечних класів, причому ці бібліотеки є об'єктно-орієнтованими (крім інкапсуляції підтримують успадкування і поліморфізм). Однак, оскільки MFC в значній мірі орієнтована на роботу з вікнами, документами, подань?? і т.д., велика її частина залишається незатребуваною консольним додатком. Тим не менш, вона все одно може виявитися дуже корисною!

    Отже, вибираємо тепер четвертий варіант і дивимося, що нам створила середу Visual C + +. Так! На цей раз видно, що попрацювала малятко! Багато чого незрозумілого (і, сподіваюся, зрозумілого теж) написала! Давайте розбиратися ...

    По-перше, нові файли з'явилися: Listing4.h, Listing4.rc, Resource.h.

    Listing4.h - файл заголовка для нашого исходники. Поки що у нас тут ось що: перші два рядки і сама остання - попередження повторного підключення, це щоб не вийшло так, що ми б включили двічі цей файл в який-небудь інший (можете почитати в розділі «Мова програмування С + + »про варти включення). Далі три рядки - перевірка версії MFC. Ну і, нарешті, підключення файлу Resource.h.

    Практично кожен додаток, що було створене Visual C + +, містить один файл ресурсів, однойменний з самим додатком і що має розширення. rc. У нашому випадку це Listing4.rc. У ньому знаходяться опису всіх ресурсів нашої програми. У нас тут буде тільки таблиця строкових ресурсів. У цьому і є високе призначення нашої заготовки - вона виводить на екран рядок «Hello from MFC!», оформлену як рядковий ресурс. Середа адже насправді може сама (з нашою допомогою звичайно) оголосити всі необхідні ресурси, дати їм ідентифікатори (унікальні імена), зв'язати ідентифікатори з конкретними числовими значеннями і т.д. Насправді це дуже зручно, наприклад, для русифікації програми не знадобитися шукати в програмному коді місця де виводяться рядки, а просто в таблиці взяти і поміняти текст з англійської на російську, зберігши при цьому всі ідентифікатори та чисельні значення. У програмному коді-то у нас прописані ідентифікатори. Так що розумна середу, забезпечивши нам таку політику, може позбавити нас від значного геморою. І це лише один приклад халяви, яку дарує нам Visual C + +. При спробі відкрити файл Listing4.rc у нас відкривається віконце ResourceView. Тут у нас і є таблиця рядків. У ній ми можемо змінити рядок відповідну даному ідентифікатором, або створити новий рядковий ресурс, поставивши йому у відповідність новий ідентифікатор. Просікають логіку? То-то!

    У файлі Resource.h просто, використовуючи директиву # define , Кожному ідентифікатором ставиться у відповідність чисельне значення. Тут же ми можемо його поміняти або вказати його для нового ресурсу.

    Спробуйте запустити програму, привітайтеся з MFC і переконайтеся, що додаток працює. Якщо привіталися, значить працює. Між часом у нашому робочому просторі з'явилася татко «External Dependencies» з файлом basetsd.h всередині. У ньому, якщо хочете знати, нам показують визначення базових типів даних. Це на випадок, якщо нам заманеться (або доведеться) використовувати 64-бітні типи даних.

    Тим часом і у вже відомих нам файлах відбулися значні зміни. Давайте почнемо тепер з файлу StdAfx.h. На початку всі ті ж, що і в Listing4.h варти включення, далі все та ж перевірка версії MFC, далі йде рядок:

    # define VC_EXTRALEAN// Exclude rarely-used stuff from Windows headers

    - вона для прискорення процесу компіляції (за рахунок відмови від деяких можливостей)

    далі йдуть рядки з підключенням основних MFC-шних файлів: afx.h, afxwin.h, afxext.h, afxdtctl.h, afxcmn.h.

    До речі, якщо будете програмувати, використовуючи MFC, дуже раджу подивитися ці заголовки. Якщо ви знаєте мову С + +, то повинні побачити там не фігу, а корисну інформацію з MFC-класів і функцій і т.д. Буває нітрохи не гірше довідників. А як довідник дуже раджу MSDN Library.

    Нижче розташовано місце, куди ми підключаємо заголовки, які рідко змінюються і будуть використовуватися як перекомпіліровать (я говорив про це вище, на початку статті). Zabot'лівая середу Visual C + + 6.0 вже підключила там .

    А ось тепер давайте дивитися найцікавіше -- звичайно ж Listing4.cpp. Тут у нас ось чого вже готове:

    Розбираємо по порядку. Як звичайно, підключаємо stdafx.h, а разом з ним і Listing4.h. Він підключається тут, а не у файлі stdafx.h, тому що очікується, що ми це фото (Listing4.h) будемо досить часто колупати. Наступний блок з п'яти рядків може виявитися малозрозумілим. Пожалію я вас і не буду зараз мізки пудрити, детально роз'яснюючи цей запис, просто скажу, що вона, можна сказати, канонічна, і міняти її, як правило, не варто. Застосовується в основному в налагоджувальних цілях і щоб уникнути деяких труднощів з ключовими словами та іменами. Далі саме цікаве і починається!

    Отже, далі у нас йде оголошення об'єкту класу нашого застосування. А саме оголошення об'єкта theApp класу CWinApp. Клас CWinApp є похідним від CWinThread. Тому клас CWinApp представляє і основний потік виконання програми, і сам додаток. Таким чином, у будь-якому MFC-додатку існує тільки один об'єкт класу CWinApp. Нас про це в коментарі вже попередили.

    Рядок

    using namespace std;

    говорить нам про те, що в даному блоці програми буде використовуватися стандартне простір імен std. Пояснюю. У програмі може підключатися дуже велике число різних файлів заголовків. У кожному файлі заголовка використовується велика кількість різних назв: змінні, функції, класи, структури і т.д. Різні бібліотеки розробляють різні люди, і, звичайно ж, виходить так, що в різних бібліотеках можуть використовуватися однакові імена. Якщо ми будемо користуватися відразу кількома бібліотеками, то може скластися така ситуація, коли при спробі використовувати ім'я, яке дублюється і в іншому підключається фото, компонувальник видасть повідомлення про помилку: «Identifier multiply defined» (Ідентифікатор визначено кілька разів », де ідентифікатор - це ім'я якого-небудь елемента). Така ситуація називається конфліктом імен. Для того, щоб уникнути таких проблем і придумали простору імен. Простори імен використовуються для позначення глобального простору імен, що дозволяє нехай і не завжди усунути, але, по крайней мірою, зменшити кількість конфліктів імен.

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

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

    Далі у нас іде функція _tmain. А чому _tmain? І чому там тип TCHAR *, а не char *? І що ще за параметр TCHAR * envp []?

    Ну що ж, для зацікавлених поясню. Функція називається _tmain і тип параметрів TCHAR * тому що середовище генерує нам такий код, для того щоб забезпечити сумісність з різними кодуваннями тексту, різних типів char - одне й багатобайтові і т.д. і т.п. Не буду вдаватися в усі подробиці, та й що нам з того: main або _tmain, char або TCHAR? Для нас зараз, в общем-то, сенс не змінюється: _tmain - головна функція в програмі, TCHAR * - рядок тексту. Про всі проблеми зі стандартами вже поZabot'ілась Середа. А ось щодо envp?

    Як бачите, TCHAR * envp [] - теж масив рядків. Він необхідний для роботи з змінними оточення. Хто не в курсі про змінні оточення - читайте що-небудь про MS-DOS (напр., фігурне «IBM PC для користувача »). Оскільки робота з змінними оточення і процесами в консолі (а воно часто для того й треба) не так проста, і не надто часто використовується, то більш докладно в цій статті я роз'яснювати про них не буду. Досить з нас поки аргументів командного рядка.

    Нижче йде оголошення змінної nRetCode - вона буде повертатися функцією _tmain як код помилки. Нагадую, якщо 0 - виконання програми завершилося успішно, якщо не 0 - то неуспішне:)

    Потім слід власне ініціалізація MFC. Зазвичай (в GUI-додатках) це відбувається так: при ініціалізації об'єкту класу CWinApp (або похідного від нього) функцією WinMain, що є частиною бібліотеки MFC, викликається функція AfxWinInit і перевіряється повертається нею значення. Але, оскільки консольні програми не використовують функцію WinMain, нам доводиться викликати функцію AfxWinInit безпосередньо. А вона у нас в такому випадку просить чотири параметри:

    HINSTANCE hInstance

    - дескриптор поточного модуля;

    HINSTANCE hPrevInstance

    - дескриптор попередньої копії програми; для Win32-додатків цей параметр завжди NULL;

    LPTSTR lpCmdLine

    - покажчик на командний рядок поточного процесу;

    int nCmdShow

    - визначає, як має виглядати основне вікно GUI-додатки (оскільки у нас не GUI-додаток, то цей параметр теж 0);

    Що, типи даних дивні? Ну так, дивні ... Але не буду я вам зараз про них розповідати - занадто багато буде. Пожалію вас - не буду зараз мізки вам цим пудрити. Все що на даний момент вам необхідно знати, я пояснив.

    Значить так, другий і четвертий параметр у нас нуль, я вже сказав, а ось звідки ми беремо перший і третій. В якості першого параметра ми використовуємо функцію GetModuleHandle. Вона якраз і повертає нам дескриптор модуля (файлу. dll або. exe), ім'я якого вказується як параметр. Коли цей параметр дорівнює нулю (як у нас), повертається дескриптор файлу, використаного для створення поточного процесу. Що крутувата звучить? Якщо не зрозуміло, почитайте що-небудь з архітектури та основним концепціям Windows ... Почитайте про процеси, дескриптори і т.д. Хоча, можливо, і без того розберетеся? Гаразд. В якості третього параметра ми використовуємо функцію GetCommandLine, повертає вказівник на командний рядок (формату Unicode) поточного процесу. Хто не в курсі, дві двокрапки перед ім'ям функції ставиться, тому що це - глобальна функція Windows.

    Що у нас там далі йде? Ах так, після перевірки умови, якщо функція AfxWinInit поверне не 0 (пам'ятаєте, у нас же записано «Якщо не» if (! AfxWinInit ...), то буде передано повідомлення про помилку за допомогою стандартного небуферізованного потоку діагностики помилок cerr. У нього синтаксис такий же, як і у cout. Кому цікаво, макрос _T використовується для вирішення все тих же труднощів з кодуваннями (Unicode, ANSI ...) Нагадую, про потоки читайте незабаром у розділі «Мова програмування С + +». Ну і звичайно ж, нашому «Сторожа» nRetCode присвоюється значення 1. В іншому випадку (якщо ініціалізація MFC пройшла успішно) буде виконуватися код нашої програми. Саме сюди ми і будемо писати свій програмний код. У разі нашої заготовки це просто вивід на екран строкового ресурсу. Оголошуємо strHello типу CString. Далі рядком

    strHello.LoadString (IDS_HELLO);

    ми, використовуючи функцію LoadString, яка є членом класу CString, завантажуємо рядковий ресурс Windows, що має ідентифікатор IDS_HELLO в існуючий об'єкт strHello. Потім цей об'єкт виводиться на екран з використанням стандартного потоку виводу cout. Кому цікаво, (LPCTSTR) - знову ж таки для вирішення труднощів з кодуваннями.

    Ну і, нарешті, повертається наш «сторож» nRetCode.

    Ось, власне, і все! Ну що, завантажив по повній? Нічого, розбирайтеся, читайте книжки, MSDN читайте, «медитуйте»:)

    Хотілося б ще сказати, що ж все-таки таке MSDN. MSDN - це здоровенний довідник для програмування в Visual Studio. NET. Там є все: і по мові С + +, і по програмуванню в Microsoft Visual C + + і ще дуже багато чого корисного. Вся ця краса розміщується на трьох CD, і при встановлення на жорсткий диск важить близько 2Гб. Так, вона англійською. Але розібратися можна. Одним словом, рекомендую.

    Що ж ви тепер знаєте і вмієте? Ви тепер знаєте, як зробити і використати всі 4 типу заготовок консольних додатків, знаєте майже в усіх деталях, що в цих заготовках і навіщо потрібно, а отже, можете і самі подібні речі творити. Більш того, розібравшись у цих заготовках, ви тепер знаєте, як найкращим чином на їх основі почати створювати своє робоче додаток. Але саме робоче додаток ми ще не створювали. Я вас тільки «Наносив», натренував маненько для битв з Матрицею і її кодла, бою ж ще не було. Але він буде! Попереду нас чекає перша, нехай і невеликий, але реальний бій з Матрицею. А саме, ми з вами у статті зробимо наше перший реально КОРИСНЕ консольний додаток. Сьогодні ми з вами підготувалися. Битва попереду!

    Список літератури

    Н. Секунь «Самоучитель Visual C + + 6»;

    Бьерн Страуструп «Мова програмування С + +»;

    Джесс Ліберті «Освой С + + самостійно за 21 день»;

    MSDN for Visual Studio. NET;

    Вміст заголовків файлів (. h) середовища Visual C + +;

    Юджин Олафсен, Кенн Скрайбер, Девід Уайт «MFC і Visual C + + 6 »;

    В.Е. Фігурне «IBM PC для користувача»

    Zabot 2004

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.realcoding.net/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status