[MUSIC PŘEHRÁVÁNÍ] ROB BODEN: Dobře. Takže, první věc, první, video od známou tvář. [PŘEHRÁVÁNÍ] -Dobře. To je CS50, a to je start tří týdnů. Promiň, že jsem nemohl být s tebou dnes, ale dovolte mi představit CS50 vlastní Rob Boden. [END VIDEO PŘEHRÁVÁNÍ] [Potleskem a CHEERS] ROB BODEN: filmografie v že video je fantastické. Dobrá. Tak za prvé, je tu ještě jeden oběd. Je to zítra v 01:15. Neexistuje žádný obědě v pátek. Je s Quora. A Tommy je tu ještě není, ale jeden z lidé, tam je bývalý šéf CF, Tommy McWilliam. Takže je to zábava chlap. Ty by měly přijít. Dobrá. Takže minulý týden, jsme začali rozpadá o tom, co řetězec skutečně je. Známe od počátku, že je to posloupnost znaků. Ale minulý týden, jsme se ponořili do skutečnosti, že to, co je ve skutečnosti sekvence postavy, dobře, máme nyní pole znaků. A my víme, že řetězec, je to pole znaků, na samém konci, máme tento speciální nulový bajt, to zpětné lomítko 0, která označuje konec řetězec. A tak řetězec je pole znaky, ale může mít více než jen pole znaků, můžeme mít řadu kteréhokoli typ, co chceme. Takže, pokud si vzpomínáte z minulého týdne, Věk program, který představil David velmi rychle. Takže první věc, kterou budeme dělat, je požádat uživatele o celé číslo, počet lidí v místnosti. Jakmile budeme mít, že celé číslo, budeme deklarovat pole. Všimněte si tuto syntaxi konzoly. Budeš si zvyknout na to. Takže budeme deklarovat pole celých čísel volal věku, a tam jsou n celá čísla v tomto poli. Takže tento vzor tady, je to 4 int i se rovná 0, i je menší než n, i a a, že je také bude vzor že vám velmi zvyklí. Vzhledem k tomu, že je docela hodně, jak jste vždy bude iterovat přes pole. Tak si uvědomit, že n je délka našeho pole. A tak tady jsme opakovaně žádají na věku osoby i v místnosti. Poté, jdeme dolů, a bez ohledu na libovolná důvod, proč jsme se pak vytisknout kolik jdou být ode dneška za rok. A spuštění tohoto programu, pojďme aby věku, tečka lomítko věku. Takže počet lidí v místnosti, řekněme, že jsou tam tři. A říkají, že první osoba 13, Další je 26 a poslední 30. Takže to bude iterovat přes ty tři lidí, vytisknout 14, 27, a 31. Takže si pamatujte, že když jsme se vyhlásit pole velikosti n, indexy v tom, že pole, pole obsahuje hodnoty a indexy 0, 1, 2, celou cestu až n minus 1. Takže, když jsme řekli, že byli tři lidé v místnosti, a dáme sem První iterace přes tento smyčky, i bude 0. Takže v indexu 0.. Jsme přiřazení první věkem uživatel zadá. Pak v další, jsme zadání Druhá n uživatel zadá, a vedle dvou, poslední n. Takže si všimnout, že řada velikosti tři nemá nic v indexu tři. Toto není platný. Dobrá. Takže, jde sem. Takže teď, že jsme se zabýval polí, máme nějaké znalosti. Nyní se budeme pohybovat na povel linka argumenty, které se bude docela relevantní k tomuto problému sadě. Takže až do teď, když jste deklaroval svou hlavní funkci, máme řekl int main void. Takže void prostě znamená, že nejsme absolvování některého argumenty k této funkci. Nyní budeme vidět, že hlavním může trvat několik argumentů. Zde jim říkáme int argc a řetězec argv závorky. Držáky, opět s uvedením že máme co do činění s poli. Tak tady, string argv držáky, jsme jednání s pole řetězců. Takže argc, že ​​to bude ukazovat kolik argumenty máme předán do tohoto programu. A vidět, co to znamená, pojďme zavřete toto. OK. Takže až do teď, jsme běžet každý program, jako je tečka lomítko věkových kategorií. Můžeme také na příkazovém řádku, kolem předat argumenty, tedy termín, příkaz linka argumenty. Takže první argument, hello world. Tak tady, argc bude tři. Je to počet argumentů na příkazovém řádku. Argc je vždy alespoň 1, protože dot lomítko věku, sám, se počítá jako jeden z argumenty příkazového řádku. Pak ahoj je první. Pokud dot slash věku je zeroth, pak ahoj je první, a svět je Druhý argument řádek příkaz. Takže řetězec argv, budeme vidět, obsahuje řetězců, tečka lomítko věku, ahoj a svět. A tím, že žádost Davida, jedeme video přehrát zavádějící, že. [PŘEHRÁVÁNÍ] -Až nyní v programech jsme napsal, že jsme prohlásit Hlavní jako int main void. A celou tu dobu, že void má prostě bylo určující, že Program neponese argumenty příkazového řádku. Jinými slovy, když uživatel spustí Program, on nebo ona může poskytnout příkazu argumenty jsou podle psát další slova nebo slovní spojení po programu je jméno na příkazovém řádku. No, pokud chceš svůj program na přijmout argumenty příkazového řádku, jeden nebo více takových slov, musíme nahradit ztrátu s několika argumenty. Tak pojďme na to. Zahrnout CS50.h. Zahrnout standardní io.h. Int main. A teď, místo toho, void, budu zadat int argc názvem, a Pole řetězců zvaných argv. Nyní, argc a argv jsou jednoduše konvence. Mohli jsme nazývají tyto argumenty většina cokoliv chceme. Ale co je důležité je, že argc je int, protože podle definice je bude obsahovat počet argumentů, počet slov, že celkem uživatel zadal na jeho nebo její výzvu. argv, mezitím, argument, vektor, je bude ve skutečnosti být pole skladování všechna slova, které má uživatel napsaný na jeho nebo její výzvu. Pojďme pokračovat udělat něco teď s jedním nebo více z těchto argumenty příkazového řádku. Zejména, pojďme do toho a tisk bez ohledu na slovo uživatel zadá po názvu programu na příkazovém řádku. Otevřete držák. Zavřete držák. Printf procent je zpětné lomítko a čárka. A teď musím říct, printf, jakou hodnotu zapojit do tohoto zástupného symbolu. Chci první slovo, které má uživatel napsal po názvu programu, a tak budu specifikovat argv držák 1, v blízkosti závorka, středník. A teď, proč držák 1 a ne držák 0? No, to dopadá, automaticky uloží v argv 0 bude Skutečný název programu. Takže první slovo, které uživatel zadá Po název programu je tím, že konvence, bude uložené v argv 1. Pojďme se nyní sestavit a spustit tento program. Ujistěte se argv 0, tečka lomítko argv 0. A nyní slovo jako ahoj. Enter. A tady to máme, ahoj. [END VIDEO PŘEHRÁVÁNÍ] ROB BODEN: Dobře. Zavřete to. Takže se podrobněji podíváme na tomto programu, který jsme právě představil k nám, dobře, jen ukázat, pokud tiskneme argv 0, dělat, teď co je to, argv 0, tečka lomítko argv 0. Tak, jak se očekávalo, je to vytisknout jméno programu, protože argv 0 je vždy bude název programu. Ale pojďme dělat něco bit zajímavější. Takže problému nastavení, budete představil na tuto funkci, atoi. Tak co budeme používat atoi pro? To bude konvertovat řetězec na celé číslo. Takže když jsem předat řetězec, jeden, dva, tři, k atoi, že budete převádět, které na celé číslo, jeden, dva, tři. Takže budeme konvertovat první argument řádek příkaz na celé číslo, a pak už jen vytisknout, že celé číslo. Takže v podstatě, že jsme trochu reimplementing vezmi_int, jen číslo je zadáno v příkazu linka místo v programu interaktivně. Tak, aby argv 0, pojďme dělat je to tady, a zavřít to. Takže běh argv 0, a pojďme vstoupit číslo, jeden, dva, tři čtyři jedna dvě. Takže to bude tisknout celé číslo, jeden dva tři čtyři jedna dvě. Tam jsou některé nuance, aby atoi, že bude to přestat se starat o nic za platný číselný znak, ale to nevadí. Tak co si myslíte, že se stane jestli jsem to udělat? Segmentation fault. Tak proč je to? Podíváte-li se zpět na našeho programu jsme převod argv 1, první argument po názvu programu, na celé číslo. Ale není tam žádný argument předaný po názvu programu. Takže tady vidíme, že se jedná o kočárek programu, protože, když se budeme snažit, aby jej spustit bez argumentů, to bude jen pád. Takže další společný vzor uvidíte je něco jako, pokud argc je méně než dva, což naznačuje, že nebyl alespoň název programu a První argument, pak budeme dělat něco jako printf, nestačí argumenty příkazového řádku. To asi není dobrý pro tisk, je to asi něco, jako byste měli zadat číslo na příkazovém řádku. Budu prostě skončit tam. A pak se vraťte 1. Takže si pamatujte, že na konci našeho programu, pokud se vrátí 0, že druh indikuje úspěch. A hlavní také automaticky vrací 0, pokud nechcete. Tak tady jsme přeladění 1 uvést že to není úspěch. A můžete se vrátit co chcete, jen, 0 znamená úspěch, a něco signalizuje poruchu. Takže pojďme spustit tuto verzi věcí. Takže teď, pokud se nám nepodaří zadat příkazový řádek Argument, že to správně říct, nám, nestačí příkazového řádku. Nedokončil větu. Jinak, pokud jsme skutečně projít to jedno, může dokončit program. Tak to je, jak byste používat argc v pro ověření počtu argumenty příkazového řádku, které skutečně prošel. Takže pojďme udělat tento program trochu více složité, a podívejte se na druhý iterace věcí. Takže teď nejsme jen tisk První argument řádek příkaz. Zde jsme iterace z int i rovnými 0, i je menší než argc, i a plus, a tisk argv, index i. Takže tento model, opět se jedná o stejný vzor jako dříve, s výjimkou toho, volání proměnné n, budeme používat argc. Tak to je iterace každý index v poli, a každý tisk má v tomto poli. A tak, když jsme se spustit tento program, tak, Nechtěl jsem zadat libovolný příkaz argumenty, tak to jen tiskne název programu. Pokud zadám spoustu věcí, to bude vytisknout jeden, každý na samostatném řádku. OK. Takže pojďme o krok dále. A namísto tisku každý argument na samostatném řádku, pojďme tisknout každý charakter každého argumentu na vlastním řádku. Takže si pamatujte, že argv je pole řetězců. Takže to, co je řetězec, ale řada znaků? Takže to znamená, že argv je opravdu pole z pole znaků. A tak, že s využitím, pojďme ignorovat to nyní. Řekněme zvážit řetězec argv 0. Takže pokud chceme, aby každý znak argv 0 na samostatném řádku, pak chci, udělat vzor jsme zvyklí, i je menší, než je délka pole, který zde, je strlen z, to je není to, co chci dělat, řetězec s se rovná argv 0. Tak jsem je menší než délka naší pole, které je v tomto případě je pole znaků, i plus plus. A tak, jak jsme viděli minulý týden, je to ideální pokud se pohybujeme, že strlen mimo stavu, se od n přidávat strlen S pokaždé, když jdeme smyčkou, a to nebude měnit. Takže budeme nastavit rovné n. sem. OK. Takže teď, jsme iterace každý index v poli. A tak, chceme-li tisknout každý charakter v tomto poli, procenta c je vlajky chceme použít pro znaky. A teď držák i bude řetězec, index znak i, takže pokud string byly ahoj. pak s 0 bude h, S příchytkou 1 bude e, a tak dále. Takže teď chceme spojit Tyto dvě věci. Chceme tisknout každý znak každý argument příkazového řádku. Takže budeme mít vnořené smyčky for. A obvykle, první čítač je i, další se bude j, n bude strlen z argv i, i je menší než n, i plus plus. A teď, místo tisku argv i tak, argv držák i bude index - že to bude i-tý příkazového řádku Argument, argv i, j bude je j-tý znak argument, i-tý. Zbavím se toho tady teď od dáme to do té smyčky. Takže je ekvivalentní řetězec s rovnými argv i, a pak je držák j. No, my nepotřebujeme deklarovat tato proměnná y. Místo toho jsme jen spojit tyto dva do toho, co jsme měli, argv I, J. SPEAKER 1: [neslyšitelné]. ROB BODEN: Dobrý nápad. Takže je to rozbité. Pokud jsem vlastně běžel, by se si to uvědomit. Takže počítadlo mi záleží v tomto zejména pro smyčka je j, iterátor. Takže byste narazit na otázky, pravděpodobně nekonečná smyčka, pokud se nestanovila, že. To je důvod, proč jsme také mluvili o ladění dnes. OK. Takže pojďme spustit tento program. A pojďme vlastně přidat samostatný printf tady, že bude jen vytisknout další řádek, protože to znamená, že když jsme spuštění programu, bude tam prázdná čára mezi každým charakteru každý řádek argumentu příkazu. No, uvidíme, co to znamená. OOP. Mám nějakou chybu. Chyba implicitně prohlásil Knihovna funkcí strlen. Takže se vrací do našeho programu, jsem zapomněli hash patří string.h. Takže string.h bude hlavičkový soubor, který prohlašuje, Funkce strlen. OK, to zkompiluje. Nyní, pojďme jej spustit. Tak právě to. Bude to vytisknout naše název programu, hello world. Bude to vytisknout každou věc, každý znak, na samostatném řádku. OK. Takže pojďme vlastně vzít o krok dále. A namísto použití string.h, pojďme přemýšlet o tom, jak bychom realizovat naše vlastní strlen funkce. Tak jsem si hned dát funkce podpis. Takže pojďme zavolat my_strlen, a to bude trvat řetězec jako argument, a očekáváme, že se vrátí délka tohoto řetězce. Tak, kde je ten chlap? Ano. OK. Takže nezapomeňte od dřívějšího snímku, který byl také z minulého týdne, že řada postav, dobře, řetězec, takže řekněme, že je to náš řetězec s. Takže pokud s je řetězec, ahoj, a pak, H-E-L-L-O, paměti, že se to být, a pak to zpětné lomítko 0 znak. Tak jak se dostaneme délku s? No, trik hledá tento vůle, 0 povahu, tento null terminátor. Takže algoritmus bude být něco jako málo dost postav, které - Pojďme si to ručně představují jedny čítač, říkejme tuto délku int. Takže, od tady, my jsme bude iteraci našeho řetězce. Takže první znak, to je H, a není to zpětné lomítko 0, takže délka je 1. Iterovat na další znak, E, a to ani zpětné lomítko 0. Délka je 2. L, 3. L, 4.. O, 5. A konečně se dostáváme zpětné lomítko 0, a tak to znamená, dobře, Tento řetězec je u konce. Takže pojďme se vrátit pět. Takže vlastně provádí jednak tím, že můj délky n se rovná 0, moje pravá ruka. A budeme iterovat - SPEAKER 1: [neslyšitelné] ROB BODEN: Oh, střílet. Dobrý nápad. Boom. Takže délka n rovno 0. Takže teď, když s délka není rovné a poté, zpětné lomítko 0. Takže pamatujte, že toto zpětné lomítko 0, je Skutečný znak, a znamená to, že konec řetězce. Stejně jako, také zpětné lomítko n je aktuální znak. Zpětné lomítko 0 se chystá uvést konec našeho řetězce. Nechci, aby to dát tam. A zatímco s indexované podle délky není rovná null zakončení, poté jsme jen tak zvýšit délku. Takže na konci našeho programu, Délka se nakonec bude být 5 v tomto případě. A budeme jen vracet délku. OK. Takže teď tady, vůbec se mi nelíbí to my_strlen. Pojďme zkompilovat, aby se ujistil, všechno běží hladce. Jsem dělal ve 2? Nebo to byl 1? To by mělo stačit. Dobrá. Tak tohle je argv 2. Funguje jak se očekávalo, i když bylo to, že ten, co jsem to udělal v? Ano. OK. Tato verze, co neměl printf nový řádek poté, ale to není žádný rozdíl. OK. Takže pracoval, jak se očekávalo. Nyní můžeme i kombinovat jeden krok dále, kde Oznámení tady, dobře, Nejprve jsme popadl strlen z argv i, a pak jsme iterace každá postava v tomto řetězci. Takže místo toho, aby dělal to, co kdybychom Jen kombinovat logiku čekání až jsme narazili zpětné lomítko 0 práva do této smyčky for? Takže iterovat zatímco argv i, j dělá není rovno zpětné lomítko 0. Takže první je spustit. Dobrá. Tak tady je tato podmínka říká - Pojďme jasné, že. Takže teď, ať je to naše argv. Takže, když jsem běžel tento program dříve, argv je pole řetězců. A tak, když jsem jej spustit s tečkou lomítkem argv 2, hello world, pak argv sám o sobě je délka 3, pro argv nula, ahoj a svět. A v každé z těchto indexů je, Samotný pole, kde to bude tečka, bude to lomítko, já nevím, v případě, že je správný směr, jsem Nemyslím, že to bylo. -R-V pomlčka, potřebují více prostoru. Pojďme nakrájíme na tomto poli. -R-V pomlčka 0, a pak zpětné lomítko 0. A pak v nepořádku bude ahoj. Řekněme, že H-E zpětné lomítko 0. A konečně, W-O lomítko 0. Takže algoritmus, který jsme právě napsali, vnořené cykly for, co jsou zač dělá, je, musíme nejprve čelit i a pak j. To by bylo jednodušší, s kódem na obrazovka, Vraťme se k tomu. OK. Tak zjistíte, že i je iterátor, který je iterace každý příkaz argument řádek. A j je iterátor Iterace na každý znak v tom, že argument řádek příkaz. Takže co to nejvnitřnější printf dělá je, jsme printf argv 0 0, printf argv 0 1 printf argv 0 2, 0 3, 0 4, 0 5, 0 6, ale teď, argv 0 7 se chystá rovná zpětné lomítko 0. Tak jsme se ukončit, že pro smyčce, a teď jsem se opakuje na 1. A teď jdeme k tisku argv 1 0, argv 1 1 - No, teď, když jsem řez ahoj krátká, argv 1 2 opět bude zpětné lomítko 0. A tak, i zvýšit, a pokračovat, a tak dále, dokud se vytisknout všechny svět, a to jsou tři příkazového řádku argumenty, a budeme ukončit z vnější smyčka, a dokončit náš program. OK. Takže pojďme se sem vrátit. Takže budete získat nějaké znalosti s argumenty příkazového řádku pro tento zvláštní problém nastavit. Nyní, ladění. Takže jste asi už musel udělat některé ladící s vaší předchozí problém nastavit. A ještě jedna velmi snadný způsob, jak ladění, Nejprve se pojďme podívat na buggy programu. No, procházky tohoto programu, budeme žádat uživatele o integer, chytit, že celé číslo, a pak, libovolně, máme while, který se právě chystá decrement i, dokud je to rovná 10. Pojďme se jen předpokládat, že jsem zadání celé číslo větší než 10. Takže decrement i tak, aby to rovná 10. A pak máme další while že, když jsem se nerovná 0, máme bude decrement i o 3. Takže pokud uvidíte záměr chyby tady je to, že tento bude decrement i na být 10, a pak to, zatímco smyčka úbytek i z 10 na 7, až 4 na 1, k negativnímu 2, aby negativní 5, a tak dále, na negativní nekonečna, protože i bude Nikdy vlastně rovná 0. A pak na konci tohoto programu, máme funkci foo, který je jde o tisku, že i. Tak to je krátká a triviální program a chyba je zřejmé, zvláště poté, co jsem řekl to, co chyba je. Ale záměr tady je dobře, to by mohlo skutečně vypadat jako některé z vašich řešení od chamtivý od posledního problém nastavit, a možná to mít některé nekonečná smyčka v programu, a nemáte tušení, co to způsobuje. Takže velmi užitečné pro ladění technika je prostě přidat printfs celého kódu. Takže tady chci printf mimo První cyklus while. A tady chci printf, a já si jen vytisknout i. Budu ještě udělat jako první, zatímco smyčka, i. Venku, druhý cyklus while. Opět, tisknout uvnitř odtud, hodnota i. A pojďme spustit to. Takže tečka lomítko ladění. Zadejte celé číslo. Pojďme udělat 13. A boom. Vidíme, že jsme nekonečné smyčkování uvnitř druhé, zatímco smyčky. Takže teď víme, co je chyba. Ale printf ladění je naprosto skvělý, ale jakmile se vaše programy se delší a složitější, existují sofistikovanější řešení jak věci pracují. Takže pojďme odstranit všechny tyto printfs. A pojďme se ujistěte, já ne něco pokazit. OK. Takže program, budeme představit se nazývá GDB, GNU Debugger. No, vlastně, pojďme odstranit ladění pro druhé, a aby ladit znovu. No, vlastně první, dobrá lekce V argumenty příkazového řádku. Všimněte si, že tento Clang příkaz, který je sestavování vše je předán na příkazovém řádku, tyto argumenty příkazového řádku. Tak, jak přesně se bude používat argumenty příkazového řádku, jak jsme předtím, a jak budete v pset 2, to je jak Clang je jejich použití. Tak zjistíte, že to první příznak, pomlčka ggdb3, co že to říkám, kovový zvuk, měli byste zkompilovat tento soubor s záměr, že jsme se nakonec je třeba ji ladit. Takže pokud budete mít tu vlajku, pak můžeme GDB ladění. A to bude otevírat GNU Debugger. Takže tam je spousta příkazů že je třeba si zvyknout. První z nich, že budete pravděpodobně ihned potřebujete, je Run. Takže to, co je spustit dělat? Bude to začátek našeho programu. Tak utíkej, začíná program, program ptá se nás na celé číslo, 13. A pak je to nekonečná smyčkování jako Očekává se, s výjimkou jsem odstranil printfs, takže nemáme ani vidět. Vystoupil normálně. Oh. Je možné, že je to všechno zabalené cesta kolem, zpět na - ignorovat to. Předpokládejme, že nevystoupil normálně. K dispozici je složité odpověď. Takže teď, že to není moc užitečné. Tak právě běží náš program uvnitř Tento debugger se nám nepomůže v žádném způsobem, protože jsme mohli právě udělal tečka lomítko ladění zvenčí GDB. Takže jeden příkaz, který pravděpodobně budete - a já budu skončit to. Ovládání-d nebo ukončit, a to jak práci. Takže pojďme otevřít ho znovu. Další příkaz, který budete pravděpodobně okamžitě chcete zvyknout si je přestávka. Takže budeme rozbít na hlavní teď, a pak budu vysvětlovat, že. No, tady vidíme my nastavit zarážku na tomto řádku debug.c. Takže to, co zlom znamená, že když jsem typ běh, program bude pokračovat v jízdě, dokud Praštil jsem zarážku. Takže, když jsem narazila na příkaz Spustit, spustí program, a pak se zlomí, jakmile to vstupuje do hlavní funkce. Přestávka hlavní bude něco jste docela běžně dělat. A teď vám představit některých dalších příkazů. Všimněte si zde, že říká my zlomil na řádku 11, který je printf, zadejte celé číslo. Takže příkaz Další bude, jak jdeme na další řádek kódu. To se děje, abychom mohli kroku v naší programové řádek po řádku. Takže příště. Nyní linka 12, jedeme získat celé číslo. Další. A pokud jste prostě zmáčknout Enter znovu, bude to opakovat poslední věc, kterou udělal. Takže nemám potřebu psát Další pokaždé. Takže zadat číslo, 13. Takže teď, linka 14, a zároveň i větší než 10, a já budu dělat dál. A vidíme, že budeme decrement i. Takže budeme i decrement znovu. Takže teď, další užitečné příkaz Tisk. Takže tisku se bude tisknout hodnota proměnné. Pojďme se vydat na hodnotu proměnné i. Pojďme tisknout i. Bude to říct, že jsem je 11. Teď jsme znovu na Další a zároveň i je větší než 10. Tak jsem to ještě větší než 10, protože je to 11. i minus minus. Pojďme si vytisknout i znovu. Jak se dalo očekávat, je to 10. Takže teď, příště. Bude to zpátky do stavu, i je vyšší než 10, ale já je teď 10, tak že to není větší než 10, takže očekáváme, že to vypadnout z cyklu while. A teď jsme pod tento řádek kódu. A další příkaz, List, se právě chystá Pro zobrazení předchozí a další pár řádků kódu, ve případě, že jste ztratili sami. Takže jsme prostě vystoupil tento while, a teď jsme vstoupili do této zatímco smyčka, linka 18. Takže když jsem se nerovná 0. A další, i rovná i mínus 3, a my budeme Všimněte si, tak to prostě dál. A můžeme vytisknout i. Každý příkaz druh má klávesové zkratky. Tak p je zkratka pro tisk. Takže můžeme p i. Jen držte n, nebo aby dělal Další. Vytisknout i znovu. Vidíte, teď je to negativní 167. Takže to bude trvat věčně, ale ne opravdu navždy, protože jste právě viděli, je bude skutečně skončí na nějakém místě. Tak to je začátek GDB. Ale pojďme udělat ještě jednu věc v GDB. Uh, ladění. Takže, v tomto konkrétním případě, nekonečná smyčka se stalo, že uvnitř hlavní funkcí. A teď, prostě přijmout, že jsem bude pohybovat nekonečnou smyčku do funkce foo. Jen si uvědomit, že na konci tohoto Program, dobře, to bylo původně volá foo, který byl právě bude tisknout i. Ale teď jsme volá foo, který je bude decrement jsem, až je to 0, a vytisknout tuto proměnnou. OK. Kromě toho, že. Proveďte ladění. A teď, gdb ladění. OK. Takže když jsem spustit pak se nebudu být schopen skutečně krokovat my programu řádek po řádku. Takže pojďme rozbít na hlavní, a poté zadejte příkaz Spustit. Tak jdi přes to, printf, zadejte číslo, dostanete číslo, 13. Takže budeme držet snižující dokud i je větší než 10. Pak jedeme do propadnout while, a dostat se do vedení - pojďme otevřít v samostatném okně. Tak jsme zmenšena, dokud jsem byl už ne větší než 10, a pak jsme se nazývá funkce, foo. Takže to, co se stalo, jakmile jsem narazila Funkce foo, tak jsem zavolal foo, a Pak jsem už neměl kontrolu nad GDB. Takže jakmile jsem narazila Další na tomto řádku, věci pokračuje, dokud se to stalo, kde program vystoupil, když - předpokládat, že neexistovala nakonec. Viděl jsi, že pauza na chvíli ačkoli. Tak proč jsem ztratil kontrolu nad Program v tomto bodě? No, když jsem typ vedle, že jde doslovný další řádek kódu, který bude provádět. Takže po řádku 21, další řádek kódu že bude vykonávat je linka 22, což znamená, že opuštění hlavní. Takže nechci, aby jen tak na další řádek kódu. Chci jít do funkce, foo, a pak také krokovat tyto řádky kódu. Takže to, že máme alternativu. Pojďme přestat to znovu. Přestávka hlavní. Uh, 1, další, další, 13, další, další, další, pečlivě, předtím, než jsme narazili řádek foo. OK. Takže teď jsme na řádku 21, kde říkáme foo. Nechceme psát dál, protože to bude jen volání funkce foo, a přejít na další řádek kódu. Co chceme použít, je krok. Takže tam je rozdíl mezi krokem a další, kde krok kroky do fungovat, a další jede přes funkci. Je to jen provádí celistvost funkce a udržuje v chodu. Takže krok se chystá přivést nás do funkce foo. A vidíme tady, teď, jsme zpátky na Tento while to, teoreticky, bude pokračovat navždy. A pokud jste hit krok, když to není ani funkce pro volání, pak je to identické Další. Takže je to pouze tehdy, když jste na řádek, který volá funkci, která Step se bude lišit od Next. Takže krok nám přinese zde. Krok, krok, krok, krok, krok, krok, a Budeme se nekonečná smyčka navždy. Takže jste mohli zvyknout, že vaše způsob identifikace nekonečné smyčky, je jen držet tuto klávesu Enter na vidět, kde narazíte. Existují lepší způsoby, jak to udělat, ale teď, že je naprosto dostačující. A stylisticky, aby odpovídal stylu 50, měl jsem to udělal. OK. Takže jeden poslední příkaz představit. Dobře, pojďme gdb ladění palců Takže místo toho, lámání na hlavní, když jsem znát funkci foo je také problém, pak bych mohl mít jen řekl, rozbít na foo, místo toho. Řekněme, že jsem se rozbít na hlavní i foo. Takže si můžete nastavit tolik zarážky jak budete chtít. Když jsem se napsat slovo pes, to se děje zastavit na - ooh, pojďme překompilovat, protože Změnil jsem věci. Uvidíte tento řádek, varování, zdroj soubor je novější než spustitelného souboru. Takže to znamená, že jsem šel sem a změnil to, aby odpovídaly stylu 50, ale já jsem překompilovat programu. Takže GDB mě vědom. Odejdu, aby ladit znovu, hit gdb ladění. OK. Takže teď, zpátky k tomu, co jsem dělal. Přestávka hlavní, přerušení foo. Nyní, když jsem spuštění programu, takže je to bude pokračovat, dokud hity breakpoint. To breakpoint se stane být první v hlavní. A teď, místo toho, aby dělal další, další, další, další, další, až jsem narazila foo, jsem můžete psát i nadále, což bude pokračovat dokud nenarazíte na další zarážku. Musím nejprve zadat celé číslo. Pokračovat bude pokračovat, dokud jsem trefil další breakpoint, což je skutečnost, že funkce foo. Takže Run poběží, dokud nenarazíte breakpoint, ale stačí pouze zadat příkaz Spustit, když jste spuštění programu, a poté, od té doby, je to i nadále. Kdybych to udělal rozbít hlavní a pak běžel, bude to zlomit na hlavní, a pak pokračovat. Vzhledem k tomu, nemám bod zlomu na foo, Zadejte celé číslo, pak nyní jsem nebude rozbít na foo. Je to prostě bude nekonečno smyčky, dokud to. OK. Tak to je úvod do GDB. Ty by měly začít používat ve vašich problémů sad. To může být velmi užitečné, identifikovat chyby. Pokud jste vlastně jen, line-by-line, přejděte prostřednictvím kódu, a porovnat, co je vlastně děje s tím, co můžete očekávat aby se to stalo, pak je to docela těžko přehlédnout vaše chyby. OK. Takže minulý týden David vyrůstal v tomto tajný klíč kryptografie věci pro poprvé, kdy nechceme Hesla jen být uloženy na našich Počítač v některých textového souboru, kde někdo může přijít a jen otevřete ji a přečtěte si je. V ideálním případě by se šifrována nějakým způsobem. A Problem Set 2, budete se zabývat s jednoho způsobu šifrování, nebo, no, dvě metody, ale nejsou tak velké. Máte-li dělat hacker vydání, jste také bude jednání s dešifrování nějaké věci. Takže otázka teď je, dobře, a to i v případě, Máme nejsilnější šifrování algoritmus na světě, pokud se rozhodnete zvláště chudé heslo, pak to vám nepomůže moc, protože lidé budou moci na to přijít. I když viděl zašifrovaný řetězec a vypadá to, že nepořádek z odpadků to znamená, že nic pro ně, v případě, že ještě stačí vyzkoušet několik hesel na to přijít, pak nejsou příliš bezpečné. Takže sledujete video, které je tento bod. [PŘEHRÁVÁNÍ] -Přilba, vám ďábel. Co se děje? Co děláte s mou dcerou? -Dovolte mi představit brilantní mladý plastický chirurg, Dr. Phillip Schlotkin, největší nos práce člověk v celé vesmír, a Beverly Hills. -Vaše Výsosti. -Nose práce? Nerozumím. Ona už měla nos. Byl to sladký šestnáct přítomen. -No. Není to to, co si myslíte. Je to mnohem, mnohem horší. Pokud nechcete mi dát kombinaci se vzduch štít, Dr. Schlotkin bude dát svou dceru zpět svůj starý nos. -No. Kde jsi to vzal? -Dobře. Řeknu. Řeknu. Ne, tati. Ne, to nesmíš. -Máš pravdu, má drahá. Budu si ujít nové nos. Ale já jsem se mu to říct kombinaci, bez ohledu na to, co. -Velmi dobře. Dr. Schlotkin, dělat to nejhorší. -Rádo se stalo. [NÁSTROJE JSOU nabroušené] -No. Počkejte. Počkejte. Řeknu. Řeknu. Jsem věděl, že to bude fungovat. Dobrá. Dejte mi ho. -Kombinace je jedna. -One. -One. -Two. -Two. -Two. -Tři. -Tři. -Tři. -Four. -Four. -Four. -Five. -Five. -Five. -Tak kombinace je, dva, tři, čtyři, pět. To je ten nejhloupější kombinace Co jsem kdy v životě slyšel. To je ten druh věcí idiot bude mít na jeho zavazadlech. -Děkuji vám, Vaše Výsosti. -Co jsi to udělal? Jsem vypnul zdi. -Ne, ne. Jsi vypnul celý film. -Musel jsem stiskl špatné tlačítko. -No, dal ji zpět. Vložte film zpět. -Ano, pane. Ano, pane. -Pojďme, Arnolde. No, Gretchen. Samozřejmě, že víš, že jsem to ještě muset účtovat za to. [END VIDEO PŘEHRÁVÁNÍ] ROB BODEN: Dobře. Takže teď, že jsme už mluvili o bezpečnost v některých ohledech, pěkná malý filmový plakát, takže v posledních letech dnů, tyto problémy s NSA sledování všechno. To může být obtížné cítit, jako jste vy mít nějaký soukromí v on-line světě, i když jsem nevěděl si většina detailů PRISM. Takže pohybuje nad PRISM, nejdeme je třeba o tom mluvit, teď přemýšlet o svém notebooku. Tak tady, chci přejít k mému skutečnému účtu, s mým malým tučňákem. Takže mám nastaveno heslo, a že heslo je, co chci, aby to bylo. Ale pamatujte si, že to, co jsem přihlášení v s, takže to login výzva, je nějaký program. Je nějaký program, který byl napsal nějakou osobou. A tak, že osoba, pokud jsou zvláště nebezpečný, mohli již bylo řečeno, v pořádku, takže pokud heslo že jsem se vstoupit, je rovna můj aktuální heslo, nebo je to stejná na některé speciální hesla - David je úžasný, nebo tak něco - nechte je dál Takže škodlivý programátor může mít přístup ke všem vašim Mac, nebo Windows, nebo tak něco. Takže to není moc obavy, protože, Myslím, že je to login programu , který je dodáván s OS X, stovky nebo tisíce lidí, kteří mají přezkoumat tento kód. A tak, pokud v kódu někde, jste říci, zda tento řetězec rovná rovná David je úžasný, login, pak někdo bude, stejně jako, počkejte. To není v pořádku. To by nemělo být tady. Takže to je jeden způsob, jak dostat věci být docela bezpečné. Ale myslet i programů že píšete. Řekněme, že jste napsal program login. Tak to login program, který jste napsal, tak samozřejmě, že jste dobrý programátor. Nebudeš dát jakýkoliv škodlivý jestliže x rovná se rovná David je úžasné do vašeho kódu. Ale tento program, co si použít zkompilovat tento program? Něco jako Clang. Takže to, co v případě, že osoba, která se stalo napsat zvonění speciál přejímané v Clang něco podobného, ​​když jsem sestavování přihlásit programu, zadejte tento kód do přihlašovacího programu, který říká, pokud x se rovná rovná David je úžasné? Takže není ještě dost, ale máme stejný vydávat tady, kde kovový zvuk, dobře, tisíce, ne-li desítky tisíc lidé, se podíval na Clang, mají Podíval se na své řádků kódu a řekl, v pořádku, nic špatného zde. Je zřejmé, že nikdo se dělá nic to škodlivý. Ale to, co je zvonění sám, jako, co když jsem sestavit zvonění? Co když mám nějaký kompilátor, který sestavuje zvonění, které vloží do Clang Tento speciální hack, který říká, všechno v pořádku, když jsem se sestavit zvonění, pak spustitelný bych se měla speciálně vypadat uvnitř přihlašovací programu a vložkou toto heslo, rovná se rovná Dave je úžasné? Takže si pamatujte, že váš kompilátor sám musí být sestaven na nějakém místě. Takže jestli to, co se rozhodnete sestavit zvonění s, je sám o sobě škodlivý, pak by mohl být zašroubován celý cesta v řadě. Takže tady máme Ken Thompson a Dennis Ritchie. Tak tohle je kultovní fotografie. Dennis Ritchie je na pravé straně. Je major - skoro napsal C. Tak můžete děkuji mu za tuto třídu. Ken Thomson je na levé straně. Dva z nich v podstatě napsal UNIX. No, oni byli hlavními přispěvateli v Unixu. Tam byly některé další. Takže Ken Thompson, na nějakém místě, vyhrává Turing Award. A ocenění Turing, vždycky jsem slyšel je odkazoval se na tuto cestu, je to Nobelova cena za počítačové vědy. Takže na Turing Award, má na dát jeho děkovací řeči. A dává tomuto velmi slavný projev Nyní, s názvem Úvahy o důvěřující Důvěra, kterou jsme spojili Chcete-li na stránkách kurzu. A v této řeči, on říká, všechno v pořádku, tak jsem napsal UNIX, a teď všichni si lidé používáte UNIX. Teď si uvědomte, že dnes je Linux přímý potomek UNIX. OS X přímo používá UNIX. Windows není tak moc, ale hodně myšlenek byly převzaty ze systému UNIX. Takže půjde až do fáze, a říká, v pořádku, jsem napsal UNIX. A stejně tak vy víte, že jsem moci přihlásit do každé jeden z vašich počítačů. Protože jsem si jeden z těchto speciálních pokud x rovná se rovná Ken Thomson je úžasné, pak jsem dovoleno se přihlásit. Takže lidé jsou jako, no, Jak jsi to udělal? Podívali jsme se na přihlašovací programu a nic tam. Je to jako, no, jsem upravil kompilátor přihlásit přihlašovací programu takže přihlášení Program nyní bude mít že x se rovná rovná Ken Thompson je úžasné. A oni říkají, dobře, že to není pravda. Díváme se na kompilátoru, a Kompilátor nemá žádné řádky Kód takhle. Je to jako, OK, ale to, co jste kompilace kompilátoru se? A myslí si, a je to, jako, no, Já jsem ten, kdo ti dal kompilátor kterou používáte pro kompilaci kompilátoru, tak jste kompilaci kompilátor, který sama o sobě je škodlivý, a bude přerušit program login. Takže v podstatě, v tomto bodě, tam je žádný způsob, jak byste se mohli podívat na zdroje Kód přihlašovací programu vidět, co je špatně. Dalo by se dokonce podívat do zdrojový kód kompilátoru vidět, co je špatně. Budete muset podívat na stroji kód, skutečný binární ze sestaven kompilátor vidět, počkejte, to řádky kódu by tu být. Ale Ken Thompson to vzal jeden krok dále a řekl, dobře, tam jsou Tyto speciální programy, které skutečně pomůže vám číst binární programů, a tak pokud někdo používá tento program, číst binární, by vidět tyto řádků kódu. Byl upraven ty programy, které říkají, všechno Dobrá, když se díváte na kompilátor, neukazují to zejména sada binární. Takže pak je třeba vzít, že krok dále a v podstatě, které by mohly mít přijatá více úrovní nepřímé, a na nějakém místě, nikdo je vlastně bude kontrola. Takže poučení z příběhu je, že jste nebude psát Zvonění v této třídě. Budeš používat lezení Zvonění hodně v této třídě. Pro všechny víte, Clang je škodlivý program, který je sabotovat každý jediný program, který jsem kdy sestavil. A nechat na tom velmi neblahé na vědomí, že se uvidíme ve středu. [APPLAUSE] Reproduktoru 2: V dalším CS50. SPEAKER 3: Neopovažuj se říkat, že. Můžete to udělat. Vy jste to udělal dříve, můžete to udělat dnes, můžete to udělat zítra. Vy jste dělal to několik let. Stačí jít tam a udělat. Můžete to udělat. [MUSIC PŘEHRÁVÁNÍ]