JASON Hirschhorn: Welcome, všichni, až 6. týdnu. Jsem rád, že vás všechny vidět živ a zdráv po Quiz 0, protože vím, že byl trochu hrubý. Ale naštěstí, vy všichni udělal neuvěřitelně dobře. A tak to je úžasné. Pokud jste v mé části, jsem k dispozici většinu z vás zpět již své kvízy. Pár z vás, mám schůzku po třídě. A pokud jste student a rozšíření jste neobdrželi kvíz zpět zatím, vaše TF je asi na tom pracuje a třídění, a dostane ji zpět pro vás v nejbližší době. Takže moje rozšíření studenti, kteří jsou sledovat právě teď - doufejme, že žije - Budu mít vaše kvízy krátce také. Náš program pro dnešek je následující. Za prvé, budeme jít přes některé zdroje, které CS50 poskytuje na vás. Chystáme se jít přes Quiz 0 další, a Budu zodpoví všechny otázky nikoho má o konkrétních problémech. A pak jsme se jít přes soubor I / O a problém sada 5. Tyto poslední dvě témata bude trvat nahoru na velkém oddílu dnes. Každý týden dal jsem tento seznam jako připomínka k vám všem, ale jádro část, máme jen 90 minut - jsme nejsou schopni pokrýt všechno, co jsem rád bych na pokrytí pro vás. Ale máme spoustu zdrojů pro můžete čerpat jak poznat materiál a práce prostřednictvím váš problém nastaví. Připomíná, že mám on-line text box, nastavit pro vás vyplnit, pokud žádnou zpětnou vazbu pro mě, jak pozitivní, tak konstruktivní, o úseku. Že URL je zde umístěna vpravo dole. Takže, prosím, chvilku, pokud máte nějaké zpětná vazba, ať už v průběhu části, nebo po, nebo poté, co se budete dívat na video, on-line, aby mi svůj názor. Opravdu si toho vážím veškeré z něj. Tak jsem byl s malým konverzace se spoustou mých Studenti po celém týdnu - jak jsem ruku zpět kvízy, mluví o Samozřejmě, když vidí, jak to děláte. A jedno téma má přijít znovu a více než v roce mluví o - v zejména - Problém sady. A já jsem zapouzdřené toto téma na palubě právě teď. V podstatě, tam je rozdíl mezi zapnutím do něčeho, co je správně a něco udělat , který je dobře. Většina lidí dělají fantastické , pokud jde o správnosti - 5 či 4 je na všech psets. Většina lidí se stále jsou po celou dobu. Nicméně, právě proto, že jste udělali něco právo neznamená, že jste udělat něco tak elegantně, nebo efektivně, nebo čistě jako vy mohl udělat. A to je to, co design - a v menší míře, styl - osy jsou. Tak jsem vás všechny tlačí, a další TFS tlačí vás lidi, aby nejen pořadí ve věcech, které jsou v pořádku, ale obracejí ve věcech, které jsou kódované dobře. Nedělám zbytečné PRO smyček, Není přepočtu proměnných li to nemusíte se. Například, při pohledu zpět do problému nastavení 4, při uvádění cihly na obrazovka, každá řada - každá cihla v daný řádek má stejnou y-ovou souřadnici - koordinovat stejné výšce. Tak, že y-ová souřadnice nepotřeboval se vypočítá v interiéru vnořené FOR smyčky, které jste pravděpodobně použité aby ty cihly na obrazovce. Chce to jen se musí vypočítat každý Doba přepnutí řádek, nebo přestěhovala o řádek dolů. Takže říci, zda existuje 10 cihly v řádek, každá cihla může mít stejnou y-ovou souřadnici, a že y-ová souřadnice stačí vypočítat jednou pro všechny z nich. Není třeba, aby se vypočítá 10 časy, ani se, že výpočet je třeba se stane v aktuální volání funkce - Nová gracked volání funkce. Takže pokud to bylo trochu matoucí pro vy, více obecně, věci, které Nemusíte se stane pokaždé, projít FOR smyčky by neměla být umístit uvnitř smyčky for, a neměly by stane pokaždé, když jdete přes FOR smyčky. Další dobrý design příklad jsme viděli v týdnu 3 pro 15, můžete udržet dráha z nuly. Takže při inicializaci desky, vás uložit - v globální proměnné, snad - x a y-souřadnici nula. A pak kdykoli - v pohybu funkci, když uděláte úspěšný krok, aktualizovat Umístění nuly. To by tě zachránil od nutnosti provést vnořené FOR smyčky prohlédnout nastoupit pokaždé v pohybu funkci a najít nulu, nebo najděte dlaždici, a pak zkontrolovat, co je vedle ní. Místo toho, máte umístění nula, stačí se podívat nahoře, dole, a nalevo a napravo od něj, aby si dlaždice jste hledali. Takže pokud jde o programech jsme psaní, oni jsou nikdy dost velký že některé z těchto rozhodnutí designu jsou opravdu bude bránit vaše programu, nebo aby to běžet pomaleji, nebo snad dokonce k vyčerpání paměti. Ale my jsme pořád tlačí vás kluci psát jako elegantní a efektivní kód, jak je to možné. Takže pokud nechcete skončit psát věci , které mají podstatně větší rozsah, budou psány s dobrým navrhnout kromě toho, že správný. Takže číslo máte přinesl, že ven. To je něco, co jsme hledali - něco, co budeme i nadále tlačit vás kluci na. Pokud budete mít nějaké dotazy týkající se návrh programu, neváhejte oslovit mě, a já jsem rád, že procházet programu s vámi, a poukázat na některé z designu rozhodnutí, které jste provedli, a dát vám některé návrhy, jak učinit ještě lepší rozhodnutí designu. Takže jdeme dál mluvit o Quiz 0. Než to uděláme, nemá někdo máte nějaké otázky o tom, co Zakryl jsem tak daleko? [Šustění NOISE] JASON Hirschhorn: Sedm sekund. OK. Pojďme se bavit o Quiz 0 na chvíli. Většina z vás má svou kvíz 0 je zpět. Pokud ne, snad Pamatujete si to trochu. Ale pokud jste si vzal kvíz 0, pak mají také přístup k PDF on-line v vzorové řešení. Má někdo nějaké otázky před skočíme do materiálu na týden o zvláštní problém na kvíz 0 - proč odpověď je to, co to je? Je někdo zmatený o něčem? Dokonce i když máte problém pravdu, ale Jen bych rád, abych to vysvětlil trochu více, jsem rád, že tak učinit nyní. Tak jsem se zeptal vás kluci přijít připraveni s některými myšlenky o Quiz 0. Takže kdo by chtěl, aby nám dostat začal s otázkou nebo komentář o Quiz 0? [PAPER šustění] JASON Hirschhorn: Ne každý udělal perfektně. Takže vím [smích] tam musí být některé otázky o Quiz 0. OK. Ano. Ompica. OMPICA: číslo 10. JASON Hirschhorn: číslo 10. Který z nich bylo číslo 10? OMPICA: - JASON Hirschhorn: haven't I - OMPICA: patří - JASON Hirschhorn: Číslo 10 bylo osm I - psaní osm na I? OMPICA: Jo. JASON Hirschhorn: OK. Takže další otázka, kterou může mít zeptal se mám předvídavý? Odpověď je ano. V úseku před kvízu, zeptal jsem se vy k zakódování jak Sterling a osm až i. Oba z nich se stalo se objeví na kvíz. Takže doufejme, že jste zaplatili pozornost na to. A pokud jste měli, pak byste měli mít pravděpodobně dobře na ty dva. Ale osm až i, my jsme vlastně kód je ve třídě, ale bylo to opět, zeptal se na kvíz. Takže pár věcí, které berou vědomí při kódování osm až i. První věc, na otázku, bylo že jste potřebovali zjistit, jestli řetězec byl roven null. A pár lidí se snažila ověřit později v programu, pokud je konzola jsem byl - tak specifický charakter v tom, že string - byl roven null. Ale pamatujte si, že null je v podstatě - to je dobré myslet na null jako nulový ukazatel - ukazatel na nulu - někde v paměti, kde můžete nikdy přístup. Takže pokud je něco rovná null, můžete vím, že to nebyla inicializována, nebo tam nic není. Tak to je char hvězda, S, s držák i je char. Tak to dává smysl srovnávat s na hodnotu null, ale ne s držák i na hodnotu null. Ale opět - tak, aby byla první věc, že jste měli udělat - zkontrolujte, zda jste skutečně má skutečný řetězec. Dále, co jste chtěli projít Každý znak v řetězci. A tak by to bylo jako s držákem i, například, pokud je i vaše iterátor. A vzít tu postavu, a získat jeho skutečnou hodnotu. Můžete si jej uloží jako char, ale ASCII hodnota pro nulu - nula jako znak - ve skutečnosti není celé číslo nula. Je to jiné číslo, které můžete vyhledat v tabulce ASCII. Takže jeden způsob, jak korekci, že - Asi nejlepší způsob, jak opravit za že - je odečíst od ní hodnota znaku - nulu jako znak. Takže minus jeden citát, nula, další singl citát. To bude trvat bez ohledu na číslo, které máte jako char, a dostat je rovna číslo jako skutečné číslo. A to je velmi podobný přístupu Mnoho lidí se v Problém sada 2, s Caesarem a Viginere - tyto šifry, pokud byly otáčení je. Takže poté, co jste jej jako číslo od nula až devět, a pak - v závislosti na kde to jde v konečné číslo - je třeba ji vynásobit o síle 10. Někteří lidé se stěhoval ze zadní do přední a násobí jednotlivce číslo o síle 10. Někteří lidé se stěhoval z zepředu dozadu - a tak se nejvyšší pořadových čísel první - a zachrání ty, globální proměnná counter. A pak pokaždé přes FOR smyčky, násobit, že obří globální proti proměnnou 10, aby prostor pro další char. Takže to bylo trochu matoucí, aniž by mi to psát na tabuli. Ale roztok vzorku je Vám k dispozici. Ale to byly velké věci jsme hledali. Také zkontrolujte, ujistěte se, že každý individuální charakter byl skutečně charakter od nuly do devíti, a ne některé další znak, jako A, například. To byly věci, které jsme hledali v této otázce. Znamená to, že odpověď na vaši otázku? OMPICA: Jo. JASON Hirschhorn: OK. Existují nějaké další otázky o Quiz 0? Co kompilaci? Všichni sestavování pravdu? Ne. Tam bylo - [Smích] Jakékoliv dotazy týkající se kompilace proces? Wow. [PAPER šustění] JASON Hirschhorn: Ano. Michael. MICHAEL: Je číslo 7 - náhodné? JASON Hirschhorn: číslo 7. Číslo 7 je získat náhodné celé číslo. Výborný. Takže jste dostali integer a číslo b, a chcete náhodné celé číslo mezi a, b. Můžeme vlastně napsat tento jeden na deska, protože tohle Byl jeden řádek kódu - jeden způsob, jak to udělat. Takže jsme vzhledem k drand jako funkce můžeme použít. A co drand - za předpokladu, že to byl nasazený - co drand vrátit? MICHAEL: float mezi 0,0 a 1,0. JASON Hirschhorn: číslo - jo. Číslo mezi 0 a 1.. A tak jsme b a. A pak máme náhodné číslo mezi 0 a 1 který nám byl dán drand. Někteří lidé se snažili dát b, nebo b minus , nebo něco v těch závorky. To by znamenalo, že jsou argumenty k této funkci. drand nebere žádné argumenty - jako getString dělá Neužívejte žádné argumenty. Takže je to jen otevřené závorka, v blízkosti paren - a to, že samo o sobě, je volání funkce. A to vám dává číslo mezi 0 a 1.. Samozřejmě, že máme celou řadu že čísla mohou být palců Řekněme, že pokud b je 10, a je 5, opravdu Chcete-číslo s řadou 5. Takže další věc, kterou musíme udělat, je vynásobte to o rozsahu b minus. Takže za předpokladu, že se násobí. A že budeme mít celou řadu v daném rozsahu. A že konkrétní rozsah je Rozdíl mezi B minus. A konečně, že ho dám jen od - říkají, že rozsah mezi b minus je 5, že dám nám číslo od 0 do 5. Avšak v případě, že je ve skutečnosti 5, je třeba zvýšit tento rozsah až tam, kde je to vlastně má být, tím, že přidá. Tak, že dostane logický právo. A pak, měli byste mít další otázka? MICHAEL: Ne Cítím se teď opravdu hloupý. [Smích] JASON Hirschhorn: Ne Nemějte pocit, že opravdu hloupý. Počet lidí, kteří bojovali s touto otázkou. A pak, další otázkou je, drand, jste řekl, vám dává plovák - vrátí plovák. Ale tato funkce skutečně požádal na číslo, které mají být vráceny. Nemusíte obsadit toto výslovně na celé číslo, protože tyto Operace bude zacházet jako všechno float - jako číslo s plovoucí čárkou. Stejně jako tento vůli - i když to je celé číslo, bude se násobí správně. Všechny násobení bude fungovat. Nemusíte ji obsadil zde. Ve skutečnosti, neměli byste obsadil ho. To by - pokud by totiž vrhl číslo že je mezi 0 a 1 - náhodné číslo, plovoucí desetinnou čárkou - pak to bude buď pouze 0 nebo 1, tak ztratíte všechny uvedené přesnosti. Ale na konci, když se vrátíte, automaticky se dostane poslal zpátky jako celé číslo. Takže nemusíte dělat že obsazení sami. Tak tohle byla odpověď na že otázka, číslo 7. Jakékoliv další otázky týkající se Quiz 0? Jo, Annie. ANNIE: Když budeme používat rekurzivní - kdy používáme iterační smyčky? JASON Hirschhorn: Pokud používáte rekurzivní - tak obecněji, klady a zápory rekurze proti iterativní přístup. Může někdo nabídnout Pro nebo kon? Prosím? Nelze nikoho. Kdo může nabídnout Pro nebo kon? [PAPER šustění] STUDENT 1: Rekurzivní je méně kódování - méně psát? JASON Hirschhorn: Takže obecně, rekurze zejména funkce - nebo algoritmus jako sloučení druh -, které se hodí na rekurzivní přístup - může být přímější na kód rekurzivně. A právě větší smysl na to rekurzivně. Tak to by bylo pro rekurzi. Ostatní? Jo? Student 2: Con rekurzi - To používá více paměti. JASON Hirschhorn: Tak přesně to pravé. Rekurzivní funkce bude držet přidání zásobník rámy na zásobníku. Takže pokud jste pracující na mnoha čísla, a musí se volat to fungovat hodně, pak jste jistě zabírají více paměti, zatímco iterativní přístup pouze dát jednu stack frame na zásobníku, protože to vše se děje v rámci jedné funkce. Jakékoliv jiné výhody a nevýhody? Jo. STUDENT 3: Pros na rekurze. Nemusíte určit, předem kolikrát kód musela opakovat. Ty mohou mít předem stanovený počet časy, které máte k iteraci, pak rekurze je lepší, protože to znamená, že výsledek. JASON Hirschhorn: Myslím, že je to pravda. Ale myslím, že v obou případech byste nikdy - byste pravděpodobně získat některé vstup od uživatele. Nebo tato funkce bude mít nějaký vstup že by se zjistit, kolikrát je by měl běžet. Takže obecně, by si ani tvrdou kódu - dokonce v iterativní přístup - jak mnohokrát, že smyčka by měl být spuštěn. Věděli jste, že jsi jiný přemýšlet o tom, Annie? OK. Takže to jsou asi dva - největší pro a největší kon na rekurzivní proti iterativní přístup. OK. Na Quiz 0 Ještě něco? Pojďme dál. File I / O. Tam je nádherný krátký Tento týden na soubor I / O, které snad jste sledovali násobek krát, a obdivoval. Hodně práce šla do toho, a já jsem slyšel, že to je šíleně užitečné. Já také odkaz na tento snímek, V případě, že jste neměl možnost sledovat to 10 krát. Takže se budeme stručně probrat významné kroky k otevření a práci se soubory, a pak budeme ponořit se do problému kódování před zkoumání problému sadu. Takže znovu, jdu dát to nahoru na obrazovce, ale já budu mluvit za jen minutu na to, co jsme tady se souborem I/O-- Co to znamená? To znamená, že můžeme vytvářet naše programy, a potom se naše programy exit, a ne dělali žádný vliv na svět mimo našeho programu. Ale když jsme začali pracovat se soubory - jak je číst v a vytváření je - můžeme mít nějaký vliv na svět mimo našeho programu. Stejně jako v případě Microsoft Word nebyl schopen aby veškeré dokumenty aplikace Word, klepněte na Jednou Microsoft Word přestat, všechny své Práce bude pryč, a to by opravdu k ničemu. My nakonec chceme, aby bylo možné psát programy, které mohou mít vliv na svět kolem nich, a to jak tím, že v komplexní vstupy - z hlediska souborů a pomocí souborů, a také vytváří zajímavé a přesvědčivé výstupy - , pokud jde o různé typy souborů. Takže to je důvod, proč jsme se začíná naučit se pracovat se soubory. Konkrétněji, co co děláme, je takto. Je to velmi jednoduché. Existuje jen pár kroků, a jsou zde uvedeny o tomto kodexu. Takže jdeme projít Tento kód řádek po řádku. Za prvé, můžete vidět zdůraznil - když pracujete se souborem, bez ohledu na typ souboru je to, musíte ji otevřít. A to je s výzvou k fopen - tady. Ty zahrnují název souboru. Pokud soubor není v adresáři, nebo složku, kde tento program život, pak je také nutné zahrnout Cesta na místo, kde tento soubor je. Budeme předpokládat, že tento soubor s názvem "text.txt" - jednoduchý textový dokument - je stejné složce jako tohoto programu je. Takže to je další věc, kterou byste měli mít na mysl - že pokud chcete otevřít soubor někde jinde, co skutečně potřebujete aby zahrnovala jeho umístění. Za druhé, můžete předat argument fopen, a to je to, co chcete dělat, se souborem. Existují tři hlavní argumenty, že budete předat fopen. Kdo mi může dát ty tři? Kdo mi může dát jeden z nich? Ano. STUDENT 4: název souboru? JASON Hirschhorn: Omlouvám se. Tři hlavní argumenty můžete projdou jako druhý argument fopen. Máš pravdu - název souboru je první argument. Ale druhý argument fopen jsou obecně tři řetězce, a - ano. Aleja. Aleja: pro append. JASON Hirschhorn:, chcete-li přidat do souboru, který již existuje. STUDENT 5: R pro čtení. JASON Hirschhorn: R, pokud chcete číst ze souboru. STUDENT 6: W pro zápis. JASON Hirschhorn: A w, pokud se chcete napsat do souboru. Takže v tomto případě budeme psát do souboru, takže máme w. Otevřete jej, musíte také uložit soubor někde, a to s Kód na levé straně Operátor přiřazení - Já jsem vytvořit ukazatel do souboru volal, v tomto případě, soubor. Nebudeme se bát toho, co to všechny čepice FILE to je. Postačí, když řeknu, že je to dlouhý proud nul a jedniček. A to je to, jak se budeme pracovat a pochopit ji. Další věc, kterou musíme udělat - a To je nesmírně důležité - při každém otevření souboru - Ve skutečnosti, když budete volat malloc, pro příklad, a trochu paměti a zkuste a uložte jej na ukazatel, vždy chcete zkontrolovat, aby se ujistil, že funkce nevrátil null. Takže v tomto případě, jsme kontrolu, aby se Ujistěte se, že jsme vlastně otevřeli soubor správně, a tam byl v našem programu žádná chyba. Dále, jakmile jsme se kontrolovat, aby se ujistil, že máme pracovní soubor, můžeme psát, nebo číst z, nebo připojit k souboru. V tomto případě, jsem prostě tisku jeden řádek do tohoto souboru. Jak mám vědět, že? No, já jsem s použitím této funkce volal fprintf. Všechny funkce, které budete používat při psaní, nebo čtení, nebo práce se soubory bude podobný funkce, které jste neviděli, ale začínají písmenem F, stojí na souboru. A fprintf, na rozdíl od našeho běžného tisku app, trvá jeden další argument, a to je soubor, ve kterém jste který chcete vytisknout tento řádek. Nemám nic právo Ohai. Nemám na třetinu argument printf - nebo druhý argument printf, Třetí argument fprintf, protože jsem nemají žádné zástupné symboly zde. Nejsem včetně všech proměnných. Ale opět, fprintf a všechny z těchto souborů funkce, které pracují se soubory jsou obvykle bude potřebovat soubor na kterém jsou v provozu. A konečně poslední důležitá věc udělat, je zavřít soubor, stejně jako s - když jsme malloc něco, chceme osvobodit něco, lest my mají nevracení paměti - chceme zavřít naši soubor. Pokud tento program vystoupil bez zapínání soubor, je pravděpodobné, nic by jít špatně, zejména pokud se Byl malý soubor. Ale je to jistě dobrá kódování styl a praxe vždy zavřete soubor Až budete hotovi používat. Takže to je základy souboru I / O. Pravděpodobně jste již viděli, že před, nebo Sledoval ji v této fantastické zkratu. Má někdo nějaké otázky, před jdeme do nějaké praxe kódování problémy, o souboru I / O nebo kroky jsem přešel? [Psaní SOUNDS] JASON Hirschhorn: Myslíte si, mám otázku, Avi? AVI: Ne JASON Hirschhorn: OK. Budu čekat další sedm sekund. [Smích] To je opravdu dobrý tip. Vy prostě nelíbí klást otázky. To je v pořádku. OK. Takže náš problém první praxe je, že jsme bude duplikovat funkci nástroj příkazového řádku, který pravděpodobně použít před - kopie - Nástroj kopie. Pokud zadáte cp a pak ji přenést dva Argumenty do terminálu, můžete zkopírujte soubor. A to je to, co se děje psát teď. Takže znovu, odečítání z tohoto snímku, bych můžete napsat program, který trvá dvě a pouze dvě příkazového řádku argumenty - zdrojový soubor a cílový soubor - a zkopíruje obsah zdroje soubor do cílového souboru jeden bajt najednou. Tak to je hodně požádat. Opět platí, že dobrý způsob, jak to je jít rovnou do C kódu, ale rozčlenit do několika kroků. Za prvé, přemýšlet o logice - přesně na co se ptám vás dělat - a pochopit všechny kroky k tomuto problému. Není v C, jen v některých pseudokódu, nebo dokonce duševní model co se děje. Dále, až budete mít pseudokódu dolů, přijít na to, jak v pseudokódu mapy na nářadí a věcí, které jsme naučili používat v C. A nakonec, až budete mít vše, co společně, můžete kódovat problém. Trvat 5 až 10 minut práce na tento problém. Dám instrukce zpět do sekundy. A pak jsme jít přes pseudokódu, a kód to žít jako skupina. Máte-li nějaké otázky, když jste pracuje na tom, neváhejte zvýšit ruka tvá, a já přišel kolem a odpovědět na ně. STUDENT 7: Mohu přejeďte kus papíru? JASON Hirschhorn: Co se děje? [Psaní SOUNDS] JASON Hirschhorn: OK. Pojďme se nad pseudokódu první, a pak Dám vám pár více minut na dokončení kódování. Kdo by chtěl, aby mi začít s prvním řádku pseudokódu pro tuto funkci? STUDENT 8: Zkontrolujte, zda jste dostali dva soubory. JASON Hirschhorn: OK. A pokud nejsme? STUDENT 8: Chtěl bych se vrátit 0.. JASON Hirschhorn: Měli bychom se vrátit 0? STUDENT 8: Návrat - zaslepení. Promiňte. JASON Hirschhorn: Jo. Pravděpodobně ne 0. Vzhledem k tomu, 0 znamená, že vše, co bylo dobré. OK. Takže to je první řádek z pseudokódu. Kdo má druhý řádek pseudokódu? STUDENT 9: Open oba soubory? JASON Hirschhorn: Otevřete oba soubory. OK? STUDENT 10: Podívejte se, v případě, že soubor je NULL? JASON Hirschhorn: Zkontrolujte, , že ani nejsou NULL. Jako stranou - lomítko 0 - je NULL? STUDENT 11: Ne. JASON Hirschhorn: To není NULL. Tomu se říká NULL zakončení. Je to vlastně píše pouze s jedním litrů. Takže kontrola něco proti tomu - to je vlastně postava - tak něco proti kontrole, která je není totéž jako kontrola, zda je rovná NULL. A někteří lidé - na jejich kvízy a jejich problémy soupravy - dostali dvě z nich zaměňovat. Ale dva z nich jsou ve skutečnosti jiného. Jeden končí řetězec - jeden je ukazatel na 0. STUDENT 12: Proč byste zkontrolovat, Ujistěte se, že soubory nejsou NULL před otevřením? JASON Hirschhorn: Tak otevřené šetří něco, co v tomto souboru. A pokud půjdete sem - takže tento řádek - fopen - vám adresu a obchod že adresa v souboru, jestli to funguje. Pokud to nefunguje, je to bude ukládat NULL - STUDENT 12: Oh. OK. Mám tě. JASON Hirschhorn: V souboru. Takže nemůžete zkontrolovat NULL předtím, než jste je otevřel. NULL znamená, že něco ne pracovat správně. OK. Takže zkontrolujte, zda ani jest? Nebo jsou? Co si myslíme? Půjdeme s tím. STUDENT 13: Je. JASON Hirschhorn: Je? Ani je? STUDENT 13: Je. JASON Hirschhorn: OK. Zdá se, že se některé shoda na tom. Ani je NULL. OK, další řádek pseudokódu. Kdo mi nedal ještě čáru? Budeme na tebe čekat. Jo. STUDENT 14: Musíš číst od prvního souboru? JASON Hirschhorn: OK. STUDENT 14: Nebo můžeme použít fscanf nebo něco jako, že první soubor? JASON Hirschhorn: Takže chceme číst od prvního souboru a - nechme to tady. Čtení ze zdrojového souboru. A pak, co budeme dělat, když jsme číst ze zdrojového souboru? Někdo jiný? STUDENT 15: Napište do cílový soubor? JASON Hirschhorn: Píšeme cílový soubor, a - OK. Co ještě nám chybí? Někdo, kdo mi nedal řádek kódu ještě - v pseudokódu. Jo. STUDENT 16: Možná, že se můžete vždy zkontrolovat jestli je tu něco ke čtení pro, jako další řádek? To je stejně jako další řádek, uvidíme, jestli to existuje. [ELECTRONIC BEEP] JASON Hirschhorn: Chybička se vloudila. To je můj deníku software. Jo? STUDENT 16: Jo. JASON Hirschhorn: Tak mi mi to ještě jednou. STUDENT 16: Zkontrolujte, zda je ještě další řádek z zdrojový soubor číst. JASON Hirschhorn: OK. Takže nejsme čtení řádků - byli zde čtení bajtů - ale máte pravdu. Chceme, číst a psát, dokud nejsou žádné další bajtů. OK. A tak by měly být opravdu členité bit, protože jsou pod ním. Je to tak? Dokud jsme z bytů, budeme číst ze zdrojového souboru a zapisovat do cílového souboru. A pak, co je poslední řada pseudokódu? Někdo, kdo není uveden mě ještě něco. STUDENT 17: Zavřete soubory? JASON Hirschhorn: Přesně tak. Zavřete soubory. Takže je tu náš pseudokódu. Chystám se dát pseudokódu do gedit, a za pár minut jsme bude kód dohromady. OK. Pojďme začít jako skupina. Nishant, mám nový soubor. Právě jsem otevřel to. Untitled Document 1. Co je první věc, kterou bych měl udělat? Nishant: Zahrnout knihovny? JASON Hirschhorn: OK. Jaké knihovny? Nishant: stdio.h, stdlib.h, věřím, že? JASON Hirschhorn: OK. Co je stdlib pro? Nishant: Zapomněl jsem. JASON Hirschhorn: OK. Tak jsou stdio. Co bych měl udělat ještě předtím, než Začnu kódování? Nishant: Napište záhlaví? JASON Hirschhorn: Jak mohu si to barevné? [vložením VOICES] Nishant: Jak se vám to barevné? JASON Hirschhorn: Jak si barvu jsem kódování? Nishant: Já nevím. Oh. Uložit. JASON Hirschhorn: Save. Ano. Měl jsem ji uložit jako. C.. Tak ji uložit na plochu jako cp.c. Sladké. A když chci získat plný styl body, co bych měl jsou na vrcholu? Nishant: Dalo by se napsat své jméno, název programu, a účel programu stejně? JASON Hirschhorn: Vypadá to dobře. Výborný. Takže jste se k nám nastupuje dokonale. # Include - budeme také psát - OK. Takže myslím, že jsem všechno, aby mohli vyrazit. Kdo má první řádek kódu pro mě - nebo první řádky kódu, které to bude trvat uspokojit naše první komentář v pseudokódu? Vy. STUDENT 18: Měla by to být int argc, a pak char * argv? JASON Hirschhorn: Myslím, že máš pravdu. Změňme to int main, otevřené závorka, int argc, čárka, char * argv? Stejně jako, že? STUDENT 18: Závorky. JASON Hirschhorn: konzoly. Otevřete držák, pravá závorka, zavřít rodič. Perfect. Nyní mohu vzít argumenty příkazového řádku. OK. Ujistěte se, my jsme vzhledem dva soubory. Můžete mi dát, že stejně. STUDENT 18: Pokud argc - Tento člověk nemusí rovnat 3. JASON Hirschhorn: Je-li otevřené závorka argc není rovno 3? STUDENT 18: Jo, vrátíte 1 nebo tak něco. JASON Hirschhorn: Omlouvám se. STUDENT 18: Návrat 1 nebo tak něco. JASON Hirschhorn: return 1. OK? Skvělé. Otevřete oba soubory. Kdo mi může pomoci otevřít oba soubory? Kdo mi nedal kód ještě? Kurt? KURT: Takže všechny čepice F-I-L-E hvězdy zdroj. JASON Hirschhorn: Jdu aby se na samohlásky. Ti, kteří jsou v pohodě. Je to jako Tumblr. STUDENT 18: Rovná fopen - JASON Hirschhorn: Rovná fopen? STUDENT 18: Otevřené závorka, argv, otevřený držák. JASON Hirschhorn: Počkejte. Promiňte. Otevřít závorka. OK. STUDENT 18: Jo. Argv sub 1. JASON Hirschhorn: Sub 1? STUDENT 18: Jo. Argv otevřený držák 1 - Ano. A pak se čárka, a pak otevřete dvojitým citace, r, uvozovky, zavřít závorka, středník. JASON Hirschhorn: Sladký. A co ta druhá? STUDENT 18: Velmi podobná, ale místo toho S-R-C, měli byste říkat D-S-T. JASON Hirschhorn: Oo! To se mi líbí. STUDENT 18: Just D-S-T. Jo. A pak argv, otevřený držák, 2. Jo. A pak w namísto r.. Jo. JASON Hirschhorn: Skvělé. Další pár řádků. Také, pokud někdo má co přidat do linky, které jsme udělali, neváhejte přidat ty, které jsou také. Zkontrolujte, zda žádný z nich není NULL. Kdo mi může dát kód, který jsem třeba uspokojení, že řada pseudokódu? Archer. ARCHER: Pokud src rovná rovná NULL nebo dst rovná rovná NULL, pak se vrátit - JASON Hirschhorn: Co? ARCHER: Vraťte 2? JASON Hirschhorn: Vraťte 2. Takže pokud je otevřené závorka src rovná rovná NULL, nebo - co to thing's - potrubí? Pipe? Nazveme ho potrubí. Potrubí, trubky, dst rovná rovná NULL, vrátí 2. OK? Dokud jsme z bytů - jsme se nějak přeskočil tomto kroku pseudokódu část, která bude tady. Ale dokud jsme z bytů - Co to dělá zvuk jako? Jaký typ konstrukce C - ale já ho nepoužívám strukturu slovo, protože budeme-li začít používat že v ostatních případech - ale nástroj C Zní to jako? STUDENT 19: smyčka. JASON Hirschhorn: smyčka. Zní to jako smyčka. Takže, kdo mi může dát první řádek ze smyčky kódu tady? Můžete si také vybrat, jaký druh smyčka chceš, když mi dáš Tento řádek kódu. Existují tři druhy. Můžete si vybrat. Navrhoval bych jednu z nich. Avi. Který z nich chceš? AVI: PRO. JASON Hirschhorn: PRO. AVI: int i rovná nule. JASON Hirschhorn: OK. AVI: Tato část si nejsem jistej. Ale i menší než velikost z hvězdy zdroje? Nejsem si jistý. JASON Hirschhorn: OK. AVI: Vzhledem k tomu, že chcete velikost souboru, ne? JASON Hirschhorn: Takže to asi nebude nám velikost skutečné souboru v bajtech. Takže co jiného jsme mohli dělat? Co je jiný typ smyčky? Nebo bychom měli držet FOR smyčky? STUDENT 20: Mohl bys udělat WHILE smyčky? A pak, co byste udělat, je Byl byste - protože máme char * pro soubor. Takže pokud budeme jen držet zvyšování že až bychom najít NULL znak na Konec to? Nebo ne, je to, že není jak soubory práci? JASON Hirschhorn: Takže můžeme udržet zvyšování char * dokud nenajdeme NULL - STUDENT 20: v podstatě dál znak po znaku, dokud jsme narazili konec souboru. JASON Hirschhorn: Ano. Takže to je to, co chceme dělat. Chceme, aby se čtení, znak znakem, dokud se nedostaneme do konec souboru. STUDENT 20: Jo. Najít - co je konec, nebo stopka na konci textového souboru. JASON Hirschhorn: OK. Takže, když se dostaneme na konec souboru - Jak víme, že jsme dosáhli konec souboru? Pokud volám - tak se pojďme krok zpět. Co je to funkce? Pojďme se na tomto řádku tady. Čtení ze zdrojového souboru. Kdo mi může dát, že řádek kódu? STUDENT 21: fscanf? JASON Hirschhorn: fscanf. OK. Co když chci číst, velmi konkrétně, jeden byte? STUDENT 21: Já nevím. JASON Hirschhorn: OK. Ještě jednodušší než fscanf - to, co je - Chci číst ze zdrojového souboru? Čtení ze zdrojového souboru. Co je to funkce - jo. STUDENT 22: Je to fread? JASON Hirschhorn: fread. Myslím si, pojďme zůstat u že jeden teď. Jaký druh argumentů se fread vzít? STUDENT 22: Pravděpodobně typ souboru, a pak umístění v souboru? JASON Hirschhorn: Co mohu psát zde přijít na to, jaký typ argumentů fread trvá? VÍCE STUDENTI: Man fread. JASON Hirschhorn: Muž fread a fwrite. Vypadá to, že vyvěsíme společně. Tak fread se, jak mnoho argumentů? STUDENT 23: Čtyři. JASON Hirschhorn: Trvá čtyři argumenty. Trvá to ukazatel, velikost, a že věc, která je divné, a některé soubor. OK? Pojďme si o tom přečíst tady. "Funkce fread čte n MEMB prvky dat, každá velikost bajtů dlouhý, z potoka, na který ukazuje přenášet, ukládat je na místě dán ukazatel. " Tak čtyři argumenty. Proč jsem jen kopírovat to, a vložte ho tady. OK. Takže, kdo může začít vyplňování Tyto argumenty pro mě? Avi. AVI: Vyjměte prázdnotu. Dejte jen src. Vyjměte ukazatel a hvězdu. Dejte src. Pak - JASON Hirschhorn: Tak já jdu k zastavení tam, protože to je nesprávné. Máš pravdu s src, ale kde by src jít? [vložením VOICES] JASON Hirschhorn: Mělo by jít sem. To je src - naše src je typ. Pojďme se podívat tady. To se ptá na typ FILE *, jsme ve skutečnosti obvykle vidět takhle. Tak to je žádat o argument Typ souboru * zvaný proud, který je src. OK? Jaká velikost věci dělat chceme číst? Vám to dal jsem popis problému. STUDENT 24: Jeden bajt najednou. JASON Hirschhorn: Jeden bajt. Jak velký je byte? Jeho velikost je v bytech, tak co mohu dát tam? STUDENT 25: One. JASON Hirschhorn: One. Správně. Jeho velikost je v jednotce byte, takže 1 je 1 byte. Kolik si chci přečíst najednou. STUDENT 26: One? JASON Hirschhorn: Jedna věc. Chci číst jednu věc velikosti 1, jedno kousnutí najednou. A kam mám dát, když jsem četl, že? STUDENT 27: Cíl? JASON Hirschhorn: Takže nemohu dát to rovnou do cíle. STUDENT 28: Budeš put se do třetí ukazatel? STUDENT 27: K určení. JASON Hirschhorn: OK. Jo. STUDENT 29: Můžete deklarovat něco sloužit jako dočasné úložiště dříve. JASON Hirschhorn: OK. Dej mi to. STUDENT 29: Další soubor ukazatel, možná? JASON Hirschhorn: OK. Tak tohle je neplatná hvězda - je to typ void hvězda, takže to není musí být ukazatel souboru. A když jsem četl jeden bajt, kde by bylo dobré místo uložit jeden bajt? STUDENT 29: array? JASON Hirschhorn: array. OK. A co je ještě něco, co je pouze velikost jeden byte? STUDENT 30: char *? STUDENT 29: Jo. JASON Hirschhorn: char * není jeden bajt. STUDENT 29: char. JASON Hirschhorn: char je jeden byte. Je to tak? Takže říkejme této vyrovnávací paměti je obecný jméno používá pro tyto věci pro ukládání něco dočasně. Tak jsem se vytvořit vyrovnávací paměť. Je to tak? Ale to trvat void *. Možná máte pravdu, že je to by měla být vyrovnávací paměť o velikosti 0. Tak to ukládá jeden - pravdu. Protože to tady - char vyrovnávací paměť je charakter, ale to trvá void * - ukazatel. Takže jsem mohl udělat, a teď vyrovnávací paměť je ukazatel. Co jiného jsem mohla dělat? STUDENT 31: Dejte si hvězda vedle char. JASON Hirschhorn: Mohl bych Vytvořili je char *. OK. Co je další věc, kterou jsem mohl udělat? Nebo pojďme s tímto. Char * buffer, takže to, co mohu dát sem v? STUDENT 31: Buffer. JASON Hirschhorn: Buffer. Buffer je ukazatel na char. A v tomto místě, dáváme jeden byte z něčeho, co jsem četl. Jo. Avi. AVI: Jen rychlá otázka. Chcete malloc vyrovnávací paměť? JASON Hirschhorn: Kdo může odpověď na tuto otázku? STUDENT 32: No, to není opravdu přejděte na cokoliv právě teď, takže - JASON Hirschhorn: Ale dělat Chceme, aby to malloc? STUDENT 32: Pokud se na to, že způsobem, myslím, že jo, protože byste museli nějaké místo na to, aby ukazoval na. JASON Hirschhorn: Máme muset malloc? STUDENT 33: Pokud se chystáte na použití mimo smyčku. JASON Hirschhorn: Budeme používat mimo smyčky? STUDENT 34: Ano. STUDENT 35: Počkejte. Chceme, aby prohlásit ho ve smyčce na onen svět? JASON Hirschhorn: Tak myslím, že máme někteří pseudo WHILE smyčky tady, že jsme se snaží přijít na to, že jsme se dostali do ještě. Nepotřebujeme, aby to malloc. Jsme pracující v hlavním, je to jen jde , které mají být použity v této smyčky. Není třeba, aby existovaly mimo to. Takže to může být lokální proměnná. Máte ukazatel na lokální proměnná. STUDENT 36: Ale to není směřující k ničemu. JASON Hirschhorn: Ne, to není inicializovány na cokoliv. Ale my nebudeme používat také. Chystáme se dát něco do je to poprvé, co jsme ji používat. Tak to vypadá v pořádku. Takže nepotřebujeme tu malloc. A já si myslím, že je to v pořádku, jak je. OK. Máme fread linku. Pojďme udělat další řádek. Pokud chceme zapisovat do souboru, co je dobrou funkci použít k tomu, že? STUDENT 37: fwrite? STUDENT 38: fprintf? JASON Hirschhorn: fprintf je jeden. Co je další? STUDENT 39: fwrite. JASON Hirschhorn: fwrite. A pro naše účely, fwrite, které jsme zde viděli, je pravděpodobně lepší volbou. To trvá čtyři argumenty stejně. Nishant, můžete dát me argumenty? Nishant: První z nich se děje být jen vyrovnávací paměti. JASON Hirschhorn: OK. Nishant: druhý je jen bude 1. Třetí to bude 1. A čtvrtá bude dst. JASON Hirschhorn: Má někdo jakékoliv otázky týkající se tohoto řádku? To vypadá dobře. OK. Takže teď to vypadá, že na jednu věc, že ​​jsme chybí - vlastně, pojďme napsat tento poslední řádek. Zavřete soubory. Kdo nám může skončit psaní Tyto dva poslední řádky? Ano. Je nám líto, Jak se jmenujete? LUCY: Lucy. JASON Hirschhorn: Lucy. LUCY: fclose src a pak fclose cíl. JASON Hirschhorn: fclose, otevřené závorka, src, zavřít závorka, středník. A fclose - jo? LUCY: Open závorky, dst a pak středníkem. JASON Hirschhorn: Skvělé. A co bych měl obsahovat na konci? LUCY: Návrat 0. JASON Hirschhorn: Návrat 0. Musím? Jen otázka. Ještě musíme zahrnout výnos 0? VÍCE STUDENTI: Ne JASON Hirschhorn: Ne Hlavní automaticky dělá pokud se dostanete do konce. Ale myslím, že to je hezké jsou explicitně. Zvlášť, když se vracíte jiné věci v celém programu. OK. To je to, co nám chybí - PŘI co? Kdo může myslet na některé z nich - má nějaký smysl, co všechno mohl jít tam? I když je to jen v některých pseudokódu jako jazyka? Co jsme vlastně - co chceme jít do? Jo, Lucy. LUCY: konec souboru. JASON Hirschhorn: konec souboru. Tak co myslíš tím konec souboru? LUCY: Jakmile se dostanete konec souboru, zastavit. JASON Hirschhorn: OK. Takže jakmile se dostanete na konec souboru. Jak víme, že když jsme dosáhli konec souboru? STUDENT 40: Myslím, že vyrovnávací paměť bude nastavena na hodnotu NULL. STUDENT 41: Buffer je deklarována uvnitř smyčky. JASON Hirschhorn: Takže si myslíte, že vyrovnávací paměti bude nastavena na hodnotu NULL. Proč by vyrovnávací paměti je nastavena na NULL? STUDENT 40: Vzhledem k tomu, když jste fread, snažíte se dát nic do vyrovnávací paměti. JASON Hirschhorn: OK. Takže si myslíš fread - když jsme došli na konec soubor, co je fread dělat? Myslím, že je to otázka musíme zjistit. Co fread dělat? Znamená to dát NULL do vyrovnávací paměti, nebo to dělá něco jiného? Jak můžeme zjistit, co je to? STUDENT 42: Man. JASON Hirschhorn: Man. Takže pojďme se podívat sem. Návratová hodnota. Na úspěchu, fread a fwrite vrátit Počet položek číst nebo zapisovat. Toto číslo se rovná počtu bajtů převedeny pouze tehdy, když velikost je 1. Pokud dojde k chybě, nebo konec je dosaženo soubor, návratová hodnota je krátká počet položku nebo 0. Takže pro naše účely, pokud fread dosáhne konec souboru, a čte z konec souboru, tam je nic číst, co to jde vrátit? STUDENT 43: Zero? JASON Hirschhorn: Co? STUDENT 43: Zero? JASON Hirschhorn: Zero. Bude to vrátí nulu. Takže víme, že fread, když jsme došli na konec souboru, bude vrátit se na nulu. Jak můžeme využít ke svému prospěchu? AVI: Můžete deklarovat proměnnou mimo smyčky zvané kontrola. Pokud kontrola rovná - teď - jeden. JASON Hirschhorn: OK. AVI: A pak si můžete dát IF výkaz ihned po fread říká, pokud fread se rovná nule - no. JASON Hirschhorn: Kdo může pomoci Avi ven? AVI: Co je to hodnota vrácené fread? JASON Hirschhorn: Prostě jsme šel přes to. AVI: Jak si to představuje? JASON Hirschhorn: Tak to se vrací - pojďme podívejte se sem - vrací size_t, což je v podstatě celé číslo. Tak to vrátí celé číslo. A v našem případě to bude návrat 1 nebo 0 - 1. je-li to číst jednu věc - jeden bajt, a 0, pokud jsme došli na konec. Takže pokud fread - jo? STUDENT 45: Nemůžete prostě dát plný fread (buffer, 1, 1, src) do while? JASON Hirschhorn: Takže navrhujete Tím se tam? [vložením VOICES] JASON Hirschhorn: Vydrž. Takže jsme zbavit toho. Takže navrhnout uvedení fread do tam? Co bychom měli také pohybovat pokud chcete dělat, že? STUDENT 45: vyrovnávací venku. JASON Hirschhorn: Měli bychom také přesunout to tady. STUDENT 45: Ale dělá, že stále posunout dopředu? [vložením VOICES] JASON Hirschhorn: OK. Tak tohle je to, co navrhl Okshar. Vytváříme naši vyrovnávací paměti. My WHILE fread, pak jsme fwrite. Myšlenky na to? STUDENT 46: Moje jediná otázka je, by to vlastně spustit příkaz fread? JASON Hirschhorn: Velká otázka. Když budete dávat volání funkce uvnitř stavu, dělá volání funkce vykonávat? Už jsme viděli příklady tohoto. Je to tak? STUDENT 46: OK. Jo. Takže to dělá spustit. JASON Hirschhorn: Viděli jsme věci jako to předtím, kdy máme volání funkce uvnitř stavu. Znamená to, že volání funkce vykonávat? Ano. Takže odpověď je ano. Toto volání funkce bude vykonávat. Ale opět, je to, co chceme? Co je jeden způsob, jak bychom mohli přijít , jestli je to to, co chceme? VÍCE STUDENTI: Spusťte ji? JASON Hirschhorn: Můžeme to spustit. Ale dříve, než to uděláme, mohli bychom i rozum z toho. Pokud - že máme jeden bajt v naší soubor, dostaneme se sem, dostaneme se k tomuto kódu. Tím se spustí. fread vrátí jeden bajt a uložit je do paměti. A to vyhodnotí na 1, hned poté, co se vrátí jedna. Takže zatímco 1. Znamená to, že kód uvnitř WHILE smyčky bude provádět? STUDENT 47: Jo. To je pravda. JASON Hirschhorn: Ano. 1. je pravda. Není to 0. Takže kód uvnitř zde bude provádět. Takže budeme psát, že. Budeme se vrátit k tomu linka znovu. Nyní máme - jsme na konci našeho souboru. Čteme z konce našeho souboru, protože jsme měli jen jeden byte v něm. Fread vrací 0, obchody něco v pufru. Upřímně řečeno, nevím, co ukládá do vyrovnávací paměti. Mohli bychom vyhledat aby viděli, co to dělá. To já opravdu nevím. Nevíme, koho to zajímá, co ukládá do vyrovnávací paměti? Ale to vrátí 0. A bude Zatímco 0 spustit? PŘI 0 se neprovede. Takže se budeme pohybovat sem. Takže pojďme se zvednutím ruky, pokud to je kód bychom měli spustit, nebo pokud se by měl udělat jako první změny. Takže pokud si myslíte, že - budete muset volit. Pokud si myslíte, že bychom měli spustit tento kód tak, jak je, prosím, zvedněte ruku. OK. Je tu ještě jedna - máte dotaz, obavy? Jo. STUDENT 48: Poté, co jsme se přesunout vyrovnávací paměti mimo smyčky, my muset malloc? JASON Hirschhorn: Velká otázka. Poté, co jsme se přesunout bufferu mimo smyčky, musíme to malloc? To je rozsah otázka. Pokud budeme inicializovat vyrovnávací mimo této smyčky, bude existovat uvnitř smyčky? VÍCE STUDENTI: Ano. JASON Hirschhorn: Ano. Jeho působnost se vztahuje na uvnitř smyčky, a, opravdu, něco níže je uvnitř tohoto kodexu, včetně věci uvnitř zde. Takže nepotřebujeme ji malloc. Je to lokální proměnné, a její rozsah stále obsahuje smyčky. STUDENT 49: Potřebujeme ho osvobodit? JASON Hirschhorn: Máme je třeba volné paměti? STUDENT 49: Jo, když to neuděláme malloc. JASON Hirschhorn: Máme je třeba volné paměti? My ne. Opět platí, že se jedná o lokální proměnnou, takže se není třeba ji uvolnit. OK. Podívejme se, co se stane. Tak to je inicializována. To bylo to, co něco, Marcus navržena dříve. Takže jsme si, že chyby, variabilní vyrovnávací paměti je inicializována při zde použit. Jak můžeme tento problém vyřešit? STUDENT 50: malloc to? STUDENT 51: rovná NULL? STUDENT 52: Řekněme, že vyrovnávací rovná NULL. JASON Hirschhorn: OK. Vypadá to dobře. Máme to teď. Pojďme vytvořit něco vyzkoušet kopírování. Takže máme textový soubor. Jak můžeme spustit tento program? Jo. STUDENT 53: Můžete to udělat tečku lomítko cp, test.txt. A pak můžete pojmenovat další soubor které se bude ukládat. JASON Hirschhorn: OK. Nazveme ji out.txt. V pohodě? Seg chyba. Myšlenky na poruchy seg? To je skvělé. Jak můžeme zjistit, kde chyba seg je? Co je? STUDENT 54: Gdb. JASON Hirschhorn: Gdb. Provozujeme gdb písemně gdb tečka lomítko, Název našeho programu. Žádné argumenty příkazového řádku tam. Budeme nastavit zarážku na hlavní. Pokud chci spustit gdb, co mám dělat? STUDENT 55: R. JASON Hirschhorn: R. A co pak? STUDENT 55: Argumenty? JASON Hirschhorn: A argumenty příkazového řádku. Pojďme se projít. N se mi právě při řádek po řádku. Chystám se jít až do Mám moje chyba seg. Tady je moje chyba seg. Vypadá to, že fread způsobeno moje chyba seg. Vím, že fread způsobila moje chyba seg, , protože to byl linka se právě spuštěn. A jediná věc, která byla děje v tomto řádku - dvě věci děly. Fread se děje, a pak jsme byli dělat nějaké kontroly WHILE. Jsem ochoten se vsadit, že WHILE kontrola nebyla příčinou moje chyba seg. S největší pravděpodobností, fread byl způsobuje moje chyba seg. Také vidím něco, co zde, memcopy. Kopie paměti. Zní to jako pohybující se paměť od jedno místo na další. Zní to jako něco, co by se stalo v fread, možná některé paměti pohybující se odsud sem. Pojďme si projít to znovu. Jak mám začít, že přes a spusťte jej znovu? Jo. STUDENT 56: Myslíte si, je třeba, aby ampersand před vyrovnávací paměti? JASON Hirschhorn: Tak ampersand před vyrovnávací paměti by mi dát adresu vyrovnávací paměť, která je char *. Pojďme si projít tímto ještě jednou. Jak mohu spustit přes to ještě jednou? STUDENT 57: Může si jen typ spustit znovu? JASON Hirschhorn: Stačí zadat znovu spustit. Takže my nebudeme provést tento řádek. Takže pufr je ukazatel NULL. Opravte? To ukazuje na - podívejme se. Pokud máme naše - nakreslit rychle vyfotit. Každý může vidět, pokud Píšu tady? Takže v zásobníku, máme místní variabilní a je to tzv. vyrovnávací paměti, a Je to ukazatel na char. Co adresa je tento znak v? STUDENT 58: 0x0. JASON Hirschhorn: Správně. To je to, co to je. Tady, v pufru, je uložen 0x0. To je to, co máme - setup máme teď. Takže tento řádek, fread, dá něco od zdroje, kde? Do tohoto pole, nebo tento box? Který box? Levé okno nebo pravé okno? Toto právo box. Z toho vyplývá, ukazatel, a vloží jej sem. Když se budeme snažit a dotek paměti na polohy 0, co dostaneme? Porucha segmentace. To je chyba teď máme. Jo. STUDENT 59: Ještě nemáte dát hvězdy vyrovnávací paměť? Nebo ne? Pro fread? JASON Hirschhorn: Tak fread má ukazatel. Takže to projde v pufru. A pak to bude de-reference že někde uvnitř fread. Ale opět, viděli jsme, že se ukazatel. Nepotřebujeme ji předat hvězdy vyrovnávací paměti. To by bylo kolem to, co je tady. A to by asi nám chybu proto, že jsme de-odkazování. Je to tak? Když jsme se de-reference tohoto ukazatele, pokud snažíme se o přístup k tomuto umístění, dostáváme chybu - naše chyba segmentace. Takže - Chybička se vloudila. Chystáme se odejít z gdb. Naše linka - náš problém - má pravdu zde na této lince. A to je problém, protože z této linie. Jak můžeme vytvořit pole, které je k dispozici ve fread. Je to tak? Musíme vytvořit pole, které je jedním byte velké, velikost char. Ale my potřebujeme, že box bude přístupný pokud tato funkce provádí. Takže tam, kde - jo. Nějaké nápady? STUDENT 60: Stačí jen nastavit jako jakýkoliv náhodný charakter. Jen to char bufferu se rovná charakter. A pak, když jste pufru tam - JASON Hirschhorn: Počkejte. Char vyrovnávací paměť? Takže žádná hvězda? STUDENT 60: Jo. Vyjměte hvězdu. Rovná náhodný charakter. JASON Hirschhorn: OK. Tak mi dej jeden. STUDENT 60: Like, nebo tak něco. A pak, když máte vyrovnávací paměti tam, můžete použít - STUDENT 61: hvězda? Ale ne, ampersand. STUDENT 60: Používejte ampersand. JASON Hirschhorn: OK. A co v fwrite? STUDENT 60: Používejte ampersand znovu. JASON Hirschhorn: Dobře. Takže vaše představa je, že jsme se vytvořit znak a dát něco v něm, a pak napsat k tomuto char. STUDENT 60: Jo. JASON Hirschhorn: Co si lidé myslí? STUDENT 62: Je to spletitý. JASON Hirschhorn: OK. Pojďme vytáhněte ji. Takže tentokrát budu kreslit to v červená na zásobníku tady, a pak jsme bude mít - ooh! Promiňte. Takže tentokrát máme něco, co nazývá vyrovnávací paměti, a to je na stacku. Opravte? A my uložení v něm je, zpočátku. Pak máme výzvu k fread. Co fread to je, že trvá byte z náš soubor a dá to někde. Klade to v jakémkoliv co to ukazuje. No, předtím, než jsme měli tuto adresu - 0x0. A teď, co Adresa máme? STUDENT 63: Cokoliv Adresa vyrovnávací paměti je. JASON Hirschhorn: Cokoliv Adresa vyrovnávací paměti je. Je to asi bude něco takového. Pravděpodobně začnou s b a f, a pak dalších šest hexadecimálních číslic. Nezáleží na tom. Některé adresu. A my jsme kolem této adresy palců A jdeme dát náš jeden byte, co na této adrese. Takže jdeme dát náš jeden byte, co tady uvnitř. A pak budeme psát z co je vůbec tady uvnitř. Má někdo nějaké otázky, o tom? Kdo si myslí, že tento kód bude fungovat? Zvedněte ruku, pokud si myslíte, Tento kód bude fungovat. Musíte zaujmout stanovisko. A kdo si myslí, že tento kód nebude fungovat? Zvedněte ruku. Všichni ostatní by měli být zvednutím ruky. OK. Michael, kde stojíte? MICHAEL: Nemůžu se rozhodnout. Druh ve středu. JASON Hirschhorn: Vy jste ve středu. Vyberte si jednu. MICHAEL: Já budu mít víru a říkají, že to bude fungovat. JASON Hirschhorn: OK. Budete mít víru, a říkají, že to funguje? Co se stalo? [vložením VOICES] JASON Hirschhorn: Žádná chyba seg. Jak můžeme zkontrolovat, zda dvě věci jsou stejné? Dva soubory jsou stejné. STUDENT 64: Diff. JASON Hirschhorn: Diff. Rozdíl kontroly na rozdíly mezi dva soubory, a pokud se vrátí nic, jsou totožné. A když jsme se otevřít, dostaneme naši soubor. Tak, že je správné řešení. Podívejme se na to ještě jednou. My vlastně ani neměl je třeba ji inicializovat. Bylo by asi vypadat trochu čistší, pokud jste si ho nedali něco náhodně tam. Bod je, co jste potřebovali vytvořit nějaký prostor pro uložení něco z fread a vzít něco z fwrite. A to, co musel být buď místní proměnné na zásobníku - máte Mohl jsem malloc'd nějaký prostor. Takže jsme vlastně mohli mít napsal malloc tady, a že by to fungovalo. A pak bychom byli skladování naše věci někde na haldě. Ale to je ve skutečnosti, pravděpodobně, nejelegantnější řešení. Stačí vytvořit nějaký prostor na zásobníku pro tyto věci jít. Chtěl bych mít dvě další připomínky. Pokud byste měli vzít obrat v tomto, a pak se dal na to, mé poznámky by takto. Tyto 1 je tady, se mnou, podívejte se jako magických čísel. Toto 1, pokud jde o fread, dává smysl. To je počet věcí číst nebo psát. Ale tohle tady by asi něco jiného. Takže to, co je řešení? STUDENT 65: Velikost bytu. JASON Hirschhorn: Jako, že? STUDENT 65: Velikost char. JASON Hirschhorn: Velikost char. Jo, byte není typ. Takže velikost char prací. Mohli bychom se, v horní části náš kód, # definována tak, že. Volal něco BYTE a je to opravdu char. Vlastně, ještě lepší přístup mohlo být toto - uint. Ví někdo, co to je? Promiňte. Mám ji dozadu. Počkejte, no. Kudy to jde? Ví někdo, co to je? Jo. STUDENT 67: má pomoci sjednotit přes systémy věci, které mají - stejně jako celá čísla bez znaménka které mají 8 bajtů? JASON Hirschhorn: To je Přesně tak. Na různých strojích, velikost char - obvykle char. Znaky jsou obvykle jeden bajt. Ale velikost jiných datových typů jsou různé velikosti na 32-bitovém počítači versus 64-bitové stroje. Uint8_t je vždy 8 bitů - vždy jeden bajt. A já potřebuju, aby zahrnoval standardní soubor int záhlaví. Takže teď, to by byly pravděpodobně Nejlepší způsob, jak napsat tento kód. Tak jsem se zbavit magických čísel. A mám také logičtější typ bufferu. To není jen char, to je byte, což je to, co očekáváme, že bude. A tady, máme vlastně Byl trochu robustnější. Nejsme volat to char, který - Možná, kdo ví - může být odlišný velikost na různých strojích. Jsme vlastně, že tohle je přesně to, jeden bajt, vždy, bez ohledu na to, co. A podíváme-li se zde, děláme cp. Uh-oh. Co se stalo? STUDENT 68: To by mohlo být zapnutý. JASON Hirschhorn: Co? STUDENT 69: Je to tak? STUDENT 70: To snad ne definovat jako typ. STUDENT 71: Ale to by být definovány v normě. STUDENT 72: Co se děje? STUDENT 73: Měla by definovat být všechny kryty? JASON Hirschhorn: Takže to není # define. Ve skutečnosti, v tomto případě, jsem bude používat typedef. Protože jsme ji využívají jako Typ na jednom místě. Takže v tomto případě vlastně chceme, aby typedef, jako bychom tisknete nový typ byte, a to je, v podstatě, to. Je to trochu jiné než # define. A nyní, náš kód funguje perfektně. Takže, ještě jednou, # define se něco, nahradí jej všude se na jiné věci. Je to jen makro - zkratka, jak se zbavit magických čísel. Ale v tomto případě, protože jsme používat to jako typ - tady - aby za to pracovat, musíme na typedef, co byte je. A my jsme ji definuje tady. Není to struct, je to ve skutečnosti pouze celé číslo bez znaménka. Je to jeden byte dlouhý. Tento kód bude k dispozici on-line, a všichni ho měli mít hned. Takže máme - perfektní - 13 minut odešel jít nad problémem sada 5. Chci se projít copy.c společně, a pak se budeme krátce promluvit o ostatních částech problému nastavení. Takže dovolte mi, abych vytáhnout copy.c. A super věc je, že máme vlastně již napsáno hodně tohoto kódu. Kód psali jsme doslova vyšel odtud, když jsem byl psát to na vlastní pěst. Ale to je copy.c, tvoří základ pro první a druhou částí Problém sada pro whodunit.c, které budete muset napsat, a resize.c. Recover.c, což je třetí a poslední Část problému nastavení, není vychází z tohoto souboru. Budeš muset napsat, že soubor, my vám šablonu pro které souboru, ale to nemá nic společného co do činění s copy.c. Ale protože copy.c je základem pro První dvě části, jedeme jít přes něj, takže máte dobrý pocit z toho, co to dělá. A připomínky, aby některé z nich pryč. Jsme již napsal něco z toho. Za prvé, děláme, že dostaneme tři argumenty. Dále jsme si vzpomněla na název souboru. Tak jsme přeskočili tento krok, pokud jsme kódované naše věc - když naše cp. Ale tady, oni to dělat je to trochu čistší. Jsou kontroly, aby se ujistil oba soubory jsou dobré, v Kromě jejich otevření. Napsali jsme všechno tento kód právě teď, takže jsem nebude přebývat na tomto kódu. Dále je některé věci, které je specifické pro typy souborů, jsme pomocí, který jsou bitmapové soubory. Bitmapové soubory mají nějaký metadata jsou s nimi spojeny. Takže prvních pár bajtů ti o souboru. Jsou to barvy pixel v tomto snímku. Řeknou vám o souboru. A pokud budete číst přes problému nastavení, budete mít mnohem více informací Na jaké typy struktur metadat jsou zahrnuty s bitmapami. Ale to je důvod, proč máme tento první sada - tohoto kódu přímo zde. Jsme čtení metadata - dva kusy metadat - soubor záhlaví a informace záhlaví. A my jsme kontrolu některé části to, aby ujistěte se, že je pravda, bitmapový soubor před pokračováním. A opět, to jsou detaily jsme Nemusíte chodit do teď. Pokud budete číst přes problému nastavení, budete rozumět nich. Dlouhý příběh krátký, to jsou jen říkám, to je soubor rastrového obrázku, a potvrzuje, že. Dále budeme psát ty do souboru ven. Vidíme, že zde. Píšeme na ven ukazatel. Dále jsme určování polstrování. Takže znovu, jak je zvláštnost s Rastrový obrázek, některé linky jsou polstrování na konci. A pokud budete číst přes problému nastavení, budete se dozvědět více o polstrováním. To je vzorec najít polstrování. Důležité mít na paměti - když změníte velikost bitmapy soubor, polstrování změny. Když změníte velikost soubor, polstrování změny. Je to nikdy nebude větší než 3 - to bude 0 až 3, včetně. Ale když změníte velikost něco, polstrování změny. Mám-li pouze jeden pixel v této řadě, jsem Potřebujeme tři bajty polstrováním, protože každý řádek musí být dělitelné čtyřmi bajtů dlouhé do rastrového souboru. Ale když jsem se zdvojnásobí to, jít od jednoho pixelu na dva pixel, z nichž každá, řekněme, je byte, pak musím dva bajty polstrováním, jak vydělat , které se rovná čtyři. Takže když jsem se změnit velikost něčeho, Potřebuji změnit výši vycpávky mám. Znamená to, že smysl pro každého? Dále jsme iteraci každém řádku, nebo přes všechny řádky. A pak iterovat každý sloupec v každém řádku. Jsme léčbu tohoto bitmapu jako mřížky, jako jsme léčit Stravování v 15.. Stejně jako jsme se chovali cihly, kdy jsme vytiskli na obrazovce. Mřížky řádků a sloupců. Pak - viděli jsme to. Vlastně jsme jen kódované to. Vytvořili jsme nějaké dočasné uskladnění. Čteme tam, a pak píšeme ho. To je přesně to, co právě udělal. Dále, protože jsem řekl, každý řádek končí v některých polstrování, jsme přeskočit tomto polstrování - starý polstrování. A pak přidáme zpět. V tomto případě budeme vytvářet stejný přesný soubor. Jsme prostě zkopírováním. Takže tento řádek je trochu hloupé. Mohli jsme doslova dal výplň palců Ale pokud změníte velikost souboru, vy přesto chcete tento řádek? Takže pokud změníme velikost souboru, máme ještě chcete přeskočit přes staré čalounění? STUDENT 74: Ano. JASON Hirschhorn: Tak my. Protože toto, zase, nabídka se zdrojovým souborem. Nechceme péči o čalounění ze zdrojového souboru. Chceme jít na další řádek. Ale my prostě dát zpět Starý množství polstrování. Musíme se vrátit Nová výše polstrováním. Takže když měníme velikost soubor, přesto chceme přeskočit polstrování ve starém souboru - co budeme číst od. Ale to, co píšete, aby, jedeme muset vrátit některé odlišné počet polstrování, které jsme dospěli k závěru. Jo. STUDENT 75: Pořadí těchto dvou linky nezáleží, ne? Vzhledem k tomu, že jste manipulaci různé soubory. JASON Hirschhorn: Přesně tak. Pořadí těchto dvou linek nezáleží. Píšeme tento řádek. To je tady pro soubor jsme písemně. To je důležité, abychom si správné množství čalounění. To se musí vypořádat se souborem. Chceme přeskočit rovnou přes výplň. Nechceme, aby čtení - pokud budeme číst byte v době, jsme Nestarám se o tyto doplňkové bajty. Chceme se přesunout na další řádek. Nakonec stejně jako Lucy dal za nás, zavřeme soubory a vrátí 0. Tak tohle je copy.c. A my vlastně napsal - jsme strávili většinu část psaní tohoto, v podstatě. Udělal jsi to. Takže doufejme, že budete mít dobrý pocit o tom, co se děje tady. Velký rozdíl, upřímně řečeno, je jen Tato první část, která se zabývá zvláštnosti bitmapové soubory. Tak jsem si jako můj další snímek, Co musíme udělat? Dobře, pojďme přemýšlet o tom, detektivka. A pro někoho, kdo si přes problém nastavit to, co máme je třeba udělat, detektivka? Jednoduše. Aleja. Aleja: Můžeš si vzít tu část každého pixelu, která označuje red. A pak - druh? JASON Hirschhorn: OK. Tak se tu část každého pixel, který označuje červená. Je to blízko, ale ne všechny z nich. STUDENT 76: No, je tu různé způsoby, jak to udělat. JASON Hirschhorn: OK. Dej mi jednu cestu. STUDENT 76: Vyjměte všechny červené a pak zdůraznil, modré a zelené. JASON Hirschhorn: OK. Takže vzhledem oba tyto způsoby - to zní, jako bychom dát pixel, to má červenou, modrou a zelenou hladinu. Chceme změnit relativní úrovně červené, modré a zelené, v závislosti na tomto pixelu. Je-li v tomto kódu měli bychom změnit relativní červená, modrá, zelená hladiny daného pixelu. Poté, co jsme si to - předtím, než jsme to napsat? Dej mi číslo řádku. VÍCE STUDENTI: 83. JASON Hirschhorn: 83. Tak tady. Pro detektivka, kód, který je třeba zápis by měl jít všichni tady. A to je pouze kód musíte napsat. Vzhledem k tomu, jak jsme slyšeli, vše, co potřebujete udělat, je změnit tyto relativní modrá, červené a zelené úrovně z každého pixelu. Četl jste ji, a teď jste bude psát to. Jak se dostanu - když mám tuhle věc tzv. triple, tady, a to je typ RGBTRIPLE - dobře, pokud jsme se podívali na bmp.h, co je RGBTRIPLE? STUDENT 77: Je to struct. JASON Hirschhorn: RGBTRIPLE je struct. Vidíme, že tady dole. A tak když jsem chtěl, aby přístup, řekněme, červená úroveň struct, jak to mám přístup červenou úroveň tohoto struct? [CLASS šelesty] STUDENT 78: RGBTRIPLE.rgbtred? JASON Hirschhorn: Je to pravda? STUDENT 79: Mělo by být trojitý tečka, místo RGBTRIPLE tečky? JASON Hirschhorn: Triple. Triple je lokální proměnná, tak tu, je tu žádné ukazatele zde. Takže jsme prostě použít tečka notaci. To mi dá úrovně červené. Pokud chci to změnit, jsem nastavit to rovnat na něco jiného. Takže znovu, tento řádek kódu přístupů tato proměnná uvnitř tohoto struct, a můžeme nastavit tak, aby něco nového. Takže pro detektivka, opět, je to, v podstatě to, co musíme udělat. Velmi jednoduché. Stačí změnit některé relativní úrovně, a to je místo, kde že kód pokračuje. Změna velikosti, na druhé straně, je to trochu složitější. Ve skutečnosti, pro změnu velikosti je pravděpodobně nejsložitější část tohoto problému nastavení. Máme tři minuty jít přes něj. Ale zase jsme již psali většina tohoto kódu, a tak jsme by měla být docela povědomě. Jaké jsou některé věci, které chceme dělat v změnit velikost, pokud jste si přečetli na problém nastavit? Dáte-li mi je, jsme lze mluvit o nich. Jaké jsou některé věci, které jsme chtěli udělat? STUDENT 80: Vertikálně - takže budete muset horizontálně změnit jeho velikost, ale vertikálně změnit jeho velikost, stejně? JASON Hirschhorn: Takže pokud máme daný pixel, a chceme-li změnit velikost jej faktor dva, nyní musí být změnit velikost vodorovně a změně velikosti vertikálně. Má to smysl? Jo. Tak to je asi Největší výzvou. A budeme o tom mluvit v sec. Jo. STUDENT 81: jak jsem o tom přemýšlel byl jste potřebovali vytisknout - JASON Hirschhorn: Počkejte. Nikdy nám neřekl, co jsi udělal. Budeme mluvit v logice. STUDENT 81: OK. Jaká byla otázka? JASON Hirschhorn: Jen zvedl ruku. Nebylo pochyb. Dovolte mi, abych to představit. Dovolte mi, abych diskutovat o této krátce. Takže jsme jeden pixel, chceme replikovat, a to jak horizontálně, tak vertikálně. Takže v ideálním případě to, co děláme tady, je, jsme přečíst v našem pixelu, můžeme napsat, že však mnoho časů. Ale pak máme trik tady, protože pak chceme přeskočit k další řádek a napsat, že na začátek dalšího řádku. Takže pokud chceme replikovat i horizontálně i vertikálně, což je jeden dobrý způsob, jak to udělat - jeden dobrý i když na to? Takže nepotřebujeme neustále hledat kolem našeho souboru umístit věci. Tato otázka nemusí mít Dávalo to smysl, ale myslím, že odpověď na to pomůže. STUDENT 82: Vytvoření pole? JASON Hirschhorn: Tak pojďme myslet každého souboru jako řady. Pojďme si, že pokud jde o řadách. Pokud máme první řádek z naší malé obrázek, můžeme tuto řadu do velké řady z velkého obrazu, a pak se replikovat tento řádek však kolikrát je třeba replikovat, spíše než jít pixel po pixelu, která se dostane matoucí, když zabývající se soubory. Protože kdybychom měli - Běžím z vesmíru. Pokud je to náš soubor, a máme, že tam jeden pixel, a chceme, aby to tady, máme stále nějaké věci že je třeba jít tam, když jsme psaní a vytváření našeho nového souboru - náš soubor, který je dvakrát tak velký. Ale je to opravdu těžké s funkcemi souborů přeskočit kolem nových linek takhle, a pak se vraťte sem a dát věci tam. Je téměř nemožné, aby něco stejně jako to, že v případě, že má smysl. Takže, pokud si myslíme, že jde o řadách, můžeme se naše řady, a pak ji - kopírovat řádky svisle. A to je, jak se vypořádat s velikosti vertikálně, nikoli horizontálně. To bylo docela rychlé, a trochu matoucí. Bohužel náš čas vypršel. Budu stát venku pro ty z vás, Zde, kteří mají otázky týkající se Problém set, včetně obnovit. Takže pojďme odročit teď. A opět, pokud máte nějaké dotazy, můžeme povídat venku.