JASON Hirschhorn: Welcome až A5, všichni. Máme vzrušující týden před námi, hlavně proto, že tam je tak mnoho nových čelí v této místnosti. Je to úžasné. Mnoho z vás se zde náhodou, což je ještě lepší. Takže doufejme, že budete držet k nám. Tento týden budeme trávit Převážná část úseku příprava na kvíz. Takže na našem programu, budeme mluvit něco o zdrojích pro třídu, ale také pro testu, a pak znovu, tráví většinu třídy mluvení o otázkách. Jakmile jsme hotovi odpovědi na vaše otázky, nebo pokud vaše otázky přirozeně nás vedou k nějaké kódování, jsem mají vzorek problémy z midterms minulost, že budeme kódovat žít v sekci dohromady, že také vychovávat jiné dobré téma k pokrytí. Takže první, co jsme prošli za posledních pár týdnů, aby vám připomněl, chlapi, tam jsou tuny zdrojů k dispozici pro tento kurz. Mnoho z nich bude nesmírně užitečná na vás, jak si i nadále studovat kvíz 0, protože je to v úterý odpoledne. Takže vy všichni byli studuje na chvíli. K dispozici jsou skripta a zdroje kód, který by měl určitě vyzkoušet. Podívejte se na šortky. Podívejte se na study.cs50.net. A pak, jsou uvedeny níže, řada z jiných zdrojů. Opět platí, že kvíz 0 je zítra při 1 hodině. Pokud jste tak ještě neučinili, zkontrolujte, zda ven O Quiz 0 doklad o Domovská stránka hřiště je přijít na to, kde bereš kvíz. Kvíz začíná v 01:10 a končí 70 minut později. Takže pokud se objevíš po 01:10, budete dostaneme, že mnoho méně minut než 70, aby se kvíz. Takže ujistěte se, že jste tam včas. Pokud jste rozšíření student nebo mají některé další testování úvahy, že nemusí být na jedno hodin zítra. Ale opět, zkontrolujte O kvíz 0 dokumentovat, aby se ujistil, víte, kdy užíváte kvíz. Napsal jsem 75 minut sem. Myslím, že je to v pořádku, ne 70. To se vztahuje na veškerý materiál od jednoho týdne 0 se minulý týden přednášky ve středu. A opět, v tomto testu, na který dokument, dostanete jeden oboustranný a 8 1/2 do 11 listu papíru, které dostanete použít jako poznámky během testu. Mnoho lidí, pokud ne většina lidí, mají zjistil, že jeden z nejdůležitějších užitečný způsob, ke studiu na kvíz je provést studie list, jedno-Sider, jejich vlastní. Tak se podívejte na ty poslední, pokud jste viděli ty předchozí. Oslovit přátele, aby viděli, co oni jsou umístění na jejich. Ale hands-dolů, nejlepší způsob, jak můžete Studie je projít všechno a ořezávat ho na to, co by měl nebo by měl nepatří na tomto listu papír, protože to je prostě fakt užitečné jak pro vás, aby se ujistil, jdete přes všechno a mít nějaké znalosti s ním. Většina lidí, najdeme, i když se list papíru sedí přímo vedle nich na kvíz, neotáčejte na to, protože, opět, že velmi Proces prochází informací pomohl jim se to naučit. Má někdo nějaké otázky, o kvíz 0? Má všem - Nebudu dělat show rukou. To nic. Chtěl jsem se zeptat, kdo začal studovat. Ale já nechci, aby se ti vše není zvedněte ruce. Takže jak jsem řekl - ano, Avi, jděte do toho. AVI: Jaký by měl být užitečná věc aby na jedné pager? STUDENT: To záleží na vás. JASON Hirschhorn: Získáte používat svůj úsudek. Užitečné věci, aby na jedné pager, pokud jste zmateni o velké O runtime různých typů vyhledávání a druhy, dej to tam v šikovný dandy graf. Tak, pokud jste požádal, aby na kvíz, nemusíte se snažit a číslo to, nebo důvod, proč přes běhu. Stačí si jen zkopírovat dolů. Podíváte-li se na kvízy minulosti, hodně časy, tam běží čas na otázky. Tak to by bylo příkladem dobré co dát na jednu pager. Další dobré věci dát na, pokud jste zmatená o tom, jak deklarovat funkce, nebo to, co různé části deklarace funkce jsou, napsat že tam, generické verze a pak možná příkladem. Pokud jste zmateni o ukazatele, diagram, jak ukazatele práce asi opravdu užitečné. Pokud jste zmateni o rekurze, ochutnat rekurzivní funkce tam mohl také ukázat jako velmi užitečné. Znamená to, že vám nějaké nápady? AVI: Musíte pochopit, Celá kompilace proces, stejně jako jak to všechno funguje? JASON Hirschhorn: Vše , která byla pokryta mohl ukázat na kvíz. Otázky - ale opět, některé věci bude vážené těžce než ostatní. Některé věci mají přijít znovu až a znovu ve třídě, v přednáška a sekce. Ostatní věci nemají přijít tak často. Mluvili jsme hodně o # include a -L něco a co ty na mysli v Proces kompilace. Mluvili jsme hodně o GDB, lepit, ty různé příznaky, které se používají při jsme se sestavit něco, a to make15, například, opravdu znamená, a opravdu. Jsme nemluvili tolik o každý krok Proces kompilace. Pořád ještě jsme o tom mluvili. Takže je to stále něco, co by měli být obeznámeni se. Ale opět, my nebude - věci, které přicházejí častěji ve třídě jsou více pravděpodobné, že přijít více často a být přísněji vážené na kvíz. V pohodě. Jakékoliv další otázky týkající se kvízu 0? OK, tak jsem dal seznam témata na palubě. Šel jsem přes osnov. Prošel jsem úseku recenze od včera v noci a ty snímky přijít s non-vyčerpávající seznam témat že jsme se zabývali tak daleko CS50 a věci, které by mohly se objeví na kvíz. Tak jsem to jít přes každý jeden z nich. To by se mnohem více čas, než máme nyní. Ale dal jsem to sem, aby doufejme jog paměť jako k věcem, které mohou být nebo nemusí být obeznámeni s vámi. A já bych rád tráví většinu část odpovědi na vaše otázky o tom, Tato témata, témata, která zde nejsou zahrnuty. Můžeme psát pseudo kód. Můžeme napsat skutečný kód aby bylo zajištěno, že - Mohu odpovědět na vaši otázku, a pomoci všichni v podstatě chápat Mnoho z těchto témat, takže se budete cítit připraven a pohodlně jít do zítra kvíz. Tak si přečtěte na seznam. Vy snad přišli na úseku s některými otázkami stejně. Až budete připraveni, zvedni ruku a my jsme se mohli začít. Mějte na paměti, že otázky, které jste, neexistují hloupé otázky. Slyšeli jsme, že hodně. A otázky, které jste, jsem ochoten vsadit, mnoho jiných lidí i sedím a sledování on-line jsou také. Takže můžete pomoci jen lidi kladením otázek. Marcus. MARCUS: Mezi zásobníku a haldy, je zde předběžně vyčleněná procento paměti, která je definována jako to je na zásobníku nebo haldy? Nebo jak to funguje, přesně? JASON Hirschhorn: Velká otázka. Jdu zjistit zpětně trochu. Má všem - prosím zde upřímný. Vím, že žádám vás, abyste zvýšit vaše ruka před svými vrstevníky. Ale jsou tu lidé, kteří se cítí nepříjemný zásobníku a haldy a chtěl bych jít přes které a co ty myslíš? Pokud Zvedněte ruku - OK. Děkuju. Takže jsme jít stoh a haldy opravdu rychle a pak přesunout do odpovědi na vaši otázku. Takže pokud budeme čerpat z krabice, aby zastupoval paměť na vašem počítači, jaké jsou některé věci, které jdou v tomto poli? Hlavní. Hlavní funkcí. Tam, kde se hlavní jít? STUDENT: [neslyšitelné]. JASON Hirschhorn: Takže budeme kladen hlavní sem. Co jiného jde v tomto poli? STUDENT: Funkce, které voláte. JASON Hirschhorn: Funkce které nazýváme. A kam jdou? STUDENT: V zásobníku. JASON Hirschhorn: Oni jít na stack. Takže budeme nazývat co tady dole zásobník. A až nahoře, máme hromadu. Takže paměť není box, stejně jako to. Ale to je vlastně docela podobné. Bude to mít hodně krabic přes a více, v závislosti na tom, jak velká je vaše Počítač je nebo jak velká je vaše paměť. Na quote-konec citátu "zdola" je zásobník. A existuje několik věcí, že jdou na stack. A ti, závisí na funkcích Máte ve vašem kódu. Vždy máte jednu funkci ve vaší Kód tzv. hlavní, takže je tu vždy Sekce tady dole v zásobník věnována hlavní. Tyto oddíly v zásobníku se nazývají zásobník rámy. Při volání jiné funkce, řekl hlavní volá binární vyhledávací funkce, dáme další rámeček na zásobníku. Přesněji řečeno, budeme darovat kus paměti na našich počítač ukládat binární vyhledávání je místní proměnné a spustit binární Vyhledávání kód. Tak nazýváme binární vyhledávání. V tomto kusu paměti, jedeme ukládat své lokální proměnné. Budeme ukládat své printf volání. Ať se stane cokoliv, že funkce je bude uložen přímo tam. Binární vyhledávání je bude provádět. To se chystá dokončit spuštění. Co je to slovo v jazyce C, který označuje že funkce by měla dokončit jeho výkon? STUDENT: Návrat. JASON Hirschhorn: Návrat. Takže když vidíte, příkaz return, funkční konce když to udeří to. Takže binární vyhledávání zasáhne jeho návrat. Tato část paměti bude v podstatě se uvolnilo. A hlavní půjdou zpět do výkonu. Takže hlavní se zastaví tam, kde byl, volání binární vyhledávání, trochu návratovou hodnotu, a pokračovat v realizaci. Tento stack frame půjde pryč. Pokud říkáme rekurzivní funkci, která je funkce, která volá sama sebe přes a více, mohli bychom dostat - říci, že jsme udělal binární hledání rekurzivně. Mohli bychom se binární vyhledávací verze jednoho, binární vyhledávání dva, binární vyhledávání tři, čtyři binární vyhledávání, binární vyhledávání pět. A pak je to konečná binární vyhledávání pět zasáhne základní věci, a zásobník rámy se vrátit zpět a udržet zavírání až se dostaneme zpět do hlavního. Můžeme jít na rekurzi v trochu. Ale to všechno znamená, že pokud jste volání více funkcí najednou, tam bude více stack rámy na zásobníku. Haldy, na druhé straně, a to až zde, není pro funkce, ne pro lokální proměnné. Je to pro dynamicky přidělovány proměnné. To jsou proměnné, které mohou být inicializován buď hlavní nebo funkce, která hlavní hovory. Kdekoli v kódu, které mohou být inicializovány. A inicializovat dynamicky přidělena proměnné. Jaké funkce v jazyce C máme používat? STUDENT: Malloc. JASON Hirschhorn: Malloc. Zavoláte malloc. Získáte prostor paměti. A to je prostor paměti je na hromadu. A to je prostor paměti zůstane tam, dokud budete volat zdarma. Takže dynamicky alokované proměnné haldy bude existovat tak dlouho, jako ty chcete, aby existovat, a nebudou odejít, dokud explicitně řekněte jim, ať jdou pryč. Můžete je vytvořit v jedné funkci. Tato funkce je zásobník rámeček zmizí. Ale, že proměnná bude nadále existovat v hromadu, dokud není osvobozen, potenciálně funkcí, který se nazývá binární vyhledávání nebo cokoliv jiného. Takže ty haldy proměnné zůstat tam tak dlouho, jak budete chtít jim, aby zůstali tam. A oni se sem dostal. A pak další, kdo se dostane tam dal. Udržují se plní do, a oni zůstat tam, dokud se volání zdarma. A v podstatě, haldy a zásobníku, dostat se Marcus otázku, roste směrem k sobě navzájem. A pokud se dostanete do sebe, jste spotřebovat veškerou paměť ve vašem počítač, a váš program bude přestat protože nemáte žádnou další paměť doleva k použití. Mezi nimi existuje případně další věci. Ale pro rozsah tohoto kurzu, vám Nemusíte se obávat, že. Takže to byla odpověď na vaši otázku. Nedělejte si starosti. Ale to byla dlouhá odpověď. Vše, co potřebujete vědět, je haldy a zásobníku bude - jeden začíná v dolní části. Stack dělá. Haldy je tam nahoře. Budou růst blíže k sobě. A pokud se dotknou, to je problém. Utekl jsi z paměti. Ale také, kromě vědět, kde jsou to, co je uloženo v obou stack a heap. Curtis. CURTIS: Když se srazí, je, že přetečení zásobníku? JASON Hirschhorn: Když se srazí, to není přetečení zásobníku. Přetečení zásobníku je jiná oblast že můžeme jít na, pokud chcete. OK, vrátíme se k tomu za chvíli. STUDENT: Jaké je to slovo s názvem když hit navzájem, stack a heap? JASON Hirschhorn: Pro tuto chvíli, nemusíte obávat. Jen vím - Já odpovím na tuto otázku po třídě. Pokud se dostanete do sebe, si vyběhl paměti, protože tam je více prostor tam. STUDENT: Je nám líto, co je chyba seg? JASON Hirschhorn: Segment Porucha může být volán k - záleží proč volal seg chyba je. Někdy, váš stack overflow, bude to říci seg chyba jako chyba. STUDENT: Co dereferencing null proměnné? Je to chyba seg? JASON Hirschhorn: Získávání null pointer - OK, takže pokud máte ukazatel, který vám rovna null, ukazatele, odvolání, Memory adresy jejich hodnoty. A nulový ukazatel je v podstatě skladování 0, 0-tého řešení v této proměnné. Takže 0x, 0, 0, 0, 0, a tak dále. Že 0-tého adresu v paměti, že to není v našem obrázku, je to tam někde, že je vyhrazena pro počítač. Jsme nesmí se ho dotknout. Takže když váš program je realizovat, pokud něco, co se snaží jít do paměti adresa 0, ví, že že je prázdná hodnota. Ví, nic by tam měla být. Takže pokud se pokusíte a použít něco, co tam a léčit něco jako tam, nebo snaží se přejít do tohoto umístění, jste bude mít poruchu seg nebo chybu. Znamená to, že odpověď na vaši otázku? A teď půjdeme zpátky k přetečení zásobníku. Věci v zásobníku, jako vy mají neviděl, v - pojďme nakreslit blízko ze zásobníku rámu. Každý může vidět, že? Takže máme rámeček zásobníku. Šetříme pole se jako místní proměnná v této funkci. Tak, že naše řada má pět míst. Všech pět z nich se uloží v tomto zásobníku rámu. Pokud začneme psát za hranice tohoto pole - takže pokud začneme psát do, řekněme, že je 0. Ti, kteří jsou pět indexy naše pole. Pokud začneme psát do indexu 5, který nemáme, když máme pole o velikosti 5, začneme psát do index 6, 7, 8, 9, můžeme získat Stack Přetečení chyba. Obecně platí, že to není - budete pravděpodobně dostanete do potíží pokud půjdete přes jeden. Ale obecně, dostanete do největší potíže, pokud jdete nad tím hodně a jít tak daleko, přes který můžete napsat na zpáteční adresu, která funkce, které se nachází na Dno zásobníku rámu. Vzhledem k tomu, že jo? Vy - v - Omlouvám se. Ne ", protože v pořádku." V zásobníku rámu, máte vaše lokální proměnné. Na samém dně zásobníku Rám je zpáteční adresa. To je místo, kde funkce jde, když je po všem. A pokud jste přepsat, že návratnost adresa, pak když to stack frame, když jdete přes zásobníku rám a provádění každého řádku, ty jsi jít do svého nového zpáteční adresu že je tam napsáno místo Skutečný jeden. A to je, jak jsme viděli Některé narušení bezpečnosti se může stát s počítači. Takže přetečení zásobníku, v krátkosti, je-li přepsat část v zásobníku máš používat, místní Proměnná jste měl použít, a zejména při spuštění přepisování důležité věci, jako je zpáteční adresu. A to je místo, kde budete mít chybu. Nebo snad dokonce byste mohli začít dokonce i zápis do - říci, binární vyhledávání bylo přímo nad hlavní. Pokud přepsal hodně, vám mohl napsat do hlavní. Ale obecně, dostanete chybu před pak, protože ví, že počítač děláte něco, co vás neměli dělat. Jo. STUDENT: Jaký je rozdíl mezi přetečení zásobníku a buffer overflow? JASON Hirschhorn: Buffer overflow je obecnější typ to, co jsem právě popsal. Žák: Takže přetečení zásobníku je Příkladem přetečení vyrovnávací paměti. JASON Hirschhorn: Přesně tak. To je pole si můžeme představit jako vyrovnávací paměti, prostor pro věci, jít dovnitř To je přetečení bufferu. Mohli bychom mít přetečení bufferu v. Pokud by došlo k vyrovnávací paměti, která se často je pole halda, a my přepsal ty hranice, pak bychom mají přetečení bufferu v. A nad rámec tohoto kurzu, oni jsou detekovány trochu jinak. Kompilátor má zvláštní způsoby detekce každého. Ale buffer overflow je obecnější typ, co jsem popsal, který byl přetečení bufferu. Věděli, že odpověď na vaši otázku? Sladké. Byly tam nějaké další otázky související na zásobníku nebo haldě? Jo. STUDENT: Vím, že máte na volné řetězce protože jsou v haldě a nechcete, aby k úniku paměti. Ale máte osvobodit globální proměnné a tak podobně? Nebo jsou automaticky osvobozeni? JASON Hirschhorn: Dobrá otázka. Takže v CS50.H, tvoříme tuto věc pro vás volal řetězec. Řetězec je opravdu to, co? STUDENT: Char hvězda. JASON Hirschhorn: char hvězda, ukazatel na znak, ukazatel na pole znaků. To je to, co je řetězec. Takže ho musíme osvobodit, protože GetString, který jsme použili hodně - Název řetězce se rovná GetString - že mallocs pro nás nějakou vzpomínku na haldy a vrátí ukazatel na První znak, který string, char hvězda. Takže zdánlivě, pokud jste nebyli psaní zdarma založit na některý z vašich řetězců že jste volal tak daleko, budete mít uniká část paměti. Samozřejmě jsme nemluvili o to, aby nikdo nedostal do problém pro to dělá. Ale do budoucna, ano. Voláte-li GetString, že jste mallocing nějaký prostor na haldě. A pokud nechcete volat zdarma později, že řetězec, máte nevracení paměti. To je odpověď na vaši otázku? Jo Žák: Takže k tomu, že budeme používat zdarma přímo před návratem? Stejně jako v rámci, myslím, že v případě, říkáme, jako, int main, v rámci Rozsah kódu, který je v těch složené závorky, přímo před - Víte, kde byste obvykle dát návratu. Myslíte si, dát volný před tím? JASON Hirschhorn: Takže si můžete dát zdarma všude tam, kde chcete dát zadarmo. Protože se jedná o dynamicky přidělovány proměnné, protože mohou žít nad rámec zejména funkce, pokud budete volat malloc v samostatné funkce, například, GetString, můžete volat zdarma do hlavní. Nemusíte to říkat v konkrétní funkci kde je malloc nazývá. Ale vy potřebujete, aby to nazvat před hlavními vrátí. A to opravdu záleží. Záleží na tom, proč jste malloced, že prostor na prvním místě. Někteří lidé budou volat osvobodit docela rychle. Někteří lidé budou volat zdarma až do konec svého programu. A oni si projít a volný všechno. Záleží na tom, proč jsi volala malloc. STUDENT: A co byste řekl pokud jste volali použití GetString? Člověk by řekl zdarma, co? JASON Hirschhorn: Tak syntaxe zdarma je prostě volný, otevřené závorka, v blízkosti závorka, a název ukazatele. Takže pokud napíšete název řetězce rovná GetString, dáte jméno zde. To je název ukazatele. A ví, že k uvolnění, že paměť. Žák: Takže, když se uvolní, že paměť, ukazatel ukazuje stále na tomto místě v paměti? Nebo je ukazatel rovněž zbavena adresa, na kterou odkazuje. JASON Hirschhorn: Měli bychom to zkusit. Měli bychom kód, který. Pojďme zpátky, když se dostaneme do kódování, a pojďme kód, který. A pokud chcete zjistit odpověď na to, že můžete také kód, který do té doby. Ale to je velká otázka. STUDENT: Je možné, aby zdarma něco příliš brzy? Takže si ještě potřebovat pro váš program, a osvobodil tuto paměť? JASON Hirschhorn: Ano. To je možné, pokud se něco zdarma a pak ji znovu použít, budete narazit na chybu. Ale to je na vás, protože jste osvobozeni něco, a pak zavolal později. Takže to byl programátorský chyba. Ale ano. Dalo by se napsat, že. Nějaké další otázky týkající se - Ano. Žák: Takže pokud jste měli jen uvolnit, obecně před program skončí, jestli to znamená, Program končí a nechcete ho uvolnit, že paměť je stále přiděleno? JASON Hirschhorn: Je-li váš program končí a jste zapomněl uvolnit něco, pak že paměť byla přidělena v průběhu životnost vašeho programu. Když váš program ukončí zcela, že paměť nebude zůstat tam navždy. Počítač je dost chytrý, aby věděl , že při ukončení programu, je by se zbavit veškeré paměti, že byla spojena s tímto programem. Nicméně, tam jsou nástroje, které můžete spustit o programu pro detekci v případě, kdy Program skončil, jsi zapomněl uvolnit nějakou paměť. A další problém, v místech, kde budete používat malloc a použití ukazatele, budete běží to program na vašem programu, aby zjistili, zda, když hlavní vrátí, jste měli nějaké věci, které byly ponechány unfreed. Takže to nebude zůstat malloced navždy ve vašem počítači. To by bylo nehospodárné, protože velmi rychle, počítače by k vyčerpání paměti. Ale v případě, že běží až do konce vašeho programování a oni nejsou osvobozeni a vaše Program ukončí, je to stále problém že tento nástroj vám pomůže řešit. STUDENT: Je to Valgrind? JASON Hirschhorn: Je to volal Valgrind. A budete - STUDENT: Ale my nemusíme vědět že k testu, ale? Myslím, že to byl mluvil o trochu v přednášce. JASON Hirschhorn: Tak Valgrind je název tohoto nástroje. Vědět, co to dělá, je dost pro kvíz. Ale vy jste jej nevyužili ještě na vašem problém nastavit, protože jsme neměli Problém set, který se výslovně zabýval s malloc nebo pomocí malloc. Takže jste nepoužili ještě Valgrind. Ale budete používat dříve spíše než později. STUDENT: Dokážete opakovat co Valgrind je? JASON Hirschhorn: Je nám líto? STUDENT: Dokážete opakovat to, co Účelem Valgring je? JASON Hirschhorn: Valgrind je název - jako GDB pomáhá při ladění programu, Valgrind vám pomůže zjistit, zda věci, které nebyly uvolněny když váš program ukončí. Takže budete spustit na vašem programu. A váš program ukončí, a to řeknu Váš program s názvem malloc to mnoho krát k tomuto počtu bytů, a vy pouze tzv. volný tento mnohokrát. A tak jsi odešel těchto mnoho bajtů aniž by byl osvobozen. Nebo to řeknu, že jste osvobozeni všechno. Dobrá práce. STUDENT: OK. A jmenuje se Valgring? JASON Hirschhorn: V--L-G-R-I-N-D. STUDENT: otázka o ukazatele. Takže říct, že jste n hvězda x se rovná něco. To se rovná, co jste uvedení tam, je to, že to, co je dát dovnitř co x směřuje k, nebo ukazatel x? JASON Hirschhorn: Můžeš zopakovat otázku? Můžeme kreslit, když to říkáte? STUDENT: V testu, ve skutečnosti, ten, který nám poslal, to bylo jako, char hvězda pravda rovná CS50 skály, ne? Takže to znamená, že toto CS50 skály je to, co je pravda ukazuje na? JASON Hirschhorn: Takže mluvíte o char hvězdy v řetězci, jak že funguje? Jo. OK. Pojďme nakreslit to tady. [SIDE konverzace] JASON Hirschhorn: Takže tato proměnná bude typu char hvězdy. Jak velký je variabilní z typu char hvězdy? Kolik bajtů? STUDENTI: Čtyři. JASON Hirschhorn: Je to čtyři bajty. Kolik práva je variabilní z typu int hvězdy? STUDENTI: Čtyři. JASON Hirschhorn: čtyři bajty. Pokud je to ukazatel, pak je vždy čtyři byty, protože ukazatele, jejich hodnota je adresa paměti. A paměťové adresy na CS50 Zařízení jsou čtyři bajty dlouhé. Takže když říkáme GetString, nebo když řekněme, jmeno_string rovná, a poté v dvojité uvozovky dát řetězec, klademe - dobře, že je to trochu jinak. Budeme se GetString jako příklad. Nebo char hvězda něco rovná řetězec. Omlouváme se, dej mi příklad že jste si přečetli? STUDENT: char hvězda pravda rovná "CS50 skály" v uvozovkách. JASON Hirschhorn: Tak to hvězda, to zavoláme tuto proměnnou x pro naše obecné účely. Vytvořili jsme proměnnou s názvem x. Je to typ char hvězda. Je to ukazatel na řadě znaků. Tak sem - Tak to je, jak to by pracují v paměti. To by uložení paměťové adresu. To by neskladujte paměťovou adresu první znak v poli. A pak, když jste postupovali ukazatel, byste získat první znak. A pokud čtete tuto věc jako řetězec, počítač je chytrý stačí vědět, přečtěte si celou tuto věc až se dostane k odporu 0.. Ale pokud jste to četl znak na čas, takže jste iterace Tento řetězec, pak budete jen číst znak v době, dokud se nedostanete na zpětné lomítko 0. To nemusí odpovídat vaší otázka, ačkoli. STUDENT: Jo, ale nemáte malloced, že prostor ale pro tento ukazatel. JASON Hirschhorn: Takže si nejsem zcela jist, přesně to, co hledáte na, protože jsem neměl dělat, že kvíz. To měl být užitečné zdrojů z jiného TF. Pokud vytváříte řetězec na zásobník nebo jako lokální proměnné, bude to být jen řada poplatků, spíše než obecně char hvězda ukazující na jiný řetězec. Ale já nevím. To by mohlo být ukazatel na další řetězec na zásobníku stejně. Jo. STUDENT: Já vím, že je třeba, aby alokovat paměť v případě, že ukazatel je jak se deklarované uvnitř jiné funkce. Potřebujete si udělat totéž, pokud je to byly prohlášeny uvnitř hlavní, budete používat uvnitř hlavní? JASON Hirschhorn: Takže ano. Můžete deklarovat ukazatel na jakýkoli adresa paměti v paměti. To může být paměť adresa místní variabilní, i když často, lidé nemají prohlásit adresy paměti do lokálních proměnných, protože jdou pryč jednou, že funkce vrací, což je důvod, proč jsme se obecně malloc věci. Ale ano, můžete deklarovat ukazatel jiné lokální proměnné. Je to jen obecně nedělá. Ale můžu se na to podívat specifická věc, kterou po hodině. Jo. STUDENT: Myslím, že to je něco co je žádán. Zdá se to divné, být inicializace ne jako ukazatel adresu, ale jako to, co Vypadá to, že hodnoty. Vypadá to, že CS50 je to, co je uvnitř to je ukázal a není skutečná adresa, ne? JASON Hirschhorn: Tak to je není tento případ, ačkoli. To není to, co se děje. Když deklarujete char hvězdu, to je adresa paměti. Ukazatele jsou všechny paměťové adresy ukazuje na něco jiného. To je něco jiného, ​​může být na stack, ale téměř vždy je na haldy ve způsobu, jakým budeme vidět dřív. Ale jmeno_string rovná dvojité uvozovky "GetString," můžeme vidět, že i my můžete prohlédnout, že i kód, který. GetString řetězec není uložen v že proměnná, nebo cokoliv řetězec název není ukládán v tom, že variabilní, protože to není jak ukazatele pracovat. Má to smysl? STUDENT: Jo. JASON Hirschhorn: OK. Doufejme, že to není matoucí pro každého. Ale kdyby to bylo, můžeme se na to podívat znovu ve chvíli, protože jsme vlastně děje kódovat něco, co bude doufejme, práci s řetězci a pomůže vám cítit se více pohodlně s nimi. Jakékoliv další dotazy týkající se těchto témata a další témata, která Dám zpátky? A - právě teď. Ano, Alden. ALDEN: Tak tohle je naprosto nesouvisí, ale nemůžeme prostě jít přes velmi rychle, co potřebujete vědět o rozdílu mezi 32 a 64-bit stroj? JASON Hirschhorn: Ano. Takže 32 bitů je, kolik bajtů? ALDEN: Je to čtyři bajty. JASON Hirschhorn: Je to čtyři bajty. A 64 bitů je, kolik bajtů? STUDENT: Osm. JASON Hirschhorn: Osm bajtů. Takže znovu, osm bitů je jeden bajt. Váš CS50 spotřebič je 32-bitový stroj. Takže adresy paměti jsou čtyři bajty dlouhé. K dispozici jsou 2 až 32 adresy paměti. 0-2 až 32 minus 1. A já nejsem pozitivní, ale to je Pravděpodobně rozsah toho, co budete potřebovat, aby vědět, pro 32-bitové stroje, které paměť adresy jsou opět čtyři bajtů, a to je maximální částka, paměťových adres. Také, datové typy - to by mohlo být něco jako dobře, že to stojí za zmínku. Velikost datového typu závisí na stroj, se kterým pracujete. Takže char, znak, je to, jak počtu bytů na našem CS50 zařízení? Jeden byte. A to je vlastně jeden bajt jako i na 64-bitovém počítači. A většina datové typy jsou stejné číslo z bytů na obou strojích. Ale některé typy dat se bude lišit na obou strojích. Tak, že by se mohly Jediná věc, kterou potřebujete vědět. Ale i to, že si myslím, je za hranicemi - Jsem si téměř jistá, když se podíváte zpět na staré kvízy, říká, převzít za kódování problémy, které používáte 32-bitový stroj. Ale tam jsou, jít spolu s tím v případě, že máte zájem, zde jsou datové typy, které jsou stejné velikost na všech strojích. Pokud jste viděli něco takového uint32_t, může nebo mohou Není vidět, že. To je typ dat. To se říká, být 32 bitů bez ohledu na co stroj je to na. Takže když lidé píší přenosné Kód, že pravděpodobně nebude používat ints. Budou místo toho použít tyto další údaje typy, které vědí, bude stejný velikost na každém stroji. Madhu. Madhu: Měl jsem otázku Proces kompilace. Takže pokud píšete program, který používá knihovna jako CS50, nebo tak něco stejně jako to, že vím, že knihovna je, v určitém okamžiku, bude sestaveny a spojeny palců Ale jak moc se to stane během sestavení vašeho programu? Jaká část této knihovny procesu nastane, když jste sestavování vlastního programu? JASON Hirschhorn: Tak pojďme na obecně kroky tohoto procesu. Můžete napsat. C souboru. Ve své. C souboru, # include svůj knihovny záhlaví, například, cs50.h. Co znamená, že ostrý patří linka udělat, aby váš program? Akchar. AKCHAR: Dodává prototypy funkce z hlavičky souborů v knihovnách. JASON Hirschhorn: Přesně tak. Dodává těchto funkčních prototypů do svého kódu. Takže pokud je váš kód je sestaven v časná stadia, kompilátor ví, že tyto funkce skutečně existují, a že někde byly definovány. K. H soubory nezahrnují definice těchto funkcí, nebo jak skutečně pracují. Cs50.h právě obsahuje něco, co se říká, GetString je skutečná věc, která se může stát. A standardio.h říká printf je skutečná věc, která se může stát. Takže váš jazyk C s tím. Záhlaví soubor se proměnil v některých strojově čitelný kód, který se nakonec dostane se obrátil na binární kód 0 a 1 je. A to je kód, který nakonec dostane popraven. -L CS50 linky - například, když píšete zvonění - a pak jsou-l CS50, píšete, že palců A uvidíte, že. Když napíšete dělat, budete si muset vybrat viz tento řádek tady. A uvidíme, že ve chvíli, kdy my kód nebo později, když jsme kódu. Ale to-l CS50 linka dělá něco trochu jiný, než # include cs50.h. Co to-l CS50 linka dělat? Avi? AVI: Chci říci, že spojuje Knihovna pro funkci volání, jako Õ. souborů. JASON Hirschhorn: Takže velmi blízko, ne-li spot-on. -L CS50 má binární soubor a spojuje ji s binárním souboru. Takže cs50.h, že to nemá smysl otáčení cs50.h z jazyka C v soustavě binární každý jeden čas se to používá. To by bylo hloupé, protože to by odpad spoustu času. Tak to již byl sestaven a obrátil se do spustitelného souboru. A nyní se chystá být sloučeny s souboru na konci. Takže ty 1 a 0 se děje spojit se svými ty a 0 je na konci. Takže teď budete skutečně mít skutečný 1 a 0, které definují, jak GetString, například funguje, nebo jak printf, například funguje. A pro více informací, tam je krátké kompilátory, že Nate dává, že byste se měli podívat na to, že jde prostřednictvím těchto kroků. Ale - Ano. STUDENT: Jsou vždy o soubory. když jsou ve formě knihovny, připraveni být sloučeny, souvisí - jako jsou v binárním kódu? JASON Hirschhorn: OK. Co - STUDENT: Je to vždy pro knihovny, když je propojit? JASON Hirschhorn: Ano. Takže tam je. S. souborů, které budou strojový kód, který bude rovněž mystický pro vás. Nemusíte se starat o ty. Ale obecně, jo, oni budou být. o soubory připraven jít. Žák: Takže, když se loď na knihovna, máte jen loď . ha. o? Nemusíte loď. C nebo. S.. JASON Hirschhorn: So - a to je v tomto krátkém stejně, pokud tato informace se zdá, že přichází trochu rychleji. Ale krátký na překladače hovoří o tom, to stejně. Když loď knihovnu, pokud loď . h soubor záhlaví, které funkční prototypy, a 1, a 0 je, to je vše, co potřebujete dát. Nemusíte dát, jak Funkce pracuje, c soubor.. Vzhledem k tomu, místo odběru, nebo bod API, bod v tomto SPL, přenosná knihovna Stanford, je to abyste se starat o tom, jak nová GRect funguje, nebo jak se pohybovat práce, nebo, jak přidat díla. Vše, co potřebujete vědět, je, že doplněk je funkce, která můžete použít, a to dělá to. Takže si opravdu nemusíte vědět, jak je to napsaný v jazyce C. stačí Víte, tady jsou funkce, co dělat, a tady jsou je 1 a 0 když budete opravdu chtít použít. V pohodě. Nějaké další otázky týkající se kompilátory nebo další témata na palubě? STUDENT: Mám otázku , kterým se provádí rekurzivní funkce. Otázka o rekurzi. Měl jsem pocit, že by se přijít. Takže pojďme rychle projít rekurze s konkrétní Například faktoriál funkce. Vzhledem k tomu, to je příklad, který často přichází, nebo se používá pro ilustraci rekurze. Takže "4!" je číst jako 4 faktoriálu. A co 4 faktoriál znamená? Co to bylo? Jak si vypočítat 4 faktoriál? 4 krát 3 krát 2 krát 1. Takže další způsob, jak napsat 4 faktoriálu je to napsat. 4x 3 faktoriál. Vzhledem k tomu, 3 faktoriál je 3 krát 2 krát 1. Takže 4 krát 3 faktoriál je 4 krát 3 krát 2 krát 1. To je důvod, proč faktoriál je skvělý kandidát na rekurzi, protože je to jasné, že tam je něco, co stane znovu a znovu a znovu na menší počet věcí, dokud se dostanete na konec. Když se dostanete na 1, 1 faktoriál je 1. Nemůžete jít mnohem dál. 0 faktoriál je také definována jako 1. Takže, když se dostanete na 1 nebo 0, jste na konci, a můžete začít chodit nahoru. Takže pokud bychom chtěli napsat rekurzivní funkce pro výpočet faktoriálu, budeme psát nějaké pseudokódu na to teď. Než jsme se napsat tento pseudokódu - Dám si kluci pár minut psát pseudo kód nebo prostě myslím, o tom - tam jsou dvě věci, které každý rekurzivní funkce potřebuje. Jaké jsou ty dvě věci? JACK: To má volat sám. JASON Hirschhorn: Noah? Oh, Jacku. Jen do toho. JACK: To má volat sám. JASON Hirschhorn: Tak rekurzivní funkce potřebuje rekurzivní volání, volat k sobě. To je jedna. A co je ta druhá věc? JACK: base-case. JASON Hirschhorn: base-case. Základní scénář je, tady je, když jsme se zastavili. Takže vaše funkce volána. Referenční případ nastane dříve. Chcete vědět, jestli jste na konci. A pokud nejste na konci, budete Udělej si svůj rekurzivní volání. A jdete přes tuto funkci znovu, zkontrolujte znovu vaše základní případ. Pokud si nejste konec, uděláte další rekurzivní volání, et cetera, et cetera. To je důvod, proč rekurzivní funkce vždy Potřebujeme ty základní věci, a ty rekurzivní volání. Pokud nemáte rekurzivní volání, je by neměl být rekurzivní funkce. Pokud jste neměli základní věci, byste jít na věky tam by byl žádný konec. A referenční případ vždy na prvním místě, protože budete vždy chtít zkontrolovat pokud jste na konci první. Takže než jsme se udělat nějaké pseudokódu, proč ne se chvíli přemýšlet o tom, jak rekurzivní funkce pro výpočet faktoriálu by být napsána? Také, jako mnoho, jak děláte, psaní že se na jeden list papíru to, co budete mít na dělat na kvíz zítra. Takže asi dobré praxe, aby Ujistěte se, že kód píšete se na list papíru - nebo si můžete udělat, že. Víte, kde jsou středníky. Pamatuješ si syntaxi. Vzhledem k tomu, že jste nebyli schopni mít Kompilátor ti udělali chybu. Také v tomto směru, zítra, kdy jste kódování problémy, pokud se vrhli na čas, nebo pokud jste velmi zmatený, jak máš napsat konkrétní věc C, by slušet vám psát pseudo-kódu nebo pište své připomínky, stejně. Vzhledem k tomu, že je částečný úvěr pro Spousta otázek, na kvíz. Takže můžete být spěchal, nebo může být jen zmatený. Psaní v komentářích nebo pseudo-kódu jsou často způsoby, které Můžete získat částečnou úvěr. Takže nenechávejte něco prázdné na kvíz. Je tu žádné sankce za uvedení věci palců Ve skutečnosti, uvedení v pseudo-kódu nebo komentáře bude pomáhat srovnávač zjistit, jestli jste skutečně vědět, co mluvíte, a možná ocenění si některé dílčí ocenění za to. Také v tomto směru, psát jasně. Pokud se nám podaří opravdu to, co píšete, nejsme ti zavolat o půlnoci zítra na obrázku z toho, co jste napsal. Jsme jen tak sundat body. Napište jasně, takže můžeme slyšet, nebo spíše, můžeme přečíst, co jste napsal. A když se říká, že dvě věty, nepište odstavec. Postupujte podle pokynů. Jasně napsat. A napsat v těchto připomínek nebo pseudokódu na otázky, které by mohly ocenění částečné úvěr. OK, pojďme se faktoriál. Takže máme funkci faktoriál. Pokud bych měl vlastně píšu v C, to, co potřebuji, aby před jménem funkce? Návratový typ, který, v tomto případ, dáme mu int. A pak uvnitř složených závorek, je co se děje uvnitř složených závorek za funkce? STUDENTI: Typ Argument. JASON Hirschhorn: Její argumenty. Takže faktoriál bude pravděpodobně přijmout argument. Je to pravděpodobně jen mít jeden argument. A my, že to bude trvat celé číslo s názvem x. A opět, při psaní prototyp funkce nebo písemně funkci v kódu před jeho definici, vás napsat datový typ a název tato proměnná pouze pro tuto funkci. Takže si můžete projít nějaké číslo do tohoto funkce, bude to jen x interně. Máme pro výpočet faktoriálu funkce. Potřebujeme dvě věci, základní případ a rekurzivní volání. Jaká je základní důvod pro faktoriál? Někdo, kdo to napsal a kdo nemá ještě mluví, co je základem pouzdro pro faktoriál? STUDENT: Pokud n je méně než 2, vrátí 1. JASON Hirschhorn: Pokud n je méně než 2, vrátí 1. Líbí se mi to, protože to se stará o 0 a 1. Takže budeme dělat x <2, vrátí 1. Pokud bychom si prošel 0, pokud dostaneme prošel 1, bude tato funkce okamžitě vrátí 1. Pokud bychom si prošel nějaké číslo větší než nebo rovno 2, jedeme do máme rekurzivní volání. A tak, jak je to, že bude fungovat? Může někdo, kdo pracoval na této který dosud nepromluvil mi rekurzivní volání pro tuto funkci v pseudokódu? Pokud bychom si prošel v počtu x a to je větší než 2, což chceme dělat? Jsme také příklad napsán na strana, která vám může poskytnout radu. STUDENT: Call x krát faktoriál x mínus 1? JASON Hirschhorn: Přesně tak. Budeme se vracet x-krát faktoriál x minus 1. A to, i když jsem sepsal, v podstatě to, co jste řekl v angličtině, tato funkce pro výpočet faktoriálu bude se znovu zavolal. Bude provádět na x minus 1. Je to vrátím s nějakým celé číslo, a pak to bude násobit tyto dva společně, a tato hodnota bude vrátil se na cokoliv nazval faktoriál funkce, které by mohly být jiná instance tato funkce pro výpočet faktoriálu. Takže to je příklad rekurzivní funkce, což je velmi jednoduché rekurzivní funkce. Ale většina z nich bude takhle. Pokud byste chtěli dobrý rekurzivní výzva pro kvízu, zkuste kódování binární vyhledávání rekurzivně. Protože pokud jste binární vyhledávání problém nastavit tři, pravděpodobně to udělal iterativně ve smyčce while. Ale může to být také písemné rekurzivně. Budeš muset napsat svůj vlastní samostatné funkce, která vezme některé různé argumenty příkazového řádku - nebo ne argumenty příkazového řádku, z nichž některé Různé jen pravidelné argumenty. Ale vy jste mohl napsat binární hledání rekurzivně stejně. Žák: Takže jste mohli také napsáno, místo x minus 1, vy by také psali x mínus minus, nebo byste mohli mít napsal mínus mínus x. Můžete jen vysvětlit, opravdu rychle, proč ty by se různé věci, jako to, co je rozdíl mezi x minus minus a minus minus x? JASON Hirschhorn: Ne, nejsem jít do toho. Ale budu s vámi mluvit o tom po třída. x mínus mínus mínus mínus x decrement x o 1. Ale dělají to trochu jinak. Ale já nechci jít do toho. Ostatní otázky týkající se rekurze nebo je tato funkce? To opravdu není ani pseudokódu. To je v podstatě kód C byste psát pro to. OK, všechny ostatní otázky o tématech tady? Jo. STUDENT: Mám rychlý přehled s plovoucí desetinnou čárkou a přesnost. JASON Hirschhorn: Plovoucí bod a přesnost. Může někdo opravdu rychle dej mi náměty s plovoucí desetinnou čárkou a přesnost? Všichni jste musel udělat pro váš problém nastavit, takže jste všichni obeznámeni s tím. Nebo možná ne všichni z vás. Každý, kdo? Dej mi začal místo. S plovoucí desetinnou čárkou a přesnost. V čem je problém? Ano. Victoria? VANESSA: Vanessa. JASON Hirschhorn: Vanessa. Promiňte. VANESSA: K dispozici je pouze omezené množství čísel, které mohou být zastoupeny protože jste na, v naší pouzdro, 32-bitový systém. Takže tak nějak si aby se nějaká čísla. JASON Hirschhorn: Tak to je Přesně tak. K dispozici jsou pouze určité množství čísla, která mohou být zastoupeny. Máte-li násobit dvě velmi velká čísla, může přetéct částku prostorů máte zastupovat celé číslo. To je důvod, proč někdy používáme long long namísto int. To má více mezer. To může mít větší počet. Plovoucí bod přesnost má co do činění s , ale také má co do činění s Skutečnost, že desetinná čísla ne vždy představoval. Promiňte. Dovolte mi, abych to zpátky nahoru. Desetinné číslo 1.0 není vždy představoval jako vy by se dalo očekávat, 1,000000000. To je někdy reprezentován jako 1,000000001 nebo 0,999999999. To by mohlo být dokonce 89 hozen tam někde. Takže ty desetinná čísla nejsou zastoupeny přesně tak, jak byste očekávat, že budou zastoupeny. Takže problém nastavit - to bylo dva? - problém nastavit dva, kde jsme se zabývali čísla s plovoucí desetinnou čárkou, když jsme chtěli to, že představují přesně to, co jsme chtěli to, že představují, číslo o haléře, nebo počet centů, vynásobíme je 100.. Zaoblené jsme je. A pak jsme odříznuti vše za desetinnou čárkou. To bylo zajištěno, že by ve skutečnosti rovná přesně to, co jsme chtěli jim rovná. Protože když budete mít něco, co je float a otočte jej do int, můžete odříznout vše na pravé straně desetinné čárky. Vzhledem k tomu, že je nějaký plovoucí desetinnou čárkou nepřesnost, 100.000 mohlo být reprezentován jako 99,999999999. A pokud jste právě odříznout všechno vpravo hned, budete dostat špatné číslo. Jo. STUDENT: Měl jsem otázku o lití. V jakém pořadí se to objevit v? Pokud bych to plavat, držáky, 1 rozdělit o 10, to dělá 1 děleno 10, pak 0,1, pak zase je do plováku? JASON Hirschhorn: Pokud tak učiníte float 1 děleno 10 - STUDENT: Jo, a pak rovná - dobře, to by za normálních okolností má to stejný v - Jo. Chcete-li, aby to plovák, ne? JASON Hirschhorn: OK, tak jdeme na použít k segue do zjišťuje, Odpovědi na tyto otázky pomocí kódování. Vzhledem k tomu, budete pravděpodobně mít spoustu Tyto minute otázky, a dobrý způsob, k jejich řešení je přes kódování. Takže budeme kódovat právě teď, a pak budeme vrátit a kód na otázku, na kterou měl. Takže první řádek - Neměl jsem napsal to - to, co je První věc, kterou chcete udělat, když jsme otevřít nový soubor v gedit? STUDENT: Zahrnout. JASON Hirschhorn: Zahrnout, co? STUDENT: CS50 knihovna. JASON Hirschhorn: OK. Co jiného bychom měli zahrnout? Jsme prostě jít zkontrolovat co se děje když obsadil něco plováku. Ale co musíme zahrnout, pokud jsme bude napsat program v jazyce C? STUDENT: Standard I / O. JASON Hirschhorn: stdio.h. Jsme vlastně nepotřebují, protože to programu, cs50.h, i když je to vždy užitečné, aby ji zahrnout. Ale my vždy potřebujeme stdio.h. STUDENT: Při kódování v C? JASON Hirschhorn: Při kódování v C. Tak jsem ji uložit jako tento c souboru.. Mám nějaké pěkné zvýraznění syntaxe. Napsal jsem prázdnotu uvnitř hlavní. Co void znamená? STUDENT: nepřebírá žádnou argumenty příkazového řádku. JASON Hirschhorn: odpadá prostředky, v tomto případ, hlavní neponese argumenty příkazového řádku. V jiných případech, to znamená, že funkce nebere argumenty příkazového řádku. Nebo funkce, kdybych psát prázdno main (void), která by se říci síťovém nevrací nic. Takže void prostě nic neznamená. Co bych napsat, kdybych přijmout argumenty příkazového řádku? STUDENT: int oblouk c string oblouk v. JASON Hirschhorn: int argc řetězec argv. Je to pravda? STUDENT: Je to char hvězda argv závorky. JASON Hirschhorn: Takže jste mohl napsat string argv závorky nebo znak hvězda argv držáky, ale budete potřebovat držáky. Vzhledem k tomu, argv je pole řetězců, pamatovat. Není to jen jeden řetězec. Takže řetězec argv je, tady je jeden řetězec s názvem argv. String argv držáky se, tady je pole řetězců. Takže int argc řetězec argv držáky by bylo něco, co jsem pravděpodobně psát. Takže jste chtěli uložit do celé číslo? STUDENT: Jo, celé číslo. Nebo v plováku. JASON Hirschhorn: V plováku? Stejně jako float x se rovná 1 děleno 10. JASON Hirschhorn: OK. Jak mohu vytisknout plovák v printf? Co je? STUDENT:% f. JASON Hirschhorn:% f. Co je to číslo? d nebo i. Co je to řetězec? STUDENT: s. JASON Hirschhorn: s. Jak mohu získat novou linku? STUDENT: Zpětné lomítko n. JASON Hirschhorn: Co mám vrátit pokud hlavní běží správně? STUDENT: 0. Musím napsat, že linie, i když? STUDENT: Ne OK, nebudeme psát, pak. Každý může přečíst, že? Vypadá to trochu malé. Každý může vidět, nebo by Dělám to větší? Myslím, že pro kameru, uděláme je to trochu větší, ačkoli. JASON Hirschhorn: Chci-li zapnout tuto . C soubor do spustitelného souboru, co mám napsat? STUDENT: Udělat test. JASON Hirschhorn: Je nám líto? STUDENT: Udělat test. JASON Hirschhorn: Udělat test. Povídali jsme si o tento řádek dříve. Zvonění. Co je to zvonění? Název překladače. Co je to linka? STUDENT: Nastaví to pro použití GDB. JASON Hirschhorn: Sady je pro použití GDB. Tato linka, co je to? STUDENT: Zdrojový kód. JASON Hirschhorn: To je zdrojový soubor, c soubor.. Co tyto dva řádky dělat? Nebo tyto dvě ne linky. Žák: Jména to vyzkoušet. JASON Hirschhorn: Tak pomlčka o říká, Pojmenujte ji něco jinak. A tady voláte ho testu. Pokud jsem neměl, že, co by to pojmenovat to? STUDENT: a.out. JASON Hirschhorn: a.out. Co je to? STUDENT: Odkazy na matematickou knihovnu. JASON Hirschhorn: Je odkazy v matematické knihovně. My neobsahoval matematickou knihovnu, ale protože to je tak běžné, že jsem napsal make vždy obsahovat matematická knihovna. A podobně, to zahrnuje knihovna CS50. OK, takže pokud jsme seznam, nyní máme spustitelný soubor s názvem Test. Chcete-li to provést, zkoušku jsem psát. Vidím, že můj plovoucí desetinnou čárkou, , jak se očekávalo, rovná 0. Znamená to, že - takže - Žák: Takže když dáte vznášet se, jako byste ji obsadil jako float - JASON Hirschhorn: Cast 1 až plováku? STUDENT: Ne, obsazení plné věc - jo. Pokud jste právě udělal, by že, aby bylo 0.1? JASON Hirschhorn: OK, tak opravdu rychle, 1 děleno 10, které jsou celá čísla je rozdělen. Takže když si rozdělit celá čísla, jsou 0, a šetříte, že 0 v plavat, protože lomítko je jen celočíselném dělení. Takže teď jsme soustružení něco do plováku. Podívejme se, co se stane. Uděláme test. Takže teď vidíme, že lomítko nebylo číslo divize, to bylo plovoucí bod rozdělení. Vzhledem k tomu, jeden z jeho argumentů byl obsazen do plováku. Takže teď to bylo říkal, zacházet s tímto divize, jako máme co do činění s plovoucí body, ne s celými čísly. A tak dostaneme odpověď očekáváme. Podívejme se, co se stane - Chybička se vloudila. Kdybych chtěl vytisknout více desetinné místo skvrny, jak jsem to mohla udělat? STUDENT: Point tečka f, nebo jako mnoho desetinná místa, jak chcete. JASON Hirschhorn: Tak jsem vytisknout 10 desetinných míst. A nyní vidíme dostáváme nějaký divný věci. A to jde zpět k vaší otázce o plovoucí desetinnou čárkou nepřesnosti. K dispozici je divné věci uložené v zde. OK, to, že odpověď na vaši otázku? Co jiného chceš kódovat rychle? STUDENT: Jen jsem chtěl vidět, zda ne, pokud se uvolní nějaký ukazatel, zda je tento ukazatel stále ještě uloženy v je adresa toho, co bylo ukázal dříve. JASON Hirschhorn: OK, tak se pojďme to udělat. Char hvězda ptr, vytváří proměnnou tzv. ptr typu char hvězdy. Jak mohu psát malloc? Alden? ALDEN: Jen malloc. Ale pak to musí být velikost a v tomto případě, myslím, že bych směřovat k char. Tak to by bylo char. JASON Hirschhorn: OK, takže více obecně, Inside - pojďme upravovat. Uvnitř malloc, chcete číslo z bytů na haldě. Obecně platí, že to, co jsme viděli, že jsme dělá se budeme malloc řetězce, například, nebo pole celých čísel. Chceme-li tedy 10 celých čísel, nebo 10 znaky, 10 nám dá 10. A pak se velikost znaků bude dát nám, že velikost znaků, které V tomto případě je 1 byte. Dostaneme 10 bajtů. Pokud bychom měli napsat velikost int, že by nám 40 bajtů. Takže více druhově, uvnitř malloc je počet bajtů chcete. V tomto případě se dostáváme 1 bajt. Který vypadá jako podivný použití malloc, ale pro naše účely dává smysl. Takže tam je to. Budeme volat zdarma. My se toho zbavit a používáme PTR znovu. A to, co jsi chtěl zkontrolovat? STUDENT: Jen jsem chtěl zjistit, zda nebo tam bylo něco uvnitř ní. JASON Hirschhorn: Takže ať už to ukázal na něco? STUDENT: Jo, přesně, zda stále měl adresu v paměti. JASON Hirschhorn: Takže ty chceš zkontrolovat hodnotu PTR? STUDENT: Jo, přesně tak. JASON Hirschhorn: Co mám napsat zde když chci zkontrolovat hodnotu bod - to, co je, Jordan řekl, hodnota? Nebo to, co je uloženo uvnitř PTR? STUDENT: adresa paměti. JASON Hirschhorn: adresa paměti. Takže když napíšu jen to, že bude dej mi hodnotu PTR. A jak mohu vytisknout adresa paměti? Co je formátovací řetězec na adresu paměti? STUDENT:% p. JASON Hirschhorn:% p. % S je řetězec. % P na ukazatel. Je to pravda? To je v pořádku. Takže ptr rovná - to ještě má něco v něm. To je pravděpodobně více zajímavá otázka. Co to linka dělat? STUDENT: seg chyby. JASON Hirschhorn: Co? STUDENT: Myslím, že seg chyby. JASON Hirschhorn: Hm? STUDENT: Myslím, že to seg poruchu. JASON Hirschhorn: Tak tento řádek o kód, hvězda PTR, co se hvězda znamená? STUDENT: Obsah. JASON Hirschhorn: Jo. Přejít na ten obsah. Tak to je jít do paměti řešit tam a dej mi to. Použil jsem% c tady, protože tam jsou znaky uloženy. Takže jsme jít na tuto adresu my právě viděli - nebo to bude pravděpodobně trochu jiný to když jsme se spustit program. Ale půjdeme na tuto adresu které víme, že ještě existuje a vidět, co tam je. Takže to nebylo seg závadu. Prostě nám nedal nic. Mohlo by se nám skutečně uveden něco, jsme prostě nemůže vidět. A že jde zpátky do tohoto nápadu - a my nebudeme mít moc do to, protože to je nad rámec rozsah tohoto kurzu. Ale mluvili jsme o tom tady, když jsme překročil hranice pole podle 1, mohli bychom se dostat do problémů. Někdy, když si jen tak vypnout 1, děláte něco špatně, a vy mohl dostat do problémů. Ale nemusíte vždy dostat do problémů. Záleží na tom, jak moc špatnou věc, kterou to, budete se dostat do problémů. Což ovšem neznamená, být nedbalý s kódem. Ale to znamená, že program nebude vždy skončit, i když jdete někam jste neměl jít. Dobrým příkladem toho je, hodně lidé v jejich problému nastavení 3, které bylo 15, nekontroloval Hranice na palubě. Takže jste se podíval doleva, podíval se na právo, podíval se na vrchol, podíval se až na dno. Ale vy jste zkontrolovat, zda horní byl vlastně bude na palubě. A spousta lidí, kteří dělali, že i se obrátil, že v jejich programu pracoval dokonale, protože pokud to deska byla uložena v paměti, pokud jste šel jeden nad ní nebo zkontrolovat, zda je paměťová adresa, nebylo nic zvláště hrozné o tom, takže program nebyl bude křičet na vás. Ale my bychom ještě sundat body, pokud jste si zkontrolujte, zda je, protože vám dělali něco, co nebyli dělat, a ty by mohly mít dostal do potíží. Kurzy jsou, i když pravděpodobně ne. Tak tohle je ukázat, že ano, stále ještě můžeme jít na to. A my nejsme dostat do Problém v tomto případě. Pokud jsme se snažili udělat si dalších 100 znaků, bychom pravděpodobně dostanete do problémů. A můžete kódovat čtení další 100 znaky, pokud chcete, tím, že dělá některé druh smyčky for. Jo. STUDENT: Protože jsme byli přiděleni, že prostor skutečná hodnota, nebyli bychom ve skutečnosti být schopni vidět nic. Měli bychom to zkusit s nastavením, které rovná jako je C nebo tak něco? JASON Hirschhorn: Velká otázka. Jak mohu nastavit tuto hodnotu - co řádek kódu mohu napsat on-line sedm dělat to, co jsi řekl? STUDENT: Hvězda ptr rovná se jeden quote c ukončit jednu nabídku. JASON Hirschhorn: Tak to je uvedení charakter, c, na tomto místě, protože opět, že hvězda znamená jít tam. A pokud je použit na levé straně Operátor přiřazení, která se rovná podepsat, nebudeme se dostat, že hodnotu tak, jak je uvedeno, že hodnoty. Nyní se pojďme podívat, co se stane. Tam dáme něco a bylo to tam. Volali jsme zdarma. Některé věci asi stalo na haldě. Takže to tam není. Ale znovu, nejsme stále problémy pro jít tam. Dělám to v kódu pro ilustraci že mnoho z nich otázky, které máte, jsou opravdu zajímavé odpovídá spoustu času. A jsou opravdu dobré otázky. A můžete přijít na ně na vlastní-li, například, nejsme v sekci. Jo. STUDENT: Vzhledem k tomu, že nejste odeslání ukazatel kdekoliv, potřebujete, aby používat malloc? JASON Hirschhorn: Tak tohle jde zpět do původního otázku. [? ?] Je to jen lokální proměnná? Malloc zde není tak přesvědčivý. Použití malloc zde není že přesvědčivé, protože je to jen lokální proměnná. Žák: Takže jsi to mohl udělat char hvězda ptr rovná ahoj? JASON Hirschhorn: Oh. Takže budeme nyní získat zpět do původního otázku. Myslím, že jste nebyli spokojeni s mou odpověď. OK? Stejně jako, že? STUDENT: Jo. Počkejte. JASON Hirschhorn: A kde chcete vytisknout? Takže budeme tisknout řetězec takového? STUDENT: Zajímavé. JASON Hirschhorn: Tak to říká, že to argument je typ znaku. Tak by to mělo být znak. STUDENT: Jen se první. JASON Hirschhorn: Tak tohle je to, co jsem řekl předtím. Jak jsem řekl, že to není ukládání řetězec v proměnné ukazatel. Je to skladování - STUDENT: první hodnota řetězce. JASON Hirschhorn: Adresa první hodnota řetězce. Pokud bychom měli vytisknout tento, jsme získání hodnoty uvnitř ukazatel. A uvidíme, že je opravdu adresa paměti. Má to smysl? Promiňte. Počkejte, to, že odpověď na vaši otázka, ne? STUDENT: Jo. JASON Hirschhorn: Tento řádek kódu je vytvořit řetězec a pak další variabilní ukazatel, který se ukázal tohoto řetězce, které pole. Jo. STUDENT: Takže když jsme šli jednu paměť zabývat dále, dostali bychom se na h? To bylo uloženo jako řetězec? JASON Hirschhorn: Stejně jako jsme udělali - tak to je cenná dělat. To je bod, aritmetika, které vy neviděli, a měly by být relativně dobře. To je podobné psaní - pokud bychom měli napsat tento řádek kódu, jsme předtím viděli pole notaci. To by nám mělo dát druhý Hodnota v tomto poli, h. Pokud jsme to udělali, mělo by to také dát us druhá hodnota v tomto poli. Vzhledem k tomu, že se bude, aby do paměti adresa prvního věc, ale paměť adresa věc jeden přes. A pak se operátor hvězda dereferences že ukazatel. A opět, pojďme se podívat. Dostaneme zase h.. STUDENT: Co přesně dělá dereference znamená? JASON Hirschhorn: Získávání je fantazie slovo pro jít. Jděte na to a dostat to, co je tam je dereference ukazatele. Je to jen fantazie slovo pro to. STUDENT: Pokud bychom chtěli k tisku celý řetězec, mohli bychom to ampersand ukazatel? JASON Hirschhorn: OK, jsme jít na tu pauzu. Jsme skončí tady. Ampersand vám adresu umístění, takže když děláte ampersand z proměnná, to vám dává adresu pokud je tato proměnná uložena. Ampersand ukazatel vám adresa ptr kde ptr je v paměti. Nebudeme jít na v tomto příkladu. Můžete zjistit, tyto věci na vlastní pěst. Ale znovu, to by mohlo být dokonce hraničí bit rámec toho, co potřebujete vědět Rozsah této polovině - nebo to kvíz, spíše. Promiňte. Budeme se dál, protože bych Líbí se mi udělat jednu kódování problém než čas vypršel. A budeme kódovat, co si myslím je nejzávažnější z nich příklady, atoi. Tak tohle byla otázka quiz před dvěma lety. A mám ho na desce zde. Lidé byli požádáni o kvízu - dostali trochu více tesxt v otázka, ale já eliminovány textu, protože to bylo zbytečné pro naše účely teď. Byl to jen nějaký pozadí na to, co atoi udělal. Ale vy všichni známe a jsou velmi obeznámeni s atoi. Navrhuji, abyste kód této na jeden list papíru. Já také doporučuji vám použít strategii že jsme přešli hodně v naší sekci. Za prvé, ujistěte se, že jste pochopili, co atoi dělá. Nakreslete si obrázek nebo přijít s některými mentální obraz o tom ve vaší hlavě. Dále vypište pseudokódu na to. Na testu, když vše, co dostanete, je pseudokódu, alespoň dát něco dolů. A pak se mapa, která pseudokódu na C. Pokud máte kontrolu ve vašem pseudokódu, stejně jako zjistit, zda něco je 1, která mapuje na pokud stav, a tak dále. A konečně, kód programu v C. Takže zpět k atoi a pět minut kódovat to na jeden list Papír, který je asi o množství času byste vzít na kvíz kódu atoi. Pět až 15 minut, pět až 12, pět až 10 minut, se o výši Doba byste strávit na to otázka v kvízu. Takže pět minut, prosím. A pokud budete mít nějaké dotazy, zvýšit tvá ruka a já přijdu kolem. [SIDE Konverzace] JASON Hirschhorn: OK, tak to bylo pět minut. To bylo asi o množství Doba byste strávit na které na kvíz, Možná low-end v té době. Budeme shrnout v trochu. Začněme kódování to. A pokud se nám nepodaří získat celou cestu přes, Odpovědi na tuto a tuto Kontrolní otázka jsou k dispozici, znovu, Podzim 2011, je-li tato otázka se objevil na kvíz. A stálo to za osm bodů na kvíz poté. Osm bodů je na horním konci množství bodů něco stojí. Většina otázek se pohybuje v rozmezí s jedním až šesti bodů. Tak to je náročnější otázka, pro jistotu. Může někdo, abych začal? Obecně platí, že to, co se nám děje chtít dělat s tím fungovat atoi, logicky? Co chceme dělat? Takže budeme psát některé pseudokódu. STUDENT: Převod znaků na celá čísla. JASON Hirschhorn: Převod znaků na celá čísla. OK. Takže, kolik znaků jsme bude muset projít? STUDENT: Všichni z nich. STUDENT: Všechny postavy v řetězci. JASON Hirschhorn: Všechny znaky v řetězci. Takže pokud bychom chtěli projít každý znak v řetězci, to je věc v C jsme viděli, že umožnila nám projít každý znak v řetězci? STUDENTI: pro smyčce. JASON Hirschhorn: pro smyčce. Takže budeme procházet každá postava v s.. Tak co budeme chtít dělat když dostaneme specifický charakter? Řekněme, že jsme stále schválil 90. Dostáváme 9. Je to postava. Co chceme udělat s že postava 9? STUDENT: Odečtěte to z povahy 0? STUDENT: Přidat 0? JASON Hirschhorn: Odečíst je z povahy 0? STUDENT: Jo. JASON Hirschhorn: Proč Chcete-li dělat, že? STUDENT: [neslyšitelné] hodnota. Jeho int hodnotu. JASON Hirschhorn: OK, takže jsme se znak 9, odečteme od znak 0, aby se aktuální číslo 9. Sladké. A jak víte, že charakter 9 mínus 0 postava je 9? Co chart jste se na? STUDENT: K dispozici jsou logicky devět místa mezi 9 a 0.. Nebo byste se mohli podívat na tabulku ASCII. JASON Hirschhorn: ASCII tabulka. Ale ano, máte pravdu stejně. Takže odečteme 0. Takže teď máme číslo 9. A to, co chceme dělat, že? Pokud budeme mít 90, to je první číslo jsme, co chceme dělat? STUDENT: já bych dal do dočasného celé číslo pole, proveďte matematiku na to později, aby to do konce. JASON Hirschhorn: OK. STUDENT: Můžete začít na konci roku pole a pak se přesunout dopředu tak, že pokaždé, když budete pohybovat vpřed, to vynásobte 10. JASON Hirschhorn: OK. To zní jako docela přesvědčivý nápad. Můžeme začít na konci našeho pole, a můžeme použít strleng. Můžeme použít strleng zde. Dostaneme délku našeho řetězce. Začneme na konci. A + první, jen jsme se, že integer, a možná bychom vytvořit jako Nová integer proměnná up top, kde jsme ukládání vše. Tak jsme smyčka přes všechny char v S z zpět na přední straně, odečteme 0, a pak jsme si to, a v závislosti na tam, kde je, jsme to násobit o síle 10. Protože první, co máme násobit krajní znak? STUDENT: 10 na 0. JASON Hirschhorn: 10 na 0. Co se množit druhé nejpravější znak by? STUDENT: [neslyšitelné]. JASON Hirschhorn: Co? STUDENT: 10 na 1. JASON Hirschhorn: 10 na 1. Třetí nejvíce vpravo znak? STUDENT: 10 na 2. JASON Hirschhorn: 10 na 2. STUDENT: Omlouvám se, ale nerozumím to, co tady děláme. JASON Hirschhorn: OK, vraťme se tedy. Takže budeme mít prošel v řetězci. Protože jsme psát atoi. Tak jsme si prošel v řetězci. Řekněme, že jsme stále prošel v řetězci 90. První věc, kterou se chystáte udělat, je nastavit nové číslo proměnné, které jsme jen tak k vytvoření jako naše nové číslo. To je to, co budeme Pro návrat na konci. Musíme projít každý znak v řetězec, protože jsme došli k závěru, že se musíme dotknout každý z nich a pak jej přidejte do naší nové číslo. Ale nemůžeme jen přidat jako číslo. Nemůžeme jen tak 9 a přidat 9 do naší celé číslo. Záleží na tom, jaké místo je v řetězci. Budeme muset násobit je to o síle 10. Vzhledem k tomu, že to, jak základna 10 děl. Takže budeme mít skutečný znak, nebo skutečné číslo číslo, odečtením znak 0 od znaku 9, jako jsme to udělali s odečtením znak kapitálu od bez ohledu na charakter jsme měli v jednom tyto problémy. Takže budeme vlastně mít číslo od 0 do 9 uložen jako reálné číslo, a my budeme vynásobte to o síle 10 v závislosti na tom, kde jsme v řetězci. A pak budeme přidat zpět do naší nové celočíselné proměnné. Tak co to bude vypadat by být - budeme čerpat tady. Pokud bychom si prošel v řetězci 90 - STUDENT: [neslyšitelné]. JASON Hirschhorn: Ale atoi vezme řetězec. Takže jdeme projít hospodářství. Budeme si prošel v 90.. Jdeme ze zadní na přední straně. Bereme 0. STUDENT: Omlouvám se. Možná je to hloupost. Pokud budeme se prošel v řetězci, Proč je 90, co jsme jak prošel v roce? Protože 90 je celé číslo. JASON Hirschhorn: Vzhledem k tomu, atoi se string a změní to na celé číslo zastoupení tohoto řetězce. Ale řetězec 90 není celé číslo 90 nebo číslo 90. Řetězec 90 je pole ze dvou, nebo tři postavy, spíše, 9 znak, znak 0, a zpětné lomítko 0 znak. A budeme psát atoi, protože pro Například, když budete mít příkaz argument řádek, a to je uloženo v argv, je to uloženo jako řetězec. Ale pokud chcete, aby ji léčit jako číslo, musíte jej převést na aktuální číslo. Což jsme udělali jeden z našich problémů sad. Které jsme udělali v řadě našich problémových sad. Každý, kdo se celé číslo jako argument příkazového řádku. Takže to je důvod, proč naše atoi funkce bere řetězec. Takže znovu, v našem příkladu zde, jsme bude trvat ten poslední. Budeme odečíst charakter 0 z toho, protože znaky 0 odečte charakterem 0 vám Skutečný počet 0, v závislosti na ASCII matematika, co děláme. Vzhledem k tomu, znaky jsou reprezentovány jako jiný než jejich skutečný - charakter, například, malá 97. Není to - oops! Není to, co byste čekali aby to bylo, 0, například. Takže budete muset odečíst charakter, aby se 0.. Takže jdeme na to, že zde získat skutečný počet. A pak budeme násobit ji síla 10 v závislosti na tom, kde je v řetězci, a pak, že a přidejte ji do naší držáku místo variabilní, takže můžeme přijít s naše poslední nové číslo. Znamená to, že má smysl pro každého? Takže nebudeme kódovat tento právě teď, protože jsme jak málo času. Omlouvám se za načasování, že. Ale je to to, co, doufejme, že byste být schopni to udělat na kvíz - na Přinejmenším si to pseudokódu napsaný. A pak, když jsme byli psát pseudokódu, ve skutečnosti, můžeme to udělat docela rychle. Každý řádek komentářů jsme napsali jsme zde překládá do asi jeden řádek C kódu. Vyhlášení nové proměnné, psaní smyčky, některé odčítání, některé násobení, a některé přiřazení. Měli bychom asi také chtít, aby napsat vratné potrubí. Také bychom mohli chtít, aby některé kontroly v zde. Jo. Žák: Takže můžeme léčit s jako skutečné řetězce? Protože vím, že je to jen adresa. Stejně jako, jak byste si délku řetězec je prošel? JASON Hirschhorn: Tak jak jste délka řetězce? Strlen. STUDENT: strlen, jo. Ale můžete si dát s jako Argument, že? JASON Hirschhorn: Tak strlen trvá char hvězdu. A z toho vyplývá, že char hvězdu, a to udržuje v počítání, dokud se dostane do zpětné lomítko 0. strlen byl vlastně jeden z dalších programů jsme šli do kódu. To je další dobrý kódu. To je jedna to trochu jednodušší, protože pokud budete přemýšlet o tom, že koncepčně - Jen jsem to řekl nahlas - strlen takto ukazatel a stále děje, a počítání a sledování, dokud dostanete zpětné lomítko 0. STUDENT: OK, to mám. JASON Hirschhorn: Takže nejlepší štěstí na kvíz 0 zítra. Pokud máte nějaké dotazy, budu být venku po tomto. Neváhejte a napište mi. Oslovit své vlastní TF, pokud jste Není v mé části, nebo se my e-mail, pokud budete chtít. Pokud chcete šílet a pošlete mi e-mail, třeštění e-mail, budu poslat tě zpátky, jako, emotikony, nebo, jako, vtip nebo tak něco. Tak neváhejte to udělat stejně. Hodně štěstí znovu, a budu Uvidíme se příští týden.