>> [Přehrávání hudby]
>> David J. Malan: Dobře.
>> [Smích]
>> Vítej zpátky.
Toto je CS50.
A to do konce týdne pět.
A až do teď, máme docela hodně bral za samozřejmé, že
existuje tento kompilátor, klap, které jste bylo vyvolání prostřednictvím této
další nástroj s názvem Udělat to nějak jako mávnutím kouzelného proutku změní váš zdrojový kód
do objektového kódu, se nul a jedniček že vaše počítače CPU, centrální
procesorová jednotka, skutečně rozumí.
Ale ukazuje se, že je to číslo, které je děje pod kapotou v
mezi vstupem a výstupem.
>> A já bych chtěl navrhnout, aby se maso že v trochu podrobněji do
Tyto čtyři kroky, mít něco, co nazývá předzpracování, co
tzv. kompilace, které jsme viděli, něco jako montáž a
něco, co nazývá propojení.
Takže až do teď, v některé z našich programy, jsme měli ostré obsahuje.
V poslední době jsme měli nějaké ostré definuje konstant.
Tak to dopadá, že ty věci, které mají před hash symbol nebo
libra symbol jsou pre-procesor směrnice.
To je jen ozdobný způsob, jak říkat, že je to řádek kódu, který je vlastně
převedeny do něčeho jiného, ​​než se Počítač se dokonce pokusit převést své
Program do nul a jedniček.
>> Například, ostrý obsahuje standardní I / O. H, do značné míry prostě znamená jít
dopředu, chytit obsah souborů stdio.h a vložit je přímo tam.
Takže žádné nul a jedniček v tomto bodě ještě.
Je to opravdu jen substituce.
A to se stalo během tzv. pre-fázi zpracování, při
vlastně běží Clang nebo specificky Aby se ve většině případů.
Takže všechno se dělo První automaticky tak daleko.
>> Pak přichází krok kompilace.
Ale byli jsme příliš zjednodušený kompilace.
Kompilace programu opravdu znamená vezměte si ji z něčeho, jako je C,
Zdrojový kód jsme psali, se na něco, co nazývá montáž.
Jazyk symbolických instrukcí je nižší úroveň jazyk, který naštěstí nebudeme
mají hodně příležitostí k napsat tento semestr.
Ale to je na nejnižší úrovni v pocit, že jste doslova začít psát
sčítat a odčítat a násobit a načíst z paměti a uložit do paměti,
velmi základní pokyny, které počítač, pod kapotou,
skutečně rozumí.
>> Konečně, montáž se tento jazyk do nul a jedniček, které jsme byli
popisovat tak daleko.
A opravdu nakonec, je tu tzv. propojení fáze, které použijeme
vidět za chvíli, která spojuje Vaše nul a jedniček s nulami a
ty ostatní lidé před jste vytvořili.
>> Takže zvažte to super jednoduchý program.
To bylo od 1. týdne.
Je to jen řekl, Hello World, na obrazovce.
Běželi jsme to přes Clang.
Nebo jsme běželi, že přes Udělat který běžel Clang.
A výstup v době, kdy některé nul a jedniček.
Ale ukazuje se, že je mezikrok.
Když jdu sem - pardon, ne Chci ho vidět ještě.
Když jdu sem k mému spotřebiče a otevřu hello.c, zde
je to stejný program.
A co budu dělat ve svém terminálu Okno je zde budu
spustit Clang spíše než značka, která automatizuje všechny čtyři
tyto kroky u nás.
A já budu dělat klap-S a pak hello.c a zadejte.
>> A já si blikající výzva znovu, což je dobré.
A nyní v mírně větší okno, Jdu otevřít gedit tady.
A já jdu otevřít soubor, který, Ukázalo se, že je to tzv. hello.s
obsahuje toto jazyk symbolických instrukcí Jsem se zmínil dříve.
A to je to, co se nazývá montáž jazyk, poměrně nízké úrovni
instrukce, že váš procesor Intel nebo co to je, že je uvnitř
chápe.
A mov je k nastěhování. Výzva je určena pro volání, velmi nízkou úroveň funkce.
sub je pro odčítání.
>> Takže když máte konkrétní procesor uvnitř počítače, co je to
odlišné versus ostatní procesorů na trhu, který je instrukce se
chápe a často, jak efektivní je je, jak rychle je na provádění některých
z těchto instrukcí.
Nyní pro více na toto téma, můžete se Další pád CS61 na vysoké škole.
Ale zde se, například, několik identifikátory, které by mohly připadat povědomý.
hello.c je název programu.
>> . Textu -
že to není moc zajímavé, že právě teď, připomínají, že text
segmentu, v pondělí, je místo, kde v Paměť váš program vlastně skončí.
Tak to alespoň mlhavě zná tam.
Zde se samozřejmě, je zmínka naší hlavní funkce.
Rolování dolů, ty naleznete na věci tzv. registry, velmi malé kousky
paměť uvnitř vaší aktuální CPU.
A když jsem se posunout dolů, i dále, vidím nějaký
nepřímé zmínky o ASCII.
A tam, samozřejmě, je to, že řetězec, ahoj, čárka, svět.
>> Tak dlouhý příběh krátký, to bylo děje pro vás, automaticky,
pod kapotou celou tuto dobu.
A to, co se děje ve skutečnosti je jednou co jste spustili Clang, nebo prostřednictvím
Zkontrolujte, že jste stále poprvé, ze zdrojového kódu,
tzv. jazyce symbolických instrukcí.
Pak zvonění je převod tohoto shromáždění jazyk až do nul a jedniček.
A to je snímek, který jsme začali naše diskuse v týdnu 0, o -
a pak týden 1 dále.
A nakonec, ty nuly a jedničky jsou v kombinaci s nulami a jedničkami
z těchto knihoven jsme se při za samozřejmost, jako je Standard I / O nebo
String knihovny, nebo dokonce CS50 knihovna.
>> Takže malovat tento obrázek více vizuálně, máme hello.c.
A, samozřejmě, používá printf fungovat říci, hello world.
Kompilace krok se dolů do tento soubor jsme právě viděli hello.s, a to i
že i když je obvykle odstraněn automaticky za vás.
Ale to je kód assembleru uprostřed kroku.
A pak, když jsme se sestavit sestavy jazyk, abych tak řekl, to je, když jste
dostat ty nul a jedniček.
Takže jsme přiblížili efektivně dnes co jsme užívali jako samozřejmost,
znamená jít zdrojový kód objektového kódu.
>> Ale nakonec, teď ten stejný obrázek - pojďme strčit ji do
na levé straně.
A všimněme si, že ve vrcholu Zmínil jsem se stdio.h.
Je to soubor, který jsme součástí téměř ve všech
programy, psali jsme.
A to je ten soubor, jehož obsah dostat kopii vložit,
účinně vrcholu kódu.
Ale ukazuje se, že na počítači systém někde, tam je pravděpodobně
stdio.c soubor, který někdo napsal let před, který implementuje všechny
funkce, které jsou deklarovány v stdio.h.
>> Nyní ve skutečnosti je to asi není na Mac nebo PC, nebo dokonce v
CS50 spotřebič je surový C kód.
Někdo již zkompilovaný a to včetně . O soubor pro cílový kód nebo.
soubor, který odkazuje na sdílené knihovny , který byl předinstalován a
předkompilován pro vás.
Ale předpokládám, že tam skutečně existuje na našem počítači stdio.c v paralelní
s Clang.
Váš kód je zkompilován a smontovány.
stdio.c je kód se kompiluje a sestaveny tak, že právě tato poslední
krok, tady dole, musíme nějak odkaz, abych tak řekl, vaše nul a jedniček
s jeho nebo její nul a jedniček do jednoho jednoduchý program, který v konečném důsledku je
volal jen Hello.
>> Tak to je vše o kouzlu, které je se děje tak daleko.
A bude i nadále, aby se tyto procesy samozřejmost, ale uvědomit,
je tu spousta šťavnatých detailů děje pod tam.
A to je to, co dělá vaše počítač s Intel Inside
zvláště zřetelný.
>> Takže v takovém případě, pokud chcete, aby Připojte se k nám na oběd v pátek, to jít
na obvyklém místě cs50.net/rsvp, 13:15 tento pátek.
A nyní několik oznámení.
Takže máme dobrou zprávu.
A máme špatné zprávy.
Začněte s nějakou dobrou zprávou zde.
>> [Sténání]
>> Dobrá.
No, je to technicky dovolenou, tak to není tak moc Dárek od nás.
Ale pak ta špatná zpráva samozřejmě.
>> [Sténání]
>> Strávil jsem hodně času těchto animací.
>> [Smích]
>> K dispozici bude přezkum zasedání letos v pondělí.
Bude to být v 17:30.
My vám připomene všech těchto detailů prostřednictvím e-mailu na kurz je
internetové stránky jen pár dní čas.
To bude natočen a zpřístupněny krátce poté.
Takže pokud nemůžete dělat, že pondělí noc slot, neboj se.
Sekce letos týden bude také zaměřit na přezkoumání na kvíz.
Pokud váš oddíl je v pondělí, což je opravdu univerzitní prázdniny, budeme
stále setkávají v části.
Pokud si prostě nemůže dělat, že část, protože budete
pryč, to je v pořádku.
Zúčastněte neděli nebo úterý oddílu nebo naladit v oddílu Jasonova, což je
k dispozici online.
>> Takže, další špatné zprávy.
Takže v souladu s osnovou, máme přednášku příští pátek.
Ale dobrá zpráva -
jasně, jsem strávil příliš mnoho času na to.
>> [Smích]
>> Budeme zrušit další pátečních přednášek.
Takže to bude dárek pro nás, takže může mít opravdu krásný odpočinek v
Mezi tento týden a dva týdny od této doby.
Takže žádné přednášky příští týden, jen malý malý kvíz, pro které by měl být
stále více vzrušený.
>> Takže pojďme se zaměřit na něco, co se ve skutečnosti vizuální
a více vzrušující a půdu za to, co se děje, že je na obzoru
jen na pár týdnů.
Po prvním testu, budeme zase zaměření našich problémových souborů na jiný
domény specifický problém, který z forenzní nebo bezpečnostních obecněji.
>> Ve skutečnosti, tradice s tímto problémem set je pro mě jeden z
výuky kolegy nebo CAS chodit po Areál přičemž některé fotografií
identifikovatelné, ale bez zjevné lidem, místa, nebo věci, pak každý rok jsem
nějak podaří omylem smazat nebo poškození digitální paměťovou kartu
že je v naší kamery.
Ale žádný velký problém.
Můžu jít dál a připojte že do svého počítače.
Můžu udělat forenzní obraz, takže mluvit, zkopírováním a nul
ty off této paměťové karty, ať už jeho karta SD nebo Compact Flash karty nebo
co jste zvyklí.
A pak můžeme předat, že ven.
>> A tak výzvou do budoucna, mimo jiné co pro vás bude psát
C kódu, který využívá spoustu JPEG pro mě a ukázalo se bude
ti lidé, místa nebo věci.
A budeme také mluvit, v tomto problému nastavit a v příštích dnech, o
grafiky obecně.
Použili jsme je, kurz, pro vypuknout.
Ale ty jsi nějak za samozřejmost existuje vysoké úrovni tyto pojmy
obdélníky a ovály.
Ale pod kapotou tam jsou pixely.
A vy jste musel začít přemýšlet o nich.
Nebo budete pro p-set 4 myslet o rozdílu mezi vaše cihel, jak
rychle jste míč pohybující se po obrazovka pro vypuknout.
Takže tam je to pojem tečky na obrazovce, která je
vstupují do hry již.
>> Teď to, co vidíte, když je to, co se dostanete na obrazovce počítače.
Pokud jste někdy sledovali nějaké dobré nebo špatný TV, je pravděpodobné, že do značné míry
léčbě publikum jako technofobií kteří nemají opravdu
vědět hodně o počítači.
A tak je to velmi snadné pro policii detektiv říci, můžete
vyčistěte, že pro mě?
Nebo zlepšit, ne?
Posílit je jako Buzz slovo v téměř jakýkoli trestný čin související show.
A realita je, pokud budete mít velmi rozmazaný obraz podezřelého dělá
něco špatného, ​​nemůžete Jen zvýšení.
Nemůžete přiblížit nekonečně.
Nevidíte v záblesk něčí oko, který spáchal, že
konkrétního trestného činu, a to navzdory Prevalence tohoto v televizi.
>> A tak s tím pojďme motivovat, aby Blížící se problém souprava s pohled na
Některé ukazuje, se kterou může být povědomý.
>> [PŘEHRÁVÁNÍ]
>> -OK.
Nyní se pojďme dobré podívat se na vás.
>> -Drž to.
Spustit to zpátky.
>> -Počkej chvíli.
Jděte vpravo.
>> -Tam.
Freeze to.
>> -Celý displej.
>> -OK.
Freeze to.
>> -Utáhněte na to, že se máš?
>> -Vector na uvedeném chlapa od zadního kola.
>> -Zoom tady na tomto místě.
>> -Se správným vybavením, zobrazované lze zvětšit a naostřené.
>> -Co je to?
>> -Je to vylepšení programu.
>> -Můžeš jasné, že se nějaké?
>> -Já nevím.
Pojďme zvýšení.
>> -Vylepšete část A-6.
>> -I lepší detail, a -
>> -Myslím, že je dost zlepšit.
Uvolněte jej do mé obrazovce.
>> -Zvýšit odraz v očích.
>> -Pojďme tento příkaz prostřednictvím Vylepšení videa.
>> -Edgar, můžete zlepšit to?
>> -Vydrž.
>> -I've pracuje na této úvahy.
>> -Někdo reflexe.
>> -Reflection.
>> -Je to odrazem z obličeje.
>> -Reflexe.
>> -Je to odraz.
>> -Přibližte na zrcadle.
>> -Můžete vidět odraz.
>> -Můžeš zlepšit image odsud?
>> -Můžete zvýšit ho tady?
>> -Můžete zlepšit to?
>> -Můžeme zlepšit to?
>> -Můžete zlepšit to?
>> -Počkej chvilku, já zlepšit.
>> -Přibližte na dveře.
>> -X10.
>> -Zoom.
>> [Smích]
>> -Nastěhování
>> -Počkej, přestaň.
>> -Stop.
>> Pauzy to.
>> -Otočit o 75 stupňů kolem vertikální prosím.
>> [Smích]
>> -Zastavte a zpět na část, o dveřím.
>> Máte-o Image Enhancer které mohou bitmap?
>> -Možná, že můžeme použít pradeep Sen způsob, jak nahlédnout do oken.
>> -Tento software je nejmodernější.
>> -Ikona hodnota je vypnuto.
>> -Se správnou kombinací algoritmů.
>> -Vzal osvětlení algoritmy další úroveň a mohu použít k
doplnění tohoto snímku.
>> -Lock a zvětšení z-osa.
>> -Vylepšete.
>> Freeze a zlepšit.
>> [END PŘEHRÁVÁNÍ]
>> David J. Malan: Takže problém Set 5 je to, co leží před námi tam.
Takže budeme brzy lépe pochopit o tom, kdy a proč se můžete
a naše nelze zvýšit tímto způsobem.
Ale nejprve pojďme vrátit naši pozornost na některé ze stavebních kamenů budeme
musí být schopni říct, že příběh.
>> Takže připomínám, že jsme vypracovali tento obrázek na Pondělí a trochu minulý týden.
A to popisuje uspořádání věcí v paměti počítače, pokud
běží nějaký program.
Tech segmentu až nahoru, odvolání, odkazuje skutečných nul a jedniček
že psát program.
Tam je, že pod některé inicializován Neinicializované údaje, které se obvykle
se vztahuje na věci, jako jsou konstanty nebo řetězce nebo globální proměnné, které mají
byl prohlášen za předem.
Tam je hromada, ale vrátíme se zpět, že za chvilku.
>> A pak je tu hromada.
Stejně jako na hromadu zásobníků v jídelna, to je místo, kde paměť dostane
vrstvené a vrstvené kdykoliv budete dělat to, co v programu?
Co je to zásobník použít pro?
>> Jo?
>> Volání funkce.
Kdykoliv volání funkce, je to vzhledem k kouskem paměti pro jeho
lokální proměnné nebo parametry.
A obrazově, vidíme, že s každým následné funkce je volána, když
volání volání B C D hovory, které se vrství do zásobníku.
A do každé z těchto plátků paměť je v podstatě unikátní rozsah
pro tuto funkci, který, samozřejmě, je problematické, pokud chcete předat
z jedné funkce na jinou část dat, která chcete ji
zmutovat nebo změnit.
>> Takže to, co bylo naše řešení umožňující Funkce reprezentován jedním zásobníku
rám změnit paměť uvnitř z jiného zásobníku rámu?
Jak ty dva mluvit k sobě navzájem?
Takže prostřednictvím ukazatelů nebo adres, které opět pouze popsat místo, kde v
paměť, a způsob, jak konkrétní skus číslo, zejména
hodnotu lze nalézt.
Tak vzpomínám minule taky jsme pokračovali příběh a podíval se na
docela buggy programu.
A tento program je kočárek pro několik důvodů, ale většina z nich je znepokojující
protože nedokáže zjistit, co?
>> Jo, to nedokáže kontrolovat vstup.
Je nám líto?
>> Pokud je to více než 12 znaků.
Takže velmi elegantně, při volání memcopy, který, jak již název napovídá, právě
kopie paměti z jeho druhý argument do první argument.
Třetí argument, velmi elegantně, je zkontrolovat, aby se ujistil, že nemáte
kopírovat více, v tomto případě, na délku baru, počet znaků,
do místa určení, která je tato pole C. Ale problém je, že to, co
pokud C sám o sobě není dostatečně velká zvládnout, že?
Budeš kopírovat počtu bajtů, že jste uvedené.
Ale co ve skutečnosti mají více bajtů, než máte prostor pro?
>> No, tento program velmi bláznivě jen slepě pokračuje vzít, co je to
dáno, ahoj zpětné lomítko 0 je skvělé, pokud řetězec je krátká
dost, stejně jako pět znaků.
Ale jestli je to opravdu 12 znaků nebo 1200 znaků, jsme viděli minule
že jste jen tak zcela přepsat paměť,
nepatří k vám.
A v nejhorším případě, pokud se přepsat, že Červená část je, že jsme nazvali
zpáteční adresa -
To je přesně tam, kde je počítač automaticky za vás, za
scény, břicha daleko 32-bitová hodnota, která připomíná to, co by mělo adresa
vrátí, až foo, to jiná funkce, se provádí spuštěním.
Je to chléb drobeček druhů , na které se vrací.
Pokud nahráváte, že potenciálně pokud jste špatný člověk, by možné
potenciálně převzít něčí počítač.
A budete určitě zhroucení ve většině případů.
>> Nyní tento problém byl jen zhoršilo když jsme začali mluvit o paměti
řízení obecně.
A malloc pro alokaci paměti, je funkce, kterou můžeme použít k přidělení
paměti, když nevíme předem že bychom mohli potřebovat.
Tak například, když jsem se vrátit ke spotřebiči zde.
A otevřu z minulého času hello2.c, připomínají tento program, která sem vypadal
Trochu něco takového, jen tři linky -
uvést své jméno, pak řetězec jméno, na levé straně, rovná GetString.
A pak jsme jej vytisknout, jméno uživatele.
>> Tak tohle je super jednoduchý program.
Aby bylo jasno, nechte mě jít napřed a aby ahoj-2.
Chystám se udělat tečku lomítko ahoj-2.
Uveďte své jméno -
David.
Enter.
Ahoj Davide.
Zdá se, že funguje OK.
Ale to, co se opravdu děje pod kapotou zde?
Nejprve pojďme sloupněte některých vrstev.
String je jen synonymem máme si uvědomil, na co?
Char hvězda.
Takže pojďme dělat to trochu tajemný ale technicky správné, že tento
je char hvězda, což znamená, že jméno, ano, je proměnná.
Ale to, co název prodejny je adresa char, která se cítí trochu divně
protože jsem se vrátit řetězec.
Začínám zpět více znaky nejsou char.
>> Ale samozřejmě, budete potřebovat pouze první char adresa si vzpomenout, kde
Celý řetězec je, protože proč?
Jak zjistit, kde konec řetězec je znát na začátku?
Zpětné lomítko nula.
Takže s těmito dvěma stopy zjistit, před začátkem a na konci
libovolný řetězec je tak dlouho, dokud jsou správně tvarované s tímto null
terminator, že zpětné lomítko nula.
>> Ale to volá GetString.
A ukázalo se, že GetString Celou tu dobu byl druh
podvádění pro nás.
Bylo to dělá tuto práci, abyste se ujistili, jak řetězec od uživatele.
Ale kde je, že paměť byla z?
Vrátíme-li se k obrázku sem použít definici z téměř
Před chvílí, že zásobník je místo, kde paměť jde, když jsou volány funkce,
podle této logiky, když zavoláte GetString, a pak jsem psát v
D--V-I-D Enter, kde je D--V-I-D lomítko nulový bod uložen, na základě
Příběh jsme řekli nám daleko?
>> Mohlo by se zdát, že je v zásobník, ne?
Voláte-li získat řetězec dostanete malý plátek paměti na zásobníku.
Takže je logické, že D--V-I-D zpětné lomítko nula je uložen
tam v zásobníku.
Ale počkej, getString vrátí tento řetězec, abych tak řekl, což znamená,
je to zásobník z jídelny je převzat ze zásobníku.
A my jsme řekli minule, že jakmile funkce vrací, a vy se, že
zásobník, abych tak řekl, ze zásobníku, co lze předpokládat, o pozůstatcích
že paměť?
Trochu jsem překleslil jako otazníky protože účinně se
neznámé hodnoty.
Které mohou být znovu použity, pokud nějaké Další funkce je volána.
>> Jinými slovy, pokud se stane, k ukládání -
Budu čerpat rychlou obrázek zde v zásobníku.
Pokud se stalo, že se čerpání spodní mého segmentu paměti, a řekneme
že toto je místo paměti obsazený hlavní a možná arg C a
arg v a něco jiného v programu, při volání GetString,
pravděpodobně dostane GetString kus paměti zde.
A pak D--V-I-D nějak skončí v této funkci.
A budu zjednodušovat.
Ale předpokládejme, že její D--V-I-D zpětné lomítko nula.
Takže toto množství bajtů se používá v rám pro getString.
>> Ale jakmile getString vrátí, budeme řekl minule, že tato paměť po
zde vše se stává - Woops! -
všichni se efektivně vymazány.
A my můžeme myslet na to teď jako otázku značky, protože kdo ví
co se děje, aby se stal z této paměti.
Opravdu, velmi často volat funkce jiné než GetString.
A jakmile jsem volat jiné funkce než GetString, možná ne v
Tento konkrétní program se jen díval na, ale nějaká jiná, jistě jiné
funkce může skončit dána Tato další místo v zásobníku.
>> Takže to nemůže být, že getString obchody D--V-I-D na stacku, protože bych
okamžitě ztratí přístup k němu.
Ale my víme, že getString vrátí pouze to, co?
Není to návrat do mi šest znaků.
Co je skutečně vrací se jsme došli k závěru minule?
Adresa první.
Tak nějak, když jsi volal GetString, je to přidělování kus paměti
Řetězec, který uživatelé typ a pak se vracet adresa ní.
A ukázalo se, že když chcete funkce alokovat paměť v tomto
způsob a návrat do osoby, která volala že funkce, adresa
že kus paměti, jste naprosto není možné, aby ji do zásobníku na
dno, protože funkčně je to jen bude to stát tobě moc
rychle, takže asi tušíte, kde budeme pravděpodobně bude hodit
místo, tzv. haldy.
>> Takže mezi spodní částí paměť je rozložení a horní paměť je
layout je celá banda segmentů.
Jedním z nich je zásobník a doprava nad ní je halda.
A halda je jen jiný kus paměť, která se nepoužívá pro funkce
když jste voláni.
Používá se na dlouhodobější paměť, když Chcete-jedna funkce chytit některé
paměti a moci pověsit na to bez ztráty kontroly nad ním.
>> Nyní by snad okamžitě vidět, že to není
nutně dokonalý design.
Jak váš program přidělené paměti na zásobník, nebo jak tomu říkáte a více
více funkcí, nebo jak si rozdělit paměť na haldě s malloc off jako
GetString dělá to, co jasně Zdá se, že nevyhnutelný problém?
>> Přesně tak.
Stejně jako skutečnost, že tyto šipky směřovaly na sebe
nevěstí nic dobrého.
A skutečně, můžeme velmi rychle dojít k selhání program, v mnoha různými způsoby.
Ve skutečnosti si myslím, že bychom mohli mít udělal náhodně jednou.
A pokud ne, jdem na to záměrně teď.
Nech mě jít dál a psát Super rychle program s názvem dontdothis.c.
A teď půjdu sem a se ostré patří stdio.h.
Pojďme deklarovat funkce foo se žádné argumenty, což je
označován jako dobře prázdnoty.
>> A jediná věc, foo se chystá udělat, je volání foo, který pravděpodobně není
nejchytřejší nápad, ale budiž.
Ent hlavní neplatné.
Nyní je jediná věc, hlavní se děje udělat, je zavolat foo stejně.
A jen tak pro legraci, já jdu dopředu a tady říkají printf "Hello from
foo ".
>> OK.
Takže když jsem nedělal žádné chyby, Udělat dontdothis dot lomítko.
A jdem na to ve větším okně -
tečka lomítko, dontdothis.
Tak pojď.
Uh oh.
Zdá se, že to můžete udělat.
Sakra.
OK.
Počkejte.
Stand by.
Měli jsme -
My jsme ji použít s make.
>> [Povzdechne si]
>> Já vím, ale myslím, že my právě smazal to.
Uh, jo.
Sakra.
Vyřešte tento Rob.
Co je?
Je to velmi jednoduché.
Jo, jsme se obrátili optimalizace off.
OK, stát ahoj.
Teď se cítím lépe.
OK.
Dobrá.
>> Takže pojďme překompilovat to -
Udělat si dontdothis.
Možná budete muset přejmenovat to dothis.c za chvíli.
Tam jdeme.
Děkuju.
OK.
Fakt, že jsem byl tisk něco, co bylo ve skutečnosti jen
zpomaluje proces, při kterém se by dosáhl tohoto bodu.
OK.
Uf!
>> Takže co se vlastně děje?
Důvodem je, stejně jako stranou, je dělat nic, pokud jde o vstup a
výstup má tendenci být pomalejší, protože psát znaky
obrazovce, má posouvat.
Tak dlouhý příběh krátký, měl jsem vlastně Stalo se to tak netrpělivá, museli bychom
viděl konečný výsledek stejně.
Teď, když jsem dostal jízdu na tisk-up, vidíme to hned.
Tak proč se to děje.
No, jednoduché vysvětlení, samozřejmě, je, že foo asi neměl
bude volat sám.
>> Nyní v obecné rovině, je to rekurze.
A mysleli jsme si pár týdnů Před rekurzivní je dobrá.
Rekurze je to magický způsob sebevyjádření Super stručně.
A to prostě funguje.
Ale tam je klíčovým rysem všech rekurzivní programy Mluvili jsme
o a podíval se na tak daleko, což bylo, že měli co?
Referenční případ, který byl nějaký pevný kódované případě tím, že v některých situacích
nevolejte foo, který je jasně není tento případ.
>> Takže to, co se skutečně děje co se týče obrázku?
No, když hlavní volá foo, že mít užitek z paměti.
Když volá foo foo, dostane plátek paměti.
Když volá foo foo, dostane kousek.
To dostane řez.
Vzhledem k tomu, foo nikdy vracet.
My nikdy mazání jedním z těch, rámy ze zásobníku.
Takže jsme profouknutí hromadu, a to uvést, kdo ví, co ještě, a
budeme překračovat hranice naší tzv. segment paměti.
Chyba jít segmentace false.
>> Takže řešení je jasně, nedělej to.
Ale větší vyplývá, že ano, tam je nějaká hranice, absolutně,
i když to není dobře definována, jak mnoho funkcí, můžete volat do
Program, kolikrát funkce mohou volat sám.
Takže i když jsme kázat rekurzi jak této potenciálně magické věci
Před pár týdny na sigma funkce, a když jsme se získat data
struktury a CS50, uvidíte další Žádosti o tom, že to není
nutně ta nejlepší věc.
Vzhledem k tomu, pokud se volání funkce, volá sama sebe, i když je tu základna
případě, pokud nechcete zasáhnout, že základní případ, 1000 pro hovory nebo hovory 10000, podle
Tehdy jste možná došly místnosti na tzv. zásobníku a stiskněte klávesu
některé jiné části paměti.
Tak to je také design trade-off mezi elegancí a mezi
robustnost váš konkrétní implementace.
>> Takže tam je další nevýhoda, nebo další chyták na to, co máme
dělal tak daleko.
Když jsem volal GetString -
nech mě jít zpátky do ahoj-2.
Všimněte si, že volám GetString, který se vrací adresu.
A tvrdí, že dnes adresa je z haldy.
A teď jsem vytištění string na této adrese.
Ale my jsme nikdy nevolal opak GetString.
Nikdy jsme museli calll funkci jako ungetstring, kde jste ruku zpět
že paměť.
Ale upřímně řečeno, jsme asi by měl být.
Protože pokud budeme pořád ptají počítač pro paměť tím, že způsob, jak někoho, jako je
GetString ale nikdy to vrátit, určitě že je také nevyhnutelně povede k
problémy, kterým jsme se spustit z paměti.
>> A ve skutečnosti, můžeme se za ně problémy s novým nástrojem, jehož použití
je trochu záhadné psát.
Ale dovolte mi jít dopředu a nešetřit ji na obrazovce jen na chvíli.
Chystám se jít dopředu a spusťte Valgrind s parametrem, jehož první příkaz
argument řádek je název tohoto programu ahoj-2.
A bohužel je to výstup je ukrutně
komplexní bezdůvodně.
Vidíme vše, co nepořádek.
David je uvedeno mé jméno.
Tak to je program, vlastně běží.
A teď si tento výstup.
>> Takže Valgrind je podobný svým duchem GDB.
Není to debugger sobě.
Ale je to vzpomínka kontrolu.
Je to program, který spustí programovat a řeknu vám, pokud budete požádáni
počítač na paměti a nikdy podal zpět, čímž což znamená, že máte
nevracení paměti.
A úniky paměti mají tendenci být špatné.
A vy jste se uživatelé počítačů mají Pravděpodobně cítil, zda máte
Mac nebo PC.
Už jste někdy použili počítač while a není restartován v několika
dny, nebo jste právě dostal hodně programy spuštěné, a ta zatracená věc
zpomalí se zastavila, nebo alespoň Je to super nepříjemné používat, protože
vše, co zrovna super slow.
>> Teď to může být libovolný počet důvodů.
Mohlo by to být nekonečná smyčka, chyba v něčí kód, nebo, více jednoduše, že
by mohlo znamenat, že používáte více paměť, nebo se snaží, než vaše
počítač ve skutečnosti má.
A možná je to chyba v nějakém programu že pořád ptají na paměti.
Prohlížeče pro roky byli notoricky známí pro to, žádají více a více paměti
ale nikdy podal zpátky.
Jistě, pokud máte pouze konečný množství paměti, nemůžete žádat
nekonečně mnohokrát pro některé z těchto pamětí.
>> A tak to, co vidíte tady, i když znovu Valgrind je výstup
zbytečně složité, aby se podíval na První, to je zajímavá část.
Heap -
v provozu na výstupu.
Tak tady je, kolik paměti je se používá v haldě na
Čas můj program ukončen -
zřejmě šest bajtů v jednom bloku.
Takže budu mávat rukama v jakém je blok.
Myslete na to je jen kus, další technický výraz pro kus.
Ale šest bajtů -
co je šest bytů, které byly ještě v použití?
>> Přesně tak.
D-A-V-I-D lomítko nula, pět písmeno Název a null terminátor.
Takže tento program Valgrind si všiml, že jsem požádal o šesti bytech, zřejmě tím, že
způsob GetString, ale nikdy dal zpátky.
A ve skutečnosti, mohlo by to být tak zřejmé, když můj program není tři
linky, ale je to 300 řádků.
Takže můžeme skutečně dát jiný příkaz linka argument Valgrind na
aby bylo více upovídaný.
Je to trochu nepříjemné pamatovat.
Ale když to udělám -
podívejme.
Leak -
Bylo to k úniku -
ani nepamatuji co je to pryč ruce.
>> - Kontrola těsnosti se rovná plné výši.
Jo, děkuji.
- Kontrola těsnosti se rovná plné výši.
Enter.
Stejný program běží.
Zadejte v Davidovi znovu.
Teď vidím trochu podrobněji.
Ale pod haldy shrnutí, což je totožná s čtyři - ah,
je to docela hezké.
Nyní Valgrind je vlastně hledá trochu těžší v mém kódu.
A to se říká, že, zdá se, malloc na řádku -
jsme oddálit.
Na řádku -
nevidíme, jaký postoj je.
Ale malloc je prvním viníkem.
Je to blog na malloc.
>> V pořádku?
OK, no.
Je to tak?
Zavolal jsem GetString.
GetString zřejmě volá malloc.
Takže to, co řádek kódu je zřejmě vinen s
přiděleno tuto paměť?
Předpokládejme, že ten, kdo napsal malloc byl asi dost dlouho, že je to
není jejich chyba.
Takže je to asi moje.
GetString v cs50.c - takže je to soubor někde na počítači -
v řádku 286 se zdá, že je viník.
Nyní předpokládejme, že CS50 bylo kolem slušné množství času, takže
my jsou neomylné.
A tak to asi není v getString že chyba spočívá, ale v
ahoj-2.c linka 18.
>> Takže pojďme se podívat na co to linka 18 byla.
Oh.
Nějak tento řádek není nutně buggy, samo o sobě, ale to je důvod,
za tím nevracení paměti.
Takže prostě super, co by intuitivně Řešením je?
Pokud se ptáte na paměti, nebyly nikdy dát zpět, a že se zdá, že je
problém, protože v průběhu času svůj počítač může spustit z paměti, může zpomalit
dolů, může špatné věci se stávají, no, to, co je jednoduché intuitivní řešení?
Dej to zpátky.
>> Jak se uvolnit, že paměť?
No, naštěstí je to docela jednoduché jen říci, bez názvu.
A my jsme nikdy nedělal.
Ale můžete v podstatě myslet zdarma jako protiklad malloc.
zdarma, je opakem přidělování paměti.
Takže teď mi dovolte překompilovat to.
Zkontrolujte, ahoj-2.
Dovolte mi jej spustit znovu. ahoj-2 David.
Takže se zdá, pracovat v přesně stejným způsobem.
Ale když jsem se vrátit do Valgrind a znovu spustit že stejný příkaz na mém nově
zkompilovaný program psaní ve jménu mém, jako předtím -
pěkné.
Heap shrnutí -
používané na výstupu -
nula bajtů nulových bloků.
A to je super hezký, všechny haldy bloky byli osvobozeni.
Žádné úniky jsou možné.
>> Takže přijít, ne problému Sada 4, ale Problem Set 5, forenzní
a následující roky, to také stane měřítkem správnosti vašeho
Program, zda máte nebo nemáte nebo nemají k nevracení paměti.
Ale naštěstí, můžete nejen rozum skrze ně intuitivně, což
je, pravděpodobně, snadné malých programů ale těžší větších programů,
Valgrind, pro ty větší programy, vám může pomoci identifikovat
konkrétní problém.
>> Ale je tu ještě jeden další problém které by mohly vzniknout.
Dovolte mi otevřít tento soubor zde, což je Opět platí, že poněkud jednoduchý příklad.
Ale pojďme se zaměřit na to, co Tento program dělá.
To se nazývá memory.c.
Budeme tento post později dnes zip dnešní zdrojového kódu.
A zjistíte, že mám funkci nazvanou f že žádné argumenty a
nevrací nic.
V řádku 20, jsem prý prohlásil ukazatel na int a volat to x.
Jsem přiřazení je návrat hodnota malloc.
A jen aby bylo jasno, kolik bajtů am Asi jsem se vrátit z malloc
v této situaci?
>> Asi 40.
Kde jsi to vzal?
No, jestli si vzpomínáte, že int je často 4 bajty, je přinejmenším v
zařízení, 10 krát 4 je samozřejmě 40.
Takže malloc vrací adresu na kus paměti a skladování, které
řešení nakonec v x.
Takže aby bylo jasno, co pak se to děje?
No, dovolte mi vrátit zpět na našem obrázku zde.
Dovolte mi, abych nejen kreslit hloubi paměti počítače, nech mě jít napřed a
nakreslit celý obdélník, který představuje všechny mé paměti RAM.
>> Řekneme, že zásobník je na dně.
A je tu textový segment se Neinicializované údaje.
Ale já jsem prostě jít na ty abstraktní jiné věci daleko jako tečka, tečka tečka.
Jdu jen se odkazovat na to jako hromadu v horní části.
A pak v dolní části obrázku, představují hlavní, já jdu
aby jí plátky paměť na zásobníku.
Pro f, jdu dát plátek paměti na zásobníku.
Teď jsem se dostal do prohlížím svůj Zdrojový kód znovu.
Jaké jsou lokální proměnné pro hlavní?
Zřejmě nic, takže řez je účinně prázdná nebo dokonce ani tak velký,
jak jsem čerpány.
Ale f, mám lokální proměnné, který se nazývá x.
Takže jsem jít dopředu a dát f kus paměti, volat to x.
>> A teď malloc 10 krát 4, Takže malloc 40, kde je to
paměť přichází?
Jsme není vykreslen obrázek jako předtím.
Ale předpokládejme, že je to skutečně přichází odtud, tak jeden,
dva, tři, čtyři, pět.
A teď musím 40 z nich.
Tak jsem si prostě udělat tečku, tečka, tečka navrhnout že tam je ještě více paměti
návratu z haldy.
Teď, co je adresa?
Zvolme libovolný naše řešit jako vždy -
Ox123, i když to asi bude být něco úplně jiného.
To je adresa prvního bajtu v paměti, že se ptám na malloc.
>> Takže ve zkratce, jakmile řádek 20 vykoná, co je doslova
uložené uvnitř x tady?
Ox123.
A vůl je nezajímavý.
To jen znamená, že tady Hexadecimální číslo.
Ale co je klíčové je, že to, co jsem obchod x, což je místní proměnná.
Ale jeho datový typ, opět je adresa int.
No, já jdu uložit Ox123.
Ale na druhou stranu, pokud je to trochu moc složitý zbytečně, když jsem listovat
zpět, můžeme to pryč docela abstraktní rozumně a jen říct, že x je
ukazatel na tento kus paměti.
>> OK.
Nyní je otázka, na dosah ruky je následující -
linka 21, jak se ukázalo, je chybné.
Proč?
>> Je nám líto?
To nemá -
tvrdí, že ještě jednou.
No, to není zadarmo.
Tak to je druhý, ale.
Takže je tu ještě jedna, ale specificky na řádku 21.
>> Přesně tak.
Tento jednoduchý řádek kódu je jen buffer overflow, přetečení vyrovnávací paměti.
Vyrovnávací paměť znamená jen kus paměti.
Ale to kus paměti o velikosti 10, 10 celých čísel, což znamená, že pokud bychom
index do ní pomocí syntaktický cukr z pole notaci, náměstí
držáky, máte přístup k x držák 0 x držák 1 x,
Držák tečka, tečka, tečka.
x držák 9 je největší.
Takže když udělám x držák 10, kde Já jsem vlastně děje v paměti?
>> No, když mám 10 int -
pojďme vlastně kreslit vše z nich tady.
Takže to byl první pět.
Zde je dalších pět ints.
Takže x držák 0 je tady. x držák 1 je zde. x držák 9 je tady. x držák
10 je tady, což znamená, že říkám, v řádku 21, počítač, aby
číslo, kde?
Číslo 0, kde?
No, to je 0, tak ano.
Ale jen to, že její 0 je tak trochu náhoda.
Mohlo by to být číslo 50, pro všechny staráme.
Ale snažíme se, aby to na x držáku 10, což je místo, kde toto
Otazník je koncipován, což není dobrá věc.
Tento program by mohl velmi dobře havárie jako výsledek.
>> Nyní pojďme dál a uvidíme, jestli to je skutečně to, co se stane.
Aby paměti, protože soubor se nazývá memory.c.
Pojďme dál a spusťte programové paměti.
Takže jsme měli štěstí, ve skutečnosti, zdá se.
Měli jsme štěstí.
Ale uvidíme, jestli budeme nyní běží Valgrind.
Na první pohled by se mohlo můj program Zdá se, že je naprosto správné.
Ale dovolte mi spustit Valgrind se - Kontrola úniku odpovídá plné paměti.
>> A teď, když jsem tento příkaz -
zajímavé.
Neplatný zápis o velikosti 4 na řádek 21 memory.c.
Linka 21 memory.c je, který z nich?
Oh, zajímavé.
Ale počkejte.
Velikost 4, jak je to s odkazem na?
Jen jsem se jednou napsat, ale je to o velikosti 4.
Proč je to 4?
Je to proto, že je to int, což je opět čtyři bajty.
Takže Valgrind našli nějakou chybu, že jsem, podíval se na mém kódu, ne.
A možná vaše TF nebo by ne.
Co však Valgrind jistě zjistil, že že jsme udělali chybu, dokonce
ale měli jsme štěstí, a počítač rozhodl, co, nebudu se zhroutí
jen proto, že jste se dotkli jeden bajt, jeden INT stojí za paměti, že ne
ve skutečnosti vlastní.
>> No, co jiného je buggy zde.
Adresa -
To je šílené hledá adresa v šestnáctkové soustavě.
To jen znamená, že někde v haldě je nula bajtů po bloku o velikosti 40
je přiděleno.
Dovolte mi přiblížit tady a uvidíme, jestli je to trochu vstřícnější.
Zajímavý.
40 bajtů definitivně ztratil v záznam ztráty 1 z 1.
Opět platí, že více slov, než je zde velmi užitečná.
Ale na základě zvýrazněné linie, kde asi bych měla zaměřit moje
pozornost na další bug?
Vypadá to, že linky 20 memory.c.
>> Takže když se vrátíme k řádku 20, to je ten, který jste určili dříve.
A to nemusí být nutně buggy.
Ale my jsme to zvrátit jeho účinky.
Tak jak to mám opravit alespoň jeden z těchto chyb?
Co jsem mohl dělat po řádku 21?
Co jsem mohl udělat bez x, takže je vrátit, že paměť.
A jak mohu opravit tuto chybu?
Měl bych určitě jít ne dál než 0.
Takže dovolte mi, abych se pokusila znovu spustit tento.
Omlouváme se, ale určitě jít ne dál než 9.
Udělat paměti.
Dovolte mi, abych znovu Valgrind ve větším okně.
A teď se podívejte.
Pěkný.
Všechny bloky haldy byli osvobozeni.
Žádné úniky jsou možné.
A tady nahoře, tam žádná zmínka některého z neplatné práva.
>> Jen dostat chamtivý a pojďme zjistit, zda další ukázkou
nejde jak má -
Jsem štěstí před chvílí.
A skutečnost, že je to 0 je možná zbytečně zavádějící.
Udělejme 50, poněkud svévolné počet, značka paměti dot slash paměť -
ještě štěstí.
Nic shazovat.
Dejme tomu, že to prostě udělat něco opravdu hloupé, a já 100.
Dovolte mi, abych předělat paměti, tečka lomítko paměť -
štěstí znovu.
Jak se o 1000?
ints mimo, hrubě, kde bych měl být?
Udělat paměť -
sakra.
>> [Smích]
>> OK.
Pojďme se flákat už ne.
Znovu paměti.
Tam jdeme.
Dobrá.
Takže zřejmě budete index 100000 ints než kde byste měli být v
paměti, špatné věci se stávají.
Tak to samozřejmě není tvrdé, rychlé pravidlo.
Byl jsem tak trochu s použitím zkušební a chyba se tam dostat.
Ale to je proto, že dlouhý příběh krátký, paměti počítače je také rozdělena
do těchto věcí tzv. segmenty.
A někdy, že počítač skutečně vám dal trochu více paměti
než se zeptáte na.
Ale účinnost, je to prostě jednodušší získat více paměti, ale pouze ti
že jste stále část.
>> A pokud budete mít štěstí někdy, Proto, měli byste být schopni dotknout
paměť, která nepatří k vám.
Nemáte žádnou záruku, že to, co hodnota dáte tam zůstane tam, protože
počítač stále si myslí, že to není tvoje, ale není to nutně děje
udeřit do dalšího segmentu paměti v počítač a vyvolat takovou chybu
tohle tady.
Dobrá.
Jakékoliv dotazy pak na paměť?
>> Dobrá.
Pojďme se podívat zde, pak na něco, co jsme užívali pro
poskytnuta na nějakou dobu, která v tomto souboru s názvem cs50.h.
Tak to je soubor.
To jsou jen celá parta komentářů do horní části.
A možná jste se na tuto možnost, pokud si tropil kolem na přístroji.
Ukazuje se však, že po celou dobu, když jsme používali řetězec jako
synonymum prostředky, které jsme deklarovali které bylo synonymem s tímto
klíčové slovo typedef pro definici typu.
A my jsme v podstatě říká, aby navléci synonymum pro char hvězdy.
, Že prostředky, které zásobníku vytvořili tyto tréninkové kola známé jako
řetězec.
>> Tady je to jen prototyp pro getchar.
Jsme mohli vidět dříve, ale to je opravdu to, co dělá. getchar
žádné argumenty, vrací char.
getdouble žádné argumenty, vrací double.
getfloat žádné argumenty, vrátí float, a tak dále.
vezmi_int je tady. getlonglong je tady.
A GetString je tady.
A je to.
Tato fialová linka je další preprocesor směrnice, protože
hashtag na jeho začátku.
>> Dobrá.
Takže teď mě nech jít do cs50.c.
A nebudeme mluvit příliš dlouho na to.
Ale aby vám pohled na to, co je se děje na všechno
čas, nech mě jít do -
jdem getchar.
Takže getchar je většinou komentáře.
Ale vypadá to takhle.
Tak tohle je skutečná funkce getchar, že jsme byli
přičemž za samozřejmost existuje.
A i když jsme se použít tohle že často, pokud vůbec, je to alespoň
poměrně jednoduchý.
Takže je to stojí za to Rychlý pohled na zde.
>> Takže getchar má nekonečnou smyčku, záměrně tak zdánlivě.
Potom zavolá - a to je druh pěkný opětovné použití kódu sami napsali.
Volá GetString.
Protože to, co dělá znamená dostat char?
No, můžete se pokusit získat celý řádek textu od uživatele a
pak se stačí podívat na jeden z těchto znaků.
V souladu 60, tady je to trochu trochu zdravý rozum kontroly.
Pokud GetString vrátil null, pojďme nepokračuje.
Něco je špatně.
>> Teď je to trochu nepříjemné, ale konvenční C. char max. pravděpodobně
představuje to, co právě na základě jeho jméno?
Je to konstanta.
Je to jako číselnou hodnotu Největší char můžete reprezentovat s
jedno kousnutí, což je pravděpodobně číslo 255, což je největší číslo, které
představují osm bitů, od nuly.
Takže jsem se využít této funkce, v této funkci, kdy psaní tohoto kódu jen proto,
pokud se něco pokazí, ale getchar jeho účel v životě je vrátit
char, musíte být schopni nějak najevo, že uživatel, který
se něco pokazilo.
Nemůžeme vrátit hodnotu null.
Ukazuje se, že je nulový ukazatel.
A opět, getchar má vrátit char.
>> Takže úmluva, pokud se něco špatně, vy, programátor, nebo
V tomto případě jsem se do knihovny, měl jsem jen rozhodnout libovolně, pokud
se něco pokazí, budu vrátí číslo 255, která je skutečně
znamená, že nemůže uživatel nemůže zadat znak reprezentován
číslo 255, protože jsme měli ukrást jako tzv. sentinelové hodnotu
představují problém.
Nyní se ukazuje, že charakter 255 není něco, co můžete psát na
klávesnice, takže to není velký problém.
Uživatel nevšimne, že Já jsem ukradl tento znak.
Ale pokud jste někdy v manuálových stránkách na počítačový systém nějaký odkaz
všechny čepice konstantní, jako je tato, která říká, v případě chyby tato konstanta může
být vráceny, to je všechno nějaký člověk udělal lety byl svévolně rozhodla
vrátit tuto speciální hodnotu a říkat konstanta v případě
se něco pokazí.
>> Nyní magie stane tady.
Za prvé, já jsem prohlásil v souladu 67 dvě postavy, C1 a C2.
A pak v řadě 68, je to vlastně řádek kódu, který je připomínající
náš přítel printf vzhledem k tomu, že má mít procent Čs v uvozovkách.
Nevšimnout, co se tu děje. sscanf znamená řetězec skenování -
znamená, že skenování formátu řetězec, ergo sscanf.
Co to má znamenat?
To znamená, že předáte sscanf řetězec.
A linka je cokoliv uživatel zadá palců
Můžete přejít na sscanf formátovací řetězec jako to, že říká, scanf, jaké jsou
Doufáte, který zadal uživatel palců
Ty pak předat v adresách dvou kousky paměti, v tomto případě,
protože mám dva zástupné symboly.
Tak jsem dám jí adresu C1 a C2 na adresu.
>> A připomínají, že dáte funkci, Adresa nějaké proměnné, co je
implikace?
Co může dělat, že funkce v důsledku dát jí adresu
Proměnná, na rozdíl od proměnná sám?
To lze změnit, ne?
Pokud jste měl někoho mapu pro fyzické adresu, mohou jít tam a udělat
co chtějí na této adrese.
Stejná myšlenka tady.
Pomineme-li, aby sscanf, adresa, ze dvou kousky paměti, dokonce i ty malé
malé kousky paměti, C1 a C2, ale řekneme jí adresu z nich,
sscanf jej změnit.
>> Takže sscanf je smysl života, když čteme manuálové stránky, je přečíst, co
uživatel zadali, doufám, že pro uživatele s zadali znak a možná
jiný znak, a to bez ohledu na uživatele napsal první znak pokračuje
zde, druhý znak jde zde.
Nyní, stejně jako stranou, a vy by jen vím to z dokumentace,
Skutečnost, že jsem dal mezeru tam prostě znamená, že je mi jedno, jestli
uživatel narazí na mezerník málo krát, než on nebo ona má
charakter, budu ignorovat jakýkoli bílý prostor.
Takže, já vím od dokumentace.
>> Skutečnost, že je druhý% c následovaný mezerou je ve skutečnosti
úmyslné.
Chci být schopni zjistit, zda uživatel podělal nebo nespolupracovali.
Takže doufám, že jen uživatel napsal v jednom znaku, a proto doufám,
že sscanf je teprve ve chvíli vrátit hodnota 1, protože, opět, když jsem četl
dokumentace, sscanf je účel život je pro návrat do počtu
proměnné, které byly vyplněny uživatelského vstupu.
>> Prošel jsem ve dvou proměnných adresy, C1 a C2.
Doufám však, že pouze jeden z je zabit, protože pokud sscanf
vrací2, co je pravděpodobně implikace logicky?
Že uživatel nebyl jen mi jednu charakter, jako bych mu nebo jí.
Pravděpodobně zadali při nejméně dva znaky.
Takže když jsem místo toho neměl druhý % C, jen jsem měl jeden, který
Upřímně řečeno by být více intuitivní přístup, myslím, že první pohled,
budete nebude schopen detekovat pokud byl uživatel dává vám více
Vstupní než jste vlastně chtěli.
Tak to je implicitní forma z kontroly chyb.
>> Ale zjistíte, co dělám tady.
Jednou jsem si jistý, že mi dal jeden uživatel postava, jsem uvolnit linku, dělat
opak getString, což používá malloc, a pak se vrátím
C1, charakter, že jsem doufal, že uživatel k dispozici a pouze za předpokladu.
Tak rychle zahlédl jen, ale všechny otázky týkající se getchar?
Vrátíme se k některým z ostatních.
>> No, nech mě jít dál a dělat to - Předpokládám, že teď, jen motivovat
diskuse v týdnu a navíc čas, to je soubor s názvem structs.h.
A opět, je to jen chuť něčeho, co leží před námi.
Ale všimněte si, že hodně toto je komentář.
Takže mi dovolte zdůraznit pouze Zajímavostí teď.
typedef -
tam je to stejné klíčové slovo znovu.
typedef používáme deklarovat řetězec jako zvláštní typ dat.
Můžete použít typedef vytvořit zbrusu nový datové typy, které neexistovaly, když
C byl vynalezen.
Například, int přichází s C. char Dodává se s C. double přichází s C. Ale
není pojem studenta.
A přesto, že by bylo docela užitečné mít schopni napsat program, který ukládá
do proměnné, student ID číslo, jejich jméno, a jejich dům.
Jinými slovy, tři kusy dat, jako int a
string a jiný řetězec.
>> S typedef, co je dost silný o tom, a klíčovým slovem sturct pro
struktura, vy, programátor v roce 2013, může skutečně definovat vlastní
datové typy, které neexistovaly let zpátky, ale to vyhovovalo vašim požadavkům.
A tak zde, v řádcích 13 až 19, jsme se prohlašuje, že nový datový typ, například
int, ale nazývat to studentka.
A uvnitř této proměnné se chystá tři věci - int, string,
a řetězec.
Takže si můžete myslet, co je opravdu stalo, i když je to
kousek zjednodušení pro dnešek, student je v podstatě děje
takhle vypadat.
Jeho bude kus paměť s ID, jméno
pole a dům pole.
A budeme moci využít tyto kusy paměti a přistupovat k nim takto.
>> Když jdu do struct0.c, zde je poměrně dlouho, ale po
vzor, ​​kód, který používá tento nový trik.
Takže v první řadě mi dovolte, abych vás upozornil na zajímavých částí nahoru nahoru.
Sharp definuje studenty 3, prohlašuje, konstantní tzv. studenti a nabyvatelé
je libovolně číslo 3, jen takže mám tři studenty pomocí
Tento program nyní.
Tady je hlavní.
A všimněte si, jak Prohlašuji, řada studentů?
No, jen jsem použít stejnou syntaxi.
Slovo Student je samozřejmě nové.
Ale student, třída, konzolové studenti.
>> Takže bohužel je tu spousta opětovného použití pojmů zde.
To je jen číslo.
Takže to je jako říct tři.
Třída je jen to, co chci volat proměnnou.
Mohl bych říkat, že studenti.
Ale třída, to není třída ve objektově orientované Java druh způsobem.
Je to jen třída studentů.
A datový typ každého prvku v tomto poli je studentem.
Tak to je trochu jinak az říká něco
takhle, je to jen -
Říkám, dej mi tři studenty a volat, že třídu pole.
>> Dobrá.
Tady je to čtyři smyčky.
Ten chlap zná - iterate od nuly až na tři.
A tady je nový kus syntaxe.
Program bude podněcovat mě, člověk, aby to student
ID, což je int.
A tady je syntaxe, pomocí kterého můžete uložit něco do pole ID na
Umístění třída držák I. Tak tato syntaxe není nic nového.
To prostě znamená, že mi osmý studentů ve třídě.
Ale to je symbol nové.
Až do této chvíle jsme nelze použít tečku, alespoň v kódu jako je tato.
To znamená jít do struct známý jako student a dát tam něco.
Stejně tak v této další řádek, 31, přejít dopředu a dejte, co uživatel zadá
na jméno tady a co dělají pro dům, totéž, jděte do toho a
vložte jej do. domu.
>> Takže to, co dělá tento program nakonec dělat?
Můžete vidět malou ukázku tam.
Nech mě jít dál a dělat, aby structs 0 tečka lomítko struct 0, student ID 1,
řekl David Mather, student ID 2.
Rob Kirkland, student ID 3.
Lauren Leverit -
a jediné, co tento program udělal, který je jen zcela svévolné, je
Chtěl jsem udělat něco, co s těmito daty, teď, když jsem učil nás, jak se
používat structs, je, že jsem prostě musel Tato extra smyčka zde.
I iterovat přes pole studentů.
Použil jsem svou, možná teď známý přítel, řetězec porovnání, stircomp na
Kontrola je 8. studenta dům rovná Mather?
A pokud ano, stačí něco vytisknout libovolně ráda, ano, je.
Ale na druhou stranu, jen to, že mi příležitosti používat a opakovaně a
znovu tuto novou dot notace.
>> Takže koho to zajímá, že?
Přijít s studentského programu poněkud svévolné, ale ukázalo se,
že můžeme dělat užitečné věci s to, například následujícím způsobem.
To je mnohem složitější struct v C. Je tu tucet nebo více polí,
poněkud nesrozumitelné názvy.
Ale pokud jste někdy slyšeli o grafický formát souboru s názvem bitmapa, BMP, to
Ukazuje se, že bitmapový formát souboru skoro vypadá, že.
Je to malá hloupá smajlíky.
Je to malý obrázek, který jsem přiblížení na dost velký, takže jsem mohl vidět každý
jednotlivých bodů neboli pixelů.
Nyní se ukazuje, můžeme představovat černá tečka s, řekněme, číslo 0..
A bílá tečka s číslem 1.
>> Takže jinými slovy, pokud chcete kreslit Smajlík a kromě toho, že obraz v
počítač, postačí pro uložení nuly a ty, které vypadají jako to, kde,
znovu, ty jsou bílé a nuly jsou černé.
A společně, pokud skutečně máte gird jedniček a nul, máte
mřížka obrazových bodů, a pokud si položit je ven, máte roztomilá
malý smajlíky.
Nyní bitmapový obrázek formátu BMP, je efektivně, že pod kapotou
ale s více pixelů Sot, že může skutečně reprezentovat barvy.
>> Ale když máte sofistikovanější formáty souborů jako BMP a JPEG a GIF
se kterou by mohlo být známé, které soubory na disku obvykle není pouze
mají nul a jedniček na obrazových bodů, ale mají nějaký metadata a -
meta v tom smyslu, že ve skutečnosti není dat, ale to je užitečné mít.
Takže tato pole tady naznačujete, a uvidíme to podrobněji v P-set
5, že před nul a jedniček, které představují obrazové body v obraze,
je tu banda metadat, jako velikost snímku a
šířka obrazu.
A všimněte si, já jsem škubání pryč některé libovolné věci zde -
šířka a výška.
Bit obraz a některé další věci.
Takže tam je nějaký metadata v souboru.
>> Ale tím, že pochopení toho, jak jsou stanoveny soubory se tímto způsobem, můžete skutečně
pak manipulovat s obrázky, obnovit obrázky z disku, velikost obrázků.
Ale to nejde nutně zlepšit je.
Potřeboval jsem fotografii.
Tak jsem šel zpátky do RJ zde, který jsi viděl Na obrazovce se poměrně dlouhou dobu před.
A když otevřu Keynote tady, je to co se stane, když se pokusíte přiblížit a
zvýšení RJ.
On nedostávají žádné opravdu lepší.
Nyní Keynote je trochu rozmazaný, že trochu, jen zakrývat
Skutečnost, že RJ nedostane zvlášť lepší, když obraz zvětšíte
A pokud se to udělat tímto způsobem, vidět na náměstí?
Ano, můžete určitě vidět čtverce na projektoru.
>> To je to, co dostanete, když budete zvýšit.
Ale v pochopení toho, jak naše RJ nebo Smajlík je realizován nám umožní
vlastně psát kód, který manipuluje tyto věci.
A já myslel, že bych skončit na této poznámce, se 55 sekund na zvýšení je to,
Troufám si řekněme poněkud zavádějící.
>> [PŘEHRÁVÁNÍ]
>> -Lže.
O co, já nevím.
>> -Tak co víme?
>> -To v 09:15 Ray Santoya byl u bankomatu.
>> -Takže otázka je, co dělal v 9:16?
>> -Střelba devět milimetrů na něco.
Možná viděl odstřelovače.
>> -Nebo se s ním pracovat.
>> -Počkej.
Vraťte se jeden.
>> -Co vidíš?
>> -Přineste mu lícem nahoru, na celé obrazovce.
>> -Jeho brýle.
>> -Je to odraz.
>> -To je baseball Neuvitas tým.
To je jejich logo.
>> A mluví s tím, kdo je na sobě bundu.
>> [END PŘEHRÁVÁNÍ]
>> David J. Malan: To bude Problém je sada 5.
Uvidíme se příští týden.
>> MALE SPEAKER: Na další CS50.
>> [Cvrcku]
>> [Přehrávání hudby]