Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:jimp2:2017:labs:pamiec-i-pliki [2017/03/03 17:13] mwp [Map] |
pl:dydaktyka:jimp2:2017:labs:pamiec-i-pliki [2019/06/27 15:50] (aktualna) |
| |
Niestety należy pamiętać o tym by zwolnić pamięć przydzieloną inaczej uzyskujemy wyciek pamięci i program w trakcie działania zaczyna zużywać coraz więcej pamięci operacyjnej mimo, że już jej i tak nigdy nie użyje! Sprawa też nie jest taka prosta, bo nie zawsze wiadomo, czy pewne elementy nie są już na pewno przez nikogo używane. | Niestety należy pamiętać o tym by zwolnić pamięć przydzieloną inaczej uzyskujemy wyciek pamięci i program w trakcie działania zaczyna zużywać coraz więcej pamięci operacyjnej mimo, że już jej i tak nigdy nie użyje! Sprawa też nie jest taka prosta, bo nie zawsze wiadomo, czy pewne elementy nie są już na pewno przez nikogo używane. |
| |
| === Brak wartości === |
| |
| W C%%++%%11 nie używamy już makra **NULL** zostało dodane specjalne słowo kluczowe reprezentujące pusty wskaźnik **nullptr** |
| |
| <code cpp> |
| int *v = nullptr; |
| delete v; |
| </code> |
| |
| |
=====Ale jest nadzieja - zautomatyzowane zarządzanie pamięcią część pierwsza===== | =====Ale jest nadzieja - zautomatyzowane zarządzanie pamięcią część pierwsza===== |
using std::cout; | using std::cout; |
using std::endl; | using std::endl; |
| using std::vector; |
| |
void print_vector(const std::vector<int> &v) { | void PrintVector(const vector<int> &v) { |
bool first = true; | bool first = true; |
for(auto n : v) { | for(auto n : v) { |
| |
} | } |
cout<<std::endl; | cout<<endl; |
} | } |
| |
{ | { |
// Create a vector containing integers | // Create a vector containing integers |
std::vector<int> v = {7, 5, 16, 8}; | vector<int> v = {7, 5, 16, 8}; |
| |
cout << "initilized with 4 numbers"<<endl; | cout << "initilized with 4 numbers"<<endl; |
print_vector(v); | PrintVector(v); |
| |
// Add two more integers to vector | // Add two more integers to vector |
v.emplace_back(13); | v.emplace_back(13); |
cout << "after 2 more inserted"<<endl; | cout << "after 2 more inserted"<<endl; |
print_vector(v); | PrintVector(v); |
| |
//copy of the value inside vector | //copy of the value inside vector |
| |
cout << "BUT: after incrementation"<<endl; | cout << "BUT: after incrementation"<<endl; |
print_vector(v); | PrintVector(v); |
| |
//reference to the value inside vector, therefore one can change the value | //reference to the value inside vector, therefore one can change the value |
} | } |
cout << "and again... can you spot the difference?"<<endl; | cout << "and again... can you spot the difference?"<<endl; |
print_vector(v); | PrintVector(v); |
} | } |
</code> | </code> |
[[http://coliru.stacked-crooked.com/a/e34667b3cc595d3a|Run code]] | [[http://coliru.stacked-crooked.com/a/056089e192222291|Run code]] |
| |
==== Map ==== | ==== Map ==== |
====== Ćwiczenia ====== | ====== Ćwiczenia ====== |
- Zrefaktoryzować kod metod //factorial//, //reverse// i //is_palindrome// tak, żeby nawiązywały do konwencji, że nazwa funkcji jest pisana jako //NazwaFunkcjiCamelCase//, skorzystać z narzędzia do refaktoryzacji wbudowanego w CLion: najechać na metodę kursorem wybrać z menu Refactor->Rename... (SHIFT+F6). | - Zrefaktoryzować kod metod //factorial//, //reverse// i //is_palindrome// tak, żeby nawiązywały do konwencji, że nazwa funkcji jest pisana jako //NazwaFunkcjiCamelCase//, skorzystać z narzędzia do refaktoryzacji wbudowanego w CLion: najechać na metodę kursorem wybrać z menu Refactor->Rename... (SHIFT+F6). |
- [1 plus] W sekcji [[#wskazniki_i_alokacja_pamieci|Wskaźniki i alokacja pamięci]] zostało powiedziane, że **nie można** utworzyć tablicy wielowymiarowej prostym poleceniem //int * *tab = new int[10][10]//. Przeanalizuj rysunek poniżej i zastanów się dlaczego tak jest. Następnie napisz program który będzie pobierał od użytkownika wymiary tablicy i dynamicznie alokował pamięć dla niej. Napisz funkcję która będzie uzupełniała tablicę iloczynami wierszy i kolumn i osobną funkcję do wyświetlania tablicy. Czy można do tego wykorzystać funkcje napisane na poprzednich laboratoriach nie modyfikując ich? Pamiętaj o **poprawnym** zwolnieniu pamięci! {{.:pointers2pointers.png|Tablica wskaźników}}. Zadanie zostało podzielone na kroki: (step1,step2,...). Ukończenie pierwszego i drugiego kroku jest wymagane do zaliczenia ćwiczenia. | - [1 plus] W sekcji [[#wskazniki_i_alokacja_pamieci|Wskaźniki i alokacja pamięci]] zostało powiedziane, że **nie można** utworzyć tablicy wielowymiarowej prostym poleceniem //int * *tab = new int[10][10]//. Przeanalizuj rysunek poniżej i zastanów się dlaczego tak jest. Następnie napisz program który będzie pobierał od użytkownika wymiary tablicy i dynamicznie alokował pamięć dla niej. Napisz funkcję która będzie uzupełniała tablicę kolejnymi liczbami całkowitymi (tak jak na rysunku) i osobną funkcję do wyświetlania tablicy. Czy można do tego wykorzystać funkcje napisane na poprzednich laboratoriach nie modyfikując ich? Pamiętaj o **poprawnym** zwolnieniu pamięci! {{.:pointers2pointers.png|Tablica wskaźników}}. Zadanie zostało podzielone na kroki: (step1,step2,...). Ukończenie pierwszego i drugiego kroku jest wymagane do zaliczenia ćwiczenia. |
* Moduł: **array2d** | * Moduł: **array2d** |
* Pliki z implementacją: **Array2d.h/cpp** | * Pliki z implementacją: **Array2D.h/cpp** |
* Sygnatura metody: <code cpp>int **Array2D(int n_rows, int n_columns); | * Sygnatura metody: <code cpp>int **Array2D(int n_rows, int n_columns); |
void DeleteArray2D(int **array, int n_rows, int n_columns);</code> | void DeleteArray2D(int **array, int n_rows, int n_columns);</code> |
- [2 plusy] Wykorzystując strukturę danych (struct) znaną jeszcze z języka C, należy zaimplementować listę jednokierunkową zdolną przechowywać liczby całkowite w swoich węzłach. **UWAGA**: jest to ćwiczenie tylko techniczne, w standardowej bibliotece istnieje [[http://en.cppreference.com/w/cpp/container/forward_list|forward_list]] zdolna przechowywać dowolny typ. | - [2 plusy] Wykorzystując strukturę danych (struct) znaną jeszcze z języka C, należy zaimplementować listę jednokierunkową zdolną przechowywać liczby całkowite w swoich węzłach. **UWAGA**: jest to ćwiczenie tylko techniczne, w standardowej bibliotece istnieje [[http://en.cppreference.com/w/cpp/container/forward_list|forward_list]] zdolna przechowywać dowolny typ. |
* Moduł: **simpleforwardlist** | * Moduł: **simpleforwardlist** |
* Pliki z implementacją: **ForwardList.h/cpp** | * Pliki z implementacją: **SimpleForwardList.h/cpp** |
* Sygnatury metod: <code cpp>ForwardList *CreateNode(int value); | * Sygnatury metod: <code cpp>ForwardList *CreateNode(int value); |
void DestroyList(ForwardList *list);</code> | void DestroyList(ForwardList *list);</code> |
* Pliki nagłówkowe: <code cpp>#include <string> | * Pliki nagłówkowe: <code cpp>#include <string> |
#include <vector></code> | #include <vector></code> |
| * Wskazówki: <code cpp>#include <algorithm> |
| using std::find; |
| using std::vector; |
| using std::string; |
| |
| vector<string> dictionary {"the","of"}; |
| |
| //THERE ARE BETTER WAYS TO LOOK FOR A WORD BUT IT WORKS |
| if (find(dictionary.begin(),dictionary.end(),"of") != dictionary.end()) { |
| //FOUND! |
| } |
| |
| </code> |