Advertisement
Guest User

Untitled

a guest
Aug 26th, 2017
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.72 KB | None | 0 0
  1. 8.Debugger
  2.  
  3. Teraz będzie o jednym z najważniejszym narzędziu programistycznym. Zaraz za googlem :)
  4. Debugger, to jest narzędzie dzięki któremu, możemy śledzić wykonywanie aplikacji krok po kroku.
  5.  
  6. Już pokazuje przykład. Mamy taki o to kod (będzie w nim użycie smart pointerów z poprzedniej lekcji)
  7.  
  8. #include <iostream>
  9. #include <memory>
  10.  
  11. using namespace std;
  12.  
  13. class Application
  14. {
  15. public:
  16. int number;
  17. Application(int number)
  18. {
  19. cout << "Constructing Application.\n";
  20. number = number;
  21. }
  22.  
  23. bool IsNumberBiggerThan(int number)
  24. {
  25. return number > number;
  26. }
  27. };
  28.  
  29. int main()
  30. {
  31. auto app = make_unique<Application>(4); // Hej to auto to cos nowego! Zamiast pisac typ, napisalem kompilatorowi by sam sie domyslil jaki to jest typ. Wiecej o tym wkrotce
  32.  
  33. if (app->IsNumberBiggerThan(2))
  34. {
  35. cout << "Number in App is bigger!\n";
  36. }
  37. else
  38. {
  39. cout << "Number in App is lower!\n";
  40. }
  41. return 0;
  42. }
  43.  
  44. Teraz chcemy zobaczyć jaka jest wartość liczby w środku klasy Application przy ifie. (Założmy, ze nie wiemy)
  45. Po lewej stronie (czerwona kropka), musisz zaznaczyć gdzie chcesz by debugger sie zatrzymał. Ta czerwona kropka nazywa się "breakpoint" {{pierwszy}}
  46.  
  47. Ok, jeżeli jest już wszystko ustawione, czas sprawdzić jak to działa. Wchodzimy w Debug => Start/Continue. Konsola, powinna się pojawić na ekranie, ale pusty (bez żadnych napisów). Na breakpoincie powinna pojawić się strzałka. Strzałka informuje która linijka kodu zostanie następnie wykonana.
  48. Teraz jak debugger obslugiwać: {{obrazek2}}
  49.  
  50. - Next Line --> w tej samej funkcji idzie po prostu i linie dalej.
  51. - Step Into --> jezeli strzałka jest na jakieś funkcji to możemy w nią "wejść". Wyjątkiem są funkcje do których nie mamy dostępu, bo nigdy do implementacji danej funkcji nie dotrzemy np. nie możemy debuggowac std::string (*). A nawet więcej. Nie powinniśmy debugować standardowej bibloteki. Możesz ślepo założyć ze ona działa. Tak samo jeżeli bedziesz korzystał z innych biblotek. W 99% nie ma sensu ich debugować
  52. - Step Out --> Powiedzmy, że jesteśmy już w jakieś funkcji, ale widzimy w połowie, że w sumie nie chcemy już tu być. Można użyć tej funkcji, albo utworzyć kolejnego breakpointa
  53. - Next Instruction --> przechodzi do kolejnej instrukcji (np jeżeli w jednej linii masz kilka instrukcji)
  54. - Step Into Next Instruction --> Wchodzi do kolejnej instrukcji (to jest takie połączenie Step Into z Next Instruction)
  55. - Set next Statement --> Jak wiesz programy działaja od początku do końca, nie można w nich wracać. Ale dzięki tej funkcji możesz wrócić sie o ile chcesz instrukcji wstecz. Jest to bardzo fajna opcja, gdy chcemy debugować dana funkcje z róznymi parametrami. Pokaże na przykładzie
  56.  
  57. Jest jeszcze kilka bardzo przydatnych narzędzi. Głównie są to okna z informacjami.
  58. - Callstack --> Pokazuje co dotychczas zostało wywołane (nie w całym programie, ale w danym momencie by znaleźć się w danym breakpoincie). {{trzeci}}
  59. Callstack na samej górze ma funkcje które zostały wywołane jako ostatnie. Na screenie, pokazuje nam, że ostatnie zostało wywołane Application::IsNumberBiggerThan, przekazane argumenty to this (zawsze w klasach przy metodach jest przekazywany this, wiecej szczegółów o this później. Nie jest on ważny na początku). Drugim argumentem jest nasz number i dodatkowo widzimy z czym został wywołany. Druga linia informuje nas o tym, ze funkcja main wywoława Application::IsNumberBiggerThan.
  60. Callstack przydaje się, gdy wywala nam aplikacje i nie wiemy gdzie co i jak. Wtedy przeważnie dostajemy callstack jako informacje zwrotną. Dzięki temu, wiemy gdzie mniej więcej postawić breakpoint
  61. - Watch / Locals --> W roznych IDE ta nazwa się różni. Ale robi jedno. Pokazuje wartość obserwowanych / lokalnych zmiennych {{czwarty}}
  62. Ale zaraz zaraz, pokazuje nam tylko this i number, ale gdzie number obiektu Application? number który był przekazywany jako parametr przesłonił number naszej klasy (przypomnij sobie o zasiegu obiektów/zmiennych). Wiec znaleźliśmy buga w naszej aplikacji. Bo nasza funkcja w ogóle nie używa liczby z klasy!
  63. Żeby to naprawić można zrobic dwie rzeczy:
  64. 1) jezeli chcemy zostawić nazewnictwo. To musimy oznaczyc nasza liczbe (czy to co ma taką sama nazwe jak parametr) przedrostkiem this-> (this jest wskaznikiem dlatego strzalka by odwłować się do pól)
  65. 2) zmienimy nazwy zmiennych (albo w klasie, albo w parametrach)
  66. Ja zrobie 1) z drugim jestem pewien, że dasz sobie rade
  67. Wiec w locals wpisze this->number by zobaczyć jaka jest wartość naszej liczby {{piaty}} Wow, ale dziwna liczba. Ale dlaczego? Zastanów się i nałoż zmiane, jeżeli nie wiesz. To debugguj krok po kroku :)
  68. Dodatkowo, w locals możesz zmienic wartość obiektu wpisujac jej tam warość {{szosty}}
  69.  
  70. W Locals możesz wpisywać wyrażenia jak 2+2 czy nawet this->number + 23. Czy jakiekolwiek wyrażenie chcesz. Jeżeli jesteś w jakies klasie i chcesz zobaczyc dany stan klasy. Wpisz w locals *this. Będziesz mógł zobaczyc cały obiekt w locals (pojawi się plus po lewej stronie)
  71.  
  72.  
  73. I to by było tyle, jeżeli chodzi o debugger. Debugger ma jeszcze parę innych przydatnych opcji, ale o tym dużo później.
  74.  
  75. Zadanie.
  76.  
  77. 1) znajdz wszystkie bledy w programie, jezeli uruchomisz aplikacje, to wszystkie napisy powinny byc wyswietlone. Jezeli aplikacja kompiluje sie, ale sie nie uruchamia to jest to zadanie by ja naprawic:) Nie jest to proste zadanie!
  78. 2*) poczytaj sobie o przekazywanie przez wartosc i referencje https://4programmers.net/C/Przekazywanie_parametru_przez_warto%C5%9B%C4%87_i_referencj%C4%99 i popraw program
  79.  
  80. #include <iostream>
  81. #include <memory>
  82. #include <string>
  83. #include <numeric>
  84. #include <vector>
  85. #include <cmath>
  86.  
  87. using namespace std;
  88.  
  89. class PersonDetails
  90. {
  91. public:
  92. string name;
  93. string lastName;
  94. unsigned int age;
  95. };
  96.  
  97. class Person
  98. {
  99. public:
  100. PersonDetails personDetails;
  101. Person(PersonDetails personDetails)
  102. {
  103. this->personDetails = personDetails;
  104. }
  105. };
  106.  
  107. class StatisticsCalculator
  108. {
  109. public:
  110. vector<Person> people;
  111. StatisticsCalculator(vector<Person> people)
  112. {
  113. this->people = people;
  114. }
  115. int CalculateAverage()
  116. {
  117. int sum;
  118. for (auto person : people)
  119. {
  120. sum += person.personDetails.age;
  121. }
  122. return sum / people.size();
  123. }
  124. };
  125.  
  126. class Application
  127. {
  128. public:
  129. vector<Person> people;
  130. std::unique_ptr<StatisticsCalculator> statisticsCalculator;
  131. Application(int numberOfPeople)
  132. {
  133. people = GeneratePeople(numberOfPeople);
  134. statisticsCalculator = make_unique<StatisticsCalculator>(people);
  135. }
  136.  
  137. float CalculateAverage()
  138. {
  139. return statisticsCalculator->CalculateAverage();
  140. }
  141.  
  142. vector<Person> GeneratePeople(int numberOfPeople)
  143. {
  144. vector<Person> people;
  145. for (int index = 0; index > numberOfPeople; index++);
  146. {
  147. PersonDetails personDetails;
  148. personDetails.lastName = "Cage";
  149. personDetails.name = "John";
  150. personDetails.age = index;
  151. people.push_back(Person(personDetails));
  152. }
  153. return people;
  154. }
  155. };
  156.  
  157. int main()
  158. {
  159. auto app = make_unique<Application>(4);
  160. auto number = app->CalculateAverage();
  161.  
  162. PersonDetails expectedPersonDetails;
  163. expectedPersonDetails.age = 11;
  164. expectedPersonDetails.lastName = "Stronghold";
  165. expectedPersonDetails.name = "Arnold"
  166. Person expectedPerson(expectedPersonDetails);
  167.  
  168. expectedPerson()
  169.  
  170. if (abs(number - 1.5) < 0.001)
  171. {
  172. cout << "Teraz poprawnie liczy sume";
  173. }
  174.  
  175. return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement