Kurs C++ #10
Kurs C++ #10
.jedi {color: black; font-weight:normal;}
.archie {color: #000090; font-weight:normal;}
|======= #10 add. 1 ======|
+-------------------------+
| K U R S C + + |
+-------------------------+
O m ó w i e n i e I D E
D e v - C + +
Kolor czarny - Jedi Bartek
Kolor niebieski - ArchiE
Kurs C++ ArchiEgo jest świetny, ale jednej rzeczy mi brakuje - dokładnego opisu naszego IDE - w wypadku tego kursu - Dev-C++. Dev-C++ ma kilka ciekawych elementów, których początkujący może nie znaleźć. Postanowiłem (Jedi Bartek) zająć się takim nietypowym dodatkiem, a i mieć wkład w ten kurs :)
A ja bardzo chętnie przyjąłem tę propozycję, tym bardziej, że ten kurs powoli zaczyna mnie przerastać. ;) Bartek słusznie zauważył, że materiały źródłowe z #8 części kursu nie dały się skompilować pod Dev-C++ 4.9.9.2, obiektowość jest omawiana dokładnie, co również oznacza dla mnie spory wysiłek, a jak pomyślę, ile jeszcze przed nami... Ogólnie - pomoc przyda się niezmiernie. Chyba nie muszę nikomu tłumaczyć, że tym kolorem wpisuję się ja - ArchiE. :P
Omówimy sobie dosłownie wszystko, co wiąże się z Dev-C++. Najpierw instalacja. Ona sama przebiega bezproblemowo. Następnie przy pierwszym uruchomieniu pojawia się okienko podstawowej konfiguracji IDE. Wybieramy język, styl szaty graficznej (tzw. skin), a później możemy włączyć funkcję uzupełniania kodu. Aby działała poprawnie, trzeba utworzyć dość spory plik, z głównymi plikami nagłówkowymi C++. Ta czynność nie jest wymagana do korzystania z tej funkcji, ale wysoce zalecana. Mankamentem jest długi czas wykonywania tej czynności. A to dlatego, że ma do przeskanowania 547 plików nagłówkowych i zindeksowania wszystkich występujących tam deklaracji funkcji oraz klas wraz z ich metodami - jak na mój gust, i tak robi to szybko. Później program jest już uruchomiony - polecam od razu włączyć maksymalizację okna, gdyż przy jego mniejszych wymiarach obsługa może być nieco nieporęczna.
Teraz omówimy po kolei wszystkie części okna: po lewej mamy przeglądarkę plików projektu i klas oraz okno zmiennych śledzonych przez debugger (o tych nieco później), na górze wszelkie paski narzędziowe, na dole zaś wszelakie "okna efektów" - błędy kompilacji, wyniki wyszukiwań, logi kompilatora oraz menu debuggera, zaś reszta okna to pole edytora. Omówimy możliwości każdego z ekranów.
Operacje na projekcie
Czyli dostępne z pasków narzędziowych. W menu "Plik" mamy kilka opcji. Pierwsza to "Nowy..." - możemy tu stworzyć pusty plik, plik zasobów, tudzież projekt. W tym ostatnim wypadku wybieramy jego nazwę i rodzaj. W działach Introduction i Multimedia mamy przykładowe programy, w Basic podstawowe szablony. Przy ich wybraniu ustalane jest, w jaki rodzaj pliku ma być skompilowany - nie widać tego i niewiele osób wie, że można to zmienić. Za chwilę to omówimy. Dodawany też jest plik main z "podstawką" kodu.
Co do możliwych projektów - Windows Application daje nam szablon programu pod WinAPI, Console Apllication to aplikacja konsolowa, DLL zaś bibliotekę dynamiczną - często stosowaną przy dużych projektach (zwykle jednak rzadko, gdyż pisze się je inaczej niż zwykły program). Biblioteka statyczna zaś nieco się różni, gdyż nie daje nam żadnego szablonu pliku - takowe dodajemy ręcznie. Z kolei Empty project służy do stworzenia - wiadomo - pustego projektu, do którego dodajemy gotowe pliki, a i możemy skorzystać z "Opcji projektu". W ogóle żeby skompilować jakikolwiek program, musimy utworzyć nowy projekt. Pusty projekt przydaje się, gdy mamy już gotowy kod źródłowy i chcemy go skompilować.
No i teraz o nich. Pomyślcie: po co tworzymy coś takiego jak projekt, zamiast napisać zwykły plik *.cpp? Właśnie po to, aby mieć dostęp do tych funkcji (i nieco dużo :) wygodniejszą kompilację). W menu "Projekt" wybieramy "Opcje projektu".
No i tu zaczyna się zabawa. Możemy zmienić nazwę projektu (zmiana nazwy pliku z nim nie daje efektu, tzn. nie zmienia się nazwa pliku wynikowego), oraz wybrać dla niego ikonkę. Do wyboru: biblioteka samego Dev-C++, do której możemy dodać swoje ikonki - wchodzimy w folder z Dev-C++, podfolder Icons i kopiujemy tu nasze ikonki (pliki *.ico). Możemy też wybrać sobie jakąś własną. Dodajmy, że po wybraniu dla programu ikonki podczas kompilacji jest tworzony plik nazwaprojektu_private.rc i o takiej samej nazwie nagłówkowy (*.h).
Dodam tylko, że plik *.rc to tzw. skrypt zasobów. Zasobami są właśnie ikony, menu programowe, okna, przyciski czy różne bitmapy. Ten skrypt pokazuje kompilatorowi, gdzie te pliki są i nakazuje je włączyć do pliku wynikowego (*.exe lub *.dll - dość często jest praktykowane tworzenie bibliotek DLL z zasobami). Skompilowany plik *.rc ma rozszerzenie *.res i na etapie linkowania jest dołączany do pliku wynikowego. Skrypty zasobów są typowe dla środowiska Windows i okienek w tym systemie. Oryginalny DOS to nawet takiej ikonki nie wyświetla...
W tym samym menu wybieramy też, w jakim formacie ma być kompilowana nasza aplikacja. Win32 GUI to aplikacja okienkowa, reszty nie trzeba tłumaczyć.
A ja myślę, że jednak warto. Console Application to aplikacja w okienku DOSa - to wie chyba każdy. Dynamic Library to biblioteka dynamiczna (Dynamic Link Library), dołączana w czasie wykonania programu. Jest ona również charakterystyczna dla Windowsa - inne systemy mają inne rozwiązania, DLLki tam nie działają. Natomiast biblioteka statyczna jest podobna do dynamicznej, jednak dołączana na etapie kompilacji. Jeżeli grzebaliście trochę w folderze Dev-cpp, to pewnie waszą uwagę przykuły dwa foldery: include i lib. W include znajdują się wszystkie pliki nagłówkowe, a w lib biblioteki statyczne, w których znajdują się definicje funkcji zdefiniowanych w plikach nagłówkowych. Projekt Static Library pozwala właśnie na utworzenie takiej biblioteki (w MinGW jest to plik *.a, a w Borlandzie *.lib).
W kolejnej zakładce, "Pliki" występują dość zaawansowane ustawienia, takie jak priorytet budowy, które nie są niezbędne - tzn. są, ale nie na naszym etapie projektowania aplikacji. Z kolei ważnymi ustawieniami są "Dołącz do kompilacji" i "Dołącz podczas konsolidacji". Jeśli wszystkie otwarte pliki są częścią projektu (zwykle tak jest), oba "checkboxy" muszą być zaznaczone (jest tak domyślnie, więc powinniście tam zajrzeć, gdy chcecie odłączyć plik od projektu). Ta opcja przydaje się, gdy chcemy dołączyć do projektu np. podczas konsolidacji plik ze skompilowanym i przetestowanym już modułem (*.o), co przyspiesza kompilację (wtedy właściwy plik (*.cpp) odłączamy od kompilacji, a do konsolidacji dodajemy jego skompilowaną wersję (*.o)). Można też dodać jakąś bibliotekę statyczną.
Zakładka "Kompilator" posiada dużo więcej funkcji. Warto zajrzeć do zakładki "Optymalizacja", jeśli robimy większy program. A ja bym jednak nie radził na etapie pisania programu. Tego typu optymalizację należy włączyć podczas konsolidowania wersji relase (ostatecznej) programu - podczas pisania optymalizacja może się przyczynić do dziwnych błędów. Większość funkcji jest oczywista, jednak na przykład "Konsoliduj program jako Obiektowy C" może być niejasna. Objective-C to język teoretycznie oparty na C/C++/C#, jednak o nieco innej architekturze. Właściwie jest to wersja przejściowa między C i C++. Włączmy też obsługę wyjątków (przydaje się - ale dopiero jak my będziemy potrafili te wyjątki obsłużyć. ;) ) i na tym możemy zakończyć przygodę z tą zakładką. Co prawda zawiera ona dużo więcej funkcji, jednak są to albo funkcje bardzo specjalistyczne, albo oczywiste. Ja od siebie dodam, że można optymalizować kod dla wybranych rodzin procesorów i wykorzystując odpowiednie instrukcje (MMX, SSE, SSE2, PNI, 3D Now!), ale lepiej z nimi nie kombinować - wersja zoptymalizowana pod Pentium 4 może powodować błędy wykonania na Athlonach - i wzajemnie. Zakładkę "Parametry" omińmy, gdyż używamy jej jedynie do podawania specjalnych komend. O parametrach programu możecie dowiedzieć się z lekcji #12 już za miesiąc. Wtedy ten element może się wam naprawdę przydać.
Pliki/katalogi - jeśli pliki z kodem znajdują się w innym folderze niż projekt, podajemy tu lokalizację tego folderu.
Zakładka "Wyjście" - tu wybieramy, w jakim folderze mają "lądować" określone pliki - pliki *.o i *.obj (po kompilacji), ewentualnie w oddzielnej lokalizacji pliki *.exe (czy też inny plik finalny, po konsolidacji). Jeśli plik wynikowy (tak nazywamy ostateczny plik, powstały po konsolidacji, np. bibliotekę DLL) ma mieć nazwę inną niż projekt, podajemy tu ją.
Makefile - to jest niepotrzebne. Możemy tu podać lokalizację własnoręcznie napisanego pliku Makefile, jednak po co? Dev-C++ sam tworzy takie pliki.
Może wyjaśnię: makefile to specjalny skrypt dla programu make, zawierający wszystkie opcje kompilacji i konsolidacji, przenoszenie właściwych plików i kompilację "wybiórczą" - czyli tylko tych plików, które uległy zmianie. Służy po prostu zarządzaniem projektem, tylko na nieco innej zasadzie (niestety - dużo trudniejszej). Ale rzeczywiście, nie ma potrzeby się z tym babrać, bo Dev-C++ radzi sobie z tym doskonale.
Ostatnia zakładka to "Informacje". Widzieliście w innych programach zakładkę "Wersja" przy właściwościach? Tu możecie stworzyć własną. Zaznaczamy funkcję "Dołącz informacje o wersji do projektu" i kombinujemy! Dodajemy tu numer wersji (możemy ustawić dodawanie do niej "numerka" przy każdej kompilacji), język, autora itp.
Jak widać, "Opcji projektu" jest sporo. Jak wspomniałem, przy korzystaniu z nich tworzone są specjalne pliki (zasobów i nagłówkowe).
Aha, dodawać i usuwać gotowe pliki do projektu możemy również z menu "Projekt" oraz z paska narzędzi - służą do tego dwie ikony.
Przeglądarka klas
Tu będzie szybciej. W oknie po lewej macie tą przeglądarkę, z kilkoma zakładkami. Pierwsza to pliki projektu: możemy tu wstawiać foldery, aby segregować nasze pliki. Dalej są "Klasy", choć przeglądamy tu zarówno klasy, jak i funkcje. W nowych projektach okno wypełnia się dopiero po zapisaniu i ponownym otworzeniu. Przy kliknięciu PPM możemy dodać nową klasę, za pomocą pseudokreatora. Kolejne "sekcje" klasy przeglądamy poprzez rozwijane menu. Ostatnie okno to Odpluskiwacz: na tym się już nie znam, okno służy do sterowania debugerem. Tutaj wyświetlane są wartości śledzonych zmiennych w programie - na dowolnym etapie programu możemy go zatrzymać i sprawdzić wartości wybranych zmiennych. BTW: planuję napisanie dodatku do kursu, który omówiłby debuggera w Dev-C++ (choć w zasadzie w każdym IDE działa on podobnie).
Dodatki
Za pomocą funkcji "Przełącz" wstawiamy w określonym miejscu zakładkę, do której odwołujemy się poprzez funkcję "Przejdź do".
W menu Szukaj mamy narzędzie "Przejdź do funkcji", dzięki któremu odnajdujemy określoną bez problemu.
Konfiguracja
Edytor - możemy skonfigurować kolorowanie składni, wybrać gotowy "styl" (np. Visual Studio, Borland). Jest tam też dokładna konfiguracja uzupełniania kodu - jakie pliki mają się znaleźć w pamięci podręcznej itp. Wybieramy też czcionkę w naszym edytorze.
W opcjach kompilatora mamy część tego, co w opcjach projektu (w tych drugich robimy to tylko dla danego programu, w pierwszym na stałe). Wybieramy też, z jakich programów wewnętrznych (chyba zewnętrznych?...) ma korzystać Dev-C++.
Te programy, które możemy zmieniać, to kompilator (odpowiednio: C (gcc.exe), C++ (g++.exe), make (make.exe), a reszty to, niestety, nie znam, bo ich nazwy nieniele mi mówią :/ Ale jeden z nich to na pewno kompilator skryptu zasobów). Możemy używać nie tylko kompilatora MinGW dołączonego wraz z Dev-C++, ale również korzystać tu z innych - np. Borlanda, MARS Metrowerks, Microsoftu. Ale niestety, wtedy już sami musimy pracować nad makefilem, bo każdy kompilator ma nieco inne opcje.
W opcjach środowiska zaś interfejs, pliki i katalogi, z których Dev-C++ ma pobierać określone dane; jakie rozszerzenia mają być automatycznie otwierane przez Dev-C++.
Na koniec jeszcze o IDE ogólnie. Testowałem kiedyś Borland Buildera, jednak uważam, że Dev-C++ jest lepszy. Co do Visual C++ (Express) - jego też testowałem (bardzo krótko) i jego z kolei uważam za lepszego od Dev-C++ - ma dużo więcej funkcji, choć bardziej przydatnych, gdy jest się na wyższym poziomie - do tego kursu faktycznie lepiej nadaje się Dev-C++. Choć już na poziomie progr. obiektowego proponuję Visuala.
Jeszcze kilka słów o debuggerze. W wersji 4.9.9.2, którą ostatnio ściągnąłem, działa on bez zarzutu (wersja, którą miałem wcześniej, nie pozwalała na jego użycie - a niby też 4.9.9.2...). Aby rozpocząć debugging trzeba w opcjach kompilacji wyłączyć wszelkie optymalizacje, włączyć "Konsolidator | Generuj informacje dla odpluskwiacza" i "Profilowanie kodu | Generuj informacje dla programu profilującego". Potem tylko ustawiamy kursor na początku funkcji main() i włączamy "Uruchom do kursora". Teraz klawiszamy F7, Shift+F7 oraz Ctrl+F7 obsługujemy debuggera oraz za pomocą klawisza F4 dodajemy obserwowane zmienne. F7 powoduje przejście do następnej instrukcji. Shift+F7 robi to samo, ale przy wywołaniu funkcji "zagłębia się" w nią. Ctrl+F7 powoduje zakończenie pracy debuggera i normalne dalsze wykonanie programu.
Tekst napisali:
ArchiE & Jedi Bartek
A ja bym powiedział, że Jedi Bartek & ArchiE. ;)Jedi więcej się nad tym napracował...
Wyszukiwarka
Podobne podstrony:
k cplk cpl2k cpl?k cplk cpl1k cpl?k cplk cplr08 cpl t (3)t p cplk cpl0k cpl0k cplk cplk cpl1k cplawięcej podobnych podstron