SPEAKER 1: Ahoj všichni. Chystáme se začít. Myslím si, že lidé jsou stále pokračuje být filtrování. Ale v zájmu času, takže můžeme dostat Vy odsud včas, jdeme na start. Takže vítejte na CS50 Kvíz 0 hodnocení. Pro ty z vás, kteří si neuvědomil Ještě máte otázku týkající se středu. Woo-hoo. Pokud jste nezačali studovat nebo si neuvědomil, že to ještě existuje, minulé kvízy a veškeré informace o Váš kvíz je na cs50.net/quizzes. Je tu nějaký docela dobrá věc tam, Posledních kvízy z posledních 10 let, stejně jako informace o tento kvíz a témata které se bude vztahovat. Takže začněme. Takže vy si možná vzpomenou, první den třídního David měl ty svítilny. Takže v podstatě všechno, co jde na pod kapotou počítače je provádí v binární. Binární znamená, že to, co zní jako, 0 je a jeden je. To má dvě hodnoty, které může být reprezentován. Tak jako v prvním dnem oddílu když David se obrátil na světlo žárovka reprezentovat na, nebo 1, náš počítač chápe jako binární 0 a je 1 je, zapnout nebo vypnout. Základy binární. Každé místo je zastoupena v základně dva. Takže si přidat 2 do 0 do 1 až 2 úplně nahoru. Chcete-li vypočítat, jaké jsou vaše binární je decimal, stačí následovat tuto rovnici Typ věc. Pokud máte jeden v některém z těchto míst, to vynásobit cokoliv založit, že je to in, přidejte ji, a dostanete desetinné místo. Takže to je to, jak můžete spolehnout do 5 v binární. Stejně jako to, co jsme dělali na Poslední snímek, to je to, jak byste představují 1 až 5. Podobně, stejně jako můžete přidávat a odčítání v desítkové soustavě nebo založit 10, nebo opravdu žádný základ, na můžete přidat a odčítání v binární. Přesně to, co byste čekali, když jste přidejte dvě až, když se rovná větší než 1, nesete 1, aby bylo 0, a to dále, že cesta, jen jako byste očekávat, že s pravidelným desítkové nebo jakýkoli jiný základ. V pohodě. Takže jak jsem řekl předtím, všechno, co pokračuje pod kapotou našeho počítače se provádí v 0 je a 1 je, nebo binární. Tak jak jsme se vyjádřit, například, písmena nebo čísla, nebo znaky? A odpověď na to je ASCII. ASCII je mapování mezi znaky , které bychom za normálních okolností vidět Anglický jazyk jako to, B je, C je, podtržítka, pomlčky a něco takového. A to, že mapuje na hodnotu ASCII. ASCII hodnota je jen číslo, které lze chápat počítačem. A stejně jako vy můžete dělat sčítání a odčítání s čísly, můžete to udělat je s hodnotami ASCII. Takže v tomto příkladu, co bude tisknout? Jo, tak jen prostor C space space B D. Kde jsi moje myš jít? Všimněte si můžete definovat int na 65 let. A při tisku, že s použitím procent C, bude to interpretovat jako charakter a vytiskne A. Podobně můžete deklarovat to jako char. A když si ji vytisknout pomocí procent C, bude to interpretovat jako procent D. A stejně jako si můžete přidat číslo, můžete přidat znaky jsou Hodnoty ASCII, v tomto případě. Tak trochu ukazatel pro každého. 5, jako řetězec, není ve skutečnosti rovná 5. Tak jak můžeme převést Řetězec 5 do celé číslo 5? Nějaké nápady? Jo. Takže pokud máme 5 jako řetězec, můžeme odečíst 0. A to budeme mít pět. A podobně, pokud máme 5 as integer, dodat, že na řetězec 0. A to nám dává řetězec 5. V pohodě. Nyní si připomeňme, zpět k přednášce v němž jsme si povídali o algoritmech. Tak jak to vlastně chceme počítač dělat zajímavé věci? Víš, jen sčítání a odčítání čísla a tisk věci není to vzrušující. Obvykle chceme naše počítače k provést nějaký algoritmus. Něco trochu složitější než jen prosté aritmetiky. Algoritmus je jen krok za krokem sady pokynů pro způsob provedení určitý task-- stejně jako recept. Možná si ještě vzpomínáte na první den třída, kde David se nám počítat pokoj lidí, a kolik lidí byli v místnosti. Ty by mohly být použity k počítání jeden po druhém. 1, 2, 3, 4. V tomto případě, lineární algoritmus. Ale David představen algoritmus pro můžete počítat lidi v místnosti kde všichni stojí, vy, že vaše číslo na jinou osobu, dodat, že číslo nahoru, a jedna osoba se posadí. A to zopakovat. To je jeden druh algoritmu. Můžeme analyzovat, jak účinně An algoritmus je založen na to spuštění. Ale budeme mluvit trochu více o tom později. Takže všechny algoritmy lze také být zapsán v pseudokódu. Pseudokód je jen angličtina jako syntaxe používá k reprezentaci programovací jazyk. Například, pokud bychom chtěli požádat uživatele uhodnout moje oblíbené číslo, my může mít pseudokódu jako takové. Pořiďte si uživatelé hádat. V případě, že odhad je správný, řekněte jim, jsou správné, jinak řekni jim že to není správné. A pseudokód je způsob, jak snadno představuje myšlenku nebo algoritmus. Takže teď bychom mohli chtít, aby skutečně napsat to v jazyce, který počítač Možná pochopení. Takže bychom mohli napsat naše pseudokód a interpretovat, že do zdrojového kódu. Zatím zdrojový kód musí dodržovat do určité syntaxi programovací jazyk. A tak daleko, v CS50, máme Používám většinou c. Takže to může být zdrojový kód pro C. Později v průběhu, budete v noci přišel do styku s jinou programování jazyky jako PHP. Nebo pokud dokonce vzít jiných tříd, ti mohli dělat Java, Python, nebo dokonce OCML. Ale v našem c programovací jazyk, je to jak bychom mohli psát zdrojový kód pro pseudokód algoritmu, který Jen jsem popsal dříve. Tak jak se váš počítač skutečně Rozumíš tomu? Jak už jsem říkal, je to opravdu jen chápe nul a jedniček. Tak jak to dostat ze zdroje Kód na něco, co může být Rozuměl jste? No, máme něco volal kompilátor. Pokud si vzpomenete, zpět většinu svého psets, měl jsi nějaký druh programu napsaný v dot c souboru. A pak byste zadat značku. Takže to, co je, aby dělal? Můžete zadat make kompilovat Program proto someone-- kdo napsal své p sadu; Pravděpodobně David-- vytvořil make soubor. A to říká, aby vědět, ke spuštění kompilátor, volal řinčet, že bude pak kompilovat zdrojový kód k objektu kód, který je nul a jedniček že váš počítač rozumí. Ale trochu později, půjdeme více do hloubky asi překladačů. Tak vzpomínám pset 0, tam-- ano, máte nějakou otázku? Diváků: [neslyšitelné]? SPEAKER 1: Ano. Myslím, že ve skutečnosti by měla být on-line. Jo. Diváků: Je to jako [neslyšitelné]? Reproduktor 1: Není. Jsou na cs50.net/quizzes. DIVÁKŮ: Slash kvízy, lomítko 2013, lomítko 0, a jen proklikat kvízy 2013 a kvíz 0, zkontrolovat v sekci snímků. SPEAKER 1: Jo, takže pokud jste chtěl vytáhněte ji nahoru a podívat se na to na vašem vlastní počítač, to je taky v pohodě. Řekni to ještě jednou. Diváků: [neslyšitelné]. SPEAKER 1: Jo, [neslyšitelné] je dummy proměnná. Oh, ano? Diváků: [neslyšitelné]? Reproduktor 1: No, stávky nejsou na zkoušku. Omlouváme se, ale její otázka byla, byla stávky na zkoušku. A to není. Takže pset 0, měli jste mít všechny realizovány něco, pomocí scratch. A my jsme se naučili některé základní programování stavební bloky pomocí scratch. Takže pojďme se podívat na některé z těchto stavebních bloků , které tvoří program. První z nich je logický výraz. Booleovské výrazy, jsou ty, a 0, nebo něco, co má dvě možné hodnoty. V tomto případě je pravdivé nebo nepravdivé, zapnout nebo vypnout, a ano nebo ne. Příkladem jednoduché, velmi jednoduché, program, který používá Boolean Výraz se zde. Tak, aby pro booleovských výrazů na být užitečné, máme logických operátorů. Jedná se o subjekty, které mohou být použity srovnat určité hodnoty. Takže tu máme a nebo není rovno méně než nebo se rovná, nebo větší než rovná, a méně než nebo větší než. Ale tito operátoři nejsou příliš užitečné, pokud můžeme spojit je do podmínky. Takže jste si možná vzpomenou na zelené louce a od p určuje, že my měl podmínek. Jsou to v podstatě jako vidličkami, v logika programu, který provádí v závislosti na tom, zda podmínka je splněna. Takže jedna z podmínek, které jsme měli používá mnohokrát v tomto kurzu je if, else, pokud a jinde podmínek. Zde je příklad toho, jak můžete použít. Ví někdo, jaký je rozdíl mezi jen pomocí if všech Cesta dolů verše if, else, tehdy a ještě v kombinaci? Ano? Diváků: [neslyšitelné]. SPEAKER 1: Přesně tak. Takže pokud bych měl, pokud celou cestu dolů tento způsobem, i když tato podmínka přiznání pravda, to bude ještě pokračovat testování další dva. Vzhledem k tomu, s jiným-li, else prohlášení, v případě, že jeden vrátí hodnotu true, ostatní nejsou testovány. Jakékoliv dotazy o tom? V pohodě. Takže použít if-else z else prohlášení, pokud víte, že je to jen možné být jeden z těchto případů. Takže víme, že je-li x menší než 0, je to rozhodně nebude větší než 0. Další, další stavební blok že jsme se dozvěděli, jsou smyčky. Máme tři typy smyček. U smyčky, while, a to while. A obecně, pokud si sednete do něco psát, musíte se rozhodnout, který ze tří, který chcete použít. Tak jak jsme se rozhodnout, který z nich? Obecně používáme pro smyčce, pokud víme, kolikrát chceme opakovat přes něco nebo kolikrát Chceme-li provést úkol. Používáme while pokud budeme potřebovat nějaké podmínka, aby to byla pravda, aby v provozu. A používáme to při velmi podobné zatímco, ale chceme, aby naši spuštění kódu na alespoň jednou. Takže dělat, když to, co je v úkolu bude vždy probíhat nejméně jednou. Vzhledem k tomu, s chvíli ji nemusí spustit vůbec, pokud podmínka není splněna. Jakékoliv otázky s tím? Takže struktura smyčky for. Vy jste všichni viděli to. Můžete inicializovat. Máte nějaký stavu. Tak, například, můžeme inicializovat jako i rovná 0. i je menší než 10. A i ++. Velmi jednoduchá, že jsme udělali. Na smyčce while, podobně, máte mít nějaký druh inicializace, nějaký stavu, a nějaká aktualizace. Takže můžeme realizovat naše pro smyčce také jako while pomocí tohoto. A podobně se dělat, zatímco smyčky, bychom mohli mít nějakou inicializaci, vykonat něco, aktualizujte ji a zkontrolujte stav. Takže teď funguje. My jsme dali všechno dohromady. Mohli bychom napsat nějaký druh funkce. Společné funkce, které vám mohou Viděl už je hlavní. Hlavní je funkce. To má návratový typ, int. Má název funkce, hlavní. A to má argumenty, argc a argv. Takže hlavní je jen funkce. Další funkce, které mohou být použita, printf-- printf je function-- Vezmi_int, toupper. Ale to se stalo, že byl zaveden pro nás nějaký knihovny. Pokud jste pamatuji, včetně Tato knihovna CS50.h nebo Standardní I / O knihovny. Ano, otázka? Diváků: Je hlavní jen vlastní, c? Má to tak nějak [neslyšitelné]? SPEAKER 1: Otázkou je, pokud hlavní je vlastní cca. A ano, všechny funkce mají hlavní funkci. Je to tak trochu nezbytné pro počítač vědět, kde začít spuštění kódu. Diváků: Takže ne [neslyšitelné]? SPEAKER 1: Ne Nějaké další otázky? V pohodě. Tak jako můžete využít funkci která je napsána pro vás, můžete také napsat vlastní funkci. To je funkce, která by se někdo mohl psali pro výpočet objemu o q, například. K dispozici je návratový typ zde, v tomto případě int, naše jméno funkce q a naše Seznam parametrů. A všimněte si, že budete muset zapisovat data typ parametru, který chcete použít jinak funkce není vědět, jaký druh Parametr bych měl přijmout. Takže, v tomto případě, chceme číslo jako náš vstup. Tak proč bychom mohli chtít použít funkce? Za prvé, ideální pro organizaci. Pomáhají rozbít svůj kód do více organizované kusy a aby to čitelnější. Zjednodušení. To je dobré pro design. Když čtete kus kódu a hlavní funkcí je opravdu, opravdu dlouho, mohlo by to být těžší důvod o tom, co se děje. Takže pokud jste vyrazit do funkce, to by mohlo být čitelnější. A znovu-schopnosti. Pokud máte kus kódu, který je bytí volal nebo spustit několikrát, namísto přepisování, které kódují 10 krát ve své hlavní funkce, můžete chcete jej znovu použít. A pak pokaždé, když budete potřebovat, aby kus kódu, volání funkce. Takže teď, pokud si vzpomeneme zpět do nuly, jsme mluvili o několika pojmy, z nichž jeden je řezání závitů. Téma je představa o násobek sekvence kódu vykonávající současně. Takže myslíte, že zpět do prvního dne, kdy měl David vy počítat z počtu lidé v místnosti. V podstatě to, co se děje na vše je z vás byli běží oddělené podprocesy. A ty nitě přicházeli společně dostat nějakou odpověď. Podobně, v Scratch, když máte více skřítci, můžete kočku a psa. A oni by byli současně vedou své vlastní skripty. To je příklad řezání závitů. A ten druhý koncept, který byl představený v začátku byla akce. A události, kdy více částí kódu spolu vzájemně komunikují. V Scratch, to bylo, když jste použili řízení a vysílání Když jsem Příjem bloky. A také, v problémových Sada 4, viděli jsme trochu událostí stejně. Vy jste mohl použít Knihovna Gevent. A byl tam funkce waitForClick , ve kterém jste čekali pro uživatele ke kliknutí. A vaše kliknutí, v tomto případě by bylo akce a čekat na kliknutí je váš obslužnou rutinu události. A také v průběhu zobrazování vašich psets a pracuje na svých psets, můžete mohla přijít do styku s některé z těchto příkazů. To je to, co jste napsali do své okno terminálu nebo cokoliv okno které se objeví na vašem g úpravy na, v podstatě, procházet váš počítač. Tak například, LS uvádí Obsah adresáře. Ujistěte se adresář vytvoří novou složku. CD, změna adresáře. RM, odstranit, odstraní soubor nebo nějaký adresář. A pak odstraňte adresář odstraní adresář. Diváků: [neslyšitelné]? SPEAKER 1: Jo, jasně. Omlouváme se, ale otázka byla, zda vás by naznačovaly uvedení této na tahák. Mohlo by to pomoci. Pokud máte prostor, můžete si ji na. Je to také jen obecně dost dobrý mít na paměti, protože když ji použijete budete chtít jen si to zapamatoval. To bude váš život mnohem jednodušší. Už jsem odpověděl na vaši otázku? Takže teď, mluvili jsme trochu Krátce o knihovnách. Ale dva hlavní ty, které jsme byli použití dosud v kurzu jsou Standardní I / O a CS50. Jaké věci jsou zahrnuty ve standardním I / O knihovny? Jo, zatím jsme použili printf. V CS50, jsme použili vezmi_int a GetString. A datový typ string je shodou okolností také musí být deklarovány v tomto CS50 knihovně. Promluvíme si o trochu více do hloubky o Jak knihovny fungují a jak se komunikovat se zbytkem vašeho kódu. Ale to jsou dva hlavní ty, které jsme přišli do kontaktu s tak daleko samozřejmě. Typy. Jedná se o dobré si uvědomit, jak moc každý druh je zastoupen, nebo jak počtu bytů každá typu requires-- int, 4 bajtů; char, 1 byte. Float je 4 bajty. Co je to double? Diváků: [neslyšitelné]. SPEAKER 1: Jo, takže plovák ale dvojnásobek velikosti. Co je dlouho? Diváků: [neslyšitelné]. SPEAKER 1: OK. Co je to dlouho? Diváků: [neslyšitelné]. SPEAKER 1: Jo, dvakrát int. Ano. Diváků: [neslyšitelné]. SPEAKER 1: Long [neslyšitelné]. A pak dlouho dlouho dvojnásobný. DIVÁKŮ: Ne, ne. Dlouho jen int. Záleží na architektuře před [neslyšitelné] a int mají stejnou velikost. [Neslyšitelné]. SPEAKER 1: Tak dlouhý a int jsou stejné. A pak dlouho dlouho je dvojnásobek int. V pohodě. A pak to, co je poslední typ? DIVÁKŮ: Pointer. SPEAKER 1: Jo, tak jsme se dozvěděli, něco málo o ukazatele. A to bez ohledu na to, co je ukazatel ukazuje na-- by to mohlo být char hvězda nebo int star-- je to vždy 4 bajty pro ukazatel. Otázky o tom? Ano? Diváků: [neslyšitelné]? SPEAKER 1: Tak dlouhý a int jsou Totéž v tomto CS50 spotřebiče. Diváků: Přístroj je zcela zaměnitelné. SPEAKER 1: Jo. Tak dlouho, dokud je dvakrát int. Diváků: Tohle je 32 bit? SPEAKER 1: 32 bit, jo. Diváků: Tak [neslyšitelné]? SPEAKER 1: Ano, pokud to není explicitně říct, že by měla převzít 32 bit. Diváků: Bylo by něco říci jako předpokladu Architektura jako spotřebiče. Pro 64 bit, jediné věci, které změna se touží a ukazatele. Oba [neslyšitelné]. SPEAKER 1: Ano? DIVÁKŮ: Otázka. Takže na jedné z praxe kvízů, požádá o unsigned int. Tak, jak by to být stanoven z int [neslyšitelné]? SPEAKER 1: unsigned v je také 4 bajty. Ale to, co je odlišné o podepsané int a unsigned int? Diváků: [neslyšitelné]. Reproduktor 1: Správně. Jeden může reprezentovat záporné hodnoty. Ale jak to udělat? Diváků: [neslyšitelné]. SPEAKER 1: Jo, to ušetří 1 bit reprezentovat značku. Podepsala má jeden bit, který představuje znak. A unsigned prostě všech pozitivních výsledků. DIVÁKŮ: OK. Takže říkáte, že double je dvakrát větší plováku? SPEAKER 1: Double je dvakrát velikost plováku, ano. Diváků: Jak ukazatel na long long [neslyšitelné]? SPEAKER 1: Takže otázka je, jak se ukazatel na dlouhou long-- jak je to jen čtyři bytů, long long jeho 8 bajtů. Takže pamatujte, co je ukazatel, v podstatě, na velmi základní hodnoty. Diváků: [neslyšitelné]. SPEAKER 1: Jo, tak ukazatel je jen paměť. Takže nezáleží na tom, kolik místa který pointer ukazuje. Je jen třeba 4 bajty sledovat na tomto paměťovém místě. Nějaké další otázky? V pohodě. Takže poslední věc, kterou jsem je standardní výstup. Měli byste je používat často natolik, že si vzpomenete. Ale to je, když použijeme printf, například. A máme tyto zástupné symboly, které byli povoláni formátu kódy. Takže procent c char, procenta i pro int, a můžeme také použít procent d. Je to to samé. Ale, obecně, v CS50 jsme zkuste použít procent i. Procenta f pro plováku. Procenta ld dlouho dlouho a procent s pro řetězec. Stejně tak jsem použil několik z těchto sekvencí escape. Například zpětné lomítko n pro nový řádek. To je jen, když jste formátování Váš kód pro tisk f. Ano? Diváků: Co je to procent d pro? SPEAKER 1: Takže otázka je to, co je procento d pro? Procento d je pro ints. Procent d a procento i jsou stejné. Diváků: Jaký je rozdíl mezi zpětné lomítko n a zpětné lomítko r? SPEAKER 1: Takže otázka je, co je Rozdíl mezi vůlí n a odpor r? Myslím si, že zpětné lomítko r je-- Diváků: Tak zpětné lomítko r prostě znamená, vrací na začátek řádku aniž by skutečně jít na nový řádek. Takže pokud tisknete zpětné lomítko r a návrat na začátek řádku pak tisknete více věcí, můžete přepsat věci, které je již na [Neslyšitelné]. Vzhledem k tomu, n ve skutečnosti jde do nového linka a jde do [neslyšitelné]. SPEAKER 1: No, nějaké další otázky? V pořádku. Chystám se předat jej Dan, který bude pokračovat. [APPLAUSE] DAN: V pořádku. Takže budu mluvit o další velice široký Řada myšlenek ze třídy, které jsou zhruba zástupce dvou týdnů a start tří týdnů rozjezdu s odléváním, které je jen způsob, jak léčení hodnotu určitého typu jako hodnota jiného typu. Takže to můžeme dělat s znaků do ints, plave ints a dlouhé touží zdvojnásobit. Všechny tyto věci mohou být použity jako způsoby léčení nějakou číselnou hodnotu minus char jako jiné číselná hodnota. Takže tam jsou některé problémy s tím, ze kurz, který přichází, když jste házet věci, jako je plovák ints. Tak tohle je trochu divný. Máme plováku, který je 1.31. Vynásobíme ji 10000. A pak jsme ji vytisknout jako int. Co dělá tento výstup? 10000 krát 1.31. Takže 13000, je to, že to uhodl? Diváků: Myslím, že je to 10000. DAN: Tak jsem se vynásobí 10000 předtím, než jsem ho casting. DIVÁKŮ: Oh. Nebylo by tam být jedna 9 a některé 0 počet? DAN: Můžete mít nějaké podivné znaky. Tak jo, to je 1,3 krát 10.000. Tak to je 13000. A to navíc weird-- Diváků: 13100. DAN: 13100. Děkuji, Robe. A to navíc weirdness-- tento 9,9-- Jednoduše proto, že tento odlévání skončil zaokrouhlení směrem dolů, kde to by nemělo mít. Jo. Diváků: lití stane po cokoliv jiného? DAN: Takže, protože jsem to v tištěné podobě, ale Znamená to, násobení před ním Znamená to, lití. Diváků: [neslyšitelné]. DAN: Myslím, že by obsadil první, jo, což by bylo 10.000. Ještě něco? V pohodě. Tak tohle je 13099. Proč se to stalo? Nepřesnost. Plováky nejsou dokonalé. Mohou představovat pouze číslice na určitý počet významných osobností. Takže když jsme se vytiskne 8 Sig fíky na to float, dostaneme jakousi ošklivý vypadající číslo. A to proto, že 1,31 nemohou přesně být zastoupeny jednoduché síly dva ve stroji. Takže to skončí při nejbližší hádat, která však končí je trochu málo. Smysl? OK. Nyní přešel jsou jiný způsob dělá podmíněné příkazy, kde všechny staráme se jen o jednu proměnnou. Takže v tomto konkrétním příkladu, jsme získání celé číslo od uživatele. A pak se díváme na co to číslo je. Lze předpokládat, že je to číslo od jednoho do čtyř. To je to, co žádáš. Takže si udělat spínač název proměnné. Pak můžete nastavit případů možné Hodnoty by to mohlo být. Takže případě, že jeden, říkají, že je nízká. A pak zlomit dostat ven stavu spínače, takže nechcete jít dál. V dalším case-- tak tomu dva a případ tři-- jestli je to případ dvou to jen klesne První řádek kódu, které považuje se třetím případě, dokud nenarazí na přestávku. Takže důvod, proč jste si případ jednoho do pouze tisk nízká proto, že jsem tuto přestávku zde. Mám-li, řekněme, ignoroval break-- když jsem hodil tuto breakaway-- by to vytisknout nízká, a pak by tisknout střed, a pak by to zlomit. Takže přestávky jsou důležitou součástí spínače podmínek a že by tam měla být. Veškeré případy, které nejsou výslovně uvedeno jsou zpracovány výchozí případ ve spínači a měly by být vrženy. Publikum: Tak 1, 2, 3, a 4 by n? DAN: Hodnoty, které n může být. Ano. Jo? Diváků: Takže když máte že [neslyšitelné]? DAN: byste vytisknout nízká, a pak by to vytisknout střední a pak by to zlomit. Diváků: Proč by to vytisknout Střední-li [neslyšitelné]? DAN: Takže všechno v případě, před přestávka spadá. Takže případ jednoho tisku pod případ tím, jak je to po tisku. Jo? Diváků: [neslyšitelné]? DAN: Tak toto číslo je jen zvláštní hodnota, kterou tato proměnná může mít, že jo? Má to smysl? Jo. Diváků: [neslyšitelné]? DAN: Ano, případ dvou vytiskne střední a pak zlomit. Diváků: [neslyšitelné]? DAN: Myslím si, že by? Jaké další typy dat můžete přepínat? Diváků: Můžete přepínat před všemi datovými typy. Ale to jen znamená, že něco přes znaků a ints a podobné věci, protože pokud jste přepínání ukazatele že není opravdu smysl, přepínání zatížení, pokud je to dokonce ať to to uděláte, protože s plovoucí desetinnou čárkou přesný byste opravdu chci to udělat tak jako tak. Takže docela hodně, jen ints a znaků a tak podobně. DAN: Jo, to je, když máte explicitní hodnoty, které víte, myslím, že může být že spínač je vlastně užitečný. Dobrý? OK. Rozsah je rozsah, který prohlásil, variabilní rozšiřuje. Takže v tomto malém kusu kódu mám, že by bylo plné chyb. A důvod, proč je prohlášen jsem tento int i v rámci tohoto cyklu for. A pak jsem se snažím vyplývá, že i mimo, že pro rozsah smyčky. Takže v podstatě, můžete přemýšlet o rozsahu jako něco, když deklarujete se uvnitř párem složených závorek pouze existuje v těchto složených závorek. A pokud se pokusíte a použít tuto proměnnou mimo těchto složených závorkách, budete dojde k chybě z kompilátor. Jo? Diváků: Tak tohle nefunguje? DAN: To nefunguje, ano. Strings. String char *. Jsou to přesně to samé. Jsou to jen ukazatele na znaky. A všechny řetězce, které máte by měl skončit se zpětným lomítkem nulové, což je právě c konvence. To je nazýváno NULL terminátor. A NULL-- kapitál N, kapitál U kapitál L, hlavní já-- není totéž jako NULL terminátor. To je ukazatel. To je znak. Jsou velmi odlišné. Pamatuj si to. To bude na kvíz, pravděpodobně. Neviděl jsem kvíz. Jo? Diváků: Tak NULL je, řekněme, ukazatel? DAN: Ano. Diváků: Co [neslyšitelné]? DAN: Je-li, řekněme, malloc je volána, když vás nemají dostatek paměti, aby si bez ohledu na velikost žádáš, malloc vrátí NULL. Je to v podstatě vždy, když je funkce měl vrátit ukazatel, můžete je třeba zkontrolovat před NULL následujících důvodů NULL je docela good-- to je, tak nějak, hodnota odpadky. Je to, pokud jde o ukazatele jít nula. Kdykoli budete volat funkci, která vrací ukazatel. Budete chtít zkontrolovat, že je Ujistěte se, že, že ukazatel není NULL protože NULL je velmi časté. Je to jakýsi návrat na odpadky. Takže pokud se něco se nedaří, jen vrátit namísto NULL. Diváků: [neslyšitelné]? DAN: Ano, a to je to. Diváků: [neslyšitelné]? DAN: kouzlo jako to. To je NULL terminátor. Je to malá písmena N-U-L-L, pokud jste hláskování to. Diváků: A já šel zpět a zkouší to. A pokud se pokusíte dát plovoucí desetinnou čárkou hodnota na přepínači, bude to řvát na tebe říká, prohlášení vyžaduje výraz celočíselného typu. DAN: Tady to je. Ale jo, to byla otázka znovu? Diváků: [neslyšitelné]? DAN: Tak kapitál N, kapitál U kapitál L, L kapitál je skutečný c věc. To je ukazatel NULL a bude být léčeny jen jako takový. Nebudete někdy zkusit a kouzlo Znak NULL a neuvidím jiný způsob, než tohle. Jo? Diváků: Takže návrat do char max nebo něco, co v komentáři by to ztělesňují stejnou funkci jako [neslyšitelné]? Diváků: Takže máte na mysli vrací char max z getchar, nebo co to je? Hlediště: Ano. DIVÁKŮ: Jo, tak obecně termín pro všechny ty věci, jsou ověřovací hodnoty. Tak jako návrat int max od vezmi_int a char max z getchar, je to měl být rád, v pořádku, je-li tyto věci se vracejí k nám, se něco pokazilo. U ukazatelů, jen náhodou tato hodnota sentinel, že každý souhlasí s tím,. A to je věc, kterou se vrátit když se něco pokazí. Takže char max je to, co jsme pomocí představují něco jako NULL nebo getchar. Diváků: Takže pokud testujete getchar, mohl by si dát NULL? Bylo by to něco změnit? DAN: Dalo by se to jen zkontrolovat NULL. Musel byste zkontrolovat char max, protože návratová hodnota funkce je postava není ukazatel. Jo? Diváků: Tato otázka se ptá pro délku řetězce. Znamená to, že obsahují znak NULL? DAN: Ne A to je skutečně, jak délka řetězce ví, zastavit, protože prochází vaše pole znaků do vidí znak NULL. A pak je to jako všechno Dobře, jsem udělal. Diváků: [neslyšitelné] pět? DAN: Dobrý den bude pět. Jo. Takže pole jsou spojité bloky paměti. Mají okamžitý přístup tím, Název pole, a pak ve složených šle, co index chceš jít se, že jsou indexovány od nuly, přes Délka pole minus jedna. A oni to prohlásil podle typu věc, že ​​jste ukládání do pole, název pole, a poté bez ohledu na velikost, je z tohoto pole. Tak to je char pole délky šest, že má tyto hodnoty. Jo? Diváků: [neslyšitelné]? DAN: Jo. Diváků: [neslyšitelné]? DAN: Máte-li to, co se děje do pole již. Takže byste mohli zadat toto místo as, řekněme, char, bez ohledu na název vašeho pole je prázdné závorky rovná kudrnaté rovnátka H čárka čárka E L L čárkou čárka O čárka znak NULL a složená závorka. To by také fungovat jako prohlášení. Diváků: [neslyšitelné]? DAN: Pak musíte mít velikost již. Diváků: [neslyšitelné]? DAN: Ano. V pořádku. Argumenty příkazového řádku jsou způsob, jak získání vstup od uživatele jako Argumenty hlavní. Hlavní přijímá dva argumenty. Počet argumentů, který je prošel podél příkazového řádku a a řetězec vektoru nebo pole řetězců ze všech argumentů. Takže když, řekněme, se nazývá funkce, jako je tečka z 1 místo, 2 prostor, tři, argc by 4. A argv 0 by tečka ven. Argv1 by jeden. argv2 by 2. argv3 bude 3, v tomto konkrétním případě. Jo? Diváků: [neslyšitelné]? DAN: poslední prvek v poli protože pole je délka argc Plus jeden z argb, poslední prvek je ukazatel NULL. Je argc plus 1. Takže v případě, že jsem řekl, je to by argv 0 je tečka ven. argv 1 je 1. argv2 je 2. argv 3 je 3. argv 4, což je jedna větší než argc by mít hodnotu NULL. A to je NULL pointer. Ano. A to proto, že řetězec je char hvězda je ukazatel. Tak musí být stejného typu. Jo? Diváků: Dvě otázky. Takže člověk, jaký je rozdíl mezi to a GetString jiný než jeden typ v uživatelské motoru? A za druhé, to je uložena v vaše poslední vzpomínka? Tak jako, by GetString být [neslyšitelné]? DAN: Kde je uloženo? Já nevím, kde je uložen. DIVÁKŮ: Takže, vlastně, víte, jak si fungovat říkáte, že je to argumenty jsou uloženy v zásobníku? Takže argc a argv jsou argumenty na hlavní a jsou ve frontě, nebo opravdu těsně nad to, co si myslíte, že jako začátek zásobníku. Jaká byla druhá část otázky? Diváků: Tak co je to [neslyšitelné]? DAN: Jo, je to jen jiný způsob, jak jak se dostat vstup od uživatele. Tahle je o něco účinnější a to je šikovnější pro skripty, protože vás stačí předat argumenty k vaší hlavní funkce spíše než čekat pro uživatele v případě, že nemáte žádné uživatele. DIVÁKŮ: A jo, dostat řetězce by [neslyšitelné]. To by ukládat věci, které potřebujete. DAN: Jo? Diváků: [neslyšitelné]? DAN: Ano, argv 0 je vždy tečka lomítko z volání funkce. Jo? Diváků: [neslyšitelné]? DAN: Ano, každý z argumentů skončila znakem NULL, protože jsou řetězce. Diváků: [neslyšitelné]? DAN: Ano, argv argc je ukazatel NULL. Diváků: [neslyšitelné]? DAN: Ach jo. Jo, je mi líto. Diváků: Tak [neslyšitelné]? DAN: Takže otázka je, pokud jste měli příkazového řádku tečka lomítko tečku z 1, 2, by počet příkazového řádku Argumenty být dva nebo by to bylo tři? Diváků: Myslím, že to není opravdu záleží. Mám ve zvyku říkat, oh, jsi neprošel žádné argumenty příkazového řádku, když Je zřejmé, že jste zavolal funkci. Takže mám tendenci hlasitě vyloučit funkce z příkazového řádku argumenty, i když je to zahrnuto v argv. DAN: Ale kdyby to bylo na test-- Jo-- i když řeknete něco jako argc rovná 3, jste v bezpečné postavení. Jo? Diváků: [neslyšitelné]? DAN: Myslím, že kdyby namísto volání této v argc a smyčcové argv závorkách ale stále stejné typy a jen volal je něco jiného, ​​jako a b, to by ještě fungovat? A to by ještě fungovat, byste jen-- namísto použití argc-- byste používat a b. Jo? Diváků: [neslyšitelné]? DAN: Takže otázka je GetString je bude ukládat paměť haldy protože GetString je char *. Ukládá paměť haldy, protože žádá, aby se malloc v aktuální realizace getString. OK, dál. Zabezpečení. Takže skutečně bezpečné, můžete spolehnout na žádný jeden a nedovolují jeden přístup ke kterékoli vaše informace, což je důvod, proč všichni staví své vlastní stroje, vlastní operační systémy, všechny jejich Programy od nuly, a samozřejmě nepřipojujte žádné jiné zařízení přes internet. Takže počítače jsou nejisté. Ve skutečnosti jsou. Musíme věřit ostatním lidem. A představa bezpečnosti je, že jste se snaží omezit množství věřím, že budete potřebovat. A jedním z prostředků, můžete to udělat je přes kryptografii. Kryptografie je, v podstatě, máme tajemství. Někdy musíme projít naše tajemství spolu přes, řekněme, internet nebo dalších věcí. A my nechceme lidi poznat tato tajemství. Tak jsme zašifrovat naše tajemství na cestě že doufáme, že nikdo nemůže přijít na to. Tak jsme used-- přes průběhu tohoto class-- věci, jako Caesara a [Neslyšitelné], které jsou velmi obojí, velmi nebezpečné způsoby šifrování věci. Jsou snadno zjistit, co se jsou, a jaké jsou vaše tajemství jsou. Skutečný svět používá mnohem více složité šifrovací schémata. A my se nesmí dostat do mnohem víc než to. Ladění. GDB je nejlepší. Chystám se zdůraznit to znovu. Použití GDB celou dobu každý když budete mít problém. Příkazy, které jsou užitečné v GDB jsou zlomit, který předáte buď linku číslo, název funkce, v podstatě kde v kódu Chcete-li zastavit, a musí být schopen převzít kontrolu. Tisk má proměnnou a vytiskne co to je proměnná na to bod ve svém provedení. Další přesune provedení po jednom kroku. A krok kroky uvnitř funkce v provedení. Ostatní věci jsou běh, což je, jak jste skutečně spustit kód. Continue všechny kroky potřebné se dostat k dalšímu bodu zlomu. A existuje mnoho, mnoho dalších. Najděte si je. Jsou to skvělé. Jo? Diváků: [neslyšitelné]? DAN: Ano, což je debugger. Takže debugger je program, který umožňuje ladit svůj program. Není to program, který najde chyby pro vy, ale bylo by to skvělé. A poslední je pro mě hledání. Takže typů hledání, které jsme si povídali o v této třídě jsou lineární vyhledávání, což je jen, že se podíváte do každého prvek vyhledávacího prostoru, jedna prvek v době, dokud nenajdete to, co hledáte, nebo dokud se nedostanete si konec vaší hledání prostoru, ve kterém bod říkáte, že jste nemohli najít prvek, který jste hledali. A to trvá v nejlepším případě konstantní čas, což je 0 1 a v nejhorším případě lineární Doba, která je 0 n. Binární vyhledávání, které je třeba špinavé prvky. Jdete do středu svých prvků, zjistit, zda prvek hledáte je větší nebo menší, než je prvek že jste ve středu. Je to větší, říkáte, že dno Vašeho hledání prostor je váš aktuální poloha, střední, a restartovat proces. Pokud je to menší, vypadáš říká že to-- jo, co se děje? Diváků: [neslyšitelné]? DAN: Ano. Nějaký druh druhu, který se kdy učil v třída je poctivá hra pro zkoušku. [SMÍCH] DAN: A to, že jste neměli aby to pro problémové sady, je to fér hra pro test. Diváků: Můžeme jít přes něj, jak na-- DAN: to bude pryč přes. SPEAKER 2: Skutečný kód [Neslyšitelné] je nastavena na study.cs50.net. Takže, když se podíváte na problém praxe na stránce sloučení druhu study.cs50.net, je kód pro provádění sloučit druh. Takže nemusíte provádět to se dnes v noci. Ale ujistěte se, že jste to pochopili, spíše než jen memorovat to. Diváků: [neslyšitelné]? SPEAKER 2: stránky merge sort na study.cs50.net, je praxe problém, který, pokud se proklikat problém, na samém konci je řešení, které je sloučení implementace třídění. Ale ujistěte se, že jste to pochopili spíše než jen memorovat to nebo kopírování to. Diváků: A naprosto v pořádku problém pro zkoušku by něco jako tady je seznam. Co to seznam vypadat po jeden krok volby druhu nebo vložení třídění nebo cokoliv jiného. Jeden plný iterace seznamu. Takže i když nechcete skončit museli Kód pro to, musíte to pochopit Stačí vědět, jak to bude je třeba změnu tohoto pole. DAN: Tak to je pro mě. [APPLAUSE] LUCAS: Ahoj všichni. Mé jméno je Lucas. Budu mluvit o rekurzi, všechny že druhy, které jsme se naučili, a Trochu všech ukazatelů. OK? Takže v první řadě, rekurze. Co to znamená říci, že funkce je rekurzivní? Diváků: Volání sám. LUCAS: OK, volá sám, jo. Takže líbí tento obrázek, například. Je to jako na obrázku uvnitř obrázku, a tak dále. Tak například, můžete have-- jako Dan že mluvil o binární vyhledávání. Jedním ze způsobů, binární vyhledávání rekurzivní je skutečnost, že jste se snaží najít číslo. Takže jdete do středu. A pak byste zkontrolovat, zda čísla tam na levé straně a na pravé straně. A pak, když zjistíte, číslo bude na levé straně, je to to samé něco jako znovu dělat hledání, ale jen v levé části seznamu. Tak to je, jak to vypadá jako je rekurzivní. Takže to je důvod, proč jste se rekurzivní řešení pro sloučení druhu. OK, tak tady je jeden příklad. Takže řekněme, že chci vybrat všechna čísla od 1 do n. Mohu si uvědomit, že součet n číslo n a navíc n minus 1 až 1. Ale pak, když jsem se na n mínus 1 Plus n minus 2 plus 1, to je stejný něco jako jako souhrn čísel až n mínus 1. Takže můžu říct, součet stejné částky se rovná n plus součet n mínus jedna. Má to smysl? A taky bude mít něco jiného nazývá base-case, což je to, že součet čísel nahoru na nulu by byl nula. Takže jakmile jsem se k číslu nula, jsem přestat počítat. Má to smysl? Tak tady je příklad toho, jak Mohu realizovat to. Tak jsem si tuto funkci v některé z nich. To trvá celé číslo n. Tak jsem nejprve zkontrolovat, zda je n menší nebo rovna nule. Takže pokud je to menší nebo roven nule, I vrátit se na nulu, což je náš základní scénář. Jinak mohu jen vrátit n Plus součet čísel z kdo n mínus jedna. Smysl? OK. Tak tady je to, jak to vypadá. Máte součet 2 se rovná 2 plus součet 1. A někteří z 1 je 1 plus součet 0, což je 0. Smysl? Takže pokud se podíváme na hromadu svého programu, to je to, co to vypadá. Za prvé, máme hlavní funkci. A pak hlavní funkce volal součet 2. A pak částka 2 se chystá říct, oh, sum 2 se rovná 2 plus součet jednoho. Tak jsem se přidat částku ve výši 1 do zásobníku. A součet 1 bude volat součet 0, což bude také být přidán do zásobníku. A pak se každý z těchto ty, které jsou na druhou muset vrátit než ty ostatní mohou pokračovat. Tak například, tady, suma 0, Nejprve se chystá vrátit 0. A pak zvolte částku 1. Pak částka 1 bude vrátí 1 součtu 2. A konečně, součet 2 se děje vrátit se 3 na hlavní. Má to smysl? Je to opravdu důležité, aby pochopili, jak zásobník funguje a snaží se uvidíme, jestli to dává smysl. OK, tak třídění. Tak proč je třídění důležité, v první řadě? Proč bychom se měli starat? Každý, kdo? Dej mi nějaký příklad? Jo? Diváků: [neslyšitelné]. LUCAS: Jo, OK. Takže můžete vyhledávat efektivněji. To je dobrý způsob, jak. Tak, například, máme hodně věci ve skutečnosti, v našem životě, které jsou řazeny. Například, slovníky. Je velmi důležité, aby všechny slova v nějakém pořadí, které jsme přístup snadno. Takže to je to, co říká. Můžete vyhledávat efektivněji. Přemýšlejte o tom, jak těžké to bude mít slovník, ve kterém slova jsou v náhodném pořadí. Budete se muset podívat na, do značné míry, každý slovo, dokud nenajdete slovo, které hledáte. Pokud používáte Facebook také, když díváte se na své přátele, že jste jde vidět, že Facebook dát své blíže přítel je na vrcholu těch že nemusíte mluvit, že hodně. Vydáte-li se celou cestu až na dno váš seznam příteli, budete vidět lidé, kteří pravděpodobně nemají ani Pamatuji si, že jsi přátele. A to proto, že Facebook druhů vaši přátelé založené na tom, jak blízko jste k nim. Takže organizování dat. Také Pokemon. Takže vidíte, že všech Pokémonů mají čísla. A to je jako snadno způsob přístupu k datům. Diváků: Přístup Pokemon. LUCAS: Jo. Diváků: [neslyšitelné]. LUCAS: Jo. OK, takže výběr třídit. Výběr řazení se chystá vybrat Nejmenší netříděný hodnota ze seznamu každého čas v každém opakování. Je to něco jako druh, který děláte ve vaší hlavě, když se snažíte, aby seřadit seznam po ruce. V podstatě vše, co udělat, je se podíváte pro nejmenším počtem. Můžete dát do tříděného seznamu. A pak se podíváte na další nejmenší číslo. A pak se v tom budeš pokračovat že a tak dále. Takže výběr druh je v podstatě si vyberte pokaždé nejmenší netříděného hodnota. Dejte na konci řazeny součástí seznamu. A to dělat. Takže pojďme se rychle podívat, co to vypadá. Tak tady je řazeny a netříděný seznam. Takže řazeny seznamu, je zpočátku prázdný. A pak budu výběr Nejmenší číslo zde, což je o 2. Tak jsem se na číslo 2 a dal jsem v přední části seznamu. A pak jsem se podívat na další nejmenší prvek, který je 3. Tak jsem ji na konci tříděného seznamu. A pak jsem to dělat. Zjistil jsem, 4 a dát to na konci. Najděte 5 a dát to na konci. A podívejte se na to, jak všechny ty časy, které Říkám, že dát na konec, v podstatě, vyměňovat dvě hodnoty. OK? A pak ten poslední, který jste právě ještě jeden prvek. Takže je již řazeno. OK, takže vložení třídit. Vložení druh budete mít také že věc z toho, že tříděny a netříděný seznam. Jediná věc je, že pokaždé, když Přidáváte prvek na řazeny list, stačí vybrat prvek, který je v přední části netříděného seznamu. A pak budete najít to, co pozice by měla být v setříděné součástí seznamu. Podívejme se, co to je, takže to dává větší smysl. Takže nejprve, například, snažím se vložit číslo tři v tříděný součástí seznamu. Takže seznam nemá nic. Tak jsem si jen dát číslo 3. Teď chci přidat číslo 5 na tříděný součástí seznamu. Tak jsem se podívat na čísla 5. Všiml jsem si, že je větší než 3. Takže vím, že to musí být po 3. Tak jsem dal 3 a 5. Pak chci vložit číslo dvě. Všiml jsem si, že číslo 2 je ve skutečnosti poslední pak i 3 a 5. Takže jsem vlastně dát to všechno způsob, jak na začátku seznamu. Tak jsem se, druh, posunout všechny prvky v tříděném seznamu, takže můžu vytvořit prostor pro číslo 2. Pak jsem vidět číslo 6. Vidím, že by to mělo být po 5. Tak jsem to tam dal. A nakonec, když se podívám na číslo 4. A všiml jsem si, že by měla být mezi 3 a 5. A pak jsem to tam dal a posun všechny ostatní prvky. Smysl? Bubble Sort. Takže bubble sort je v podstatě to, co jste bude do-- říkáme bublina druh, protože se projít list-- je to vlastně lepší, když jsem jen ukázat se vám líbí tohle-- a budete porovnávat sousedící čísla. A vy budete vyměňovat své pozice v případě, že nejste ve správném pořadí. Takže v podstatě, co se děje na stát, je tu například, Máte-8 a 6. Víte, že tříděný objednávka bude ve skutečnosti 6 a 5, ne? Takže se chystáte vyměnit objednávky. Pak vidím, 8 a 4 zde. A já jsem to samé. Znovu jsem se vyměnit. A konečně, 2 a 8. Také jsem je vyměnit. Říká se tomu Bubble Sort, protože po Každý z těchto iterací, ve skutečnosti, největší číslo v seznamu dostane všechny cesta na konec seznamu. Má to smysl? Vzhledem k tomu, udržuje ji vyměnit a přesunutím doprava. OK, tak to je druhá iterace. Bylo by to totéž. Udělám jednu výměnu a pak poslední. Jsem si, že tam nejsou žádné swapy a seznam je seřazen. Takže v Bubble Sort, jsme v podstatě udržet prochází v seznamu a vyměňovat věci, než jsem si všimla, že jsem to neudělal veškeré swapy dělat to opakování, které Znamená to, že seznam je již řazeno. Smysl? Pojďme mluvit trochu o provozu. Tak si kluci pamatovat Big O, Omega, a Theta? Jo? OK, co je Big O, v první řadě? Diváků: [neslyšitelné]. LUCAS: Jo, je to jen v nejhorším případě runtime, což právě znamená, že je kolik očekáváte program aby se do běhu. Stejně jako v oblasti of-- v tomto case-- n. Počet prvků v Seznam v nejhorším případě. Stejně jako v nejhorším možném případě. Takže pro Bubble Sort, například, máme velký Ø n náměstí. Proč máme, že? Proč je Bubble Sort Big O n čtverec? Diváků: [neslyšitelné]. LUCAS: Jo, takže v nejhorším případě bude že budu muset dělat n iterací. Takže každý z iterací bude přinese největší prvek na konec seznamu. Takže nejhorší je, že jsem k tomu, že věc, n-krát. A pro každý z těchto časů, musím do n swapy, protože musím porovnat každé dva prvky. Takže to je důvod, proč je to n na druhou protože to je n krát n. Poté výběr třídění je také n náměstí protože pro každou iteraci, musím podívejte se na každé jednotlivé součásti v seznamu. A pak najít nejmenší, což znamená, že budu muset prohlédnout n prvků. A co musím udělat, že N-krát, protože Musím vybrat všechny n prvků. Vložení druh je také n náměstí proto, že nejhorší scénář být jedno, musím vložit n čísla, že? Tak už vím, že budu mít n iterací. Ale pro každý z těchto čísel, když jsem měl podívat se na všechna čísla v řazeny seznam a dát to všechno tak, jak v přední části, který bude n náměstí , protože to bude n krát n znovu. Smysl? Co omega? Diváků: [neslyšitelné]. LUCAS: Je to nejlepší scénář. Takže je to jako v mnoha časů pro třídění, nejlepší scénář je když je seznam již seřazeny. Takže si opravdu nemají nic dělat. Bubble Sort má nejlepší scénář n. Nevíte proč? Diváků: [neslyšitelné]. LUCAS: Ano, pokud budete mít přehled o zda jsou údaje poměr nějaké swapy nebo ne, pokud máte něco jako nastaven na platí v případě, že byla iterace, pokud Seznam je již řazeno, v podstatě, co se stane je, že budu zkuste vyměnit každé dva sousední prvky. Budu vidět, že nejsou tam žádné swapy. A já jsem se vrátit hned. Takže to znamená, že jsem musel projít seznam najednou. Tak to je n proto, že vypadám na n prvků. Proč výběrem Třídit n náměstí? Jo, a to i v případě, že seznam je řazen, pro každá iterace výběr druhu, I muset vybrat minimální prvek. Takže to znamená, že jsem se podívat u všech prvků v netříděného seznam a najít minimum pro každou iteraci. Má to smysl? A vložení meč je N, protože v případ, že se snažím vložit čísla a všechna čísla, když jsem snaží se je vložit, vidím, že se jsou ve správné poloze. Nemám jít zkontrolovat všechny ostatní čísla v netříděného seznamu. Takže to je důvod, proč to bude n. Smysl? A co je theta? Diváků: [neslyšitelné]. LUCAS: Co prosím? Řekni to znovu. Diváků: [neslyšitelné]. LUCAS: Přesně tak. Takže vidíte, že jen výběr uloženy v Sloučit druh má thetas. A to proto, že máte jen theta pokud oba Big O a Omega jsou stejné. OK. A konečně, sloučit druh je v log n. A pak, když Dan říkal, Merge sort je něco jako stejným způsobem, jako ty binární vyhledávání. Tak se dostanete na seznam. A vy budete snížit na polovinu. A pak se řezat v menších poloviny. A pak je sloučit. Vy jste si uvědomit, že, že jo? OK, jak se říká. OK, ukazatele. Takže to, co je ukazatel? Diváků: [neslyšitelné]. LUCAS: adresa. OK. Vím, že David ukazuje spoustu videa Binkym a věci směřující navzájem. Ale já bych si myslel, ukazatelů jako pouhou adresu. Takže je to proměnná, která se děje uložit adresu. Takže je to právě tato speciální proměnná , že je dlouhý čtyři bajty. Pamatujte si, že ukazatel na cokoliv je vždy dlouhý čtyři bajty pro naši 32-bit Stroj tak v případě zařízení. A to jen má místo proměnné uvnitř něj. OK, takže je to vzpomínka, v podstatě. Takže každý blok paměti, ve skutečnosti má štítek, který je adresa slotty paměti. Takže to znamená, že můžu mít ukazatel ukazující na některé z těchto adres. Takže důvod, proč budeme používat ukazatele je když budu muset pamatovat umístění , že konkrétní proměnná paměť. A vy jste si uvědomit, že jeden z těch případů bylo, když mám funkci jestli mám skutečně chtějí, abyste výměna za reálných čísel, já vlastně mají poslat ukazatel. Není variabilní. Ještě jste si uvědomit, že? Rozdíl between-- jak se jmenuje? Volání hodnotou a volání s odkazem, že jo? OK, jo. Tak zavolej hodnotou. Když pošlete proměnnou funkci jste právě vysílá hodnotu. Takže jste vlastně odesílání kopie proměnné. A váš program je to úplně jedno o v případě, že stejná proměnná skutečně vytvoří kopii. A volá odkaz znamená, že Já jsem vlastně zasláním kopie Ukazatel na této proměnné. Takže to znamená, že pošlu umístění této proměnné. Takže mám pocit, umístění proměnná, když volám funkce s ukazateli, jsem schopen skutečně Změna data, která byla v hlavním. Smysl? I když je ukazatel kopírování, ukazatel má stále reálnou adresu proměnná, která chci změnit. Smysl? Tak vytváření ukazatelů. Pamatujte si, že ukazatel vždy typ, který to ukazuje , a poté se hvězdy. A pak si dát jméno. Takže pamatujte, že vždy, když máte co hvězda, je to jako ukazatel na že bez ohledu na variabilní typ, který jste měli. Tak tady na hvězdy, například, že je to ukazatel a číslo. A pak char hvězda je ukazatel char hvězda a tak dále. Jo? Diváků: Co když máme ukazatel na n hrát x. Vím, že vytvoří ukazatel na x. Znamená to také prohlásit x na celé číslo? LUCAS: OK, takže když říkáte, že n hvězda x, nejste vytvořit ukazatel na proměnné x. Ty vytvoří ukazatel s názvem x. Diváků: [neslyšitelné]. LUCAS: Takže když řeknu, že n hvězda x, jsem říká, hej, v paměti, budu získat jeden z těchto tří polí. A já řeknu, že bude x, což je bude ukazatel. A něco zajímavého o ukazatele je to, že říkáme, že mají 4 bajty pro 32bitové počítače. A důvod, proč to je proto, 4 byty jsou 32-bitů. A stroje, které jsou 64 bitů skutečně mají ukazatele adresy které jsou dlouhé 64 bitů. Tak to prostě znamená, že velikost adresy v počítači se liší. Takže Odkazování a Získávání. K dispozici jsou dva subjekty, které Měli byste pamatovat. První z nich je ampersand. Druhým je hvězda. Nenechte se zmást tím, že hvězdy a to STAR, protože nezapomeňte, že v tento případ, budete muset n hvězdu. Je to jako celou věc dohromady. Neexistuje n Space Star. Takže to znamená, že je to typ. Pamatujte si, že když máte proměnná hvězda, ty jsi mluví o typu. Když máte jen hvězdy a pak název proměnné, to znamená, že jste dereferencing ukazatel, který Znamená to, že se díváte na ukazatel, najít adresu, že je to ukázal na, bude na tuto adresu, a při pohledu na, pokud máte tam. Takže říkám svým studentům, že když máte hvězda, měl by si myslíte, že je to zkratka obsahu. Takže pokud máte ukazatel a to hvězda ukazatel, je to Obsah ukazatele. Takže jdete, co to ukazuje na a podívejte se na konstantní obsah. A ampersand je stejný věc jako adresa. Takže pokud mám proměnnou A-- rád, pojďme říct, že jsem udělal int rovná 3-- když chci najít adresu, která variabilní paměť, mohu jen dělat ampersand. Takže je to adresa. Smysl? Tak tady je příklad. Tento chybí int b a c int. Takže int se rovná 3 znamená, že Chystám se jít do paměti. A já jdu najít slot a dal číslo 3 zde. A pak int b se rovná 4. Chystám se udělat to samé. Přejít na paměti a dát číslo 4 v jednom z polí. A int se rovná 5. Najít další krabici a dát číslo pět. Takže to, co je tato položka děláš? n hvězda pa rovná ampersand a. Takže v první řadě, n hvězda pa. Co to dělá? Diváků: [neslyšitelné]. LUCAS: Jo, takže n hvězda pa, první, deklaruje ukazatel s názvem pa. A pak je to přiřazením hodnoty že ukazatel být adresa. Tak ampersand. Pak, když to udělám hvězdu PB, co je to hvězda pb? Oh, omlouvám se. To je také chybí. n hvězda pb. Myslím hvězda ks. Je mi to tak líto. Je to to samé. Ale teď jsem v pohodě ar vytvoří ukazatel na B ​​a pak ukazatel na C. Jo? Diváků: [neslyšitelné]? LUCAS: Ano. Takže pokud jdete do paměti a přejděte k pole, které je označení pro pa jste vlastně bude zobrazit adresu. OK? Jo? Diváků: [neslyšitelné]? LUCAS: Jo, ukazatel je adresa. Nikdy na to nezapomenu. Je to jako nejdůležitější část o ukazatele. K dispozici je ukládání a adresu do určité proměnné. Ještě něco? Nějaké další otázky? OK. Takže ukazatele a pole. Pamatujte si, že když jsem si int pole 3, v podstatě to, co dělám, je, že jsem, druh o, prohlásil v ukazatelem. Takže pole je něco jako ukazatel na konkrétní místo v paměti, ve které jsem přiděleny tři sloty pro celá čísla. Má to smysl? Takže když jsem si int pole 3, co jsem tom, v podstatě, vytváří tři sloty na paměť. Tak jsem si tři sloty v paměti. Takže když to udělám, pak hvězda pole, je v podstatě znamená, že obsah pole, což znamená, že vymazat ukazatel, jdu na tomto místě, že to ukazuje na, a dal jsem číslo jedna. A pak, když to udělám hvězdu pole plus 1, To je totéž jako dělat řadu Víka jedna, což znamená jen chodím do místo, že to ukazuje na. A pak se navíc 1 značky me posun o jednu pozici. Tak jsem na tuto pozici, ve skutečnosti, a dal číslo dvě. A pak, konečně, když jsem si pole a navíc 2, jdu tam, kde polohovací Array adrese. A pak jsem se přestěhovat do bloků paměti. A pak jsem dal číslo tři tady. Jo? Diváků: Takže hvězda pole je jednoduše říká úplně první bod. A můžete přidat jeden, jen proto, že Jsme opravdu jen odkazování, že první adresu. LUCAS: Jo. Proč, například, řekněme pole 0, 1 pole a pole 2? Já říkám, proč to děláš 0, 1, 2, 3 místo 1, 2, 3? Jedním z důvodů je, jedna, výpočetní programátoři raději začít počítáno od 0. Dva proto, že když děláte pole 0, je to totéž, jako dělá pole plus 0, což znamená, že jdu do tento postoj, a já ne přeskočit všechny paměťové bloky. Tak jsem se nepohybují všechny paměťové bloky. Jo? Diváků: [neslyšitelné]? LUCAS: Tak ona se ptá, co je rozdíl mezi dělá tento nebo dělat malloc. Jeden z rozdílů je to, že int array 3 je vytvoření pole na stacku. A když se mi to malloc to, vytváří na haldě. Má to smysl? Takže jak malloc vlastně funguje? Tak proč ještě muset použít malloc? Váš kompilátor druh postav si vše proměnné, které jste deklarované. A vytváří prostor pro všechny Z nich v zásobníku. Takže všechny vaše proměnné se děje být někde ve stohu. Takže tady je proměnné prostředí. Takže v podstatě, prostor pro proměnné, v paměti je přiděleno na kompilaci. Takže to znamená, že váš počítač má znát všechny tyto proměnné předem. Není třeba vědět, jakou hodnotu budete dát do nich. Ale je třeba vědět, jak kolik paměti budete potřebovat. Ale teď řekněme, že, například, budete vytvářet pole nebo při Řetězec, který užíváte od uživatele. Nevíte, jak dlouho řetězec bude, například. Takže nevíte přesně, kolik bloků paměti přidělíte, že jo? Takže to opravdu není smysl pro můžete říct, dát 100 znaků. A pak to, co v případě, že uživatel píše 150? Ty bude v háji. Takže v podstatě, nemůžete být jisti, jak kolik paměti je potřeba přidělit při kompilaci programu. A tak prostě víte, že v době běhu. Takže to je důvod, proč máte hromadu. Takže haldy bude mít paměť že jste při přidělování Doba trvání běhu programu. Takže v podstatě, když to uděláte malloc, co děláte je přidělování na paměti runtime, což znamená, že jste rozhodování o tom, právo v tomto okamžiku, že vás by měl mít tuto paměť. Tak to je, když jste ji přidělování. Má to smysl? Takže pamatujte, že zásobník má proměnné , které jsou vytvořeny v době kompilace. A pak hromada má proměnné které jsou vytvořeny as you go s malloc, například. Diváků: [neslyšitelné]? LUCAS: Tak GetString je bude volat malloc. Dovolte mi, abych mluvit o malloc a Vysvětlím ti to getString. Takže malloc je totéž jako přidělování paměti. Tak to bude o přidělení paměť na haldě. A to bude vracet ukazatel na kde byl, že přidělené paměti na adrese. Takže když do-- pro example-- zde n hvězda ukazatel. A pak se ukazatel rovná malloc Velikost palce krát 10. Jsem vytvořit ukazatel. A pak jsem přiřazování, že ukazatel hodnota ukazatele, které malloc dává mi to. Takže se ptám malloc můžete přidělit prostor pro 10 celých čísel. To je to, co říká. A malloc mi vrací ukazatel na toto místo. Smysl? OK. I A GetString je v podstatě dělá volat malloc, takže si můžete přidělit paměti za běhu. Vždy nezapomeňte zkontrolovat NULL protože malloc se chystá vrátit NULL pokud nelze alokovat paměť. Řekněme, že budete žádat o směšný množství paměti. Váš počítač se nebude schopen mnohem přidělit, že. Takže malloc právě děje vrátit null. Takže nezapomeňte vždy zkontrolovat, zda ukazatel, který jste dostali od malloc je null, nebo ne, protože pokud je to, můžete být dereferencing ukazatel a způsobuje nežádoucí chyby. A konečně, nezapomeňte vaše volné paměti. Malloc vytváří paměť haldy. A vy budete muset uvolnit paměť před ukončením programu. OK, to je všechno pro mě. Je nám líto, Rob. Díky. [APPLAUSE] LUCAS: Nějaká poslední otázky před Rob přijde? Ne? Jo? Diváků: Neviděl jsem tenhle online. Už jste ho nahráli ještě? LUCAS: Myslím si, že Dave je to nahrát brzy. DAVE: Bude to vědět. LUCAS: Bude to on-line. Diváků: To záleží. LUCAS: To se děje? OK. Jo? Diváků: [neslyšitelné]? LUCAS: Ano, měli byste uvolnit všechny paměť, která je vložena do haldy. Diváků: [neslyšitelné]? LUCAS: Ano. Kdykoli máte kultury malloc, měli byste mít kulturu zdarma Po zastavení používání této proměnné. Takže malloc a zdarma jsou vždy společně. Jejich nejlepší přátelé. Jo. Rob? ROB: Půjdu rychle. A také video se smířit. Mám MIC. OK, takže týden pět věcí. První věc, kterou máme, je zásobník. Takže nezapomeňte, že je tu jen jeden zásobník Rám na aktivní volání funkce. Uvidíme, že v druhé. A také si vzpomenout, co vlastně jde v každém zásobníku rámu se bude místní proměnné našich funkcí, argumenty, které jsou předány do naší funkce, spolu s několika jiné věci, které nemáte opravdu třeba obávat. Tak tady je příklad programu, kde oznámení, hlavní je printfing návrat Hodnota foo 4. foo se právě chystá k návratu Hodnota bar 4 čárkou 6. A bar bude nastavit některé místní Proměnná n rovno 4 krát 6. A pak se vrátit n. Takže pojďme se podívat na zásobníku v průběhu Skutečná iterace tohoto programu. Takže tam je spodní část našeho stacku. Nezapomeňte, že zásobník roste. Tak v dolní části naší stohu, jsme mají zásobníku rámec pro hlavní. Když se program spustí, hlavní vždy bude v Spodní část našeho stacku. A to, co je uvnitř našeho stack frame za hlavní? Takže i když neexistují žádné místní proměnné na hlavní, jak jsem řekl dříve, jsme argc a RGV zabírají místo uvnitř hlavního rámu zásobníku. Takže hlavní je nyní chystá volání funkce foo. A to znamená, že foo bude si svůj vlastní zásobník rám. Takže teď jsme uvnitř Funkce foo. A to, co musí jít do Foo stack frame? No, foo má argument n. A n je rovno 4, protože to je to, co Hlavní je kolem jako parametr Foo. Takže teď foo bude volat bar. Co je bar bude mít uvnitř jeho "zásobníku rámu? Je x rovnající se 4 y se rovná šesti. A to není všechno, že budeme mít v zásobníku rámci následujících důvodů bar má také lokální proměnné n. A n budeme rovna 24. Takže teď bar se chystá k návratu n. Takže tyč 24 se vrací do stack frame foo. A protože bar je nyní vrací, že znamená, že se objevují zásobníku rám na baru ven ze zásobníku. Takže vše, paměť, která bar byl použití je nyní z hromádky. Nyní foo bude také vrátit 24 na hlavní. Takže teď, že foo se vrací, paměť že foo použil ve své ' stack frame je také pryč. A teď, hlavní bude volat printf. Takže printf je jen další funkce. Když říkáme printf, že to bude další zásobník rámec pro printf volání funkce. Co jsme kolem printf? To je to, co se děje jít na jeho rámce zásobníku. Přinejmenším, jsme kolem že procento i zpětné lomítko n a Argument 24. To by mohlo mít více v jeho stack frame pokud printf se stane být použití některých lokální proměnné. Nevíme. Ale všechno, co v printf letech stack frame. Bude to provést printf. Pak printf to dělá. To se vrátí. Konečně, hlavní je hotovo. Hlavní vrátí. A pak náš program je hotovo. Jo? Diváků: Jste vidět [neslyšitelné] Argumenty [neslyšitelné] parametry? ROB: Takže tam je malý rozdíl mezi argumenty a parametry. A opravdu, v běžné řeči, lidé mají tendenci jen míchat po celou dobu. Ale parametry jsou formální Název věcí. Takže argc a argv jsou parametry na hlavní. Argumenty jsou to, co ve skutečnosti předat jako ty parametry. Takže, když jsem zavolat foo o 4, 4 je argument jsem předáním. A parametr n, uvnitř foo, má na hodnotu 4 od 4 byl argument. Diváků: [neslyšitelné]? ROB: n je lokální proměnnou do baru. n je ještě místní foo, ale Je to parametr foo. Není to lokální proměnná. Jo? Diváků: [neslyšitelné]? ROB: foo právě volá bar a návratu na jakémkoli bar vrátí. Diváků: [neslyšitelné]? ROB: Jo, jen aby viděl více zásobník rámy. Jo? Diváků: Proč foo nazýván před printf? ROB: Proč foo volána před printf? Takže jsem mohl mít, místo toho udělat něco jako int x rovná foo z 4 a pak vytisknout x. Místo, ale v kombinaci jsem funkci volání do printf argument. Ale všimněte si, že nemůžeme ve skutečnosti provést volání printf, dokud se zjistit, co foo z 4 je. Takže budeme hodnotit to. A jen jednou, že to udělal se děje vrátit a zhodnotit to. Jo? Diváků: Vzhledem k tomu, jak v baru [neslyšitelné] Hodnota, proč nemají [neslyšitelné]? ROB: Ty by měly být zcela int. Které nebylo chyceno více než více průchodů. Tak to by mělo být int bar a int foo protože oba tyto se vrací celá čísla. Void je pouze tehdy, pokud to nebude vrátit aktuální hodnoty. Jo? Diváků: Pokud byste měli linku výše návrat [neslyšitelné]? ROB: čára nad návratem? Hlediště: Ano. Jako když jste printf a [neslyšitelné] by to vytisknout dvakrát? ROB: Takže uvnitř foo? Kdybychom měli printf tady? Hlediště: Ano. ROB: Takže pokud jsme měli printf právo tady by to tisknout jednou. Vzhledem k tomu, voláme foo jednou pravdu tu, pak budeme hit printf. Pak zavoláme bar. A pak foo vrátí. A to je vše. Víme jen, že se vyskytnou printf jednou. Jo? Diváků: [neslyšitelné] printf volá foo, protože jsme první volání printf a pak jsme kolem argumenty. ROB: Takže teoreticky, není printf volá foo? Takže ne. Jen aby to c se chystá provést tyto věci je, než budeme moci volání funkce, všechny argumenty funkci musí zcela vyhodnoceny. Takže je to zcela hodnocena? Ano, je to jen řetězec. Je to jen hodnota. Pak musíme zcela hodnotit to. Jakmile je to hotovo, teď všichni jeho argumenty jsou vyhodnoceny. A nyní můžeme volání printf. Jo? Diváků: Jedna otázka. Pokud máte funkci void, musí Máte zpáteční středník? ROB: Nemáte návrat středník pokud máte funkci void. OK. Takže teď nějaké haldy věci. Tak haldy je, jak budeme řešit s dynamickou správou paměti. A to přímo v rozporu s zásobník, který bychom nazvali automatické správa paměti. Takže v zásobníku, nikdy opravdu vypořádat s tím, jak lokálních proměnných jsou tlačeny a vyskočila vypnout všechny Tyto zásobník rámy a všechny ty věci. Nemusíte se starat o to. Je to automatické. Takže haldy je ruční. A [neslyšitelné] pochází z těchto funkcí malloc a zdarma. Tak tady je další program. Všechno, co děláte, je mallocing číslo. Jsme ukládání do hvězdy x. Samozřejmě, že musíme zkontrolovat, aby zjistil, zda x je null. Pak budeme jen nastavit to, co x ukazuje na 50. Vytisknout co x směřuje k, print x, a pak volný x. Tak, jak se to vlastně bude vypadat Podíváme-li se na naši zásobníku a haldy? Takže začneme znovu. Spodní část naší zásobníku jako předtím. Pamatujte si, že tě haldy přímo staví stoh? Takže budeme mít Vrchol naší haldy tam. Takže dolní části našeho zásobníku, máme náš stack frame pro hlavní. Má prostor pro argc, argv a my mají nyní místní proměnnou x, která je int hvězda. Takže budeme iterovat v rámci tohoto programu. První věc, kterou máme, je volání malloc. Takže děláme volání malloc. Malloc je funkce. Je to dostane zásobníku rám. Co budeme procházet k malloc? To bude jít dovnitř ze zásobníku rámu. Máme kolem velikosti n, což je o 4. Tak, že je předán malloc. Co malloc dělat? Je to pro nás chytne nějaký prostor na haldě. Tak budeme chodit na haldy. A jdeme chytit 4 bajtů z haldy. Takže pojďme se jen tak, že libovolnou adresu. 0x123 Jen předstírat, že je adresu, která je na haldě. Takže to, co je vlastně uvnitř toho oblast paměti na adrese Ox123? Garbage. Takže jsme se neuloží nic v něm. Takže pokud víme, je Může to být cokoliv. Neměli byste předpokládat, že je to nula. Je to s největší pravděpodobností není nula. Takže teď malloc vrátí. A co budeme dělat, když se vrátí malloc? Vydali jsme, co se vrátí. Vydali jsme se x rovná tomu, co se vrací. Takže to, co se to vrací? Je to návratu 0x123, protože to je adresa bloku paměti, že to jen přidělené v haldě. Tak se vrátit 0x123 x je nyní bude nastaven rovná 0x123, které obrazově, jsme často kreslit jako x mající skutečný šipka ukazuje k tomuto bloku. Ale x je právě ukládání tuto adresu. Takže teď musíme zkontrolovat, zda x je null. To není null. Jsme předstírat, že malloc podařilo. Takže teď hvězda x se rovná 50. Takže hvězda pamatuje to znamená, přejít na tuto adresu. Takže 0x123 Jedeme do přejít na tuto adresu. Takže to nás přivádí tam. Co děláme na této adrese? Jsme skladování 50. Takže po této linii, to je to, co věci budou vypadat. Takže teď už to není odpadky tam nahoře. Nyní víme, že 50 je v tom, že zejména proto, že adresa jsme ji nastavíte na to. OK? Takže teď budeme tisknout f. Takže nejprve budeme tisknout hvězdy x. Takže to, co je hvězda x? Opět platí, že hvězda x znamená jít do věc, která x je ukazuje. Takže x je ukládání 0x123 Jdi na to. Dostaneme 50. Takže vytisknout f to. A to znamená, že to bude tisknout 50. A pak, že se vrátí. A pak máme druhý printf. Teď jsme procent věst. Pokud jste ho ještě neviděli, to je jak vytisknout ukazatel. Takže máme procent i, procent f, a všechny z nich již. Takže procent p, vytiskněte ukazatel. Takže x je ukazatel. Takže pokud budeme tisknout x sobě, budeme tisknout to, co je vlastně uvnitř x, který je 0x123 Takže první print f bude tisknout 50. Druhá tisková f se děje vytisknout 0x123 Jo? Diváků: Používáte procent x vytisknout ukazatel? ROB: Takže používáš procent x vytisknout ukazatel? Takže můžete, ale procento x je jen, Obecně platí, že pro podobně, pokud máte nějaký číslo a chcete tisknout to jako hexadecimální. To je, jak to udělat. Vzhledem k tomu, by procent d vytisknout jako desetinné číslo. To byly dostaneme procent d. i je jen číslo. procent p je specificky pro ukazatele. Takže x je ukazatel. Chceme využít procent str. Ale procento x by mohlo fungovat. Jo? Diváků: [neslyšitelné]? ROB: Jo. Alespoň pro tento call--, tak jsem nezahrnovaly to tady. Ale tyto dva argumenty jsou nezbytně uvnitř tohoto rámce zásobníku spolu se všemi lokálními proměnnými printf se stane, že bude používat. A pak další volání printf teď uvnitř printf stack frame je procent p zpětné lomítko n a to bez ohledu na hodnota x je, což je 0x123. Jo? Diváků: [neslyšitelné]? ROB: To bude něco vytisknout že vypadá takhle. Diváků: [neslyšitelné]. ROB: Takže to vytiskne jej v adresovém formuláři. Vypadá to, že adresu. Jo? Diváků: [neslyšitelné]? ROB: Proč je to, co? Diváků: [neslyšitelné]? ROB: Proč je tento ukazatel 4 bajty? Takže existuje celá parta z 0 let před tímto. Takže je to opravdu 0x0000000123. Na 64-bitovém systému, tam by Celá parta více nul. Jo? Diváků: [neslyšitelné]. ROB: Takže první printf bude print-- Diváků: [neslyšitelné]. ROB: Ano, to bude tisknout co x ukazuje. Hvězda říká, že to, co je to co ukazuje. Chytit ho. Takže to, co se to ukazuje na? 50. Chytit ho. To je to, co budeme tisknout. Vzhledem k tomu, další, že jsme jen tisk x samo o sobě. Co je uvnitř f? 0x123. OK. A pak, konečně, máme volný. Co jsme kolem osvobodit? Jsme kolem x. V té době jsem vlastně zobrazeno je v zásobníku rámu. Takže jsme kolem hodnoty 0x123 osvobodit. Takže teď zdarma ví, všechno v pořádku, Musím jít do hromady a volné, že paměť. Je to již používáte, co je na adrese 0x123. Takže bez se chystá k vydání které z haldy. Teď je naše haldy je opět prázdný. Nemáme žádné paměťové úniky. Nyní zdarma vrátí. Všimněte si, že x je stále 0x123. Ale to už není platný paměti. My už dereference x. Jo? Diváků: Je návrat 0 redundantní? ROB: Je returen 0 nadbytečný? Ano. Právě jsme se dát to tam, protože máme vrátit jednu pro vzduch. Takže je to jako, jo, umožňuje patří návrat 0. Jo? Diváků: [neslyšitelné]? ROB: Takže po volných x, co se stane v případě, snažíme dereference ukazatel? Je možné, že se nic pokazí. Je možné, že budeme ještě dostat 50. Je to možné, i to, že tato paměť je v současné době používá pro něco jiného. Takže je to nedefinované chování. A nedefinovaný něco znamená se může stát. Jo? Diváků: [neslyšitelné]? ROB: No, takže pokud přiřadíte x na něco jiného. Takže pokud tady jsme si řekli, x je rovna malloc něco else-- malloc velikost event-- pak, že původní blok paměti není uvolněno. A my jsme oficiálně ztratil. To je nevracení paměti. Ztratili jsme všechny odkazy v tomto bloku paměti. Takže není žádný způsob, jak můžeme někdy osvobodit ji. OK, tak pak se vrátí 0 znamená udělat. Dobře, takže přetečení zásobníku. Co je myšlenka tady? Takže pamatujte, že haldy klesá. Stack stoupá. Tak tohle byl příklad z přednášky, Myslím, že tam, kde hlavní je jen tak volat tuto funkci foo, který se děje volat sebe rekurzivně znovu a znovu. Takže zásobník rámy budou pracují úplně stejně. Takže budeme začít s hlavním jako spodní rámce zásobníku. Pak hlavní bude volat foo, který dostane zásobníku rám. Pak foo bude volat foo opět, který se dostane další stack frame. A pak znovu a znovu, a znovu, a znovu, dokud nakonec jsme se spustit do haldy. Tak to je, jak se dostat přetečení zásobníku. A v tomto okamžiku seg chybu. Nebo byste opravdu seg chyba před tento bod, ale jo. Diváků: Je core dump stejně jako poruchy seg? ROB: Takže uvidíte segmentaci Porucha core dumpingové. Získáte core dump když jste seg chybu. A je to jako výpisu všech obsah aktuální paměti, takže které si můžete vyzkoušet a identifikovat proč jste seg vyčítáno. Jo? Diváků: [neslyšitelné]? ROB: Takže porucha segmentace prostředky tam je přetečení zásobníku. Takže nemusí být. Porucha segmentace znamená, že jste dojemné paměti takovým způsobem, neměli byste být. Takže jeden způsob, že se tak stane, je-li můžete stack overflow, začneme dotýkat paměti tak, že bychom neměli být. Jo? Diváků: [neslyšitelné]? ROB: Takže uvnitř nekonečné smyčce. Jako, je to jako rekurzivní nekonečna smyčky, a tak jsme si další stack frame pokaždé. Ale uvnitř pravidelný nekonečný, zatímco one-- dobře, ať to není ani tisknout F-- něco udělat. To je fuk. Nebudeme se dostat další stack frame. Jsme jen tak, aby smyčkování nad touto jedinou instrukcí. Zásobník se nezvyšuje. Je to skutečnost, že každý rekurzivní hovor nám dává zásobníku rám. To je důvod, proč jsme se přetečení zásobníku. Jo? Diváků: Takže pokud jste řekl, aby si while a poté [neslyšitelné]? ROB: Takže pokud uvnitř while tam byl printf, stále by ne seg chyba. Jen jsem nechtěl plést věci. Bylo by smyčka. Vy byste si jeden zásobník rám pro printf. Pak printf vrátí. Pak byste znovu smyčku. Vy byste si jeden zásobník rám pro printf. To by se vrátit. Single stack frame. Takže nejste dostat to nekonečný hromadí zásobníku rámy. Diváků: [neslyšitelné]? ROB: Ano. Takže to přetečení zásobníku dojde protože žádný z nich volání foo se vracejí. Takže když se vrátíme, pak bychom začnou ztrácet zásobníku rámy. A pak bychom přetečení zásobníku. A to je důvod, proč potřebujete základní případ, pro své osobní funkce. Jo? Diváků: Je možné velikosti a zásobník na hromadu stejné pro všechny programy? ROB: Zhruba. Je potenciální velikost zásobníku a haldy stejné pro všechny programy? Zhruba. Existují určité randomizace do kde začíná zásobník a kde začíná haldy. Pokud se vám stalo, že máte spoustu globální proměnné a věci, můžete odnést z nějakého prostoru pro vaše hromadu. Na 64-bitovém systému, můžete prakticky nekonečnou paměť. Je tu jen tolik. Mezi 32 bitů a 64 bitů, že je významný rozdíl. Budeš se dostat spoustu více stack a heap místo na 64-bit systém, protože tam je jen více adres, které se mohou použít. Ale na individuálním systému, bude zhruba stejné množství stohu a haldy prostor. V pořádku. Takže poslední věc, kterou je kompilace. Takže byste měli znát tento proces. K dispozici jsou čtyři velké kroky. Takže první by měl být snadno zapamatovatelné. Pre-processing. To má předponu pre v něm. Tak to je před vším ostatním. Věc k zapamatování je hash. Takže hash definuje a hash obsahuje Ve všech těchto. Ti, kteří jsou pre-procesor směrnice. To jsou věci, které se pre-procesor se postará o. Takže co to pre-procesor dělat? Je to opravdu hloupost. Vše, co je schopen je všechny z nich kopírování a střih a vkládání operace. Takže hash obsahuje standardní i0 dot hodin. Co je to dělá? Je to chytil standardní I0 dot h soubor a vložit jej do horní všude tam, kde se říká, že hash obsahuje standardní i0 tečka h. A každý hash určit, že máme viděli, co se to dělá? Jeho kopírování hodnoty tohoto hash definované je definován jako a vkládání, které všude tam, kde používáte hodnotu. Takže preprocesor právě dělá opravdu operace na základě jednoduchý text. Nedělá nic chytrého. Takže vše, co je složitější. Takže teď, že preprocesor je Hotovo, jsme vlastně sestavit. Takže co sestavování znamená? Nyní bude z kódu C do assembleru. Jo? Diváků: [neslyšitelné]? ROB: Jo, jsme chytili, že. Takže kompilace. Jedeme od c do sestavy. Tak tohle je skutečná změna jazyka. Kompilace se znamená jít od vyšší jazyk na úrovni nižší úroveň jazyka. A c je vysoká jazyková úroveň ve srovnání s montáží. Co je to montáž? Jeho pokyny, které jsou, dost moc, dělal pro váš procesor. Ale váš počítač stále nechápu montáž. To chápe jen jedničky a nuly. Takže dalším krokem je montáž, která přináší nám z těchto pokynů, které váš procesor rozumí a ve skutečnosti převádí je, aby ty jedničky a nuly. Takže C montáží na binární. Ale nemám ještě spustitelný soubor. Takže myslíte, že knihovny CS50. My jsme pro vás připravili binární pro Tato CS50 knihovna, která má getString a vezmi_int a tak. Ale CS50 library-- va itself-- není spustitelný. To nemá hlavní funkci. Je to jen banda binární které můžete použít. Takže propojení je, jak jsme se dát dohromady všechny těchto různých binárních souborů do skutečné spustitelný soubor. Jeden, který můžete zadat tečka lomítko tečku ven. Takže to je jako soubor, který jste psal, - bez ohledu na váš program je-- Ceaser dot c. Ale teď to byl sestaven dolů na binární. Tak Ceaser tečka o. A tohle je náš CS50 knihovny binární. A oni jsou kombinovány do jednoho spustitelného souboru. Jo? Diváků: [neslyšitelné]? ROB: Takže první patří, pamatujte, hash jsou ve skutečnosti krok pre-procesor. Ale to je oddělené. Pokud nepoužíváte žádné funkce, které jsou mimo vaši jednoho souboru a pak, Ne, nemusíte propojit cokoliv protože máte všechno. To znamená, že printf je spojen v. Pokud jste někdy použít printf, to je něco, , že musí být spojeny v protože jsi to nenapsal. A, ve skutečnosti, printf je automaticky spojeny. Víte, jak na příkazovém řádku, nebo pokud Můžete zadat, aby, je vidět, že mají pomlčka l CS50, který má odkaz v knihovně CS50? Printf, a tak podobně, že se děje být spojeny automaticky. Nějaké další otázky týkající se něco? Diváků: [neslyšitelné]? ROB: Propojení? Máme spoustu různé binární soubory. Toto je kanonický příklad že používáme je CS50 knihovna. Sestavili jsme a podávat na binární tohoto CS50 knihovny. Chcete-li použít getString ve vašem programu. Takže jdete a používat getString. Ale bez mého binárního kódu pro GetString, při kompilaci kódu dolů, nemůžete vlastně spustit svůj Program protože GetString String je Zatím není zcela definováno. Je to jen při propojení v mém binární který obsahuje getString, že nyní vše Dobře, můžu vlastně spustit getString. Můj soubor je kompletní. A mohu spustit to. Jo? Diváků: Má propojování převést binární spustitelný? Takže i když nemáte jiný knihovny, nebylo by to stále nutné překládat [neslyšitelné]? ROB: Takže spustitelný je stále v binárním formátu. Je to jen kombinující celek banda binárních souborů. DIVÁKŮ: Děkuji moc. ROB: Žádný problém. Nějaké další otázky? Jinak jsme vše nastaveno. V pořádku. Díky. [APPLAUSE] DIVÁKŮ: Děkuji. ROB: Jo.