Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą prowadzone w oparciu o jedno z wybranych środowisk programistycznych (IDE ang. Integrated Development Environment): CodeBlocks (opensource cross platform IDE) lub Microsoft Visual Studio. Zintegrowane środowisko programistyczne CodeBlocks można pobrać nieodpłatnie ze strony internetowej: www.codeblocks.org. Do wyboru mamy pobranie środowiska w postaci otwartego kodu źródłowego na licencji publicznej GNU (ang. General Public License) do własnej kompilacji jak również pobranie wersji binarnej dla systemów operacyjnych takich jak: Windows, Linux czy też Mac OS X. 2. Proces tworzenia programu wykonywalnego Proces tworzenia programu wykonywalnego przedstawiono schematycznie na rysunku 1. W pierwszym kroku przygotowujemy kod źródłowy programu, np. w języku C++. W dalszej kolejności kod źródłowy przetwarzany jest w procesie kompilacji (tłumaczenia zapisów programisty na kod maszynowy) w wyniku którego otrzymamy tak zwane plik/i obiektowy/we zawierające kod wynikowy w postaci binarnej będący jednocześnie źródłem danych dla konsolidatora. Zadaniem konsolidatora (inaczej Linker) jest powiązanie danych otrzymanych w wyniku kompilacji wraz z kodem zawartym w odpowiednich bibliotekach (łączenie statyczne w odróżnieniu od bibliotek dołączanych dynamicznie w trakcie działania programu takich jak np. pliku *.dll). Produktem końcowym pracy konsolidatora jest oczekiwany plik wynikowy w postaci wykonywalnej (dla danego danego systemu operacyjnego). Pliki źródłowe *.cpp *.de f Pliki Kompilator Pliki objektowe *.obj nagłówkowe *.h *.li b Linker Rys. 1 Schemat tworzenia kodu wykonywalnego. Ze względu na fakt, iż zajęcia prowadzone będą głownie w oparciu o darmowe środowisko IDE jak również programy darmowe, poniżej przedstawiono opis kilku podstawowych narzędzi pakietu GNU: gcc/g++ : podstawowe kompilatory w pakiecie GNU ld : linker odpowiedzialny za generowanie programu uruchomieniowego lub bibliotek gdb : debugger będący częścią projektu GNU (więcej na ten temat w kolejnym ćwiczeniu) as : kompilator dla języka assembler make : narzędzie odpowiedzialne za nadzorowanie tworzenia program wykonywalnego Pomocna literatura: www.codeblocks.org
3. Poznanie edytora Uruchomić wybrane przez prowadzącego środowisko programistyczne (CodeBlocks lub VS) wybierając z menu głównego odpowiedni program lub skrót z okna głównego (Rys.2). a) b) Rys.2. Uruchomienie środowiska programistycznego IDE: CodeBlocks a) oraz Visual Studio b). 1. Zapoznać się z obsługą uruchomionego edytora, jego dostępnymi funkcjami oraz pomocnymi skrótami. 2. Ustawić wybrane opcje środowiska, kompilatora i edytora 4. Kompilacja i uruchomienie najprostszych programów przykładowych. a. Środowisko CodeBlocks: utworzyć nowy projekt: File >New >Project w dalszej kolejności wybrać typ tworzonego projektu: Console application w wyświetlonym oknie dialogowym wybrać język w jakim będziemy programowali: C++ wpisać nazwę projektu oraz jego lokalizację: np. Project title: Test wybrać kompilator jakiego będziemy używali oraz konfigurację dla projektu (Rys.3) Kompilator: GNU GCC Compiler Rys. 3. Tworzenie pierwszego projektu w środowisku CodeBlocks.
Rys.4. Podstawowe ustawienia kompilatora dla tworzonego projektu. Naciśnięcie przycisku Finish kończy procedurę tworzenia projektu. W okienku Menadzera w zakładce Projects można przejrzeć drzewo przedstawiające strukturę plików w naszym projekcie. W chwili obecnej posiadamy jeden plik *.cpp o nazwie main.cpp zawierający wygenerowany przez środowisko prosty kod programu, przedstawiony poniżej: cout << "Hello world!" // dodanie pliku nagłówkowego // korzystamy z przestrzeni nazw std // główna funkcja programu << endl; // wyświetlenie na standardowym wyjściu Hello World! Uwagi: kompilacja i linkowanie pierwszego programu: Build >Build lub Ctrl F9 uruchomienie utworzonego programu: Build Run lub Ctrl F10 b. Środowisko Visual Studio. utworzyć nowy projekt: File >New Project, Typ:Win32 w pojawiającym okienku wybieramy typ: Console application (Rys.5) Naciśnięcie przycisku Finish podobnie jak dla poprzedniego przykładu spowoduje utworzenie projektu oraz wygenerowanie kodu (chyba, że zaznaczymy opcję Empty Project tak, jak na rysunku 5) dla podstawowego programu konsolowego: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) // W tym miejscu wpisać kod wyświetlający ciąg znaków
Rys.5. Tworzenie nowego projektu w środowisku Visual Studio. w przypadku korzystania ze środowiska Visual Studio zapoznać się z typową dla VS strukturą projektu. sprawdzić gdzie wpisane są podstawowe pliki nagłówkowe znaczenie stdafx.h znaleźć różnicę pomiędzy main(), _tmain() i wmain() podpowiedź: specyfikacja Unicode zmodyfikować wygenerowany kod źródłowy tak, aby na ekranie wyświetlić napis Hello World Uwagi: kompilacja programu : Build Build > Solution lub F7 uruchomienie : Debug >Start debugging lub F5 5. Modyfikacja podstawowych programów, operacje na zmiennych oraz typy danych W tabeli tabeli 1 przedstawiono podstawowe typy danych wykorzystywane typowo w języku C/C++. Poniżasz tabela stanowi jedynie przypomnienie wiadomości poznanych na wcześniejszym kursie z Technologii Informacyjnych. Tab.1. Podstawowe typy danych wykorzystywane w języku C/C++ Typ danych Ilość bajtów Zakres char 1 128 do 127 int ( int16) 2 32768 do 32767 int ( int32) 4 2147483648 do 2147483647 int ( int64) 8 9223372036854775808 do 9223372036854775807 float 4 3.4E±38 double 8 1.7E±308 void 0 bez wartości bool 1 prawda/fałsz utwórz nowy (najlepiej pusty) projekt oraz zmodyfikuj (napisz od początku) program tak, aby zweryfikować dane podane w tabeli 1. Do tego celu wykorzystaj funkcję sizeof() oraz wyjaśnij różnice w zakresie dla typów signed oraz unsigned
cout << "Typ int : " << sizeof(int) << " Bajty" << endl; uruchom poniższe przykłady oraz wytłumacz różnice pomiędzy otrzymaną wartością a wartością oczekiwaną oraz popraw poniższe programy tak, aby otrzymać poprawną wartość: int a; int wynik; wynik = ++a; cout << wynik << endl; // Jakiego spodziewamy się wyniku? float zmienna1 = 1/2; float zmienna2 = 1.0; cout << zmienna1 + zmienna2 << endl; // Jakiego spodziewamy się wyniku? char zmienna1 = 256; float zmienna2 = 1.0; cout << (float)zmienna1 + zmienna2 << endl; // Jakiego spodziewamy się wyniku?