1 00:00:00,000 --> 00:00:10,970 >> [Odtwarzanie muzyki] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: W porządku. 3 00:00:12,536 --> 00:00:13,392 >> [Śmiech] 4 00:00:13,392 --> 00:00:14,240 >> Witamy z powrotem. 5 00:00:14,240 --> 00:00:14,990 To CS50. 6 00:00:14,990 --> 00:00:16,890 I to koniec tygodnia pięć. 7 00:00:16,890 --> 00:00:20,020 I do tej pory, mamy dość dużo brał za pewnik, że istnieje 8 00:00:20,020 --> 00:00:23,480 istnieje, to kompilator, dzyń, że już zostało wywołanie drodze tego 9 00:00:23,480 --> 00:00:27,100 inne narzędzie o nazwie Marka, że ​​w jakiś sposób magicznie konwertuje kod źródłowy 10 00:00:27,100 --> 00:00:31,350 do kodu wynikowego, z zer i jedynek że procesor komputery, centralny 11 00:00:31,350 --> 00:00:33,410 procesor, rzeczywiście rozumie. 12 00:00:33,410 --> 00:00:36,770 Ale okazuje się, że jest to numer, który znajduje się dzieje się pod maską w 13 00:00:36,770 --> 00:00:38,690 pomiędzy wejściem a wyjściem. 14 00:00:38,690 --> 00:00:41,800 >> I chciałbym zaproponować, że ciało że w nieco bardziej szczegółowo w 15 00:00:41,800 --> 00:00:45,130 te cztery kroki, mają coś, co nazywa wstępne przetwarzanie, coś 16 00:00:45,130 --> 00:00:48,300 nazywa kompilacji, które widzieliśmy, coś takiego montażu i 17 00:00:48,300 --> 00:00:49,420 coś takiego powiązania. 18 00:00:49,420 --> 00:00:53,270 Tak, aż do teraz, w niektórych naszych programy, mieliśmy ostre obejmuje. 19 00:00:53,270 --> 00:00:56,650 Niedawno mieliśmy niektóre ostre określa na stałe. 20 00:00:56,650 --> 00:01:00,660 Tak więc okazuje się, że te rzeczy, które są poprzedzone symbolem lub mieszania 21 00:01:00,660 --> 00:01:04,150 symbol funta są pre-processor dyrektyw. 22 00:01:04,150 --> 00:01:07,960 To tylko fantazyjny sposób na powiedzenie, że to linii kodu, które rzeczywiście 23 00:01:07,960 --> 00:01:12,280 przekształcone w coś innego przed komputer nawet próbować konwertować 24 00:01:12,280 --> 00:01:13,800 Program do zer i jedynek. 25 00:01:13,800 --> 00:01:19,000 >> Na przykład, ostre zawiera normę I / O. H, prawie oznacza tylko przejść 26 00:01:19,000 --> 00:01:24,010 naprzód, złapać zawartość plików stdio.h i wkleić je tam. 27 00:01:24,010 --> 00:01:25,880 Więc nie ma zer i jedynek w tym momencie jeszcze. 28 00:01:25,880 --> 00:01:27,470 To naprawdę tylko na zmianę. 29 00:01:27,470 --> 00:01:30,790 I że jest wykonane w tak zwanych wstępne przetwarzanie scena, kiedy 30 00:01:30,790 --> 00:01:34,230 faktycznie uruchomić brzękiem lub specjalnie Marka w większości przypadków. 31 00:01:34,230 --> 00:01:36,950 Więc to wszystko dzieje się Najpierw automatycznie do tej pory. 32 00:01:36,950 --> 00:01:38,800 >> Potem przychodzi etap kompilacji. 33 00:01:38,800 --> 00:01:40,920 Ale byliśmy zbyt uproszczony kompilacja. 34 00:01:40,920 --> 00:01:45,060 Kompilacja programu naprawdę znaczy wziąć z czegoś jak C, 35 00:01:45,060 --> 00:01:48,430 Kod źródłowy, który został nam pisanie, na dół na coś takiego zespołu. 36 00:01:48,430 --> 00:01:52,900 Asembler jest niższy poziom język, który, na szczęście, nie będziemy 37 00:01:52,900 --> 00:01:55,480 mają wiele okazji, aby napisz w tym semestrze. 38 00:01:55,480 --> 00:01:59,100 Ale to jest na najniższym poziomie w Poczucie, że dosłownie zacząć pisać 39 00:01:59,100 --> 00:02:04,270 dodawać i odejmować i mnożyć i załadować z pamięci i zapisać w pamięci, 40 00:02:04,270 --> 00:02:08,259 bardzo podstawowe instrukcje, które komputer, pod maską, 41 00:02:08,259 --> 00:02:09,639 rzeczywiście rozumie. 42 00:02:09,639 --> 00:02:14,930 >> Wreszcie, montaż zatrzymuje język z zer i jedynek, że byli 43 00:02:14,930 --> 00:02:16,190 opisywaniu tej pory. 44 00:02:16,190 --> 00:02:19,270 I rzeczywiście Wreszcie, jest tak zwany łączenie fazy, które my będziemy 45 00:02:19,270 --> 00:02:22,360 zobacz za chwilę, która łączy Twoje zer i jedynek z zer i 46 00:02:22,360 --> 00:02:24,870 te inne osoby przed stworzyłeś. 47 00:02:24,870 --> 00:02:26,660 >> Tak uważają tego super prosty program. 48 00:02:26,660 --> 00:02:27,560 To było od 1 tygodnia. 49 00:02:27,560 --> 00:02:29,610 To po prostu powiedział: Hello World, na ekranie. 50 00:02:29,610 --> 00:02:30,920 Pobiegliśmy to przez Clang. 51 00:02:30,920 --> 00:02:33,200 Albo zabrakło go przez Marka który prowadził brzękiem. 52 00:02:33,200 --> 00:02:36,170 I wyprowadzany w czasie, w którym kilka zer i jedynek. 53 00:02:36,170 --> 00:02:38,100 Ale okazuje się, że jest etap pośredni. 54 00:02:38,100 --> 00:02:40,460 Jeśli pójdę tutaj - oops, nie Chcę go zobaczyć jeszcze. 55 00:02:40,460 --> 00:02:44,800 Jeśli pójdę tutaj do mojego urządzenia i otworzyć hello.c, tutaj 56 00:02:44,800 --> 00:02:46,160 jest to, że sam program. 57 00:02:46,160 --> 00:02:48,600 I to, co mam zamiar zrobić w moim terminalu Okno jest tu będę 58 00:02:48,600 --> 00:02:51,430 uruchomić dzyń niż Marka, który automatyzuje wszystkie cztery 59 00:02:51,430 --> 00:02:52,870 te kroki za nami. 60 00:02:52,870 --> 00:02:58,620 A ja zamierzam zrobić clang-S i następnie hello.c a następnie wprowadzić. 61 00:02:58,620 --> 00:03:00,590 >> I mam miga prompt ponownie, co jest dobre. 62 00:03:00,590 --> 00:03:05,280 A teraz w nieco większym oknie Zamierzam otworzyć gedit tutaj. 63 00:03:05,280 --> 00:03:09,610 I mam zamiar otworzyć plik, który, okazuje, jest nazywany hello.s tego 64 00:03:09,610 --> 00:03:11,870 to zawiera asemblera I, o którym mowa wcześniej. 65 00:03:11,870 --> 00:03:15,060 I to jest to, co nazywa się zespół język, dość niski poziom 66 00:03:15,060 --> 00:03:18,470 instrukcje, że procesor Intel czy cokolwiek to jest, że jest w środku 67 00:03:18,470 --> 00:03:19,350 rozumie. 68 00:03:19,350 --> 00:03:24,480 A mov jest dla ruchu. Połączenie jest dla dzwoni, bardzo niski poziom funkcji. 69 00:03:24,480 --> 00:03:26,380 sub jest na odejmowanie. 70 00:03:26,380 --> 00:03:30,370 >> Więc jeśli masz konkretny procesor wewnątrz z komputera, co czyni go 71 00:03:30,370 --> 00:03:34,300 odrębne, w porównaniu z innych procesorów na rynku, to jest co instrukcje 72 00:03:34,300 --> 00:03:39,460 rozumie i często, jak skuteczne jest jest, jak szybko to jest w realizacji niektórych 73 00:03:39,460 --> 00:03:40,380 z tych instrukcji. 74 00:03:40,380 --> 00:03:45,150 Teraz więcej na ten temat, możesz wziąć następny CS61 Spadek na uczelni. 75 00:03:45,150 --> 00:03:48,170 Ale tutaj mamy, na przykład, kilka identyfikatory, które może wyglądać znajomo. 76 00:03:48,170 --> 00:03:50,150 hello.c jest nazwa programu. 77 00:03:50,150 --> 00:03:51,070 >> . Tekst - 78 00:03:51,070 --> 00:03:54,190 nie ma zbyt wiele zainteresowania nie właśnie teraz przypomnieć, że tekst 79 00:03:54,190 --> 00:03:59,190 segmentu, od poniedziałku, gdzie w pamięci program rzeczywiście kończy się. 80 00:03:59,190 --> 00:04:01,330 Tak to przynajmniej niejasno znajomy tam. 81 00:04:01,330 --> 00:04:03,730 Tutaj, oczywiście, jest wzmianka naszej głównej funkcji. 82 00:04:03,730 --> 00:04:07,220 Przewijanie w dół, te odnoszą się do rzeczy zwane rejestry, bardzo małe kawałki 83 00:04:07,220 --> 00:04:09,190 wewnątrz pamięci rzeczywistego procesora. 84 00:04:09,190 --> 00:04:12,930 A jeśli nawet przewijać dalej, widzę jakiś 85 00:04:12,930 --> 00:04:14,240 pośrednie wzmianki o ASCII. 86 00:04:14,240 --> 00:04:17,120 I rzeczywiście, jest to, że ciąg, hello, przecinek, świat. 87 00:04:17,120 --> 00:04:20,079 >> Więc krótko mówiąc, to było dzieje się dla ciebie, automatycznie, 88 00:04:20,079 --> 00:04:22,140 pod maską wszystkie tego czasu. 89 00:04:22,140 --> 00:04:26,450 A co się dzieje, jest naprawdę raz już uruchomić dzyń, lub w drodze 90 00:04:26,450 --> 00:04:29,150 Sprawdź, czego możesz się po pierwsze, z kodu źródłowego, 91 00:04:29,150 --> 00:04:30,700 tzw. asemblerze. 92 00:04:30,700 --> 00:04:35,210 Następnie Szczęk jest przekształcenie tego zespołu język w dół do zer i jedynek. 93 00:04:35,210 --> 00:04:38,340 A to, że rozpoczęliśmy slide Nasza dyskusja w tygodniu 0 na - 94 00:04:38,340 --> 00:04:39,840 a następnie Tydzień 1 na. 95 00:04:39,840 --> 00:04:44,030 I w końcu, te zera i jedynki łączy się z zer i jedynek 96 00:04:44,030 --> 00:04:47,190 z tych bibliotek byliśmy biorąc za pewnik, jak Standardowe we / wy lub 97 00:04:47,190 --> 00:04:50,010 Biblioteka String lub nawet CS50 biblioteki. 98 00:04:50,010 --> 00:04:54,200 >> Więc namalować ten obraz bardziej wizualnie, mamy hello.c. 99 00:04:54,200 --> 00:04:57,220 I to, oczywiście, używa printf funkcjonować powiedzieć, hello world. 100 00:04:57,220 --> 00:05:01,810 Krok kompilacja zabiera go w dół, aby że plik po prostu zobaczył hello.s, nawet 101 00:05:01,810 --> 00:05:04,290 choć to zazwyczaj usunięta automatycznie. 102 00:05:04,290 --> 00:05:06,050 Ale to jest kod montaż W środkowym punkcie. 103 00:05:06,050 --> 00:05:09,750 A potem, kiedy montujemy zespół język, że tak powiem, to kiedy 104 00:05:09,750 --> 00:05:10,830 się tych zer i jedynek. 105 00:05:10,830 --> 00:05:13,920 Więc mamy powiększony skutecznie dzisiaj na co byliśmy biorąc za pewnik, 106 00:05:13,920 --> 00:05:16,430 Oznacza to, będzie kod źródłowy do obiektu kodu. 107 00:05:16,430 --> 00:05:18,850 >> Ale w końcu, że teraz sam obraz - niech wpakować go do 108 00:05:18,850 --> 00:05:20,020 lewej stronie. 109 00:05:20,020 --> 00:05:22,880 I pamiętać, że tam w górze Wspomniałem stdio.h. 110 00:05:22,880 --> 00:05:25,030 To jest plik, które zostały dołączone w prawie wszystkich 111 00:05:25,030 --> 00:05:26,250 programy pisaliśmy. 112 00:05:26,250 --> 00:05:28,830 I to jest plik, którego zawartość uzyskać kopię wklejone, 113 00:05:28,830 --> 00:05:30,350 skutecznie szczycie kodzie. 114 00:05:30,350 --> 00:05:34,170 Ale okazuje się, że na komputerze System gdzieś, jest przypuszczalnie 115 00:05:34,170 --> 00:05:39,150 stdio.c plik, że ktoś napisał rok temu, że realizuje wszystkie 116 00:05:39,150 --> 00:05:41,870 Funkcje, które zostały zadeklarowane w stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Teraz w rzeczywistości to chyba nie on Twój komputer Mac lub PC, a nawet w 118 00:05:45,465 --> 00:05:47,660 CS50 Urządzenie jest surowy kod C. 119 00:05:47,660 --> 00:05:52,710 Ktoś już skompilowany i zawarte . O pliku do kodu wynikowego lub. 120 00:05:52,710 --> 00:05:56,020 pliku, który odnosi się do wspólnej biblioteki , które zostało fabrycznie zainstalowane i 121 00:05:56,020 --> 00:05:57,240 wstępnie skompilowane dla Ciebie. 122 00:05:57,240 --> 00:06:01,950 Ale załóżmy, że rzeczywiście istnieje na naszej stdio.c komputera w równolegle 123 00:06:01,950 --> 00:06:02,650 z Clang. 124 00:06:02,650 --> 00:06:04,960 Twój kod jest opracowywana i zmontowane. 125 00:06:04,960 --> 00:06:09,200 Kod stdio.c 's jest skompilowany i zmontowane, tak, że ten bardzo ostatnio 126 00:06:09,200 --> 00:06:13,730 krok, tu na dole, musimy w jakiś sposób Informacje, że tak powiem, twoje zer i jedynek 127 00:06:13,730 --> 00:06:18,430 z jego lub jej zer i jedynek do jednego Prosty program, który ostatecznie jest 128 00:06:18,430 --> 00:06:20,540 nazywa właśnie Hello. 129 00:06:20,540 --> 00:06:23,340 >> Więc to wszystko magii, która jest dzieje się tak daleko. 130 00:06:23,340 --> 00:06:26,430 I będzie kontynuować te procesy za przyznane, ale uświadomić sobie, 131 00:06:26,430 --> 00:06:28,750 jest dużo soczystych szczegółów dzieje pod spodem. 132 00:06:28,750 --> 00:06:31,920 I to jest to, co sprawia, że ​​Twój Komputer z procesorem Intel wewnątrz 133 00:06:31,920 --> 00:06:33,940 szczególnie wyraźne. 134 00:06:33,940 --> 00:06:37,020 >> Więc o tym pamiętać, jeśli chcesz Dołącz do nas na obiad w piątek, idź 135 00:06:37,020 --> 00:06:41,570 do zwykłego cs50.net/rsvp miejsce, 13:15 w piątek. 136 00:06:41,570 --> 00:06:43,400 A teraz kilka ogłoszeń. 137 00:06:43,400 --> 00:06:44,670 Tak więc mamy dobre wieści. 138 00:06:44,670 --> 00:06:45,970 I mamy złe wieści. 139 00:06:45,970 --> 00:06:47,260 Początek dobrych wiadomości tutaj. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Jęczy] 142 00:06:54,510 --> 00:06:54,710 >> Dobrze. 143 00:06:54,710 --> 00:06:56,670 Cóż, to technicznie wakacje, więc to nie jest tak dużo prezent od nas. 144 00:06:56,670 --> 00:06:58,030 Ale złe wieści oczywiście. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Jęczy] 147 00:07:01,880 --> 00:07:03,530 >> Spędziłem dużo czasu na tych animacji. 148 00:07:03,530 --> 00:07:04,690 >> [Śmiech] 149 00:07:04,690 --> 00:07:07,000 >> Nie będzie sesji recenzja to przychodzi w poniedziałek. 150 00:07:07,000 --> 00:07:08,340 To będzie o 17:30. 151 00:07:08,340 --> 00:07:11,210 Będziemy pamiętać o wszystkich tych szczegółów za pośrednictwem poczty elektronicznej na przebieg tych 152 00:07:11,210 --> 00:07:13,470 strona w zaledwie kilka dni czasu. 153 00:07:13,470 --> 00:07:16,610 To będzie filmowane i udostępniane wkrótce potem. 154 00:07:16,610 --> 00:07:19,200 Więc jeśli nie możesz zrobić, że poniedziałek Gniazdo noc, nie martw się. 155 00:07:19,200 --> 00:07:22,270 Sekcje w nadchodzącym tygodniu będzie również skupić się na przegląd do quizu. 156 00:07:22,270 --> 00:07:25,670 Jeśli sekcja jest w poniedziałek, który jest rzeczywiście uniwersytet wakacje, będziemy 157 00:07:25,670 --> 00:07:26,920 nadal spotykają się w punkcie. 158 00:07:26,920 --> 00:07:28,890 Jeśli po prostu nie może zrobić, że Sekcja bo idziesz 159 00:07:28,890 --> 00:07:29,860 stąd, że jest w porządku. 160 00:07:29,860 --> 00:07:33,710 Weź udział w niedzielę lub odcinek wtorek lub dostrojony do sekcji Jasona, który jest 161 00:07:33,710 --> 00:07:35,110 dostępny online. 162 00:07:35,110 --> 00:07:37,490 >> Tak, więcej złych wiadomości. 163 00:07:37,490 --> 00:07:41,960 Tak więc, zgodnie z programem szkolenia, mamy wykład w następny piątek. 164 00:07:41,960 --> 00:07:43,690 Ale dobra wiadomość - 165 00:07:43,690 --> 00:07:44,860 wyraźnie, spędziłem zbyt wiele czasu na to. 166 00:07:44,860 --> 00:07:45,280 >> [Śmiech] 167 00:07:45,280 --> 00:07:47,140 >> Będziemy anulować obok wykładów piątkowych. 168 00:07:47,140 --> 00:07:50,590 Tak, że będzie darem dla nas, więc może naprawdę mieć miły odpoczynek w 169 00:07:50,590 --> 00:07:52,990 między tym tydzień i dwa tygodnie stąd. 170 00:07:52,990 --> 00:07:57,460 Więc nie ma zajęcia w przyszłym tygodniu, tylko małe mały quiz, w którym powinno być 171 00:07:57,460 --> 00:07:59,030 coraz bardziej podekscytowany. 172 00:07:59,030 --> 00:08:03,870 >> Więc teraz zwrócić uwagę na coś, co jest w istocie bardziej wizualne 173 00:08:03,870 --> 00:08:06,990 i bardziej ekscytujące i ustawić scenę za to, co dzieje się na horyzoncie 174 00:08:06,990 --> 00:08:08,420 w ciągu zaledwie kilku tygodni. 175 00:08:08,420 --> 00:08:12,160 Po pierwszym quizie, skręcimy skupić nasze zestawy zadań do drugiego 176 00:08:12,160 --> 00:08:16,710 domeny na konkretny problem, który z kryminalistyki i bezpieczeństwa ogólnie. 177 00:08:16,710 --> 00:08:19,550 >> W rzeczywistości, tradycja z tym problemem zestaw jest dla mnie jednym z 178 00:08:19,550 --> 00:08:24,850 ucząc kolegów lub CAS przejść przez campus biorąc jakieś zdjęcia 179 00:08:24,850 --> 00:08:29,450 do zidentyfikowania, ale nie oczywiste ludzie, miejsca lub rzeczy, to co roku I 180 00:08:29,450 --> 00:08:34,520 jakoś przypadkowo usunąć lub uszkodzenie karty pamięci cyfrowej 181 00:08:34,520 --> 00:08:35,720 , że jest w środku naszego aparatu. 182 00:08:35,720 --> 00:08:36,860 Ale nic wielkiego. 183 00:08:36,860 --> 00:08:39,200 Mogę śmiało podłączyć że do mojego komputera. 184 00:08:39,200 --> 00:08:43,010 Mogę zrobić kryminalistycznych obraz, więc mówić, kopiując zer i 185 00:08:43,010 --> 00:08:46,830 te, z dala od tej karty pamięci, czy to jego karty SD lub Compact Flash Card lub 186 00:08:46,830 --> 00:08:48,100 co znasz. 187 00:08:48,100 --> 00:08:49,300 A potem możemy przekazać, że się. 188 00:08:49,300 --> 00:08:53,190 >> A więc wyzwanie przed siebie, między innymi rzeczy dla ciebie, będzie pisać 189 00:08:53,190 --> 00:08:58,630 Kod C, który odzyskuje całą masę JPEG dla mnie i będzie objawione 190 00:08:58,630 --> 00:09:00,190 te osoby, miejsca lub rzeczy. 191 00:09:00,190 --> 00:09:03,340 I będziemy także mówić w tym problemu ustawić w najbliższych dniach, o 192 00:09:03,340 --> 00:09:04,440 grafika ogólnie. 193 00:09:04,440 --> 00:09:06,140 Użyliśmy ich, kurs, dla wyrwać. 194 00:09:06,140 --> 00:09:09,080 Ale już jakby za pewnik istnieje te wysokie pojęcia poziomu 195 00:09:09,080 --> 00:09:10,680 prostokątów i owali. 196 00:09:10,680 --> 00:09:12,450 Ale pod maską istnieje pikseli. 197 00:09:12,450 --> 00:09:14,370 I trzeba było zacząć myśląc o nich. 198 00:09:14,370 --> 00:09:18,800 Albo będziesz dla p-set 4 myśleć o różnicy między swoimi cegieł, jak 199 00:09:18,800 --> 00:09:21,990 skoro jesteś piłka porusza się w poprzek Ekran wyrwać. 200 00:09:21,990 --> 00:09:24,830 Więc nie jest to pojęcie kropki na ekranie, który jest 201 00:09:24,830 --> 00:09:26,290 wchodzą w grę już. 202 00:09:26,290 --> 00:09:29,430 >> Teraz to, co widzisz, jest jednak to, co pojawi się na ekranie komputera. 203 00:09:29,430 --> 00:09:33,680 Jeśli kiedykolwiek oglądał jakiś dobry lub bad TV, kursy są one dość dużo 204 00:09:33,680 --> 00:09:36,280 traktować widzów jak technophobes którzy tak naprawdę nie 205 00:09:36,280 --> 00:09:37,630 wiem dużo o komputerowym. 206 00:09:37,630 --> 00:09:40,840 A więc jest to bardzo łatwe do policji Detektyw powiedzieć, prawda 207 00:09:40,840 --> 00:09:41,710 czyste, że się na mnie? 208 00:09:41,710 --> 00:09:42,710 Lub poprawić, prawda? 209 00:09:42,710 --> 00:09:45,550 Poprawa jest jak buzz słowa w Najbardziej żadnego przestępstwa związane show. 210 00:09:45,550 --> 00:09:49,240 A rzeczywistość jest, jeśli wziąć bardzo rozmazany obraz podejrzanego robi 211 00:09:49,240 --> 00:09:51,620 coś złego, nie można tylko jej ulepszenie. 212 00:09:51,620 --> 00:09:53,080 Nie można powiększać w nieskończoność. 213 00:09:53,080 --> 00:09:56,350 Nie możesz zobaczyć w czyjeś błysk eye, który popełnił, że 214 00:09:56,350 --> 00:09:59,860 szczególności przestępczości, pomimo Częstość występowania w telewizji. 215 00:09:59,860 --> 00:10:04,110 >> I tak z tym niech motywować, że Nadchodzący problemu ustawić z spojrzenie na 216 00:10:04,110 --> 00:10:05,765 niektóre pokazy, z którym może być znajomy. 217 00:10:05,765 --> 00:10:06,500 >> [PLAYBACK VIDEO] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Teraz zajmijmy się przyjrzeć Ciebie. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Czekaj. 222 00:10:17,766 --> 00:10:18,658 Uruchom to z powrotem. 223 00:10:18,658 --> 00:10:19,550 >> -Czekaj. 224 00:10:19,550 --> 00:10:21,580 Idź w prawo. 225 00:10:21,580 --> 00:10:21,800 >> -Nie. 226 00:10:21,800 --> 00:10:22,690 Zatrzymaj to. 227 00:10:22,690 --> 00:10:23,692 >> -Pełny ekran. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Zatrzymaj to. 230 00:10:24,154 --> 00:10:25,140 >> Dokręcić się on, że będzie dobrze? 231 00:10:25,140 --> 00:10:27,090 >> -Grafika w sprawie tego faceta przez tylne koła. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom w tu, na tym miejscu. 233 00:10:29,730 --> 00:10:33,700 >> -Z odpowiednim wyposażeniem, obrazami mogą być powiększone i wyostrzone. 234 00:10:33,700 --> 00:10:34,490 >> -Co to jest? 235 00:10:34,490 --> 00:10:35,870 >> -To programu poprawy. 236 00:10:35,870 --> 00:10:36,793 >> -Czy możesz wyjaśnić, że się każdy? 237 00:10:36,793 --> 00:10:38,560 >> -Nie wiem. 238 00:10:38,560 --> 00:10:39,090 Niech jej ulepszenie. 239 00:10:39,090 --> 00:10:41,690 >> -Zwiększenie punkt-6. 240 00:10:41,690 --> 00:10:43,510 >> -I zwiększa szczegółów i - 241 00:10:43,510 --> 00:10:44,456 >> -Myślę, że to wystarczy, aby zwiększyć. 242 00:10:44,456 --> 00:10:45,402 Zwolnić go do mojego ekranu. 243 00:10:45,402 --> 00:10:47,300 >> -Zwiększenie odbicie w jej oku. 244 00:10:47,300 --> 00:10:49,330 >> -No to uruchomić to przez wzmocnienie video. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar można poprawić to? 246 00:10:50,340 --> 00:10:52,320 >> -Trzymaj się. 247 00:10:52,320 --> 00:10:54,290 >> -I've pracuje nad tym refleksji. 248 00:10:54,290 --> 00:10:55,560 >> -Ktoś refleksji. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Jest odbiciem z twarzy mężczyzny. 251 00:10:57,940 --> 00:10:58,860 >> -Odbicie. 252 00:10:58,860 --> 00:10:59,710 >> -Nie ma refleksji. 253 00:10:59,710 --> 00:11:00,900 >> -Zbliżenie na lustrze. 254 00:11:00,900 --> 00:11:03,500 >> -Można zobaczyć odbicie. 255 00:11:03,500 --> 00:11:04,700 >> -Czy można poprawić wizerunek od tego? 256 00:11:04,700 --> 00:11:05,700 >> -Czy można zwiększyć go tutaj? 257 00:11:05,700 --> 00:11:06,500 >> -Czy możesz poprawić go? 258 00:11:06,500 --> 00:11:07,380 >> -Czy możesz poprawić go? 259 00:11:07,380 --> 00:11:08,190 >> -Czy możemy poprawić to? 260 00:11:08,190 --> 00:11:08,940 >> -Czy możesz poprawić go? 261 00:11:08,940 --> 00:11:10,280 >> -Chwileczkę, ja poprawić. 262 00:11:10,280 --> 00:11:11,570 >> -Zbliżenie na drzwi. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Śmiech] 266 00:11:13,197 --> 00:11:14,360 >> -Przesuń w. 267 00:11:14,360 --> 00:11:15,100 >> -Czekaj, stop. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Zatrzymaj go. 270 00:11:16,290 --> 00:11:19,390 >> -Obrócić 75 stopni wokół pionowe proszę. 271 00:11:19,390 --> 00:11:19,886 >> [Śmiech] 272 00:11:19,886 --> 00:11:24,350 >> -Przestań, a powrotem do strony o drzwi. 273 00:11:24,350 --> 00:11:26,330 >> -Masz wzmacniacz obrazu które mogą bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Może używamy Pradeep Sen Sposób, aby zobaczyć w oknach. 275 00:11:28,990 --> 00:11:30,680 >> -To oprogramowanie jest w stanie techniki. 276 00:11:30,680 --> 00:11:31,676 >> -Wartość ikona jest off. 277 00:11:31,676 --> 00:11:34,166 >> -Przy odpowiednim połączeniu algorytmów. 278 00:11:34,166 --> 00:11:38,399 >> -Zabrał algorytmów oświetlenia do Następny poziom i można ich używać do 279 00:11:38,399 --> 00:11:38,648 zwiększenia zdjecia. 280 00:11:38,648 --> 00:11:42,050 >> -Lock i powiększyć osi z. 281 00:11:42,050 --> 00:11:42,760 >> -Enhance. 282 00:11:42,760 --> 00:11:43,060 >> -Enhance. 283 00:11:43,060 --> 00:11:43,760 >> -Enhance. 284 00:11:43,760 --> 00:11:45,010 >> Zamarzaniu i wzmocnienia. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END PLAYBACK VIDEO] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: Tak Zestaw Problem 5 jest to, co nas czeka tam. 288 00:11:51,470 --> 00:11:55,260 Więc niedługo lepiej zrozumieć kiedy i dlaczego można 289 00:11:55,260 --> 00:11:57,300 i nasz nie może zwiększyć w ten sposób. 290 00:11:57,300 --> 00:12:00,090 Ale najpierw niech zwróci naszą uwagę do niektórych bloków WE'LL 291 00:12:00,090 --> 00:12:02,250 muszą być w stanie powiedzieć, że historia. 292 00:12:02,250 --> 00:12:05,580 >> Więc przypominam, że zwrócił ten obraz na Poniedziałek i trochę w zeszłym tygodniu. 293 00:12:05,580 --> 00:12:09,970 I to opisuje układ rzeczy w pamięci komputera, gdy 294 00:12:09,970 --> 00:12:11,000 uruchomiony jakiś program. 295 00:12:11,000 --> 00:12:14,310 Tech segmentu up góry, przypomnijmy, dotyczy do rzeczywistych zer i jedynek 296 00:12:14,310 --> 00:12:16,000 , które tworzą program. 297 00:12:16,000 --> 00:12:19,340 Tam, poniżej, że niektóre zainicjowany lub niezainicjalizowane danych, które zazwyczaj 298 00:12:19,340 --> 00:12:22,910 odnosi się do rzeczy, takich jak stałe lub łańcuchy lub zmienne globalne, które mają 299 00:12:22,910 --> 00:12:24,200 zostały zgłoszone wcześniej. 300 00:12:24,200 --> 00:12:26,500 Jest kupa, ale wrócimy powrót do tego za chwilę. 301 00:12:26,500 --> 00:12:27,410 >> A wtedy nie stos. 302 00:12:27,410 --> 00:12:30,660 Podobnie jak stos tac w kawiarnia, to jest, gdy pamięć ma 303 00:12:30,660 --> 00:12:33,610 warstwami i warstwami, gdy robisz to, co w programie? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Co to jest stos wykorzystanie do? 306 00:12:37,730 --> 00:12:39,320 >> Tak? 307 00:12:39,320 --> 00:12:40,000 >> Wywołanie funkcji. 308 00:12:40,000 --> 00:12:42,890 Za każdym razem, wywołania funkcji, to uwagę na taśmy pamięci dla jego 309 00:12:42,890 --> 00:12:45,020 zmienne lokalne lub jego parametry. 310 00:12:45,020 --> 00:12:48,810 I obrazowo, widzimy, że z każdym kolejna funkcja nazywa, kiedy 311 00:12:48,810 --> 00:12:52,520 Połączenia Połączenia B C zwraca d, że się warstw na stosie. 312 00:12:52,520 --> 00:12:55,630 I w każdym z tych plasterków pamięć jest w istocie wyjątkowy zakres 313 00:12:55,630 --> 00:12:58,590 dla tej funkcji, która, oczywiście, jest problematyczne, jeśli chcesz oddać 314 00:12:58,590 --> 00:13:01,850 z jednej funkcji do drugiej kawałek danych, które chcesz go 315 00:13:01,850 --> 00:13:03,500 mutować lub zmienić. 316 00:13:03,500 --> 00:13:08,060 >> Tak więc to, co było nasze rozwiązanie umożliwiające Funkcja reprezentowana przez jednego stosu 317 00:13:08,060 --> 00:13:11,390 ramkę z pamięci wewnętrznej innej ramki stosu? 318 00:13:11,390 --> 00:13:14,590 Jak te dwa ze sobą rozmawiać? 319 00:13:14,590 --> 00:13:18,510 Więc w drodze wskazówek i adresów, która, ponownie, gdy tylko opisują w 320 00:13:18,510 --> 00:13:22,280 pamięci, by sposób szczególny liczba gryźć, zwłaszcza 321 00:13:22,280 --> 00:13:23,830 Wartość można znaleźć. 322 00:13:23,830 --> 00:13:26,860 Więc pamiętam ostatni raz zbyt kontynuowaliśmy historię i spojrzał na 323 00:13:26,860 --> 00:13:28,280 dość buggy programu. 324 00:13:28,280 --> 00:13:32,900 A ten program ma błędy na kilka powodów, ale najbardziej niepokojące jeden jest 325 00:13:32,900 --> 00:13:34,620 ponieważ nie sprawdzić, co? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Tak, to nie sprawdzić wejście. 328 00:13:40,450 --> 00:13:41,870 Sorry? 329 00:13:41,870 --> 00:13:43,880 >> Jeśli jest więcej niż 12 znaków. 330 00:13:43,880 --> 00:13:47,260 Tak bardzo elegancko, gdy dzwoni memcopy, , które, jak sama nazwa wskazuje, tylko 331 00:13:47,260 --> 00:13:50,630 kopie pamięci z drugiego argumentu na pierwszy argument. 332 00:13:50,630 --> 00:13:54,730 Trzeci argument, bardzo elegancko, jest sprawdzane, aby upewnić się, że nie 333 00:13:54,730 --> 00:13:59,400 skopiować więcej niż w tym przypadku, długość z barem, liczba znaków, 334 00:13:59,400 --> 00:14:03,810 do miejsca przeznaczenia, które ma ten Tablica C. Ale problemem jest to, że to, co 335 00:14:03,810 --> 00:14:07,230 jeśli C sama w sobie nie jest na tyle duże, do obsługi tego? 336 00:14:07,230 --> 00:14:09,900 Masz zamiar skopiować numer bajtów, które już zostały wydane. 337 00:14:09,900 --> 00:14:13,040 Ale to, co faktycznie mają więcej bajtów, niż masz miejsca na? 338 00:14:13,040 --> 00:14:16,770 >> Cóż, ten program bardzo głupio tylko ślepo przechodzi wziąć cokolwiek to jest 339 00:14:16,770 --> 00:14:20,650 biorąc pod uwagę, witam backslash 0 jest super, jeśli łańcuch jest krótki 340 00:14:20,650 --> 00:14:22,040 wystarczy, jak pięć znaków. 341 00:14:22,040 --> 00:14:26,470 Ale czy to faktycznie 12 znaków lub 1200 znaków, widzieliśmy ostatni raz 342 00:14:26,470 --> 00:14:29,380 że jesteś po prostu będzie całkowicie nadpisać pamięć 343 00:14:29,380 --> 00:14:30,470 nie należy do Ciebie. 344 00:14:30,470 --> 00:14:34,390 A w najgorszym przypadku, jeśli zastąpić, że Czerwona część tam zadzwoniliśmy 345 00:14:34,390 --> 00:14:35,380 adres zwrotny - 346 00:14:35,380 --> 00:14:38,370 to jest po prostu gdzie komputer automatycznie, dla Ciebie, za 347 00:14:38,370 --> 00:14:43,130 sceny, zakładki oddalony 32-bitowa wartość, którą Przypomina to, co adres powinien 348 00:14:43,130 --> 00:14:47,080 powrócić, gdy foo, to inna funkcja, Odbywa się to wykonanie. 349 00:14:47,080 --> 00:14:49,320 Jest to swego rodzaju okruchy chleba do którego powraca. 350 00:14:49,320 --> 00:14:52,490 Jeśli nadpisanie które potencjalnie jeśli jesteś zły, może mógłby 351 00:14:52,490 --> 00:14:54,750 potencjalnie przejąć czyjś komputer. 352 00:14:54,750 --> 00:14:58,020 I będziesz na pewno awarii to w większości przypadków. 353 00:14:58,020 --> 00:15:01,690 >> Teraz ten problem został tylko pogarsza jak zaczęliśmy rozmawiać o pamięci 354 00:15:01,690 --> 00:15:03,010 Zarządzanie bardziej ogólnie. 355 00:15:03,010 --> 00:15:07,150 I malloc, dla alokacji pamięci, jest funkcji, które możemy wykorzystać do przydzielania 356 00:15:07,150 --> 00:15:11,260 pamięci, gdy nie wiemy z góry że możemy potrzebować niektórych. 357 00:15:11,260 --> 00:15:13,960 Tak więc, na przykład, jeśli wrócę do urządzenia tutaj. 358 00:15:13,960 --> 00:15:21,010 I otworzyć od ostatniego hello2.c czasu, pamiętam ten program tutaj, co wyglądało 359 00:15:21,010 --> 00:15:23,500 trochę coś takiego, zaledwie trzy linie - 360 00:15:23,500 --> 00:15:27,940 podać swoje imię i nazwisko, a następnie ciąg, po lewej stronie, jest równa getstring. 361 00:15:27,940 --> 00:15:29,690 A potem wydrukować, nazwa użytkownika. 362 00:15:29,690 --> 00:15:31,170 >> Więc to był bardzo prosty program. 363 00:15:31,170 --> 00:15:34,870 Żeby było jasne, niech śmiało i sprawiają, hello-2. 364 00:15:34,870 --> 00:15:36,680 Mam zamiar zrobić dot slash hello-2. 365 00:15:36,680 --> 00:15:37,750 Podać imię i nazwisko - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Wprowadź. 368 00:15:38,840 --> 00:15:39,540 Witaj David. 369 00:15:39,540 --> 00:15:41,060 To wydaje się działać OK. 370 00:15:41,060 --> 00:15:43,140 Ale to, co się naprawdę dzieje pod maską tutaj? 371 00:15:43,140 --> 00:15:44,670 Zacznijmy odwinąć niektórych warstw. 372 00:15:44,670 --> 00:15:48,380 String jest po prostu synonimem mamy sobie sprawę, na co? 373 00:15:48,380 --> 00:15:49,110 Char gwiazdki. 374 00:15:49,110 --> 00:15:52,740 Więc zróbmy to trochę bardziej ezoteryczne ale bardziej technicznie poprawne, że ten 375 00:15:52,740 --> 00:15:55,570 jest char gwiazdki, co oznacza, że nazwa, tak, jest zmienna. 376 00:15:55,570 --> 00:15:59,920 Ale to, co przechowuje imię jest adres char, który czuje się trochę dziwnie 377 00:15:59,920 --> 00:16:01,050 bo wracam ciąg. 378 00:16:01,050 --> 00:16:03,580 Wracam wielokrotnego znaki nie char. 379 00:16:03,580 --> 00:16:07,400 >> Ale, oczywiście, trzeba tylko najpierw Char adres zapamiętać, gdzie 380 00:16:07,400 --> 00:16:08,870 Cały ciąg jest bo po co? 381 00:16:08,870 --> 00:16:12,700 Jak można dowiedzieć się, gdzie koniec Ciąg jest wiedząc początek? 382 00:16:12,700 --> 00:16:13,630 Zerowej backslash. 383 00:16:13,630 --> 00:16:17,260 Więc z tych dwóch wskazówek dowiedzieć Przed rozpoczęciem i zakończeniem 384 00:16:17,260 --> 00:16:20,280 każdy łańcuch jest tak długo, jak są one prawidłowo utworzone z tym nieważną 385 00:16:20,280 --> 00:16:22,110 terminator, że zerowa backslash. 386 00:16:22,110 --> 00:16:24,520 >> Ale to dzwoni GetString. 387 00:16:24,520 --> 00:16:28,020 I okazuje się, że GetString przez cały ten czas był rodzaj 388 00:16:28,020 --> 00:16:28,820 oszukiwanie dla nas. 389 00:16:28,820 --> 00:16:32,460 To robi to pracy, aby upewnić się, uzyskiwanie ciąg od użytkownika. 390 00:16:32,460 --> 00:16:34,580 Ale gdzie jest ta pamięć przyjeżdżamy z? 391 00:16:34,580 --> 00:16:38,440 Jeśli wrócimy do obrazu tu i stosować definicję z tylko 392 00:16:38,440 --> 00:16:42,610 chwilę temu, że stos jest gdzie pamięć idzie gdy funkcje są uruchamiane, 393 00:16:42,610 --> 00:16:45,370 przez tę logikę, kiedy zadzwonić getstring, a potem wpisać 394 00:16:45,370 --> 00:16:50,900 D--V-I-D Enter, gdzie jest D--V-I-D ukośnik zera przechowywane, na podstawie 395 00:16:50,900 --> 00:16:53,480 story my powiedział nam daleko? 396 00:16:53,480 --> 00:16:55,190 >> Wydaje się być w stos, prawda? 397 00:16:55,190 --> 00:16:58,120 Po wywołaniu uzyskać ciąg masz Mały kawałek pamięci na stosie. 398 00:16:58,120 --> 00:17:01,630 Więc to ma się rozumieć, że D--V-I-D backslash zapisywane jest zero 399 00:17:01,630 --> 00:17:02,770 że w stosie. 400 00:17:02,770 --> 00:17:07,680 Ale chwileczkę, GetString powroty że ciąg, że tak powiem, co oznacza, 401 00:17:07,680 --> 00:17:11,700 to tacy z kafeterii zdjęty ze stosu. 402 00:17:11,700 --> 00:17:14,560 A my powiedzieliśmy ostatni raz, że tak szybko, jak funkcja zwraca, a Ty, że 403 00:17:14,560 --> 00:17:20,109 tacy, że tak powiem, ze stosu, co można założyć o resztkami 404 00:17:20,109 --> 00:17:21,819 że pamięć? 405 00:17:21,819 --> 00:17:25,160 I jakby redrew je jako znaki zapytania dlatego, że skutecznie się 406 00:17:25,160 --> 00:17:26,250 nieznanych wartości. 407 00:17:26,250 --> 00:17:29,500 Mogą one być użyte ponownie, gdy niektóre następna funkcja. 408 00:17:29,500 --> 00:17:31,870 >> Innymi słowy, jeśli zdarzy do przechowywania - 409 00:17:31,870 --> 00:17:34,350 Będę rysować szybki obraz tego stosu. 410 00:17:34,350 --> 00:17:38,690 Jeśli zdarzy ci się być rysunek dno mojego segmentu pamięci, a powiemy 411 00:17:38,690 --> 00:17:42,230 że jest to miejsce pamięci zajmowane przez główne i może arg c i 412 00:17:42,230 --> 00:17:46,790 arg v i coś jeszcze w programie, kiedy getstring nazywa, 413 00:17:46,790 --> 00:17:51,120 przypuszczalnie getstring dostaje fragment pamięci tutaj. 414 00:17:51,120 --> 00:17:53,940 A potem D--V-I-D jakoś kończy się w tej funkcji. 415 00:17:53,940 --> 00:17:55,320 I mam zamiar upraszczając. 416 00:17:55,320 --> 00:18:00,050 Ale załóżmy, że jego D--V-I-D backslash zero. 417 00:18:00,050 --> 00:18:03,500 Tak więc w tym wiele bajtów są stosowane ramki dla GetString. 418 00:18:03,500 --> 00:18:08,270 >> Ale jak tylko GetString zwrotów, my powiedział ostatnio, że ta pamięć ponad 419 00:18:08,270 --> 00:18:11,340 tutaj wszystko staje - woops! - 420 00:18:11,340 --> 00:18:14,270 wszystko staje się skutecznie usunięte. 421 00:18:14,270 --> 00:18:17,220 Możemy myśleć o tym teraz, pytanie znaki, bo kto wie, 422 00:18:17,220 --> 00:18:18,720 co się stało z tą pamięcią. 423 00:18:18,720 --> 00:18:22,130 Rzeczywiście, bardzo często nazywają funkcje inne niż GetString. 424 00:18:22,130 --> 00:18:24,750 I jak tylko zadzwonić inny Funkcja niż GetString, może nie w 425 00:18:24,750 --> 00:18:28,860 ten konkretny program, po prostu wyglądał at, ale jakiś inny, na pewno jakieś inne 426 00:18:28,860 --> 00:18:34,180 Funkcja może skończyć się dany to następny spot w stosie. 427 00:18:34,180 --> 00:18:39,410 >> Więc to nie może być tak, że GetString sklepach -D-V-I-D w stos, ponieważ byłoby 428 00:18:39,410 --> 00:18:41,040 natychmiast stracić do niej dostęp. 429 00:18:41,040 --> 00:18:43,720 Ale wiemy, że GetString zwraca tylko co? 430 00:18:43,720 --> 00:18:47,220 To nie jest powrót do mnie sześć znaków. 431 00:18:47,220 --> 00:18:51,090 Jak jest naprawdę nie wraca stwierdzić, ostatni raz? 432 00:18:51,090 --> 00:18:52,480 Adres pierwszy. 433 00:18:52,480 --> 00:18:56,650 Tak jakoś, kiedy nazywa getstring, to przydzielanie pamięci na kawałek 434 00:18:56,650 --> 00:18:59,620 Łańcuch typu użytkowników i następnie powrót adres to. 435 00:18:59,620 --> 00:19:02,930 I okazuje się, że kiedy chcesz funkcjonować do przydzielania pamięci w tym 436 00:19:02,930 --> 00:19:08,390 sposób i powrót do osoby, która wykonała że funkcja, adres 437 00:19:08,390 --> 00:19:11,870 że fragment pamięci, absolutnie nie można go umieścić w stosie na 438 00:19:11,870 --> 00:19:14,750 dno, bo to tylko funkcjonalnie będzie nie stać Ciebie bardzo 439 00:19:14,750 --> 00:19:17,800 szybko, więc można się domyślić, w którym my prawdopodobnie będzie wrzucić 440 00:19:17,800 --> 00:19:20,130 Natomiast tak zwany stos. 441 00:19:20,130 --> 00:19:25,290 >> Więc pomiędzy dnem pamięć tych układ i top of pamięć tych 442 00:19:25,290 --> 00:19:26,820 układ jest cała masa segmentów. 443 00:19:26,820 --> 00:19:29,270 Jednym z nich jest stos, a prawo ponad to jest kupa. 444 00:19:29,270 --> 00:19:33,680 A kupa jest tylko inny kawałek pamięci, która nie jest używana przez funkcje 445 00:19:33,680 --> 00:19:34,770 gdy są one nazywane. 446 00:19:34,770 --> 00:19:38,100 Służy do pamięci długoterminowej, gdy chcesz jedna funkcja chwycić niektóre 447 00:19:38,100 --> 00:19:42,700 pamięci i móc powiesić na nim bez utraty kontroli nad nim. 448 00:19:42,700 --> 00:19:45,550 >> Teraz być może natychmiast zauważyć, że nie jest to 449 00:19:45,550 --> 00:19:48,060 koniecznie idealny projekt. 450 00:19:48,060 --> 00:19:51,350 Jako program przeznaczono pamięć na stos, lub jak nazywają coraz 451 00:19:51,350 --> 00:19:55,540 więcej funkcji, lub jak można przydzielić pamięci na stercie z malloc off jako 452 00:19:55,540 --> 00:20:00,690 getstring robi, co wyraźnie wydaje się być nieunikniony problem? 453 00:20:00,690 --> 00:20:00,860 >> Racja. 454 00:20:00,860 --> 00:20:03,150 Podobnie jak fakt, że te strzałki są skierowane na siebie 455 00:20:03,150 --> 00:20:04,380 nie wróży dobrze. 456 00:20:04,380 --> 00:20:08,630 I rzeczywiście, możemy bardzo szybko upaść Program w wiele sposobów. 457 00:20:08,630 --> 00:20:12,050 W rzeczywistości, myślę, że mamy zrobił to przypadkowo jeden raz. 458 00:20:12,050 --> 00:20:14,020 A jeśli nie, to zróbmy to celowo teraz. 459 00:20:14,020 --> 00:20:21,330 Pozwól mi pójść dalej i napisać bardzo szybko Program nazywa dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 A teraz pójdę tu i Czy ostre m.in. stdio.h. 461 00:20:26,730 --> 00:20:32,620 Chcę zadeklarować funkcja foo ma żadnych argumentów, które jest 462 00:20:32,620 --> 00:20:34,040 oznaczony oraz przez próżnię. 463 00:20:34,040 --> 00:20:37,830 >> I jedyną rzeczą, foo będzie zrobić, to wywołanie foo, która chyba nie jest 464 00:20:37,830 --> 00:20:39,100 najmądrzejszy pomysł, ale tak będzie. 465 00:20:39,100 --> 00:20:40,490 Ent głównym nieważne. 466 00:20:40,490 --> 00:20:45,270 Teraz jedyną rzeczą, główny będzie Wystarczy wywołać foo również. 467 00:20:45,270 --> 00:20:51,050 I tylko dla zabawy, mam zamiar iść przed tutaj i powiedzieć, printf "Hello from 468 00:20:51,050 --> 00:20:52,340 foo ". 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Więc jeśli nie popełnić żadnych błędów, Marka dontdothis dot slash. 471 00:21:00,160 --> 00:21:01,960 I zróbmy to w większym oknie - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Chodź. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Podobno można to zrobić. 478 00:21:13,100 --> 00:21:15,190 Cholera. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Czekaj. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Czy my - 483 00:21:18,270 --> 00:21:20,110 My używaliśmy go z Marka. 484 00:21:20,110 --> 00:21:22,050 >> [Wzdycha] 485 00:21:22,050 --> 00:21:25,110 >> Wiem, ale myślę, że właśnie usunął to. 486 00:21:25,110 --> 00:21:28,410 Uh, tak. 487 00:21:28,410 --> 00:21:30,660 Cholera. 488 00:21:30,660 --> 00:21:32,640 Rozwiąż ten Roba. 489 00:21:32,640 --> 00:21:34,678 Co? 490 00:21:34,678 --> 00:21:35,928 To bardzo proste. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Tak, okazało optymalizacji off. 493 00:21:47,360 --> 00:21:48,970 OK, stand bye. 494 00:21:48,970 --> 00:21:49,950 Teraz czuję się lepiej. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Dobrze. 497 00:21:51,780 --> 00:21:53,430 >> Warto więc przebudować ten - 498 00:21:53,430 --> 00:21:55,880 Ci dontdothis. 499 00:21:55,880 --> 00:22:00,090 Być może trzeba zmienić nazwę tego celu dothis.c za chwilę. 500 00:22:00,090 --> 00:22:00,710 Proszę bardzo. 501 00:22:00,710 --> 00:22:01,240 Dziękuję. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Tak więc fakt, że byłem drukowania się coś było właściwie tylko 504 00:22:05,480 --> 00:22:08,150 spowolnienie procesu, dzięki któremu doszłaby że punkt. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Uff! 507 00:22:08,870 --> 00:22:11,180 >> Więc co tak naprawdę chodzi? 508 00:22:11,180 --> 00:22:14,440 Powodem jest, jak na bok, jest robi nic w zakresie wejścia i 509 00:22:14,440 --> 00:22:17,270 wyjście wydaje się być wolniejszy, bo napisać znaki 510 00:22:17,270 --> 00:22:18,600 Ekran, to musi przejść. 511 00:22:18,600 --> 00:22:21,720 Więc krótko mówiąc, gdybym rzeczywiście stało się tak niecierpliwi, musielibyśmy 512 00:22:21,720 --> 00:22:23,260 widziałem to efekt końcowy, jak również. 513 00:22:23,260 --> 00:22:26,220 Teraz, że mam jeździć z print-upy, widzimy go od razu. 514 00:22:26,220 --> 00:22:28,410 Więc dlaczego tak się dzieje. 515 00:22:28,410 --> 00:22:31,300 Cóż, proste wyjaśnienie, oczywiście, jest to, że prawdopodobnie nie powinien foo 516 00:22:31,300 --> 00:22:32,500 być powołanie się. 517 00:22:32,500 --> 00:22:34,470 >> Teraz w sposób ogólny, to jest rekurencja. 518 00:22:34,470 --> 00:22:36,970 I myśleliśmy, kilka tygodni temu cykliczne jest dobry. 519 00:22:36,970 --> 00:22:40,330 Rekurencja jest ten magiczny sposób wyrażania siebie bardzo zwięźle. 520 00:22:40,330 --> 00:22:41,400 I to właśnie działa. 521 00:22:41,400 --> 00:22:45,060 Ale jest kluczowym elementem wszystkich cyklicznej programy Rozmawialiśmy 522 00:22:45,060 --> 00:22:48,260 się i spojrzał na tak daleko, co było to, że miał co? 523 00:22:48,260 --> 00:22:52,610 Wariant podstawowy, który był jakiś zakodowanego tak, że powiedział w niektórych sytuacjach 524 00:22:52,610 --> 00:22:56,210 nie wywołać foo, który jest wyraźnie nie w tym przypadku. 525 00:22:56,210 --> 00:22:58,920 >> Więc to, co naprawdę dzieje się pod względem tego obrazu? 526 00:22:58,920 --> 00:23:01,790 Cóż, kiedy główny wywołuje foo, to dostaje kawałek pamięci. 527 00:23:01,790 --> 00:23:04,150 Kiedy foo zwraca bla, robi kawałek pamięci. 528 00:23:04,150 --> 00:23:06,430 Kiedy foo zwraca foo, to dostaje kawałek. 529 00:23:06,430 --> 00:23:07,080 To staje się kawałek. 530 00:23:07,080 --> 00:23:08,120 To staje się kawałek. 531 00:23:08,120 --> 00:23:09,460 Ponieważ foo nigdy nie wraca. 532 00:23:09,460 --> 00:23:12,160 My nigdy nie usuwanie jednego z nich klatki ze stosu. 533 00:23:12,160 --> 00:23:15,930 Liczymy więc, dmuchanie przez sterty nie, wspomnieć, kto wie co jeszcze, a 534 00:23:15,930 --> 00:23:19,600 jesteśmy wykraczając poza granice naszego tzw. segment pamięci. 535 00:23:19,600 --> 00:23:21,790 Błąd iść segmentacja false. 536 00:23:21,790 --> 00:23:24,110 >> Więc rozwiązanie jest wyraźnie tego nie robi. 537 00:23:24,110 --> 00:23:28,830 Ale większy implikacją jest, że tak, jest absolutnie pewna granica, 538 00:23:28,830 --> 00:23:32,470 Nawet jeśli nie jest dobrze zdefiniowane, w jaki wiele funkcji można zadzwonić w 539 00:23:32,470 --> 00:23:34,970 Program, ile razy funkcja mogą dzwonić się. 540 00:23:34,970 --> 00:23:38,430 Dlatego, mimo że my głosimy rekursji jak to coś potencjalnie magicznej 541 00:23:38,430 --> 00:23:41,870 Kilka tygodni temu na sigma funkcji, a gdy mamy dane 542 00:23:41,870 --> 00:23:45,270 struktury i CS50, zobaczysz inne wnioski o tym, że nie jest 543 00:23:45,270 --> 00:23:46,500 koniecznie najlepsze. 544 00:23:46,500 --> 00:23:50,070 Bo jeśli funkcja nazywa się, zwraca się, nawet jeśli nie ma podstawy 545 00:23:50,070 --> 00:23:54,860 przypadku, jeśli nie trafisz, że przypadku bazowego do 1000 połączeń lub 10000 apeluje, by 546 00:23:54,860 --> 00:23:58,800 że czas mogłeś zabraknie miejsca na tzw stosie i naciśnij 547 00:23:58,800 --> 00:24:00,400 inne segmenty pamięci. 548 00:24:00,400 --> 00:24:03,950 Więc to też jest projekt kompromisu między elegancją i między 549 00:24:03,950 --> 00:24:06,920 Solidność Twój szczególności realizacja. 550 00:24:06,920 --> 00:24:10,780 >> Więc nie ma innego minusem lub kolejny słaby punkt tego co mamy 551 00:24:10,780 --> 00:24:11,720 robił do tej pory. 552 00:24:11,720 --> 00:24:12,980 Gdy zadzwoniłem getstring - 553 00:24:12,980 --> 00:24:15,120 pozwól mi wrócić do Hello-2. 554 00:24:15,120 --> 00:24:18,170 Zauważ, że dzwonię GetString, który zwraca adres. 555 00:24:18,170 --> 00:24:20,730 A my twierdzą dziś, że adres jest ze sterty. 556 00:24:20,730 --> 00:24:24,480 A teraz jestem drukowanie napis pod tym adresem. 557 00:24:24,480 --> 00:24:27,000 Ale my nigdy nie nazywa Przeciwieństwem GetString. 558 00:24:27,000 --> 00:24:30,850 Nigdy nie mieliśmy do calll funkcji takich jak ungetstring, gdzie ręka z powrotem 559 00:24:30,850 --> 00:24:31,610 że pamięć. 560 00:24:31,610 --> 00:24:33,250 Ale szczerze mówiąc, prawdopodobnie powinno być. 561 00:24:33,250 --> 00:24:37,390 Bo jeśli padają komputer do pamięci, w drodze kogoś takiego jak 562 00:24:37,390 --> 00:24:40,830 getstring ale nigdy go oddać, na pewno to także jest zobowiązany do prowadzić do 563 00:24:40,830 --> 00:24:42,970 Problemy której zabraknie pamięci. 564 00:24:42,970 --> 00:24:46,140 >> A w rzeczywistości, możemy spojrzeć na te problemy z nowego narzędzia, którego użycie 565 00:24:46,140 --> 00:24:47,640 jest trochę tajemnicze pisać. 566 00:24:47,640 --> 00:24:50,960 Ale pozwól mi iść dalej i przelewać go Na ekranie za chwilę. 567 00:24:50,960 --> 00:24:56,940 Mam zamiar iść do przodu i uruchamiania Valgrind z parametrem, który najpierw polecenia 568 00:24:56,940 --> 00:25:00,260 Argument wiersza jest nazwa tego programu hello-2. 569 00:25:00,260 --> 00:25:02,650 I niestety jest to Wyjście jest potwornie 570 00:25:02,650 --> 00:25:04,290 złożone bez powodu. 571 00:25:04,290 --> 00:25:06,280 Widzimy więc cały ten bałagan. 572 00:25:06,280 --> 00:25:07,530 David jest podać swoje nazwisko. 573 00:25:07,530 --> 00:25:09,760 Więc to jest program faktycznie działa. 574 00:25:09,760 --> 00:25:11,180 I teraz mamy tego wyjścia. 575 00:25:11,180 --> 00:25:13,400 >> Więc Valgrind jest podobny w duchu do GDB. 576 00:25:13,400 --> 00:25:14,950 Nie debugger per se jest. 577 00:25:14,950 --> 00:25:16,270 Ale to kontroler pamięci. 578 00:25:16,270 --> 00:25:20,140 Jest to program, który uruchomi zaprogramować i powiedzieć, jeśli poprosiliśmy 579 00:25:20,140 --> 00:25:23,860 komputer dla pamięci i nigdy nie podał z powrotem, co oznacza, że ​​masz 580 00:25:23,860 --> 00:25:24,570 wyciek pamięci. 581 00:25:24,570 --> 00:25:26,240 A wycieki pamięci wydają się być złe. 582 00:25:26,240 --> 00:25:29,120 I to użytkownicy komputerów mają Prawdopodobnie czuł tego, czy masz 583 00:25:29,120 --> 00:25:30,300 Mac lub PC. 584 00:25:30,300 --> 00:25:33,730 Czy kiedykolwiek z komputera do natomiast nie i ponownym uruchomieniu komputera w kilku 585 00:25:33,730 --> 00:25:36,820 dzień, lub właśnie ma dużo uruchomione programy, a to cholerstwo 586 00:25:36,820 --> 00:25:42,360 obniża się zastoju, lub co najmniej jest to bardzo irytujące, w użyciu, ponieważ 587 00:25:42,360 --> 00:25:44,350 wszystko po prostu ma bardzo powolny. 588 00:25:44,350 --> 00:25:46,260 >> Teraz, że może być wiele przyczyn. 589 00:25:46,260 --> 00:25:49,600 To może być nieskończona pętla, błąd w czyjś kod, lub po prostu, że 590 00:25:49,600 --> 00:25:53,250 może oznaczać, że używasz więcej pamięci, lub próbuje, niż twój 591 00:25:53,250 --> 00:25:54,920 Komputer rzeczywiście ma. 592 00:25:54,920 --> 00:25:57,770 A może jest to błąd w jakimś programie które padają na pamięć. 593 00:25:57,770 --> 00:26:02,480 Przeglądarki za rok były notorycznie ta, z prośbą o więcej i więcej pamięci 594 00:26:02,480 --> 00:26:03,870 ale nigdy nie podając go. 595 00:26:03,870 --> 00:26:07,220 Z pewnością, jeśli tylko mają skończone Ilość pamięci, nie można prosić 596 00:26:07,220 --> 00:26:09,990 nieskończenie wiele razy, za niektóre z tych pamięci. 597 00:26:09,990 --> 00:26:13,070 >> A więc to, co tu widzisz, chociaż ponownie valgrind jest wyjście 598 00:26:13,070 --> 00:26:17,490 niepotrzebnie skomplikowane, by spojrzeć na po pierwsze, to jest interesujący. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 w użyciu na wyjeździe. 601 00:26:20,060 --> 00:26:22,810 Tak tu jest, ile pamięci było w użyciu w stercie na 602 00:26:22,810 --> 00:26:24,300 Czas mój program odszedł - 603 00:26:24,300 --> 00:26:27,280 podobno sześć bajtów w jednym bloku. 604 00:26:27,280 --> 00:26:28,710 Więc mam zamiar pomachać rękami na jakim bloku jest. 605 00:26:28,710 --> 00:26:31,270 Pomyśl, że to tylko fragment, więcej technicznej słowo kawałek. 606 00:26:31,270 --> 00:26:33,140 Ale sześć bajtów - 607 00:26:33,140 --> 00:26:36,870 czym jest sześć bajtów były nadal w użyciu? 608 00:26:36,870 --> 00:26:37,390 >> Dokładnie. 609 00:26:37,390 --> 00:26:41,520 D--V-I-D backslash zero, pięć list Nazwa oraz terminator null. 610 00:26:41,520 --> 00:26:46,350 Więc ten program valgrind zauważyłem, że I wyznaczona do sześciu bajtów, najwyraźniej, by 611 00:26:46,350 --> 00:26:48,950 sposób GetString, ale nigdy nie dał je z powrotem. 612 00:26:48,950 --> 00:26:52,030 I rzeczywiście, to może nie być tak oczywiste, jeśli program nie jest trzy 613 00:26:52,030 --> 00:26:53,590 linie, ale to 300 linii. 614 00:26:53,590 --> 00:26:56,920 Tak naprawdę możemy dać innego polecenia Argument wiersza do Valgrind do 615 00:26:56,920 --> 00:26:58,290 stał się bardziej widoczny. 616 00:26:58,290 --> 00:26:59,760 Jest to trochę irytujące, aby pamiętać. 617 00:26:59,760 --> 00:27:01,580 Ale jeśli to zrobię - 618 00:27:01,580 --> 00:27:01,930 Zobaczmy. 619 00:27:01,930 --> 00:27:03,540 Przeciek - 620 00:27:03,540 --> 00:27:05,030 Był to wyciek - 621 00:27:05,030 --> 00:27:07,580 nawet nie pamiętam co to jest off strony. 622 00:27:07,580 --> 00:27:08,550 >> - Sprawdzanie szczelności wynosi pełna. 623 00:27:08,550 --> 00:27:10,180 Tak, dziękuję. 624 00:27:10,180 --> 00:27:12,520 - Sprawdzanie szczelności wynosi pełna. 625 00:27:12,520 --> 00:27:13,800 Wprowadź. 626 00:27:13,800 --> 00:27:14,940 Sam program jest uruchomiony. 627 00:27:14,940 --> 00:27:16,180 Wpisz w David ponownie. 628 00:27:16,180 --> 00:27:17,660 Teraz widzę trochę więcej szczegółów. 629 00:27:17,660 --> 00:27:20,890 Ale poniżej podsumowaniu sterty, które jest identyczne do czterech - ah, 630 00:27:20,890 --> 00:27:22,120 to jest miłe. 631 00:27:22,120 --> 00:27:25,460 Teraz Valgrind jest rzeczywiście patrząc trochę trudniej w moim kodu. 632 00:27:25,460 --> 00:27:29,580 I to mówiąc, że, jak widać, malloc w linii - 633 00:27:29,580 --> 00:27:30,580 możemy pomniejszyć. 634 00:27:30,580 --> 00:27:31,980 Na linii - 635 00:27:31,980 --> 00:27:32,930 nie widzimy tego, co linia jest. 636 00:27:32,930 --> 00:27:35,110 Ale malloc jest pierwszym winowajcą. 637 00:27:35,110 --> 00:27:38,630 Jest blog w malloc. 638 00:27:38,630 --> 00:27:39,810 >> Wszystko w porządku? 639 00:27:39,810 --> 00:27:40,450 OK, nr. 640 00:27:40,450 --> 00:27:40,940 Prawda? 641 00:27:40,940 --> 00:27:42,520 Zadzwoniłem GetString. 642 00:27:42,520 --> 00:27:44,460 getstring najwyraźniej wywołuje malloc. 643 00:27:44,460 --> 00:27:47,800 Więc co linia kodu jest najwyraźniej winy za posiadające 644 00:27:47,800 --> 00:27:49,050 przydzielone tej pamięci? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Załóżmy, że ten, kto napisał malloc jest już na tyle długo, że jest to 647 00:27:55,540 --> 00:27:56,390 nie ich wina. 648 00:27:56,390 --> 00:27:57,520 Więc to chyba moje. 649 00:27:57,520 --> 00:28:02,000 GetString w cs50.c - więc to plik gdzieś na komputerze - 650 00:28:02,000 --> 00:28:05,210 w linii 286 wydaje się być zainstalowane. 651 00:28:05,210 --> 00:28:08,140 Teraz załóżmy, że CS50 został wokół na przyzwoitą ilość czasu, więc 652 00:28:08,140 --> 00:28:09,720 my też jesteśmy nieomylni. 653 00:28:09,720 --> 00:28:14,080 I tak to chyba nie w GetString że błąd leży, ale raczej w 654 00:28:14,080 --> 00:28:17,810 hello-2.c linia 18. 655 00:28:17,810 --> 00:28:20,670 >> Warto więc przyjrzeć się co to linia 18 była. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Jakoś ta linia nie jest koniecznie buggy, per se, ale jest powód, 658 00:28:27,130 --> 00:28:28,630 za tym wyciek pamięci. 659 00:28:28,630 --> 00:28:32,140 Tak bardzo po prostu, co by intuicyjnie być rozwiązanie tego? 660 00:28:32,140 --> 00:28:34,710 Jeśli pytamy o pamięci, nigdy nie były dając go z powrotem, i to wydaje się być 661 00:28:34,710 --> 00:28:37,940 problem, ponieważ w czasie mojego komputera może zabraknąć pamięci, może spowolnić 662 00:28:37,940 --> 00:28:42,110 w dół, złych rzeczy może się zdarzyć, dobrze, , co jest proste, intuicyjne rozwiązanie? 663 00:28:42,110 --> 00:28:43,140 Wystarczy oddać. 664 00:28:43,140 --> 00:28:44,770 >> Jak zwolnić tę pamięć? 665 00:28:44,770 --> 00:28:49,970 Cóż, na szczęście jest to dość proste tylko powiedzieć bezpłatny nazwę. 666 00:28:49,970 --> 00:28:51,260 I nigdy nie zrobiłeś tego wcześniej. 667 00:28:51,260 --> 00:28:55,890 Ale można w zasadzie myśleć o wolne jako przeciwieństwo malloc. 668 00:28:55,890 --> 00:28:58,030 wolny jest przeciwieństwem przydzielania pamięci. 669 00:28:58,030 --> 00:28:59,540 Więc teraz pozwól mi skompilować tego. 670 00:28:59,540 --> 00:29:02,050 Marka Hello-2. 671 00:29:02,050 --> 00:29:04,620 Pozwól mi uruchomić go ponownie. hello-2 David. 672 00:29:04,620 --> 00:29:07,290 Wydaje się więc do pracy w dokładnie taki sam sposób. 673 00:29:07,290 --> 00:29:11,180 Ale jeśli wrócę do Valgrind i ponownie uruchom że samo polecenie na moim nowo 674 00:29:11,180 --> 00:29:14,720 skompilowany program, wpisując w moim imieniu, jak przed - 675 00:29:14,720 --> 00:29:15,370 miło. 676 00:29:15,370 --> 00:29:16,760 Podsumowanie Heap - 677 00:29:16,760 --> 00:29:17,740 w użyciu na wyjeździe - 678 00:29:17,740 --> 00:29:19,370 zerowych bajtów zerowych bloków. 679 00:29:19,370 --> 00:29:21,840 I to jest bardzo miły, wszyscy bloki kupa zostali uwolnieni. 680 00:29:21,840 --> 00:29:23,480 Brak przecieków są możliwe. 681 00:29:23,480 --> 00:29:27,200 >> Więc zbliża się, a nie z zestawu Problem 4, Problem jednak z zestawem 5, Forensics 682 00:29:27,200 --> 00:29:30,740 i nowsze, to też będzie miarą poprawności waszego 683 00:29:30,740 --> 00:29:33,630 Program, czy masz czy nie ma wycieków pamięci. 684 00:29:33,630 --> 00:29:36,900 Ale na szczęście, nie tylko można rozumować przez nich intuicyjnie, które 685 00:29:36,900 --> 00:29:40,430 jest, bez wątpienia, jest łatwy dla małych programów ale trudniejsze do większych programów, 686 00:29:40,430 --> 00:29:43,860 Valgrind, dla tych większych programów, może pomóc w identyfikacji 687 00:29:43,860 --> 00:29:45,360 Szczególnym problemem. 688 00:29:45,360 --> 00:29:47,500 >> Ale jest jeszcze jeden problem, , które mogą się pojawić. 689 00:29:47,500 --> 00:29:51,245 Pozwól mi otworzyć ten plik tutaj, co jest, znowu, nieco prosty przykład. 690 00:29:51,245 --> 00:29:53,760 Ale skupmy się na tym, co ten program robi. 691 00:29:53,760 --> 00:29:55,190 To się nazywa memory.c. 692 00:29:55,190 --> 00:29:58,380 Będziemy pisać o tym później dzisiaj w zip dzisiejszego kodu źródłowego. 693 00:29:58,380 --> 00:30:01,610 I zauważył, że mam funkcję o nazwie f, że nie przyjmuje żadnych argumentów i 694 00:30:01,610 --> 00:30:02,800 nic nie zwraca. 695 00:30:02,800 --> 00:30:07,240 W linii 20, jestem podobno oświadczając wskaźnik do int i wywołanie to x. 696 00:30:07,240 --> 00:30:09,570 Jestem przypisanie jest powrót wartość malloc. 697 00:30:09,570 --> 00:30:14,590 I żeby była jasność, ile bajtów am I prawdopodobnie wracając z malloc 698 00:30:14,590 --> 00:30:17,080 w tej sytuacji? 699 00:30:17,080 --> 00:30:18,040 >> Prawdopodobnie 40. 700 00:30:18,040 --> 00:30:18,840 Gdzie można dostać, że z? 701 00:30:18,840 --> 00:30:22,410 Cóż, jeśli przypomnieć, że int jest często 4 bajty, co najmniej jest w 702 00:30:22,410 --> 00:30:25,110 Urządzenie, 10 razy 4 jest oczywiście 40. 703 00:30:25,110 --> 00:30:28,920 Więc malloc zwraca adres z kawał pamięci i magazynowania, które 704 00:30:28,920 --> 00:30:30,800 rozwiązać ostatecznie w X. 705 00:30:30,800 --> 00:30:32,570 Tak więc być jasne, co wtedy się dzieje? 706 00:30:32,570 --> 00:30:34,990 Cóż, pozwól mi wrócić do naszego obrazu tutaj. 707 00:30:34,990 --> 00:30:38,150 Pozwól, że nie tylko rysować głębi pamięci komputera, pozwól mi iść do przodu i 708 00:30:38,150 --> 00:30:42,990 rysować cały prostokąt reprezentuje wszystkie moje pamięci RAM. 709 00:30:42,990 --> 00:30:44,790 >> Powiemy, że stos jest na dole. 710 00:30:44,790 --> 00:30:47,010 I jest fragment tekstu w Dane niezainicjowanej. 711 00:30:47,010 --> 00:30:49,880 Ale ja po prostu się streszczenie tych inne rzeczy, oddalony jako kropka, kropka kropka. 712 00:30:49,880 --> 00:30:53,470 Mam zamiar odnieść się do tego w stosie na górze. 713 00:30:53,470 --> 00:30:57,070 A potem na dole tego obrazu, do reprezentowania Głównym, będę 714 00:30:57,070 --> 00:30:59,880 dać mu pamięć plastry na stosie. 715 00:30:59,880 --> 00:31:03,150 Dla f, mam zamiar dać mu kawałek z pamięci na stosie. 716 00:31:03,150 --> 00:31:05,140 Teraz, muszę skonsultować Moje strony Kod źródłowy ponownie. 717 00:31:05,140 --> 00:31:07,170 Co to są zmienne lokalne za główny? 718 00:31:07,170 --> 00:31:10,710 Niby nic, tak że kawałek jest skutecznie pusty lub nie, nawet tak duże 719 00:31:10,710 --> 00:31:11,600 jak już wyciągnąć go. 720 00:31:11,600 --> 00:31:15,730 Ale w F, mam zmiennej lokalnej, które nazywa x. 721 00:31:15,730 --> 00:31:20,410 Więc mam zamiar iść dalej i dać f fragment pamięci, nazywając go x. 722 00:31:20,410 --> 00:31:24,680 >> A teraz malloc 10 razy 4, Więc malloc 40, gdzie jest to 723 00:31:24,680 --> 00:31:25,430 Pamięć pochodzi z? 724 00:31:25,430 --> 00:31:27,530 Nie narysowałem obrazek jak to wcześniej. 725 00:31:27,530 --> 00:31:31,140 Ale załóżmy, że jest to skuteczne pochodzących z tego, więc jeden, 726 00:31:31,140 --> 00:31:33,170 dwa, trzy, cztery, pięć. 727 00:31:33,170 --> 00:31:34,680 A teraz potrzebuję 40 z nich. 728 00:31:34,680 --> 00:31:37,540 Więc ja po prostu zrobić kropka, kropka, kropka, aby zaproponować że jest jeszcze więcej pamięci 729 00:31:37,540 --> 00:31:39,350 wraca z hałdy. 730 00:31:39,350 --> 00:31:40,710 Teraz, co jest adres? 731 00:31:40,710 --> 00:31:42,620 Wybierzmy nasze arbitralne rozwiązania, jak zawsze - 732 00:31:42,620 --> 00:31:46,310 Ox123, choć prawdopodobnie będzie być coś zupełnie innego. 733 00:31:46,310 --> 00:31:50,420 To jest adres pierwszego bajtu pamięci, że pytam malloc dla. 734 00:31:50,420 --> 00:31:53,630 >> Tak w skrócie, linii raz 20 wykonuje, co jest dosłownie 735 00:31:53,630 --> 00:31:57,170 przechowywany wewnątrz x. tutaj? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 A Ox jest nieciekawe. 739 00:32:01,550 --> 00:32:03,200 To po prostu oznacza, oto liczba szesnastkowa. 740 00:32:03,200 --> 00:32:06,490 Ale to, co jest kluczem jest to, że to, co mam sklep w X, która jest zmienna lokalna. 741 00:32:06,490 --> 00:32:10,260 Ale jego typ danych, ponownie, jest adres wew. 742 00:32:10,260 --> 00:32:12,710 Cóż, mam zamiar zapisać Ox123. 743 00:32:12,710 --> 00:32:16,610 Ale znowu, jeśli to zbyt komplikuje niepotrzebnie, jeśli przewijać 744 00:32:16,610 --> 00:32:21,490 z powrotem, możemy to z dala dość abstrakcyjna rozsądnie i po prostu powiedzieć, że x jest 745 00:32:21,490 --> 00:32:23,910 wskaźnik do tego ilość pamięci. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Teraz pytanie pod ręką jest następujący - 748 00:32:26,230 --> 00:32:29,910 line 21, jak się okazuje, jest wadliwy. 749 00:32:29,910 --> 00:32:31,160 Dlaczego? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Sorry? 752 00:32:36,930 --> 00:32:38,640 To nie ma - 753 00:32:38,640 --> 00:32:40,390 że ponownie. 754 00:32:40,390 --> 00:32:41,240 Cóż, to nie kosztuje. 755 00:32:41,240 --> 00:32:42,350 Więc to jest drugi but. 756 00:32:42,350 --> 00:32:45,000 Więc jest jeszcze jedna, ale konkretnie na linii 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Dokładnie. 759 00:32:50,040 --> 00:32:54,980 Ta prosta linia kodu jest po prostu przepełnienie bufora, przepełnienia buforu. 760 00:32:54,980 --> 00:32:57,050 Bufor oznacza po prostu kawałek pamięci. 761 00:32:57,050 --> 00:33:01,520 Ale ten fragment pamięci jest od wielkości 10 10, liczby całkowite, co oznacza, że ​​jeśli 762 00:33:01,520 --> 00:33:05,350 Indeks do niego przy użyciu cukru składniowej notacji tablicy, plac 763 00:33:05,350 --> 00:33:09,220 wsporniki, masz dostęp do x 0 x wspornik wspornik 1 x, 764 00:33:09,220 --> 00:33:10,390 Uchwyt kropka, kropka, kropka. 765 00:33:10,390 --> 00:33:13,270 x uchwyt 9 jest największa. 766 00:33:13,270 --> 00:33:17,680 Więc jeśli ja x wspornik 10, gdzie Jestem naprawdę dzieje się w pamięci? 767 00:33:17,680 --> 00:33:19,120 >> Cóż, jeśli mam 10 int - 768 00:33:19,120 --> 00:33:21,070 niech rzeczywiście wyciągnąć wszystko z tych tutaj. 769 00:33:21,070 --> 00:33:22,700 Więc to był pierwszy pięć. 770 00:33:22,700 --> 00:33:24,660 Oto pozostałe pięć ints. 771 00:33:24,660 --> 00:33:29,580 Więc x wspornik 0 jest tutaj. x wspornik 1 jest tutaj. x uchwyt 9 jest tutaj. x wspornik 772 00:33:29,580 --> 00:33:37,960 10 jest tutaj, co oznacza, mówię, w wierszu 21, komputer umieścić 773 00:33:37,960 --> 00:33:39,400 liczba gdzie? 774 00:33:39,400 --> 00:33:42,010 Numer 0, gdzie? 775 00:33:42,010 --> 00:33:43,380 Cóż, to jest 0, tak. 776 00:33:43,380 --> 00:33:45,460 Ale sam fakt, że jej 0 jest swego rodzaju przypadek. 777 00:33:45,460 --> 00:33:47,140 Może to być numer 50, dla wszystkich, dbamy. 778 00:33:47,140 --> 00:33:50,480 Ale staramy się umieścić go na x wspornika 10, którym jest w którym ta 779 00:33:50,480 --> 00:33:53,700 Znak zapytania jest rysowany, które nie jest dobrą rzeczą. 780 00:33:53,700 --> 00:33:57,070 Ten program może być bardzo dobrze awarii w wyniku. 781 00:33:57,070 --> 00:33:59,400 >> Teraz idziemy dalej i zobaczyć, czy to jest rzeczywiście, to, co się dzieje. 782 00:33:59,400 --> 00:34:02,600 Producent pamięci, ponieważ plik nazywa memory.c. 783 00:34:02,600 --> 00:34:05,950 Idziemy naprzód i uruchomić pamięć programu. 784 00:34:05,950 --> 00:34:08,239 Więc mieliśmy szczęście, rzeczywiście, wydaje się. 785 00:34:08,239 --> 00:34:09,340 Mamy szczęście. 786 00:34:09,340 --> 00:34:11,060 Ale zobaczymy, czy możemy teraz uruchomić Valgrind. 787 00:34:11,060 --> 00:34:14,170 Na pierwszy rzut oka, mój program może wydaje się być prawidłowa. 788 00:34:14,170 --> 00:34:18,010 Ale pozwól mi uruchomić Valgrind z - Sprawdzanie szczelności wynosi pełna pamięci. 789 00:34:18,010 --> 00:34:20,110 >> A teraz, kiedy to uruchomić - 790 00:34:20,110 --> 00:34:21,030 ciekawe. 791 00:34:21,030 --> 00:34:26,800 Nieprawidłowy zapis wielkości 4 na linia 21 z memory.c. 792 00:34:26,800 --> 00:34:29,284 Linia 21 z memory.c jest który? 793 00:34:29,284 --> 00:34:30,340 O, ciekawe. 794 00:34:30,340 --> 00:34:31,080 Ale poczekaj. 795 00:34:31,080 --> 00:34:32,389 Rozmiar 4, co to jest, że myśli? 796 00:34:32,389 --> 00:34:34,969 I tylko nie jeden zapis, ale to z wielkości 4. 797 00:34:34,969 --> 00:34:36,889 Dlaczego jest to 4? 798 00:34:36,889 --> 00:34:39,280 To dlatego, że jest int, które jest, ponownie, cztery bajty. 799 00:34:39,280 --> 00:34:42,510 Więc Valgrind znalazłeś błąd, że ja, patrząc na mojego kodu, nie. 800 00:34:42,510 --> 00:34:45,040 A może twój TF by lub nie. 801 00:34:45,040 --> 00:34:48,469 Co Ale Valgrind na pewno, że zrobiliśmy błąd istnieje, nawet 802 00:34:48,469 --> 00:34:52,719 jeśli mamy szczęście, a komputer postanowił, eh, ja nie zamierzam upaść 803 00:34:52,719 --> 00:34:57,470 tylko dlatego, że dotknął jeden bajt, jeden int jest warta pamięci, że nie 804 00:34:57,470 --> 00:34:58,550 faktycznie własne. 805 00:34:58,550 --> 00:35:00,380 >> No, co jeszcze jest buggy tutaj. 806 00:35:00,380 --> 00:35:01,180 Adres - 807 00:35:01,180 --> 00:35:03,190 to jest adres patrząc szalony w systemie szesnastkowym. 808 00:35:03,190 --> 00:35:06,890 To oznacza, że ​​gdzieś w stercie jest zero bajtów po bloku wielkości 40 809 00:35:06,890 --> 00:35:07,620 jest przydzielona. 810 00:35:07,620 --> 00:35:10,610 Pozwól mi pomniejszyć tutaj i zobaczyć, czy to jest trochę bardziej pomocny. 811 00:35:10,610 --> 00:35:11,410 Ciekawe. 812 00:35:11,410 --> 00:35:15,600 40 bajty są zdecydowanie stracił w rekordowym strat 1 1. 813 00:35:15,600 --> 00:35:17,840 Ponownie, więcej słów niż jest przydatne. 814 00:35:17,840 --> 00:35:21,350 Ale w oparciu o zaznaczonych linii, gdzie powinienem chyba skupić moje 815 00:35:21,350 --> 00:35:24,070 uwagę na kolejny błąd? 816 00:35:24,070 --> 00:35:26,570 Wygląda na linii 20 memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Tak więc, jeśli wrócimy do linii 20, to jeden zidentyfikowany wcześniej. 818 00:35:30,990 --> 00:35:33,030 I to niekoniecznie buggy. 819 00:35:33,030 --> 00:35:35,160 Ale my tego odwrócić jego skutki. 820 00:35:35,160 --> 00:35:38,790 Więc jak mam poprawić co najmniej jeden z tych błędów? 821 00:35:38,790 --> 00:35:42,240 Co mogłem zrobić po linii 21? 822 00:35:42,240 --> 00:35:47,110 Mogłem zrobić bez x, więc jest oddać, że pamięć. 823 00:35:47,110 --> 00:35:49,230 I w jaki sposób rozwiązać ten problem? 824 00:35:49,230 --> 00:35:52,120 Należy na pewno tam nie dalej niż 0. 825 00:35:52,120 --> 00:35:53,670 Więc pozwól mi spróbować ponownie uruchomić to. 826 00:35:53,670 --> 00:35:56,080 Niestety, na pewno go nie dalej niż 9. 827 00:35:56,080 --> 00:35:57,510 Producent pamięci. 828 00:35:57,510 --> 00:36:00,650 Pozwól mi ponownie uruchomić Valgrind w większym oknie. 829 00:36:00,650 --> 00:36:01,580 A teraz wygląda. 830 00:36:01,580 --> 00:36:02,250 Miło. 831 00:36:02,250 --> 00:36:03,270 Wszystkie bloki kupa zostali uwolnieni. 832 00:36:03,270 --> 00:36:04,270 Brak przecieków są możliwe. 833 00:36:04,270 --> 00:36:07,520 A w górze tutaj, nie ma wzmianki nic więcej z nieważnego prawa. 834 00:36:07,520 --> 00:36:09,820 >> Wystarczy dostać chciwi, i niech to czy inna demonstracja 835 00:36:09,820 --> 00:36:11,050 nie wychodzi zgodnie z planem - 836 00:36:11,050 --> 00:36:12,560 I udało się poszczęści chwilą. 837 00:36:12,560 --> 00:36:15,530 Oraz fakt, że jest to być może 0 niepotrzebnie mylące. 838 00:36:15,530 --> 00:36:20,650 Zróbmy 50, nieco arbitralny liczba, marka pamięci dot pamięci slash - 839 00:36:20,650 --> 00:36:21,410 nadal miał szczęście. 840 00:36:21,410 --> 00:36:22,510 Nic się nie upaść. 841 00:36:22,510 --> 00:36:26,150 Załóżmy, że po prostu zrobić coś naprawdę głupi, a ja 100. 842 00:36:26,150 --> 00:36:30,360 Pozwól mi przerobić pamięć, dot slash pamięci - 843 00:36:30,360 --> 00:36:31,075 szczęście ponownie. 844 00:36:31,075 --> 00:36:32,800 Jak o 1000? 845 00:36:32,800 --> 00:36:35,370 ints poza, z grubsza, gdzie mam być? 846 00:36:35,370 --> 00:36:37,410 Producent pamięci - 847 00:36:37,410 --> 00:36:38,570 cholera. 848 00:36:38,570 --> 00:36:39,920 >> [Śmiech] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Niech nie zadzieraj już. 851 00:36:43,920 --> 00:36:45,120 Uruchom ponownie pamięć. 852 00:36:45,120 --> 00:36:45,840 Proszę bardzo. 853 00:36:45,840 --> 00:36:46,410 Dobrze. 854 00:36:46,410 --> 00:36:52,500 Więc widocznie jesteś index 100000 ints poza to, gdzie powinno być w 855 00:36:52,500 --> 00:36:54,410 pamięć, złe rzeczy się zdarzają. 856 00:36:54,410 --> 00:36:56,430 Więc to nie jest oczywiście twardy, szybki przepis. 857 00:36:56,430 --> 00:36:58,190 I niby za pomocą próby i błędów, aby się tam dostać. 858 00:36:58,190 --> 00:37:02,230 Ale to dlatego, że, krótko mówiąc, pamięci komputera jest podzielony 859 00:37:02,230 --> 00:37:03,580 do tych rzeczy zwane segmentami. 860 00:37:03,580 --> 00:37:07,260 A czasami, komputer faktycznie dał wam trochę więcej pamięci 861 00:37:07,260 --> 00:37:08,400 niż prosić. 862 00:37:08,400 --> 00:37:12,170 Ale dla wydajności, to jest po prostu łatwiej uzyskać więcej pamięci, ale tylko powiedzieć, 863 00:37:12,170 --> 00:37:13,780 że dostajesz jego część. 864 00:37:13,780 --> 00:37:16,370 >> A jeśli będziesz miał szczęście czasem, w związku z tym, może być w stanie dotknąć 865 00:37:16,370 --> 00:37:17,795 Pamięć, która nie należy do Ciebie. 866 00:37:17,795 --> 00:37:21,860 Nie masz gwarancji, że to, co wartość umieścić tam pozostanie tam, bo 867 00:37:21,860 --> 00:37:25,080 komputer nadal uważa, że ​​nie jest Ciebie, ale to nie koniecznie będzie 868 00:37:25,080 --> 00:37:29,910 trafić kolejny segment pamięci w komputer i wywołać błąd jak 869 00:37:29,910 --> 00:37:31,710 ten tutaj. 870 00:37:31,710 --> 00:37:32,060 Dobrze. 871 00:37:32,060 --> 00:37:37,240 Wszelkie pytania następnie w pamięci? 872 00:37:37,240 --> 00:37:37,590 >> Dobrze. 873 00:37:37,590 --> 00:37:40,610 Rzućmy okiem tutaj, a następnie, w coś byliśmy biorąc za 874 00:37:40,610 --> 00:37:48,361 przyznane przez dość długi czas, który jest w tym pliku o nazwie cs50.h. 875 00:37:48,361 --> 00:37:49,420 Więc to jest plik. 876 00:37:49,420 --> 00:37:51,130 Są to po prostu cała masa z komentarzy do góry góry. 877 00:37:51,130 --> 00:37:53,900 A może masz spojrzał na to, czy Ci grzebali na urządzeniu. 878 00:37:53,900 --> 00:37:57,000 Ale okazuje się, że przez cały czas, kiedy używałem ciąg jako 879 00:37:57,000 --> 00:38:01,130 synonimem, za pomocą których zadeklarowaliśmy że synonimem był z tego 880 00:38:01,130 --> 00:38:03,990 słowo kluczowe typedef dla definicji typu. 881 00:38:03,990 --> 00:38:07,500 A my w zasadzie powiedzieć, zrobić ciąg synonim dla char gwiazdy. 882 00:38:07,500 --> 00:38:11,190 Że środki, które stosu stworzył te kółka, znane jako 883 00:38:11,190 --> 00:38:12,040 ciąg. 884 00:38:12,040 --> 00:38:14,830 >> Teraz tutaj jest tylko prototyp dla getchar. 885 00:38:14,830 --> 00:38:17,350 Może Widzieliśmy to już wcześniej, ale to jest w istocie to, co robi. getchar 886 00:38:17,350 --> 00:38:19,070 nie przyjmuje żadnych argumentów, zwraca char. 887 00:38:19,070 --> 00:38:21,340 GetDouble ma żadnych argumentów, zwraca double. 888 00:38:21,340 --> 00:38:24,440 GetFloat ma żadnych argumentów, zwraca pływak, i tak dalej. 889 00:38:24,440 --> 00:38:27,270 getInt jest tutaj. getlonglong jest tutaj. 890 00:38:27,270 --> 00:38:28,820 I getstring jest tutaj. 891 00:38:28,820 --> 00:38:29,420 I to jest to. 892 00:38:29,420 --> 00:38:33,080 Ta fioletowa linia jest kolejnym preprocessor dyrektywa z powodu 893 00:38:33,080 --> 00:38:35,550 hashtag na początku tego. 894 00:38:35,550 --> 00:38:35,870 >> Dobrze. 895 00:38:35,870 --> 00:38:38,380 Więc teraz pozwól mi iść do cs50.c. 896 00:38:38,380 --> 00:38:40,400 A my nie będziemy rozmawiać zbyt długo na ten temat. 897 00:38:40,400 --> 00:38:43,280 Ale daje wgląd co trwa to wszystko 898 00:38:43,280 --> 00:38:46,434 czas, pozwól mi przejść do - 899 00:38:46,434 --> 00:38:48,250 zróbmy getchar. 900 00:38:48,250 --> 00:38:51,050 Więc getchar jest głównie komentarze. 901 00:38:51,050 --> 00:38:52,060 Ale wygląda to tak. 902 00:38:52,060 --> 00:38:54,800 Więc to jest rzeczywista funkcja getchar, że byliśmy 903 00:38:54,800 --> 00:38:56,055 biorąc za pewnik istnieje. 904 00:38:56,055 --> 00:38:59,370 I choć nie mamy korzystać z tego jeden , że często, jeśli w ogóle, to co najmniej 905 00:38:59,370 --> 00:39:00,470 stosunkowo proste. 906 00:39:00,470 --> 00:39:02,580 Więc warto poświęcić Szybkie spojrzenie na tutaj. 907 00:39:02,580 --> 00:39:06,540 >> Więc getchar ma nieskończoną pętlę, celowo tak widocznie. 908 00:39:06,540 --> 00:39:10,050 Następnie wywołuje - i jest to rodzaj ładne ponowne wykorzystanie kodu sami napisali. 909 00:39:10,050 --> 00:39:11,220 Wzywa getstring. 910 00:39:11,220 --> 00:39:12,460 Bo to, co robi znaczy dostać char? 911 00:39:12,460 --> 00:39:14,730 Cóż, równie dobrze można postarać się Cała linia tekstu od użytkownika i 912 00:39:14,730 --> 00:39:16,940 a potem po prostu patrzeć na jednego z tych znaków. 913 00:39:16,940 --> 00:39:19,170 W linii 60, tutaj jest trochę trochę sprawdzenia poczytalności. 914 00:39:19,170 --> 00:39:21,610 Jeśli getstring zwrócony NULL, niech nie kontynuować. 915 00:39:21,610 --> 00:39:22,820 Coś poszło nie tak. 916 00:39:22,820 --> 00:39:28,120 >> Teraz jest to nieco irytujące, ale konwencjonalnych w C. char max prawdopodobnie 917 00:39:28,120 --> 00:39:29,960 reprezentuje to, co właśnie na podstawie jego nazwy? 918 00:39:29,960 --> 00:39:31,670 To jest stała. 919 00:39:31,670 --> 00:39:36,040 To tak jak z wartości numerycznych Największy char można reprezentować w 920 00:39:36,040 --> 00:39:40,370 jeden kęs, który jest prawdopodobnie numer 255, który jest największym numer 921 00:39:40,370 --> 00:39:42,720 reprezentują osiem bitów, zaczynając od zera. 922 00:39:42,720 --> 00:39:47,460 Tak mi to wykorzystać, w tej funkcji, gdy pisząc ten kod, tylko dlatego, 923 00:39:47,460 --> 00:39:51,753 jeśli coś pójdzie nie tak, ale w getchar jego celem w życiu jest, aby powrócić 924 00:39:51,753 --> 00:39:54,830 char, trzeba w jakiś sposób być w stanie aby zasygnalizować użytkownikowi, że 925 00:39:54,830 --> 00:39:55,840 coś poszło nie tak. 926 00:39:55,840 --> 00:39:56,970 Nie możemy wrócić null. 927 00:39:56,970 --> 00:39:58,480 Okazuje się, że jest null pointer. 928 00:39:58,480 --> 00:40:01,030 I znowu, getchar ma powrót char. 929 00:40:01,030 --> 00:40:04,760 >> Więc konwencji, jeśli coś pójdzie nie nie tak, to ty, programista, lub w 930 00:40:04,760 --> 00:40:08,160 ta sprawa, mnie z biblioteki, miałem tylko zdecydować arbitralnie, jeśli 931 00:40:08,160 --> 00:40:12,230 coś pójdzie nie tak, mam zamiar zwraca liczbę 255, co jest naprawdę 932 00:40:12,230 --> 00:40:17,240 Oznacza to, że nie możemy, użytkownik może nie wpisywać Znak reprezentowany przez 933 00:40:17,240 --> 00:40:21,410 numer 255, ponieważ mieliśmy ukraść jako tzw wartości wskaźnikowych dla 934 00:40:21,410 --> 00:40:23,410 stanowią problem. 935 00:40:23,410 --> 00:40:27,010 Teraz okazuje się, że postać 255 nie jest czymś, co można wpisać na 936 00:40:27,010 --> 00:40:28,380 klawiatura, więc jest to nic wielkiego. 937 00:40:28,380 --> 00:40:30,910 Użytkownik nie zauważy, że I ukradli tę postać. 938 00:40:30,910 --> 00:40:34,620 Ale jeśli kiedykolwiek zobaczyć na stronach człowieka na System komputerowy pewne odniesienie do 939 00:40:34,620 --> 00:40:38,560 wszystkie caps stała jak ten, który mówi, w przypadku błędu może to stała 940 00:40:38,560 --> 00:40:42,720 być zwrócone, to wszystko jakiś człowiek zrobił lat temu postanowił arbitralnie 941 00:40:42,720 --> 00:40:45,680 zwrócić szczególną wartość i Nazywamy to stała w przypadku 942 00:40:45,680 --> 00:40:46,840 coś pójdzie nie tak. 943 00:40:46,840 --> 00:40:48,580 >> Teraz magia dzieje się tutaj. 944 00:40:48,580 --> 00:40:52,600 Po pierwsze, jestem deklarując w linii 67 Dwa znaki, C1 i C2. 945 00:40:52,600 --> 00:40:57,080 A następnie w linii 68, jest w rzeczywistości linii kodu to przypomina 946 00:40:57,080 --> 00:41:01,140 nasz przyjaciel printf, zważywszy, że ma procent Cs w cudzysłów. 947 00:41:01,140 --> 00:41:06,490 Zauważmy jednak, co się tutaj dzieje. sscanf oznacza skanowanie ciąg - 948 00:41:06,490 --> 00:41:11,690 oznacza skanowanie sformatowany ciąg, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 Co to znaczy? 950 00:41:12,590 --> 00:41:16,310 Oznacza to, że przechodzą do sscanf ciąg. 951 00:41:16,310 --> 00:41:18,420 A wiersz jest cokolwiek użytkownik wpisze w. 952 00:41:18,420 --> 00:41:23,520 Możesz przejść do sscanf ciąg formatu, takich jak ten, który mówi, co jest scanf 953 00:41:23,520 --> 00:41:25,870 Masz nadzieję użytkownik wpisał w. 954 00:41:25,870 --> 00:41:29,730 Następnie przejść w adresach dwóch fragmenty pamięci, w tym przypadku, 955 00:41:29,730 --> 00:41:31,150 bo mam dwie zastępcze. 956 00:41:31,150 --> 00:41:34,610 Więc mam zamiar dać mu adres C1 oraz adres C2. 957 00:41:34,610 --> 00:41:37,700 >> I przypominam sobie, że dajesz funkcji adres jakiejś zmiennej, co jest 958 00:41:37,700 --> 00:41:38,950 implikacja? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Co można, że ​​funkcja zrobić w wyniku o nadanie jej adres 961 00:41:45,050 --> 00:41:48,170 zmienne, w przeciwieństwie do sama zmienna? 962 00:41:48,170 --> 00:41:49,450 Może to zmienić, prawda? 963 00:41:49,450 --> 00:41:53,250 Jeśli miał ktoś mapę do fizycznego adres, mogą tam pójść i zrobić 964 00:41:53,250 --> 00:41:54,750 co chcą się pod tym adresem. 965 00:41:54,750 --> 00:41:55,800 Sama idea tutaj. 966 00:41:55,800 --> 00:41:59,950 Jeśli przejdziemy do sscanf, adres, dwóch fragmenty pamięci, nawet te małe 967 00:41:59,950 --> 00:42:03,585 małe kawałki pamięci, C1 i C2, ale możemy powiedzieć, że adres z nich, 968 00:42:03,585 --> 00:42:05,170 sscanf można go zmienić. 969 00:42:05,170 --> 00:42:08,530 >> Więc celem sscanf w życiu, jeśli czytamy strona man jest przeczytać, co 970 00:42:08,530 --> 00:42:13,420 użytkownik wpisze w, nadzieja dla użytkownika posiadającego wpisane w charakter, a może 971 00:42:13,420 --> 00:42:16,470 inny charakter, a co użytkownik wpisany pierwszy znak idzie 972 00:42:16,470 --> 00:42:19,310 tu, drugi idzie tutaj. 973 00:42:19,310 --> 00:42:22,470 Teraz, jak na bok, to i byś tylko wiem to z dokumentacji, 974 00:42:22,470 --> 00:42:25,570 Fakt, że mogę umieścić tam puste miejsce po prostu oznacza, że ​​nie obchodzi mnie, czy 975 00:42:25,570 --> 00:42:28,440 użytkownik wciśnie spację kilka razy, zanim on lub ona ma 976 00:42:28,440 --> 00:42:30,400 charakter, będę ignorować wszelkie spacje. 977 00:42:30,400 --> 00:42:32,510 Tak, wiem ze dokumentacja. 978 00:42:32,510 --> 00:42:36,570 >> Fakt, że istnieje drugi c% następnie spacje jest rzeczywiście 979 00:42:36,570 --> 00:42:37,410 celowe. 980 00:42:37,410 --> 00:42:41,190 Chcę być w stanie wykryć, czy użytkownik wkręca się, albo nie współpracowały. 981 00:42:41,190 --> 00:42:45,630 Więc mam nadzieję, że użytkownik tylko wpisane w jednej postaci, w związku z tym mam nadzieję, 982 00:42:45,630 --> 00:42:50,640 że sscanf tylko będzie wrócić wartość 1, ponieważ, ponownie, gdy czytam 983 00:42:50,640 --> 00:42:55,400 dokumentacji, celem jest w sscanf życia jest powrót do liczby 984 00:42:55,400 --> 00:42:59,170 zmienne, które zostały wypełnione z danych wprowadzanych przez użytkownika. 985 00:42:59,170 --> 00:43:02,270 >> Minąłem dwóch zmiennych adresy, C1 i C2. 986 00:43:02,270 --> 00:43:06,420 Mam nadzieję jednak, że tylko jeden z nich ginie, bo jeśli sscanf 987 00:43:06,420 --> 00:43:11,130 zwraca 2, co jest przypuszczalnie implikacja logicznie? 988 00:43:11,130 --> 00:43:14,600 Że użytkownik nie daj mi jeden postaci jak powiedziałem niego. 989 00:43:14,600 --> 00:43:17,860 Prawdopodobnie wpisane na najmniej dwa znaki. 990 00:43:17,860 --> 00:43:22,430 Jeśli więc zamiast nie ma sekundy C%, miałem tylko jeden, który 991 00:43:22,430 --> 00:43:25,370 szczerze mówiąc byłoby bardziej intuicyjne podejście, myślę, że na pierwszy rzut oka, 992 00:43:25,370 --> 00:43:30,220 nie będziemy w stanie wykryć jeśli użytkownik został dając więcej 993 00:43:30,220 --> 00:43:31,780 Wejście niż faktycznie chciał. 994 00:43:31,780 --> 00:43:34,100 Więc to jest niejawna forma od sprawdzania błędów. 995 00:43:34,100 --> 00:43:35,640 >> Zauważmy jednak, co robię tutaj. 996 00:43:35,640 --> 00:43:39,970 Kiedy jestem pewien, że użytkownik dał mi jedną charakter, I zwolnić linię, robi 997 00:43:39,970 --> 00:43:44,450 Przeciwieństwem getString, co z kolei używa malloc, a potem wrócę 998 00:43:44,450 --> 00:43:51,030 C1, znak, że miałem nadzieję, Użytkownik pod warunkiem i tylko pod warunkiem,. 999 00:43:51,030 --> 00:43:54,680 Więc szybko dostrzegła tylko, ale Wszelkie pytania dotyczące getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Wrócimy do niektórych innych. 1002 00:43:59,590 --> 00:44:03,770 >> Cóż, pozwól mi iść dalej i zrobić to - Załóżmy teraz, tylko motywować nasze 1003 00:44:03,770 --> 00:44:08,910 Dyskusja w tygodniu plus czas, to jest plik o nazwie structs.h. 1004 00:44:08,910 --> 00:44:11,440 I znowu, to tylko smak czegoś, co nas czeka. 1005 00:44:11,440 --> 00:44:13,090 Ale zauważ, że wiele tego jest komentarzy. 1006 00:44:13,090 --> 00:44:17,440 Więc pozwól mi zaznaczyć tylko Interesującą częścią teraz. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 tam, że same hasła ponownie. 1009 00:44:19,700 --> 00:44:23,100 typedef używamy zadeklarować ciąg jako szczególny rodzaj danych. 1010 00:44:23,100 --> 00:44:27,490 Możesz użyć typedef stworzyć zupełnie nowe Typy danych, które nie istniały, gdy 1011 00:44:27,490 --> 00:44:28,570 C została wymyślona. 1012 00:44:28,570 --> 00:44:32,520 Na przykład, int pochodzi z C. char pochodzi z C. podwójne pochodzi z C. Ale 1013 00:44:32,520 --> 00:44:34,000 nie ma pojęcie ucznia. 1014 00:44:34,000 --> 00:44:37,230 A przecież byłoby to całkiem przydatna jest w stanie napisać program, który przechowuje 1015 00:44:37,230 --> 00:44:40,440 w zmiennej, student numer ID, ich nazwy, a ich dom. 1016 00:44:40,440 --> 00:44:42,890 Innymi słowy, trzy kawałki danych, jak i int 1017 00:44:42,890 --> 00:44:44,420 smyczkowy i inny napis. 1018 00:44:44,420 --> 00:44:48,220 >> Z typedef, co jest dość mocny o tym i sturct słów kluczowych dla 1019 00:44:48,220 --> 00:44:53,660 struktura, to, programista w 2013 r., rzeczywiście może zdefiniować własne 1020 00:44:53,660 --> 00:44:57,530 Typy danych, które nie istniały lat temu, ale że własnych celów. 1021 00:44:57,530 --> 00:45:01,910 I tak oto, w wierszach od 13 do 19, jesteśmy deklarując nowy typ danych, jak 1022 00:45:01,910 --> 00:45:04,320 int, ale nazywając go uczeń. 1023 00:45:04,320 --> 00:45:09,310 A w środku tej zmiennej będzie są trzy rzeczy - int, string, 1024 00:45:09,310 --> 00:45:09,930 i łańcuch. 1025 00:45:09,930 --> 00:45:13,040 Więc można pomyśleć, co naprawdę tu się stało, choć jest to 1026 00:45:13,040 --> 00:45:17,160 trochę uproszczeń na dzisiaj, Student jest w istocie dzieje 1027 00:45:17,160 --> 00:45:19,450 wyglądać tak. 1028 00:45:19,450 --> 00:45:22,580 Jej będzie fragment pamięci z identyfikatorem, nazwa 1029 00:45:22,580 --> 00:45:25,580 pole, a pole dom. 1030 00:45:25,580 --> 00:45:30,670 I będziemy w stanie wykorzystać te kawałki pamięć i dostęp do nich w następujący sposób. 1031 00:45:30,670 --> 00:45:38,870 >> Jeśli pójdę do struct0.c, tu jest stosunkowo długi, ale po 1032 00:45:38,870 --> 00:45:42,630 wzór, kodu, który wykorzystuje tę nową sztuczkę. 1033 00:45:42,630 --> 00:45:45,790 Więc po pierwsze, chciałbym zwrócić uwagę do interesujących części góry szczyt. 1034 00:45:45,790 --> 00:45:49,670 Ostry definiuje studentów 3, deklaruje stałe zwane studentów i osób przypisanych 1035 00:45:49,670 --> 00:45:53,450 to arbitralnie numer 3, po prostu więc mam trzech uczniów przy użyciu 1036 00:45:53,450 --> 00:45:54,830 ten program na teraz. 1037 00:45:54,830 --> 00:45:55,960 Nadchodzi Main. 1038 00:45:55,960 --> 00:45:58,860 I zauważ, w jaki sposób zadeklarować array studentów? 1039 00:45:58,860 --> 00:46:00,480 Cóż, po prostu użyć tej samej składni. 1040 00:46:00,480 --> 00:46:02,110 Student słowo jest oczywiście nowy. 1041 00:46:02,110 --> 00:46:04,790 Ale studentów, klasy, uczniowie wsporniku. 1042 00:46:04,790 --> 00:46:06,720 >> Tak niestety jest wiele ponownego użycia terminów tutaj. 1043 00:46:06,720 --> 00:46:07,660 To jest tylko numer. 1044 00:46:07,660 --> 00:46:09,040 Tak to jest jak mówienie, trzy. 1045 00:46:09,040 --> 00:46:11,430 Klasa jest tylko to, co chcę zadzwonić zmienną. 1046 00:46:11,430 --> 00:46:12,840 Mogę nazwać to studenci. 1047 00:46:12,840 --> 00:46:15,880 Ale klasa, to nie jest klasa w obiektowym rodzaju Java drogi. 1048 00:46:15,880 --> 00:46:17,220 To jest po prostu klasa studentów. 1049 00:46:17,220 --> 00:46:20,590 I typ danych każdego elementu w tej tablicy jest studentem. 1050 00:46:20,590 --> 00:46:23,040 Więc to jest trochę inaczej i od mówi coś 1051 00:46:23,040 --> 00:46:25,250 tak, to jest po prostu - 1052 00:46:25,250 --> 00:46:29,500 Mówię, że mi trzech studentów i nazywają to klasa Array. 1053 00:46:29,500 --> 00:46:29,800 >> Dobrze. 1054 00:46:29,800 --> 00:46:30,680 Teraz tutaj jest cztery loop. 1055 00:46:30,680 --> 00:46:33,480 Ten facet zna - iterate od zero do trzech. 1056 00:46:33,480 --> 00:46:35,160 A oto nowy kawałek składni. 1057 00:46:35,160 --> 00:46:37,710 Program będzie zapyta mnie, człowieka, aby dać mu studenta 1058 00:46:37,710 --> 00:46:39,200 ID, który jest int. 1059 00:46:39,200 --> 00:46:44,650 A oto składnia, z którymi można zapisać coś w ID pola na 1060 00:46:44,650 --> 00:46:48,630 Położenie klasy I. Więc wspornik składnia ta nie jest nowa. 1061 00:46:48,630 --> 00:46:51,450 To po prostu oznacza, daj mi ósmy uczeń w klasie. 1062 00:46:51,450 --> 00:46:52,940 Ale ten symbol jest nowy. 1063 00:46:52,940 --> 00:46:56,320 Aż do teraz, my nie możemy stosować kropkę, przynajmniej w code tak. 1064 00:46:56,320 --> 00:47:01,490 Oznacza to, przejdź do struktury zwanej studentów i umieścić coś tam. 1065 00:47:01,490 --> 00:47:05,670 Podobnie w tym następnej linii, 31, przejdź do przodu i umieścić co użytkownik wpisze 1066 00:47:05,670 --> 00:47:10,530 o nazwę tu i to, co robią dla dom, to samo, śmiało 1067 00:47:10,530 --> 00:47:13,230 umieścić go w. domu. 1068 00:47:13,230 --> 00:47:15,955 >> Więc co robi ten program w końcu zrobić? 1069 00:47:15,955 --> 00:47:17,220 Można zobaczyć trochę liścik tam. 1070 00:47:17,220 --> 00:47:24,780 Pozwólcie mi iść do przodu i rób elemencie 0 dot slash struct 0, ID studenta 1, 1071 00:47:24,780 --> 00:47:28,250 mówi David Mather, student ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 i jedyne co ten program tak, który jest po prostu całkowicie arbitralne, jest 1075 00:47:38,380 --> 00:47:40,980 Chciałem zrobić coś z tymi danymi, teraz, że już nauczył nas 1076 00:47:40,980 --> 00:47:43,450 używać przypisać struktury, jest po prostu miałem ta dodatkowa pętla tutaj. 1077 00:47:43,450 --> 00:47:45,260 I iteracji tablicy studentów. 1078 00:47:45,260 --> 00:47:49,170 Kiedyś nasze, być może teraz znajomy znajomego, ciąg porównania stircomp do 1079 00:47:49,170 --> 00:47:53,780 Sprawdzanie jest 8-ga dom studenta równa Mather? 1080 00:47:53,780 --> 00:47:56,760 A jeśli tak, to po prostu wydrukować coś arbitralnie jak, tak, to jest. 1081 00:47:56,760 --> 00:47:59,430 Ale znowu, po prostu daje mi możliwości wielokrotne korzystanie i 1082 00:47:59,430 --> 00:48:02,270 ponownie ten nowy zapis kropka. 1083 00:48:02,270 --> 00:48:03,250 >> Więc kogo to obchodzi, prawda? 1084 00:48:03,250 --> 00:48:06,270 Wymyślanie studenckiego programu nieco arbitralny, ale okazuje się, 1085 00:48:06,270 --> 00:48:09,800 że możemy zrobić przydatne rzeczy z To, na przykład, w następujący sposób. 1086 00:48:09,800 --> 00:48:14,600 To jest znacznie bardziej skomplikowane struct w C. Jest tam kilkanaście lub więcej pól, 1087 00:48:14,600 --> 00:48:15,880 nieco tajemniczo nazwane. 1088 00:48:15,880 --> 00:48:20,110 Ale jeśli kiedykolwiek słyszał o grafice Format pliku o nazwie bitmap, BMP, to 1089 00:48:20,110 --> 00:48:22,830 Okazuje się, że format pliku bitmapy prawie wygląda, że ​​ta. 1090 00:48:22,830 --> 00:48:24,200 To głupi mały face Smiley. 1091 00:48:24,200 --> 00:48:27,840 Jest to mały obraz, który mam w powiększeniu on dość duży, abym mógł zobaczyć każdy 1092 00:48:27,840 --> 00:48:30,410 z poszczególnych punktów lub pikseli. 1093 00:48:30,410 --> 00:48:33,800 Teraz okazuje się, możemy reprezentować Czarna kropka, powiedzmy, numer 0. 1094 00:48:33,800 --> 00:48:35,520 A białe kropki z numerem 1. 1095 00:48:35,520 --> 00:48:39,140 >> Więc innymi słowy, jeśli chcesz zwrócić Uśmiechnięta twarz i zapisać, że obraz w 1096 00:48:39,140 --> 00:48:42,680 komputer, wystarczy zapisać zera i te, które wyglądają jak ta, gdzie 1097 00:48:42,680 --> 00:48:45,250 znowu, te są białe i zera są czarne. 1098 00:48:45,250 --> 00:48:48,290 I razem, jeśli faktycznie mają gird zer i jedynek, trzeba 1099 00:48:48,290 --> 00:48:51,030 Siatka pikseli, a jeśli świeckich je, masz ładny 1100 00:48:51,030 --> 00:48:52,560 little face Smiley. 1101 00:48:52,560 --> 00:48:58,150 Teraz bitmap format pliku BMP, jest skutecznie, że pod maską, 1102 00:48:58,150 --> 00:49:00,970 ale z pikseli więcej SOT, że może faktycznie reprezentować barwy. 1103 00:49:00,970 --> 00:49:05,170 >> Ale gdy masz bardziej wyrafinowane formatów plików, takich jak BMP i JPEG i GIF 1104 00:49:05,170 --> 00:49:09,360 , z którymi mogą się zapoznać, te pliki na dysku zazwyczaj nie tylko 1105 00:49:09,360 --> 00:49:13,760 mają zer i jedynek dla pikseli, ale mają pewne metadane, a także - 1106 00:49:13,760 --> 00:49:16,960 meta w tym sensie, że nie jest to danych, ale jest to przydatne. 1107 00:49:16,960 --> 00:49:21,370 Więc te pola są tu co oznacza, i Zobaczymy to bardziej szczegółowo w P-set 1108 00:49:21,370 --> 00:49:25,810 5, że przed zer i jedynek, które reprezentują pikseli obrazu, 1109 00:49:25,810 --> 00:49:29,110 istnieje kilka metadanych jak rozmiar obrazu i 1110 00:49:29,110 --> 00:49:30,250 szerokość obrazu. 1111 00:49:30,250 --> 00:49:32,910 I zauważyć, jestem wyrywanie off niektóre dowolne rzeczy tutaj - 1112 00:49:32,910 --> 00:49:34,260 szerokość i wysokość. 1113 00:49:34,260 --> 00:49:36,160 Ilość bitów i kilka innych rzeczy. 1114 00:49:36,160 --> 00:49:37,840 Więc jest jakiś metadanych w pliku. 1115 00:49:37,840 --> 00:49:41,470 >> Ale by zrozumieć, jak pliki są zawarte w ten sposób można rzeczywiście 1116 00:49:41,470 --> 00:49:45,890 następnie przetwarzanie obrazów, odzyskać obrazy z dysku, zmienić rozmiar zdjęć. 1117 00:49:45,890 --> 00:49:47,560 Ale nie możesz zawsze zwiększenia ich. 1118 00:49:47,560 --> 00:49:48,480 I potrzebne zdjęcie. 1119 00:49:48,480 --> 00:49:52,840 Wróciłem więc do RJ tutaj, który obejrzałeś na ekranie jakiś czas temu. 1120 00:49:52,840 --> 00:49:57,160 A jeśli otworzy Keynote tutaj, to jest co się dzieje, jeśli starają się powiększać i 1121 00:49:57,160 --> 00:49:59,380 zwiększenia RJ. 1122 00:49:59,380 --> 00:50:01,480 On nie jest coraz lepiej naprawdę. 1123 00:50:01,480 --> 00:50:06,240 Teraz Keynote jest rodzaj rozmycia to trochę, tylko do zatuszowania 1124 00:50:06,240 --> 00:50:11,040 Fakt, że RJ nie dostać szczególnie wzmocnione, gdy powiększyć obraz 1125 00:50:11,040 --> 00:50:13,310 A jeśli zrobić to w ten sposób, zobacz kwadraty? 1126 00:50:13,310 --> 00:50:15,490 Tak, można z pewnością zobaczyć kwadraty na projektorze. 1127 00:50:15,490 --> 00:50:17,690 >> To jest to, co dostajesz, kiedy zwiększyć. 1128 00:50:17,690 --> 00:50:22,570 Ale w zrozumieniu, jak nasze RJ lub Uśmiechnięta buźka jest realizowany pozwoli nam 1129 00:50:22,570 --> 00:50:24,950 faktycznie napisać kod, który manipuluje te rzeczy. 1130 00:50:24,950 --> 00:50:29,970 A ja myślałem, że skończy się na tej nucie, z 55 sekund o wzmocnienia to, 1131 00:50:29,970 --> 00:50:31,230 Śmiem, powiedzmy raczej mylące. 1132 00:50:31,230 --> 00:50:32,990 >> [PLAYBACK VIDEO] 1133 00:50:32,990 --> 00:50:34,790 >> -On kłamie. 1134 00:50:34,790 --> 00:50:38,310 O czym, nie wiem. 1135 00:50:38,310 --> 00:50:41,200 >> -Więc co wiemy? 1136 00:50:41,200 --> 00:50:45,280 >> -To na 09:15 Ray Santoya był w bankomacie. 1137 00:50:45,280 --> 00:50:47,830 >> -Więc pytanie, co robił na 09:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Fotografowanie dziewięć milimetrów na coś. 1139 00:50:50,750 --> 00:50:52,615 Może widział snajpera. 1140 00:50:52,615 --> 00:50:54,760 >> -A może z nim pracować. 1141 00:50:54,760 --> 00:50:56,120 >> -Czekaj. 1142 00:50:56,120 --> 00:50:57,450 Wróć jeden. 1143 00:50:57,450 --> 00:50:58,700 >> -Co widzisz? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Przynieś swoją twarz w górę, na pełnym ekranie. 1146 00:51:09,490 --> 00:51:09,790 >> -Jego okulary. 1147 00:51:09,790 --> 00:51:11,040 >> -Nie ma refleksji. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -To jest drużyna baseballowa Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 To jest ich logo. 1151 00:51:24,530 --> 00:51:27,040 >> -A on mówi do każdego, kto jest sobie tę kurtkę. 1152 00:51:27,040 --> 00:51:27,530 >> [END PLAYBACK VIDEO] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. MALAN: będzie być ustawiony Problem 5. 1154 00:51:29,180 --> 00:51:30,720 Do zobaczenia w przyszłym tygodniu. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: Na następnym CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Świerszcze ćwierkają] 1157 00:51:39,240 --> 00:51:41,270 >> [Odtwarzanie muzyki]