>> [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.
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.
Řeknu.
>> Jsem věděl, že to bude fungovat.
Dobrá.
Dejte mi ho.
>> -Kombinace je jedna.
>> -One.
>> -Two.
>> -Tři.
>> -Four.
>> -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Í]