Zadanie oceniane 2 #
Translacja #
W tym zadaniu stworzysz prosty projekt w C++ składający się z:
- Dwóch programów
- Biblioteki statycznej z wieloma plikami.
- Biblioteki współdzielonej.
Sklonuj repozytorium zgodnie z instrukcją z laboratorium wprowadzającego. Najpierw wykonaj pierwszy etap. Wyślij go do repozytorium oraz zgłoś to prowadzącemu, który go sprawdzi. Dopiero po tym przejdź do kolejnego etapu.
W repozytorium znajdziesz jeden plik startowy: test.cpp.
Pliki startowe #
1. Biblioteka dynamiczna [4pkt] #
Utwórz dwa pliki: hello.cpp i hello.hpp.
Pierwszy powinien zawierać:
- Definicję zmiennej globalnej statycznej
HELLO_COUNTinicjowanej zerem. - Definicję funkcji
void print(std::string name)w przestrzeni nazwhello. Funkcja ta najpierw zwiększaHELLO_COUNTo 1, a potem wypisuje na stadardowe wyjście wartość licznika oraz powitanie dlaname
Czyli np. dla trzeciego wywołania, z argumentem<HELLO_COUNT>. Hello <name>.<nowa linia>"Markusz", powinna wypisać3. Hello Markusz.<nowa linia>
W pliku hello.hpp udostępnij tę funkcję.
Utwórz plik main_program.cpp z funkcją main() i wywołaj w niej napisaną funkcję print trzy razy z dowolnymi argumentami (np. "Darius", "Xerxes", "Ataxerxes").
Utwórz plik Makefile z celami:
- Zmienną
COMPILERz wartościąg++. Nie używaj poleceniag++bezpośrednio w dalszej częściMakefile. all– teraz tylko będzie tam tylkomain_program.clean– usuwa pliki wynikowe kompilacji- Cele potrzebne do kompilacji utworzonych plików.
hello.cppnależy budować jako bibliotekę współdzieloną (shared) o nazwielibhello.so, oraz linkować ją domain_program. Kompilację pliku.cppdziel na dwa cele: kompilujący (t.j. tworzący plik.o) i linkujący.
Dodaj w komentarzu do main_program.cpp polecenie bash, którym uruchomić można ten program z katalogu projektu. Uwzględnij ścieżkę szukania bibliotek współdzielonych.
2. Biblioteka współdzielona [6pkt] #
Utwórz cztery pliki: vectors.cpp, vectors.hpp, strings.cpp i strings.hpp.
W vectors.cpp zdefiniuj w przestrzeni nazw vectors:
- Funkcję
std::vector<int> reverse(std::vector<int>* old), która tworzy nowystd::vector<int>o zawartościold, ale w odwrotnej kolejności. Upewnij się, że funkcja działa poprawnie dla pustych wektorów (->size()zwraca zmiennąunsigned). - Funkcję
int max(std::vector<int>* vec), która zwraca maksymalny element wektora. Wvectors.hppudostępnij te funkcje.
W strings.cpp zdefiniuj w przestrzeni nazw strings:
- Zmienną globalną
COMBINE_COUNTtypuintinicjowaną zerem. - Funkcję
std::string combine_strings(std::string s1, std::string s2), która zwiększaCOMBINE_COUNTo 1 oraz konkatenuje podane ciągis1is2. Przy argumentach"Hello"i"world"zwraca ciąg postaciHello world(konkatenacja i dodanie spacji pomiędzy). Wstrings.hppudostępnij tę zmienną i funkcję.
Zaktualizuj Makefile:
- Zbuduj bibliotekę statyczną
liboperations.az plikówvectors.cppistrings.cpp. Podziel zadanie w pliku Makefile odpowiednio na cele (kompilacja każdego pliku.cppi utworzenie biblioteki) - Zbuduj program
testi zlinkuj do niegoliboperations.a. - Zaktualizuj
alldodając do niegotest. - Zaktualizuj
clean, by usuwał nowe pliki wynikowe kompilacji.
Poprawny wynik uruchomienia programu test to:
vector: {1, 2, 3, 4, 5, 4}
reversed: reversed empty: {}
max: 5
COMBINE_COUNT: 0
Combining abc and efg: abc efg
COMBINE_COUNT: 1
Bon voyage.