[MUZYKA GRA] ROB Boden: W porządku. Więc, po pierwsze pierwszą rzeczą, wideo ze znajomą twarz. [ODTWARZANIE] -Wszystko w porządku. Jest CS50, a to Początek trzech tygodni. Przykro mi, że nie mogłem być tam z wami dzisiaj, ale pozwolić mi przedstawić CS50 własnej Rob Boden. [KONIEC ODTWARZANIE WIDEO] [Aplauz i CHEERS] ROB Boden: filmografia w że film jest fantastyczny. Dobrze. Więc po pierwsze, że jest inny obiad. To jutro o 1:15. Nie ma lunchu w piątek. Jest z Quora. I Tommy jeszcze nie ma, ale jeden z ludzie tam jest były szef, CF Tommy McWilliam. Więc jest zabawa facet. Powinieneś przyjść. Dobrze. Tak więc w zeszłym tygodniu rozpoczęliśmy łamanie oprócz o tym, co naprawdę jest ciąg. Wiedzieliśmy od początku, że to sekwencja znaków. Ale w zeszłym tygodniu, że zagłębił się faktem że to, co jest naprawdę sekwencja znaków, dobrze, teraz mamy tablice znaków. I wiemy, że ciąg, to tablica znaków, na samym końcu, mamy ten specjalny bajt null, to backslash 0, który wskazuje koniec ciąg. A więc ciąg jest tablicą znaków, ale możemy mieć więcej niż tylko tablica znaków, możemy mieć tablicę dowolnego typu rzeczy chcemy. Tak więc, jeśli przypomnieć, z ostatniego tygodnia, Program wprowadzony Dawid wieków bardzo szybko. Tak więc pierwszą rzeczą, którą zamierzamy zrobić, to zwrócić się do użytkownika o liczbę całkowitą, liczba osób w pokoju. Kiedy już mamy tę liczbę całkowitą, my deklarując tablicę. Zauważ składni wspornika. Masz zamiar się do tego przyzwyczaić. Więc my deklarując tablicę liczb całkowitych zwane grupy wiekowe, a są n liczbami całkowitymi w tej tablicy. Więc ten wzór tutaj, to 4 int i jest równe 0, i jest mniejsza niż n, i Plus oraz, który także będzie wzór że można się bardzo przyzwyczajeni. Bo to jest dość dużo, jak jesteś zawsze będzie iteracyjne nad tablic. Więc pamiętaj, że n jest długość naszej tablicy. A więc tutaj jesteśmy wielokrotnie prosząc do wieku osoby, którą w pokoju. Po tym, jedziemy w dół, a na co arbitralne powód, my wtedy wydrukować, jak stary idą za rok od teraz. I działa ten program, niech dokonać wieku, dot wieku ukośnymi. Tak więc liczba osób w pokoju, Można powiedzieć, że są trzy. I powiedzieć, pierwsza osoba jest 13, następny jest 26, a ostatnio 30. Tak więc będzie to w ciągu tych trzech iteracji ludzi, wydrukować 14, 27 i 31. Więc pamiętaj, że kiedy deklarujemy Tablica wielkości n, że indeksy w tablica, tablica ma wartości i indeksy 0, 1, 2, wszystkie sposobem do n minus 1. Więc kiedy powiedziała, że ​​były trzy osoby w pokoju, a my tu umieścić Pierwsza iteracja przez to pętla, i będzie 0. Tak w indeksie 0. Jesteśmy przypisywania pierwszy starzejemy użytkownik wprowadzi. Potem w następnym, wchodzimy Drugi n użytkownik wprowadza, w obok dwóch, ostatnich n. Więc zauważyć, że tablica rozmiarów trzy nie ma nic indeksu trzy. To nie jest ważne. Dobrze. Więc, wracając tutaj. Więc teraz, że mamy do czynienia z tablicami, mamy pewne znajomości. Teraz mamy zamiar przenieść się do polecenia Argumenty wiersza, które będą dość istotne dla tego zestawu problemów. Tak aż do teraz, gdy masz ogłosił swoją główną funkcję, mamy powiedział int main nieważne. Więc po prostu oznacza, że ​​nieważne nie przechodzą wszelkie argumenty tej funkcji. Teraz mamy zamiar zobaczyć, że main może potrwać kilka argumentów. Tutaj nazywamy je int argc i wsporniki ARGV smyczkowych. Wsporniki ponownie, wskazując że mamy do czynienia z tablic. Więc tutaj, wsporniki ciąg ARGV, jesteśmy czynienia z tablicy ciągów. Tak argc, że będzie wskazywać jak wiele argumentów mamy przekazywane do tego programu. I zobaczyć, co to znaczy, Zamknijmy to. OK. Tak aż do teraz, co mamy uruchomić Program jak dot wieku ukośnymi. Możemy również, w wierszu polecenia, obok przekazywać argumenty, zatem termin, polecenie Argumenty wiersza. Tak więc pierwszy argument, witaj świecie. Więc tutaj, argc będzie trzy. Jest to liczba argumentów w wierszu poleceń. Argc jest zawsze co najmniej 1, ponieważ kropka slash wieku, się, liczy się jako jeden z Argumenty wiersza poleceń. Następnie komentarzy jest pierwszy. Jeśli kropki wieku slash jest zerowe, a następnie witam to pierwszy, a świat jest Drugi argument linii poleceń. Więc argv ciąg, idziemy zobaczyć, zawiera łańcuchy, dot ukośnik grupy wiekowe, witam, i świat. I, na zamówienie Dawida, jedziemy odtworzyć video wprowadzające że. [ODTWARZANIE] -Do tej pory w programach my ve napisane, jakie deklarują Głównym jako int main nieważne. I przez cały ten czas, że nieważne jest po prostu określa, że ​​został Program nie ponosi Argumenty wiersza poleceń. Innymi słowy, gdy użytkownik uruchomi Program, może on dostarczyć polecenie Argumenty wiersza przez pisanie dodatkowe słowa lub frazy po programie jest nazwy w wierszu. Cóż, jeśli chcesz, by program przyjmują argumenty wiersza polecenia, jedno lub więcej takie słowa, musimy zastąpić unieważnić z kilkoma argumentami. Więc zróbmy to. M.in. CS50.h. Zawierają standardowe io.h. Int main. A teraz, zamiast nieważne, mam zamiar określić int zwany argc i Tablica ciągów znaków zwanych argv. Teraz argc i argv są po prostu konwencje. Mogliśmy nazywa te argumenty najbardziej cokolwiek chcemy. Ale ważne jest to, że jest argc int, ponieważ, z definicji, jest to będzie zawierać liczbę argumentów, liczba słów w sumie, że Filmaster wpisane w jego lub jej wierszu. argv tymczasem wektor argumentem, jest będzie faktycznie być tablicą przechowywania wszystkie słowa, które użytkownik ma wpisane w jego lub jej wierszu. Przejdźmy teraz do czegoś jeden lub więcej z tych Argumenty wiersza poleceń. W szczególności, idziemy do przodu i drukuj niezależnie użytkownik wpisze słowo po nazwie programu w wierszu. Otwórz uchwyt. Zamknij uchwyt. Printf procent s odwrotny ukośnik i przecinek. A teraz muszę powiedzieć printf co wartość do podłączenia do tego symbolu zastępczego. Chcę pierwsze słowo, że użytkownik nie Po wpisaniu nazwy programu, i tak mam zamiar podać argv wspornik 1, w pobliżu nawias, średnik. Teraz, dlaczego nie wspornik wspornik 1 i 0? Cóż, okazuje się, automatycznie zapisywane w argv 0 będzie Rzeczywista nazwa programu. Tak więc pierwsze słowo, że użytkownik wpisze po nazwa programu jest, by konwencja, będzie przechowywane w argv 1. Załóżmy teraz skompilować i uruchomić ten program. Sprawdź, argv 0, kropka slash argv 0. A teraz słowo jak przywitać. Enter. I nie mamy go, cześć. [KONIEC ODTWARZANIE WIDEO] ROB Boden: W porządku. Zamknij to. Więc przyjrzeć tego programu właśnie wprowadziła się do nas, dobrze, tylko aby zobaczyć, czy możemy wydrukować argv 0, sprawiają, teraz co to jest, argv 0, kropka kreska argv 0. Tak więc, zgodnie z oczekiwaniami, to drukowanie Nazwa programu, ponieważ jest argv 0 Zawsze będzie nazwa programu. Ale zróbmy coś nieco bardziej interesujące. Tak w zestawie problemów, będziesz wprowadził do tej funkcji atoi. Więc co my używać atoi na? Że zamierza przekształcić łańcuch na liczbę całkowitą. Więc jeśli mogę przekazać ciąg, jeden, dwa, trzy, do atoi, że będzie przekonwertować do liczby całkowitej, jeden, dwa, trzy. Więc idziemy do konwersji pierwszy argument linii poleceń do liczby całkowitej, a potem po prostu wydrukować, że całkowitą. Więc w zasadzie, jesteśmy rodzajem reimplementacji getint, tylko całkowitą ujęto na polecenie Linia zamiast w programie interaktywnie. Tak więc, co argv 0, zróbmy to tutaj, i zamknąć to. Tak działa argv 0, i niech wprowadź całkowitą, raz dwa trzy cztery raz dwa. Więc to wydrukować całkowitą, jedną dwa trzy cztery raz dwa. Istnieją pewne subtelności do atoi, że będzie to przestać troszczyć się o nic poza ważnego znaku numerycznego, ale to nie ma znaczenia. Więc co się dzieje, myślisz jeśli mogę to zrobić? Segmentation fault. Więc dlaczego tak jest? Jeśli spojrzeć na nasz program, jesteśmy konwersji argv 1, pierwszy argument po nazwie programu, do liczby całkowitej. Ale nie ma przekazywane argumentem po nazwie programu. Więc widzimy, że jest to buggy Program, ponieważ, jeśli staramy się go uruchomić bez żadnych argumentów, to po prostu błąd. Więc kolejny wspólny wzór zobaczysz jest coś takiego, jeśli argc jest mniej niż dwa, co wskazuje, że nie było przynajmniej nazwa programu i Pierwszy argument, to zrobimy coś jak printf, nie wystarczy Argumenty wiersza poleceń. To chyba nie jest dobre do drukowania, to chyba coś, jak należy wprowadzić liczbę całkowitą w wierszu poleceń. Ja po prostu zakończyć go tam. A następnie powrót 1. Więc pamiętaj, że pod koniec naszego Program, jeśli zwróci 0, to rodzaj wskazuje na sukces. I główny automatycznie zwraca 0 jeśli nie. Więc tutaj mamy przestrajania 1 do wskazania że to nie jest sukces. I można powrócić, co chcesz, tak, 0 oznacza sukces, a coś jeszcze o awarii. Warto więc uruchomić tę wersję rzeczy. Więc teraz, jeśli nie wpisz wiersz polecenia Argument, będzie to poprawnie powiedzieć nas, nie tyle z linii poleceń. Nie dokończył zdania. Innego, gdybyśmy rzeczywiście przekazać mu jedną, Można to realizacji programu. Tak to jest, jak należy użyć argc w Aby sprawdzić poprawność liczby Argumenty wiersza poleceń, które są faktycznie przekazywane. Więc zróbmy ten program bardziej skomplikowane, i spojrzeć na sekundę iteracja rzeczy. Więc teraz, jesteśmy nie tylko drukowanie pierwszy argument linii poleceń. Tutaj mamy iteracji z int i równych 0, i jest mniejsze niż argc, ja plus Plus i drukowanie argv, indeks i. Tak więc ten model znów jest taka sama wzór, z tą różnicą, zamiast wywołaniu zmienną n, używamy argc. Więc to jest iteracja po wszystkich indeksach w tablicy, i drukowanie każdego elementem tej tablicy. I tak, po uruchomieniu tego programu, dobrze, Nie wprowadzać żadnych linii poleceń argumentów, więc tylko wydruki nazwa programu. Jeśli wprowadzić kilka rzeczy, to będzie wydrukować jeden, każdy w oddzielnym wierszu. OK. Więc weźmy o krok dalej. I zamiast drukować każdy argument z własnej linii, niech wydrukować każdy charakter każdego argumentu w oddzielnym wierszu. Więc pamiętaj, że argv jest Tablica ciągów znaków. Więc co jest ciąg, ale Tablica znaków? Więc to oznacza, że ​​argv jest naprawdę Tablica szereg postaci. Tak więc korzystając z tego, zignorujmy to teraz. Miejmy tylko rozważyć argv ciąg 0. Tak więc, jeśli chcemy doprowadzić każdy znak argv 0 w oddzielnym wierszu, a następnie chcę zrobić wzór jesteśmy przyzwyczajeni, i jest mniej niż długość tablicy który tu jest, strlen z, to nie to, co chcę zrobić, łańcuch y jest równa argv 0. Więc jest mniejsza niż długość naszych Tablica, która w tym przypadku jest tablicą znaków, i Plus Plus. I tak, jak widzieliśmy w zeszłym tygodniu, jest to idealny jeśli poruszamy że strlen zewnątrz z warunkiem, ponieważ brak będzie dodanie strlen S każdym razem idziemy przez pętlę, i to Nie zamierzam się zmieniać. Więc będziemy go równą n tu ustawić. OK. Więc teraz mamy iterowanie Każdy indeks w tablicy. I tak, jeśli chcemy wydrukować każdy postaci tablicy, w tym procent c jest Zaznacz chcemy użyć dla znaków. A teraz uchwyt i będzie łańcuch, znak indeksu i, więc jeśli Ciąg były komentarzy. następnie S 0 będzie h, y uchwyt 1 będzie e, i tak dalej. Teraz chcemy połączyć te dwie rzeczy. Chcemy wydrukować każdy znak każdego argumentu wiersza poleceń. Więc będziemy mieć zagnieżdżonych pętli. I zwyczajowo, pierwszy licznik Ja, następna będzie j, n będzie strlen z argv i, i. jest mniejsze od n, i oraz Plus. A teraz zamiast drukowania argv i, tak argv wspornik i będzie indeksem - że będzie to wiersz poleceń i-ty Argument, argv i, j będzie być JTH charakter i-tego argumentu. Ja pozbyć się tego tutaj teraz ponieważ umieścić go w tej pętli. Więc jest równoważne String s równych argv i, a następnie s uchwyt j. Cóż, nie musimy zadeklarować zmienna y. Zamiast tego, po prostu połączyć je dwa do tego, co mieliśmy, argv i, j. GŁOŚNIK 1: [niesłyszalne]. ROB Boden: Dobra decyzja. Więc to jest zepsuty. Jeśli faktycznie prowadził ją, my by sobie z tego sprawę. Tak, zależy mi na licznik w tym zwłaszcza do pętla jest j, iterator. Więc można biegać w kwestii, prawdopodobnie nieskończonej pętli, jeśli gdyby nie stała, że. Dlatego my także mówić o debugowanie dziś. OK. Warto więc uruchomić ten program. I niech faktycznie dodać osobny printf tu, że będzie po prostu wydrukować kolejna linia, ponieważ oznacza to, kiedy uruchomić program, będzie puste Linia pomiędzy każdym charakterem każda linia argumentów poleceń. Cóż, zobaczymy, co to oznacza. Oop. Masz jakiś problem. Błąd niejawnie deklarując funkcja biblioteki strlen. Tak więc wracając do naszego programu, to zapomniałem mieszania obejmują . Więc będzie plik nagłówka, który deklaruje Funkcja strlen. OK, to kompiluje. A teraz go uruchomić. Tak, tylko to. To będzie wydrukować nasze Nazwa programu, witaj świecie. To będzie wydrukować każdą rzecz, każdy postaci własnej linii. OK. Więc rzeczywiście wziąć to jeden krok dalej. I zamiast używać , niech zastanowić się, jak chcemy realizować nasze własne strlen funkcji. Więc od razu dać podpis funkcji. Więc nazwijmy w my_strlen, i to zajmie ciąg jako argument, i spodziewamy się, aby powrócić Długość tego ciągu. Więc, gdzie jest ten facet? Tak. OK. Więc pamiętam z wcześniejszego slajdu był także z ostatniego tygodnia, że tablica znaków, dobrze, łańcuch, Więc powiedzmy, to jest nasz łańcuch s. Więc jeśli s jest ciągiem, hello, a następnie, H-E-L-L-O, w pamięci, że będzie być, i to ten backslash 0 znaków. Jak więc uzyskać długość s? Cóż, sztuczka ta szuka 0 luzów charakter, twoja wartość null terminator. Więc algorytm będzie być czymś mało wystarczającej ilości znaków, które - zróbmy to ręka stanowią jedne licznik, nazwijmy to int długość. Tak więc, począwszy od tutaj jesteśmy będzie iteracyjne nad naszego łańcucha. Tak więc pierwszy znak, to H, i to nie jest powrót slash 0, więc długość 1. Iteracji do następnego znaku, E, i to nie jest interpretacja odwrotnego ukośnika 0. Długość 2. L, 3. P 4. O, 5. I w końcu docieramy odwrotny ukośnik 0, a więc oznacza to, dobrze, Ten ciąg jest ponad. Więc wróćmy 5. Wykonawczych, które tak naprawdę, po pierwsze, moja długość n jest równe 0, moja prawa ręka. I jedziemy do iteracji - GŁOŚNIK 1: [niesłyszalne] ROB Boden: Och, strzelać. Dobre połączenie. Boom. Więc długość n jest równa 0. Więc teraz, gdy s długość nie równe, a następnie, odwrotny ukośnik 0. Więc pamiętaj, to odwrotny ukośnik 0, to rzeczywisty charakter, a to oznacza, koniec napisu. Podobnie jak, również, odwrotny ukośnik n jest rzeczywisty charakter. Backslash 0 będzie wskazywać koniec naszego łańcucha. Nie chcę postawić, że nie. I podczas gdy s indeksowane przez długość nie jest równa zerowej terminatora, to jesteśmy po prostu się do przyrostu długości. Tak więc, w celu działania programu, długość jest w końcu będzie być 5 w tym przypadku. A my długości po prostu wrócić. OK. Więc teraz tutaj, nie wiem zrobić my_strlen. Niech go skompilować, aby upewnić wszystko działa płynnie. Ja robiłem w 2? Albo to, że 1? Że należy zrobić. Dobrze. Więc to jest argv 2. Działa zgodnie z oczekiwaniami, choć było to, że jeden zrobiłem to w? Tak. OK. Ta wersja nie ma rzeczy printf nowa linia po, ale to nie ma żadnej różnicy. OK. Więc pracował zgodnie z oczekiwaniami. Teraz można nawet połączyć ten jeden krok ponadto, w którym informacja o, dobrze, pierwsze, jesteśmy chwytając strlen z argv i, a następnie mamy iterowanie Każdy znak w tym ciągu. Więc zamiast robić to, co jeśli tylko połączyć tę logikę czeka aż trafiliśmy backslash 0 prawo do tego pętli for? Tak iteracji podczas argv i, j nie nie równa odwrotny ukośnik 0. Warto więc uruchomić go pierwszy. Dobrze. Więc tutaj, warunek ten jest mówiąc - wyjaśnijmy to. Więc teraz, niech to będzie nasza argv. Więc kiedy tylko dostał ten program wcześniej, argv jest tablicą łańcuchów. I tak, jeśli uruchomię go dot slash argv 2, hello world, to argv Sam jest długość 3, dla argv zero, witam, i świat. I wewnątrz każdego z tych wskaźników jest Sama tablica, gdzie to będzie kropka, to będzie ukośnik, nie wiem czy to właściwy kierunek, ja nie sądzę, że był. -R-V kreska, potrzebujesz więcej miejsca. Skończmy na tej tablicy. Kreska 0, a następnie lewy ukośnik 0-R-V. A następnie w nieładzie będzie komentarzy. Powiedzmy, H-E backslash 0. I wreszcie, W-wy backslash 0. Tak więc algorytm, który po prostu napisał, zagnieżdżone pętle, co oni robi to, musimy najpierw licznika i, a następnie j. Byłoby łatwiej z kodem na ekran, Wróćmy do tego. OK. Więc zauważyć, że jest to iterator iterowanie każdego polecenia argument wiersza. Oraz j jest powtarzanie iterator na każdego bohatera, który linia argumentów poleceń. Więc co to robi najgłębsza printf jest, mamy printf argv 0 0 printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, ale teraz, argv 0 7 będzie równa odwrotny ukośnik 0. Więc potem wyjść, że na pętli, i teraz ja iteracje do 1. A teraz idziemy do druku argv 1 0, argv 1 1 - dobrze, teraz, od kiedy wyciąć cześć krótki, argv 1 2 ponownie będzie odwrotny ukośnik 0. I tak, ja i nadal zwiększać, a tak dalej, aż wydrukować wszystkie świat, i to są trzy wiersza poleceń argumenty, a my wyjść z Najbardziej zewnętrzna pętla i zakończyć nasz program. OK. Więc tu wrócić. Więc można zdobyć znajomości Argumenty wiersza poleceń w tej sprawie ustawić konkretny problem. Teraz, debugowanie. Więc prawdopodobnie już miał do czynienia niektóre debugowania poprzednia ustawić problemem. I jeden bardzo prosty sposób debugowania, pierwsze, spójrzmy na program buggy. Cóż, chodzenie w ramach tego programu, będziemy prosić użytkownika o całkowita, grab, że całkowitą, a następnie arbitralnie, mamy pętli while, że jest po prostu będzie zmniejszać I dopóki nie jest równa 10. Po prostu zakładamy, Wchodzę liczbę całkowitą większą niż 10. Więc zmniejszyć i dopóki nie jest równa 10. A potem mamy kolejny pętli while , że, podczas gdy ja nie równa się 0, jesteśmy I będzie zmniejszyć o 3. Więc jeśli widzisz intencji błąd tutaj, to, że będzie mi się to zmniejszyć być 10, a następnie, gdy będzie to pętla Ubytek i od 10, do 7, do 4 do 1, ujemną 2, na ujemną 5 i tak dalej, do minus nieskończoności, bo będzie nigdy nie są równe 0. A następnie na końcu tego programu mamy funkcję foo, która jest dzieje się drukiem, że ja. Więc jest to program krótki i trywialne, a błąd jest oczywiste, zwłaszcza po tym, jak tylko powiedział to, co było błędów. Ale intencją tutaj jest dobrze, to może faktycznie wygląda jak niektóre z Rozwiązania z chciwy od ostatniego ustawić problemem, a może masz niektóre nieskończonej pętli w programie, i nie masz pojęcia, co to powoduje. Tak bardzo przydatna technika debugowania jest po prostu dodać printfs w całym kodzie. Więc chcę printf zewnątrz Pierwsza pętla while. I tu chcę printf, a ja po prostu wydrukować i. Ja nawet nie pierwsza pętla, ja. Na zewnątrz, druga pętla. Po raz kolejny, drukować wewnątrz stąd wartość i.. I niech to uruchomić to. Więc kropka debug ukośnik. Wpisz liczbę całkowitą. Zróbmy 13. I bum. Widzimy, że są nieskończone zapętlenie wewnątrz drugiej pętli while. Teraz wiemy, na czym polega błąd. Ale printf debugowanie jest doskonale doskonałym, ale gdy programy dostać dłuższe i bardziej skomplikowane, są bardziej zaawansowane rozwiązania Getting Things pracy. Warto więc usunąć wszystkie te printfs. I niech to upewnij się, że nie złamać niczego. OK. Więc program jedziemy wprowadzenie nazywa GDB, na licencji GNU Debugger. Cóż, tak naprawdę, to usunięcie debug dla drugi, i znowu zrobić debug. Cóż, właściwie pierwsza, dobra lekcja z argumentów wiersza poleceń. Zauważ, że polecenie to jest Clang kompilacji wszystko jest przekazywane w linii poleceń, to Argumenty wiersza poleceń. Tak dokładnie, jak masz zamiar używać Argumenty wiersza poleceń, jak przedtem, i jak będzie w pset 2, to jak Szczęk ich używa. Więc zauważyć, że ta pierwsza flaga, kreska ggdb3, co to mówi to, Szczęk, należy skompilować ten plik z zamiarem, że będzie w końcu trzeba go debugować. Tak długo, jak masz tę flagę, następnie możemy GDB debug. I to będzie otwarcie GNU Debugger. Tak więc istnieje wiele poleceń że trzeba się przyzwyczaić. Pierwszy z nich, że prawdopodobnie będziesz natychmiast trzeba to Run. Więc co jest Uruchom zrobić? To się rozpocząć nasz program. Więc uruchomić, program, począwszy, program wzywa nas do liczby całkowitej, 13. I to jest to, jak nieskończone zapętlenie Oczekuje, z wyjątkiem usunąłem printfs, więc nawet nie widzę. Odszedł normalnie. Och. Jest możliwe, że to wszystko zapakowane odwrotnie, z powrotem do - pomijając to. Zakładam, że nie wyjść normalnie. Jest skomplikowana odpowiedź. Więc teraz, że nie jest to bardzo przydatne. Tak właśnie działa nasz program wewnątrz to debugger nie pomaga nam w jakikolwiek sposób, ponieważ mogliśmy tylko zrobić kropka slash debug spoza GDB. Więc jedno polecenie, które prawdopodobnie będziesz - a ja zamknąć to. Control-d lub zamknąć, zarówno do pracy. Warto więc otworzyć go ponownie. Inne polecenie, że prawdopodobnie będziesz natychmiast chcą przyzwyczaić jest przerwa. Więc łamiemy na głównym teraz, a następnie, że ci wyjaśnię. Cóż, tutaj widzimy, możemy ustawić punkt przerwania na tej linii w debug.c. Więc co oznacza, że ​​przerwa, kiedy wpisz Uruchom program będzie nadal działa, aż I hit punktu przerwania. Więc kiedy hit run, program uruchamia, a następnie rozkłada Z chwilą wchodzi do głównej funkcji. Złamać głównym będzie coś jesteś dość powszechnie zrobić. A teraz, aby wprowadzić Cię do niektórych więcej poleceń. Zauważcie, że to mówi my wybuchł w linii 11, który jest printf, wpisz liczbę całkowitą. Więc polecenie Następny będzie jak możemy przejść do następnej linii kodu. To będzie pozwalają nam kroku za pośrednictwem naszego programu linia po linii. Więc następnym. Teraz linia 12, jedziemy aby uzyskać całkowitą. Następny. A jeśli po prostu wciskamy Enter ponownie, to będzie powtórzyć ostatnią rzeczą, którą zrobił. Więc nie trzeba wpisywać następny każdym razem. Więc wprowadzić liczbę całkowitą, 13. Więc teraz, linia 14, a ja jest większa niż 10, i będę robić dalej. I widzimy, będziemy zmniejszać i.. Więc mamy zamiar zmniejszyć znowu. Więc teraz, kolejna użyteczna Polecenie to jest Drukuj. Więc Drukuj zamierza wydrukować Wartość zmiennej. Miejmy wydobyć wartość zmiennej i. Miejmy wydrukować i.. To będzie powiedzieć, że jest 11. Teraz Następnie ponownie, i jest większa niż 10. Więc jeszcze większe niż 10, ponieważ jest to 11. i minus minus. Miejmy drukować znowu. Zgodnie z oczekiwaniami, to jest 10. Więc teraz, następny. To będzie powrót do stanu, i jest większa niż 10, ale jest 10 tak, nie jest większa niż 10, więc oczekiwać to spadek z pętli while. A teraz jesteśmy poniżej tego wiersza kodu. I inne polecenie, listy, jest po prostu będzie wyświetlić poprzednie i następne Kilka linii kodu, w przypadku utraty siebie. Więc po prostu odszedł ta pętla, a teraz weszliśmy to pętla, linia 18. Tak, a ja nie równa 0. I następny, i jest równe I minus 3, a my zauważyć, to będzie po prostu iść dalej. I możemy wydrukować i. Każde polecenie sortowania ma skrótów. Więc p jest krótki do druku. Więc możemy P i. Tylko trzymaj n, lub robić Dalej. Wydrukuj jeszcze raz. Widzisz teraz jest ujemny 167. Więc to będzie trwać wiecznie, ale nie naprawdę zawsze, od kiedy tylko zobaczył, że faktycznie kończy się w pewnym momencie. Tak że zaczyna GDB. Ale zróbmy jeszcze jedną rzecz w GDB. Uh, debug. Tak więc, w tym szczególnym przypadku, nieskończonej pętli stało się wewnątrz Główną funkcją. A teraz, po prostu przyjąć, że jestem zamierza przenieść nieskończoną pętlę w Funkcja foo. Tylko pamiętać, że w końcu tego Program, dobrze, to było pierwotnie wywołanie foo, który był po prostu zamiar wydrukować i. Ale teraz mamy wywołanie foo, która jest zamierza zmniejszyć I dopóki jest to 0, a następnie wydrukować tej zmiennej. OK. Zapisać, że. Dodać debug. A teraz, gdb debug. OK. Więc jeśli po prostu uruchomić to nie zamierzam być w stanie rzeczywiście przejść przez moje programu linia po linii. Więc przerwa w głównym, a następnie wpisać słowo. Tak więc przejść przez to, printf, wprowadź całkowitą, uzyskać całkowitą, 13. Więc mamy zamiar utrzymać zmniejszanie dopóki nie jest większa niż 10. Następnie jedziemy do upadku przez pętla, i dostać się do linii - niech go otworzyć w osobnym oknie. Więc zmniejszana, aż już nie było większe od 10, a potem wywołaniu funkcji, bla. Więc co się stało, jak tylko uderzyć Funkcja foo, dobrze, zadzwoniłem foo, a potem nie ma już kontroli nad GDB. Tak szybko, jak tylko uderzyć Dalej na tej linii, rzeczy nadal aż stało się to, gdzie program odszedł, gdy - Zakładam, że nie istnieje w końcu. Widziałeś go wstrzymać na chwilę chociaż. Dlaczego więc stracić kontrolę nad Program w tym momencie? Cóż, kiedy ja piszę dalej, że idzie do dosłowne następna linia kodu będą wykonane. Więc po linii 21, obok linii kodu że wykona to linia 22, który jest wyjście z głównym. Więc ja nie chcę pójść do następnej linii kodu. Chcę iść do funkcji, Foo, a następnie także krok po kroku te linie kodu. Więc na to, mamy alternatywę. Miejmy rzucić jeszcze raz. Złamać główny. Uh, 1, następny, następny, 13, następny, następny, następny, ostrożnie, Zanim trafiliśmy linii foo. OK. Więc teraz, że jesteśmy na linii 21, gdzie wywołać foo. Nie chcemy, aby wpisać następny, ponieważ po prostu wywołać funkcję foo, a przejść do następnej linii kodu. Co chcemy użyć, jest krok. Więc jest różnica między kroku i Dalej, gdzie krok kroki do funkcjonować, a obok przechodzi w stosunku do funkcji. To po prostu wykonuje całość Funkcja i utrzymuje dzieje. Więc krok przyniesie nam do funkcji, bla. I widzimy tutaj, teraz, jesteśmy z powrotem w ta pętla to, w teorii, będzie trwać wiecznie. A jeśli trafisz kroku, jeśli nie jest jeszcze Funkcja zadzwonić, to jest to identyczne Dalej. Więc to jest tylko wtedy, gdy jesteś na linii, która jest wywołanie funkcji, że etap będzie się różnić od Next. Więc krok przyniesie nam tutaj. Krok, krok, krok, krok, krok, krok, i Będziemy po prostu nieskończona pętla zawsze. Więc można się przyzwyczaić, że jak sposób identyfikacji nieskończone pętle, jest przytrzymanie tego klawisza Enter, aby Zobacz, gdzie utkniesz. Są lepsze sposoby aby to zrobić, ale teraz, że jest w pełni wystarczające. I stylistycznie, w celu dostosowania do stylu 50, powinienem zrobić to. OK. Więc ostatnia komenda do wprowadzenia. Cóż, gdb debug w. Więc zamiast łamania się głównym, jeśli wiem funkcji foo jest również Problem, to mogę mieć tylko wymieniony, przełamać w foo, zamiast. Powiedzmy, że przerwa w zarówno główne i bla. Więc można ustawić jak najwięcej punktów przerwania jak chcesz. Kiedy wpisać słowo, to będzie zatrzymać się - Och, niech rekompilacji, od Zmieniłem rzeczy. Zobaczysz tę linię, ostrzeżenia, źródło plik jest nowszy niż plik wykonywalny. To znaczy, że po prostu poszedł tutaj i zmienił je w celu dostosowania do stylu 50, ale nie rekompilacji Program. Więc GDB sprawia mi świadomość. Ja zamknąć, ponownie zrobić debug, hit gdb debug. OK. Teraz, z powrotem do tego, co robię. Złamać główny, break foo. Teraz, jeśli uruchomić program, więc jest to będzie kontynuowane aż do trafienia przerwania. Zdarza się, że punkt przerwania być pierwszy w głównym. Teraz, zamiast robić następny, następny, następny, następny, następny, dopóki nie uderzył foo, ja może wpisać kontynuować, który będzie aż trafisz do następnego przerwania. Mam pierwszy wprowadzić całkowitą. Nadal będzie nadal, dopóki nie uderzył następny punkt przerwania, które jest Funkcja foo. Więc Run będzie działać aż trafisz przerwania, ale tylko wpisać słowo, gdy zaczynasz program, a następnie, od tej pory, to w dalszym ciągu. Jeśli tylko nie złamać główny i pobiegł, to będzie przerwa w Głównym, a następnie kontynuować. Ponieważ nie mam punkt załamania w foo, wprowadzić liczbę całkowitą, to teraz jestem nie złamie w foo. To po prostu się do nieskończoności Pętla dopóki. OK. Więc to jest Wstęp do GDB. Należy rozpocząć korzystanie z niego w tabelach problemowych. To może być bardzo pomocne zidentyfikować błędy. Jeśli faktycznie tak, linia po linii, przejdź przez kod, i porównać to, co jest z tym, co faktycznie dzieje się spodziewać się stało, to jest całkiem trudno nie swoje błędy. OK. Tak więc w zeszłym tygodniu w tym David wychowany Kryptografia klucza tajne rzeczy dla pierwszy raz, gdzie nie chcemy Hasła prostu być przechowywane na naszych Komputer w jakimś zwykłym pliku tekstowym, w którym ktoś może przyjść i po prostu otworzyć ją i przeczytać je. Idealnie, zostaną zaszyfrowane w jakiś sposób. W Problem zestaw 2, będziesz mieć do czynienia z jednym ze sposobów szyfrowania lub, oraz, dwie metody, ale oni nie są tak wielkie. Jeśli zrobisz edycję hakerów, jesteś również będzie mieć do czynienia z deszyfrowania pewnych rzeczy. Więc problem jest teraz, cóż, nawet jeśli mamy najsilniejsze szyfrowanie Algorytm na świecie, jeśli zdecydujesz zwłaszcza ubogich hasło, to Nie pomoże ci bardzo, ponieważ ludzie nadal będzie w stanie zrozumieć. Nawet jeśli widząc zaszyfrowany ciąg znaków i wygląda jak bałagan śmieci oznacza nic do nich, o ile jeszcze tylko trzeba spróbować kilka haseł zrozumieć to, to nie są bardzo bezpieczne. Tak więc oglądając film, który sprawia, że ​​punkt. [ODTWARZANIE] -Helmet, jesteś szatanem. Co się dzieje? Co robisz z moją córką? -Pozwól mi przedstawić genialny Młody chirurg plastyczny, dr Phillip Schlotkin, największy nos Człowiek pracy w całej wszechświat, i Beverly Hills. -Wasza Wysokość. -Nosa? Nie rozumiem. Ona już miała nosa. To było słodkie szesnaście obecny. -Nie. To nie to, co myślisz. To dużo, dużo gorzej. Jeśli nie daje mi połączenie do tarcza powietrza, dr Schlotkin będzie dać córkę jej stary nos. -Nie. Skąd to masz? -Wszystko w porządku. Powiem. Powiem. Nie, tato. Nie, nie musi. -Masz rację, mój drogi. Będę tęsknił nowy nos. Ale nie powiem mu połączenie, nie wiem co. -Bardzo dobrze. Dr Schlotkin, nie najgorsza. -Z przyjemnością. [Oprzyrządowania zaostrzony] -Nie. Czekać. Czekać. Powiem. Powiem. -Wiedziałem, że to działa. Dobrze. Daj mi to. -Połączenie jest jeden. -One. -One. -Dwa. -Dwa. -Dwa. -Trzy. -Trzy. -Trzy. -Cztery. -Cztery. -Cztery. -Pięć. -Pięć. -Pięć. Tak więc, kombinacja jest, dwa, trzy, cztery, pięć. To najgłupsza połączenie Jakie kiedykolwiek słyszałem w moim życiu. To rodzaj rzeczy idiota miałoby na jego bagażu. -Dziękuję, Wasza Wysokość. -Co ty zrobiłeś? -Odwróciłam się od ściany. -Nie, nie. Został wyłączony cały film. -Musiałem naciśnięty niewłaściwy przycisk. -Cóż, umieścić go z powrotem. Wrzuć film z powrotem. -Tak jest, sir. Tak, proszę pana. -Chodźmy, Arnold. Przyjdź, Gretchen. Oczywiście wiesz, że nadal będę musieli obciążyć cię za to. [KONIEC ODTWARZANIE WIDEO] ROB Boden: W porządku. Więc teraz, że mamy już mówić o Bezpieczeństwo w pewnym sensie, ładny mały plakat filmowy, więc w ostatnich dni, te problemy z NSA monitorowanie wszystkiego. To może być trudne, aby poczuć się jak mieć jakiś prywatności w Świat Internetu, choć nie mogę powiedzieć Ci większość szczegółów PRISM. Więc wyjście poza PRISM, nie będziemy się mówić o tym, teraz myśleć o swoim laptopie. Więc tutaj, chcę, aby przełączyć do mojego aktualnego rachunku, z mojego małego pingwina. Więc mam ustawionego hasła, a Hasło to, co chcę, żeby było. Ale pamiętaj, że to, co mam zalogowaniu w z, więc logowanie szybka, jest jakiś program. To jakiś program, który był napisany przez jakąś osobę. Tak więc, osoba, jeżeli są one szczególnie szkodliwy, mogli powiedziałem, wszystko w porządku, więc jeśli hasło że wejść jest równa mojej rzeczywisty hasło, to jest równe lub do jakiegoś specjalnego hasła - David jest super lub coś - następnie ich wpuścić Tak programista może mieć szkodliwy Dostęp do wszystkich komputerów Mac, lub Szyby, lub cokolwiek. Więc to nie jest wiele obaw, ponieważ, To znaczy, jest to program do logowania , który jest dostarczany z OS X, setki lub tysiące ludzi recenzja tego kodu. I tak, jeśli w kodzie gdzieś, ty powiedzieć, czy ten ciąg jest równy równych David jest niesamowity, zaloguj się, a następnie ktoś będzie, jak, czekaj. To nie jest prawda. To nie powinno być tutaj. Więc to jest jeden sposób możemy dostać rzeczy być rodzaj bezpieczne. Ale nawet myśleć o programach że piszesz. Powiedzmy, że napisałem program login. Więc ten program logowania, który napisał, tak, oczywiście, że jesteś dobrym programista. Nie zamierzamy umieścić dowolny złośliwy jeśli x jest równa równa David jest niesamowity w kodzie. Ale ten program, co prawda używać skompilować ten program? Coś jak Clang. Więc co, jeśli osoba, która się do Napisać dzyń specjalne Clang powlekanego coś, jeśli jestem kompilacji programu logowania, a następnie wprowadź kod do programu logowania, który mówi, jeśli x równa równa David jest niesamowite? Więc nie do końca jeszcze, ale mamy takie same Chodzi tu, gdzie Szczęk, dobrze, tysiące, jeśli nie dziesiątki tysięcy ludzie patrzeli Clang, mają Spojrzałem na jego linii kodu i powiedział, Wszystko w porządku, nie ma nic złego tutaj. Oczywiście, nikt nie robi cokolwiek to złośliwy. Ale to, co jest brzękiem się, jak, co, jeśli mogę skompilować brzęk? Co zrobić, jeśli mam jakiś kompilator, że kompiluje dzyń, która wstawia do Clang Ten specjalny kilof, który mówi, wszystko w porządku, kiedy mogę skompilować brzękiem, a następnie wykonywalny zostanę powinny specjalnie szukać wewnątrz programu login i wkładki to hasło, równa równych Dave jest niesamowite? Więc pamiętaj, że sam kompilator musi być skompilowany w pewnym momencie. Więc jeśli to, co wybrać, aby skompilować dzyń się, sam w sobie jest szkodliwy, to może być przykręcony całość droga w dół. Więc tutaj mamy Ken Thompson i Dennis Ritchie. Więc to jest charakterystycznym zdjęcia. Dennis Ritchie jest po prawej stronie. On jest głównym - dość dużo pisał C. Tak więc można Dziękuję mu za tej klasy. Ken Thomson jest po lewej stronie. Dwa z nich w zasadzie napisał UNIX. Cóż, były to główne czynniki w systemie UNIX. Było kilka innych. Więc Ken Thompson, w pewnym momencie, wygrywa nagrodę Turinga. I Nagroda Turinga, zawsze słyszałem jest określany w ten sposób, to Nagroda Nobla w dziedzinie informatyki. Więc na nagrody Turinga, musi dać swoim przemówieniu. I daje temu bardzo słynnym przemówieniu teraz nazywa Refleksje Zaufanie Zaufanie, które łączyli Aby na stronie przedmiotu. I w tej wypowiedzi, jak mówi, wszystko w porządku, więc napisałem UNIX, a teraz wszystkie Ci ludzie są przy użyciu systemu UNIX. Teraz, pamiętaj, że Linux jest dziś bezpośrednim potomkiem systemu UNIX. OS X bezpośrednio wykorzystuje UNIX. Windows nie tak dużo, ale dużo pomysły zostały zaczerpnięte z systemu UNIX. Więc idzie się na scenę i mówi, Wszystko w porządku, pisałem UNIX. I tak wiecie, jestem w stanie zalogować się do każdego Pojedynczy jeden z komputerów. Od umieścić jeden z tych specjalnych, jeśli x równa jest równa Ken Thomson jest niesamowite, następnie wolno mi się zalogować. Tak więc ludzie są jak, dobrze, Jak to zrobić? Patrzyliśmy na program login i nic nie ma. On jest jak, dobrze, zmodyfikowany kompilator do logowania w programie logowania tak, że program będzie miał teraz logowanie że x równa równa Ken Thompson jest super. A mówią, że dobrze, że to nie prawda. Patrzymy na kompilator, i kompilator nie ma żadnych linii Kod taki. On na to: OK, ale co ty kompilacji kompilator z? I myślą, a on, jak dobrze, Jestem tym, który dał ci kompilator używasz do kompilacji kompilator, więc kompilowania kompilator, że sam w sobie jest szkodliwy, i będzie złamać program login. Więc w zasadzie, w tym momencie, nie ma żaden sposób nie można patrzeć na źródła Kod programu logowania aby zobaczyć, co jest nie tak. Nie można nawet patrzeć w Kod źródłowy kompilatora aby zobaczyć, co jest nie tak. Trzeba by spojrzeć na maszynie kod rzeczywisty binarny skompilowany kompilatorem, aby zobaczyć, czekaj, to linii kodu nie powinno tu być. Ale Ken Thompson wziął jeden krok dalej i powiedział: dobrze, są Te specjalne programy, które faktycznie pomóc odczytać plik binarny programów, a więc jeśli ktoś użył tego programu do odczytać plik binarny, nie widzą tych linii kodu. Że modyfikacja tych programów do powiedzenia, wszystko Dobrze, jeśli szukasz na kompilator, nie pokazuj tego szczególności zestaw dwójkowy. Więc trzeba wziąć, że etap dalej, w zasadzie, które mogłyby mieć podjęte wiele poziomów zadnie, i w pewnym momencie, nikt nie jest w rzeczywistości będzie sprawdzenie. Więc morał z tej historii jest, że jesteś Nie zamierzam pisać Brzękiem w tej klasie. Masz zamiar używać wspinaczki Dzyń dużo w tej klasie. Dla wszystkich wiesz, Szczęk jest szkodliwy Program, który sabotuje każdy jeden program, jaki kiedykolwiek opracowano. I zostawić cię na tym bardzo złowieszczy Uwaga, do zobaczenia w środę. [Aplauz] Głośnik 2: Na następnym CS50. GŁOŚNIK 3: Nie waż się powiedzieć. Można to zrobić. Zrobiłeś tego wcześniej, można to zrobić dzisiaj, jutro możesz to zrobić. Już robi to od lat. Po prostu idź tam i to zrobić. Można to zrobić. [MUZYKA GRA]