>> [Prehrávanie hudby]
>> David J. Malan: Dobre.
>> [Smiech]
>> Vitaj späť.
Toto je CS50.
A to do konca týždňa päť.
A až do teraz, máme celkom veľa bral za samozrejmé, že
existuje tento kompilátor, klap, ktoré ste bolo vyvolanie prostredníctvom tejto
ďalší nástroj s názvom Urobiť to nejako ako mávnutím čarovného prútika zmení váš zdrojový kód
do objektového kódu, sa núl a jedničiek že vaše počítače CPU, centrálne
procesorová jednotka, skutočne rozumie.
Ale ukazuje sa, že je to číslo, ktoré je deje pod kapotou v
medzi vstupom a výstupom.
>> A ja by som chcel navrhnúť, aby sa mäso že v trochu podrobnejšie do
Tieto štyri kroky, mať niečo, čo nazýva predspracovanie, čo
tzv kompilácie, ktoré sme videli, niečo ako montáž a
niečo, čo nazýva prepojenie.
Takže až do teraz, v niektorej z našich programy, sme mali ostré obsahuje.
V poslednej dobe sme mali nejaké ostré definuje konštánt.
Tak to dopadá, že tie veci, ktoré majú pred hash symbol alebo
libra symbol sú pre-procesor smernice.
To je len ozdobný spôsob, ako hovoriť, že je to riadok kódu, ktorý je vlastne
prevedené do niečoho iného, ​​než sa Počítač sa dokonca pokúsiť previesť svoje
Program do núl a jednotiek.
>> Napríklad, ostrý obsahuje štandardné I / O. H, do značnej miery jednoducho znamená ísť
dopredu, chytiť obsah súborov stdio.h a vložiť ich priamo tam.
Takže žiadne núl a jedničiek v tomto bode ešte.
Je to naozaj len substitúcia.
A to sa stalo počas tzv pre-fáze spracovania, pri
vlastne beží Clang alebo špecificky Aby sa vo väčšine prípadov.
Takže všetko sa dialo Prvý automaticky tak ďaleko.
>> Potom prichádza krok kompilácie.
Ale boli sme príliš zjednodušený kompilácie.
Kompilácia programu naozaj znamená vezmite si ju z niečoho, ako je C,
Zdrojový kód sme písali, sa na niečo, čo nazýva montáž.
Jazyk symbolických inštrukcií je nižšia úroveň jazyk, ktorý našťastie nebudeme
majú veľa príležitostí na napísať tento semester.
Ale to je na najnižšej úrovni v pocit, že ste doslova začať písať
sčítať a odčítať a násobiť a načítať z pamäte a uložiť do pamäte,
veľmi základné pokyny, ktoré počítač, pod kapotou,
skutočne rozumie.
>> Konečne, montáž sa tento jazyk do núl a jednotiek, ktoré sme boli
popisovať tak ďaleko.
A naozaj nakoniec, je tu tzv prepojenie fázy, ktoré použijeme
vidieť za chvíľu, ktorá spája Vaše núl a jedničiek s nulami a
tie ostatné ľudia pred ste vytvorili.
>> Takže zvážte to super jednoduchý program.
To bolo od 1. týždňa.
Je to len povedal, Hello World, na obrazovke.
Bežali sme to cez Clang.
Alebo sme bežali, že cez Urobiť ktorý bežal Clang.
A výstup v čase, keď niektoré núl a jednotiek.
Ale ukazuje sa, že je medzikrok.
Keď idem sem - pardon, nie Chcem ho vidieť ešte.
Keď idem sem k môjmu spotrebiče a otvorím hello.c, tu
je to rovnaký program.
A čo budem robiť vo svojom termináli Okno je tu budem
spustiť Clang skôr ako značka, ktorá automatizuje všetky štyri
tieto kroky u nás.
A ja budem robiť klap-S a potom hello.c a zadajte.
>> A ja si blikajúce výzva znova, čo je dobré.
A teraz v mierne väčšie okno, Idem otvoriť gedit tu.
A ja idem otvoriť súbor, ktorý, Ukázalo sa, že je to tzv hello.s
obsahuje toto jazyk symbolických inštrukcií Som sa zmienil predtým.
A to je to, čo sa nazýva montáž jazyk, pomerne nízkej úrovni
inštrukcie, že váš procesor Intel alebo čo to je, že je vo vnútri
chápe.
A mov je k nasťahovaniu. Výzva je určená pre volanie, veľmi nízku úroveň funkcie.
sub je pre odčítanie.
>> Takže keď máte konkrétny procesor vnútri počítača, čo je to
odlišné verzus ostatné procesorov na trhu, ktorý je inštrukcia sa
chápe a často, ako efektívne je je, ako rýchlo je na vykonávanie niektorých
z týchto inštrukcií.
Teraz pre viac na túto tému, môžete sa Ďalší pád CS61 na vysokej škole.
Ale tu sa, napríklad, niekoľko identifikátory, ktoré by mohli pripadať povedomý.
hello.c je názov programu.
>> . Textu -
že to nie je moc zaujímavé, že práve teraz, pripomínajú, že text
segmentu, v pondelok, je miesto, kde v Pamäť váš program vlastne skončí.
Tak to aspoň hmlisto pozná tam.
Tu sa samozrejme, je zmienka našou hlavné funkcie.
Rolovanie dole, tie nájdete na veci tzv registre, veľmi malé kúsky
pamäť vnútri vašej aktuálnej CPU.
A keď som sa posunúť nadol, aj ďalej, vidím nejaký
nepriame zmienky o ASCII.
A tam, samozrejme, je to, že reťazec, ahoj, čiarka, svet.
>> Tak dlhý príbeh krátky, to bolo deje pre vás, automaticky,
pod kapotou celú túto dobu.
A to, čo sa deje v skutočnosti je jednou čo ste spustili Clang, alebo prostredníctvom
Skontrolujte, že ste stále po prvý raz, zo zdrojového kódu,
tzv jazyku symbolických inštrukcií.
Potom zvonenie je prevod tohto zhromaždenia jazyk až do núl a jednotiek.
A to je snímka, ktorý sme začali naša diskusia v týždni 0, o -
a potom týždeň 1 ďalej.
A nakoniec, tie nuly a jednotky sú v kombinácii s nulami a jednotkami
z týchto knižníc sme sa pri za samozrejmosť, ako je Standard I / O alebo
String knižnice, alebo dokonca CS50 knižnica.
>> Takže maľovať tento obrázok viac vizuálne, máme hello.c.
A, samozrejme, používa printf fungovať povedať, hello world.
Kompilácia krok sa dole do tento súbor sme práve videli hello.s, a to aj
že aj keď je zvyčajne odstránený automaticky za vás.
Ale to je kód assembleri uprostred kroku.
A potom, keď sme sa zostaviť zostavy jazyk, aby som tak povedal, to je, keď ste
dostať tie núl a jednotiek.
Takže sme priblížili efektívne dnes čo sme užívali ako samozrejmosť,
znamená ísť zdrojový kód objektového kódu.
>> Ale nakoniec, teraz ten rovnaký obrázok - poďme strčiť ju do
na ľavej strane.
A všimnime si, že vo vrchole Zmienil som sa stdio.h.
Je to súbor, ktorý sme súčasťou takmer vo všetkých
programy, písali sme.
A to je ten súbor, ktorého obsah dostať kópiu vložiť,
účinne vrchole kódu.
Ale ukazuje sa, že na počítači systém niekde, tam je pravdepodobne
stdio.c súbor, ktorý niekto napísal rokov pred, ktorý implementuje všetky
funkcie, ktoré sú deklarované v stdio.h.
>> Teraz v skutočnosti je to asi nie je na Mac alebo PC, alebo dokonca v
CS50 spotrebič je surový C kód.
Niekto už skompilovaný a to vrátane . O súbor pre cieľový kód alebo.
súbor, ktorý odkazuje na zdieľané knižnice , Ktorý bol predinštalovaný a
predkompilované pre vás.
Ale predpokladám, že tam skutočne existuje na našom počítači stdio.c v paralelnej
s Clang.
Váš kód je skompilovaný a zmontované.
stdio.c je kód sa kompiluje a zostavené tak, že práve táto posledná
krok, tu dole, musíme nejako odkaz, aby som tak povedal, vaše núl a jedničiek
s jeho alebo jej núl a jednotiek do jedného jednoduchý program, ktorý v konečnom dôsledku je
volal len Hello.
>> Tak to je všetko o kúzle, ktoré je sa deje tak ďaleko.
A bude aj naďalej, aby sa tieto procesy samozrejmosť, ale uvedomiť,
je tu veľa šťavnatých detailov deje pod tam.
A to je to, čo robí vaša počítač s Intel Inside
obzvlášť zreteľný.
>> Takže v takom prípade, ak chcete, aby Pripojte sa k nám na obed v piatok, to ísť
na obvyklom mieste cs50.net/rsvp, 13:15 tento piatok.
A teraz niekoľko oznámení.
Takže máme dobrú správu.
A máme zlé správy.
Začnite s nejakou dobrou správou tu.
>> [Stonanie]
>> Dobrá.
No, je to technicky dovolenku, tak to nie je tak moc Darček od nás.
Ale potom tá zlá správa samozrejme.
>> [Stonanie]
>> Strávil som veľa času týchto animácií.
>> [Smiech]
>> K dispozícii bude preskúmanie zasadnutí tento rok v pondelok.
Bude to byť o 17:30.
My vám pripomenie všetkých týchto detailov prostredníctvom e-mailu na kurz je
internetové stránky len pár dní čas.
To bude natočený a sprístupnené krátko potom.
Takže ak nemôžete robiť, že pondelok noc slot, neboj sa.
Sekcia tento rok týždeň bude tiež zamerať na preskúmanie na kvíz.
Ak váš oddiel je v pondelok, čo je naozaj univerzitné prázdniny, budeme
stále stretávajú v časti.
Ak si jednoducho nemôže robiť, že časť, pretože budete
preč, to je v poriadku.
Zúčastnite nedeľu alebo utorok oddielu alebo naladiť v oddieli Jasonova, čo je
k dispozícii online.
>> Takže, ďalšie zlé správy.
Takže v súlade s osnovou, máme prednášku budúci piatok.
Ale dobrá správa -
jasne, som strávil príliš veľa času na to.
>> [Smiech]
>> Budeme zrušiť ďalšie piatkových prednášok.
Takže to bude darček pre nás, takže môže mať naozaj krásny odpočinok v
Medzi tento týždeň a dva týždne od tejto doby.
Takže žiadne prednášky budúci týždeň, len malý malý kvíz, pre ktoré by mal byť
stále viac vzrušený.
>> Takže poďme sa zamerať na niečo, čo sa v skutočnosti vizuálnej
a viac vzrušujúce a pôdu za to, čo sa deje, že je na obzore
len na pár týždňov.
Po prvom teste, budeme zase zameranie našich problémových súborov na iný
domény špecifický problém, ktorý z forenznú alebo bezpečnostných všeobecnejšie.
>> V skutočnosti, tradície s týmto problémom set je pre mňa jeden z
výučby kolegami alebo CAS chodiť po Areál pričom niektoré fotografií
identifikovateľné, ale bez zjavnej ľuďom, miesta, alebo veci, potom každý rok som
nejako podarí omylom zmazať alebo poškodenie digitálnu pamäťovú kartu
že je v našej kamery.
Ale žiadny veľký problém.
Môžem ísť ďalej a pripojte že do svojho počítača.
Môžem urobiť forenznú obraz, takže hovoriť, skopírovaním a núl
tie off tejto pamäťovej karty, či už jeho karta SD alebo Compact Flash karty alebo
čo ste zvyknutí.
A potom môžeme odovzdať, že von.
>> A tak výzvou do budúcnosti, okrem iného čo pre vás bude písať
C kódu, ktorý využíva veľa JPEG pre mňa a ukázalo sa bude
tí ľudia, miesta alebo veci.
A budeme tiež hovoriť, v tomto probléme nastaviť a v najbližších dňoch, o
grafiky všeobecne.
Použili sme ich, kurz, pre vypuknúť.
Ale ty si nejako za samozrejmosť existuje vysokej úrovni tieto pojmy
obdĺžniky a ovály.
Ale pod kapotou tam sú pixely.
A vy ste musel začať premýšľať o nich.
Alebo budete pre p-set 4 myslieť o rozdiele medzi vaše tehál, ako
rýchlo ste lopta pohybujúce sa po obrazovka pre vypuknúť.
Takže tam je to pojem bodky na obrazovke, ktorá je
vstupujú do hry už.
>> Teraz to, čo vidíte, keď je to, čo sa dostanete na obrazovke počítača.
Ak ste niekedy sledovali nejaké dobré alebo zlý TV, je pravdepodobné, že do značnej miery
liečbe publikum ako technofobií ktorí nemajú naozaj
vedieť veľa o počítači.
A tak je to veľmi jednoduché pre políciu detektív povedať, môžete
vyčistite, že pre mňa?
Alebo zlepšiť, nie?
Posilniť je ako Buzz slovo v takmer akýkoľvek trestný čin súvisiaci show.
A realita je, ak budete mať veľmi rozmazaný obraz podozrivého robí
niečo zlé, nemôžete Len zvýšenie.
Nemôžete priblížiť nekonečne.
Nevidíte v záblesk niečí oko, ktorý spáchal, že
konkrétneho trestného činu, a to napriek Prevalencia tohto v televízii.
>> A tak s tým poďme motivovať, aby Blížiace sa problém súprava s pohľad na
Niektoré ukazuje, s ktorou môže byť povedomý.
>> [PLAYBACK]
>> -OK.
Teraz sa poďme dobré pozrieť sa na vás.
>> -Drž to.
Spustiť to späť.
>> -Počkaj chvíľu.
Choďte vpravo.
>> -Tam.
Freeze to.
>> -Celý displej.
>> -OK.
Freeze to.
>> -Utiahnite na to, že sa máš?
>> -Vector na uvedenom chlapa od zadného kolesa.
>> -Zoom tu na tomto mieste.
>> -So správnym vybavením, zobrazované dá zväčšiť a naostrené.
>> -Čo je to?
>> -Je to vylepšenie programu.
>> -Môžeš jasné, že sa nejaké?
>> -Ja neviem.
Poďme zvýšenie.
>> -Vylepšite časť A-6.
>> -Aj lepší detail, a -
>> -Myslím, že je dosť zlepšiť.
Uvoľnite ho do mojej obrazovke.
>> -Zvýšiť odraz v očiach.
>> -Poďme tento príkaz prostredníctvom Zdokonalenia videa.
>> -Edgar, môžete zlepšiť to?
>> -Vydrž.
>> -I've pracuje na tejto úvahy.
>> -Niekto reflexie.
>> -Reflection.
>> -Je to odrazom z tváre.
>> -Reflexia.
>> -Je to odraz.
>> -Priblížte na zrkadle.
>> -Môžete vidieť odraz.
>> -Môžeš zlepšiť imidž odtiaľto?
>> -Môžete zvýšiť ho tu?
>> -Môžete zlepšiť to?
>> -Môžeme zlepšiť to?
>> -Môžete zlepšiť to?
>> -Počkaj chvíľku, ja zlepšiť.
>> -Priblížte na dvere.
>> -X10.
>> -Zoom.
>> [Smiech]
>> -Nasťahovanie
>> -Počkaj, prestaň.
>> -Stop.
>> Pauzy to.
>> -Otočiť o 75 stupňov okolo vertikálne prosím.
>> [Smiech]
>> -Zastavte a späť na časť, o dverám.
>> Máte-o Image Enhancer ktoré môžu bitmap?
>> -Možno, že môžeme použiť pradeep Sen spôsob, ako nahliadnuť do okien.
>> -Tento softvér je najmodernejšie.
>> -Ikona hodnota je vypnuté.
>> -So správnou kombináciou algoritmov.
>> -Vzal osvetlenie algoritmy ďalšiu úroveň a môžem použiť na
doplnenie tohto snímku.
>> -Lock a zväčšenie z-os.
>> -Vylepšite.
>> Freeze a zlepšiť.
>> [END PLAYBACK]
>> David J. Malan: Takže problém Set 5 je to, čo leží pred nami tam.
Takže budeme čoskoro lepšie pochopiť o tom, kedy a prečo sa môžete
a naše nemožno zvýšiť týmto spôsobom.
Ale najprv poďme vrátiť našu pozornosť na niektoré zo stavebných kameňov budeme
musia byť schopní povedať, že príbeh.
>> Takže pripomínam, že sme vypracovali tento obrázok na Pondelok a trochu minulý týždeň.
A to opisuje usporiadanie vecí v pamäti počítača, ak
beží nejaký program.
Tech segmente až hore, odvolanie, odkazuje skutočných núl a jedničiek
že písať program.
Tam je, že pod niektoré inicializovaný Neinicializované údaje, ktoré sa obvykle
sa vzťahuje na veci, ako sú konštanty alebo reťazca alebo globálne premenné, ktoré majú
bol vyhlásený za vopred.
Tam je hromada, ale vrátime sa späť, že za chvíľku.
>> A potom je tu hromada.
Rovnako ako na hromadu zásobníkov v jedáleň, to je miesto, kde pamäť dostane
vrstvené a vrstvené kedykoľvek budete robiť to, čo v programe?
Čo je to zásobník použiť pre?
>> Jo?
>> Volanie funkcie.
Kedykoľvek volanie funkcie, je to vzhľadom k kúskom pamäte pre jeho
lokálne premenné alebo parametre.
A obrazovo, vidíme, že s každým následné funkcia je volaná, keď
volanie volanie B C D hovory, ktoré sa vrstvia do zásobníka.
A do každej z týchto plátkov pamäť je v podstate unikátny rozsah
pre túto funkciu, ktorý, samozrejme, je problematické, ak chcete odovzdať
z jednej funkcie na inú časť dát, ktoré chcete ju
zmutovať alebo zmeniť.
>> Takže to, čo bolo naše riešenie umožňujúce Funkcia reprezentovaný jedným zásobníka
rám zmeniť pamäť vnútri z iného zásobníka rámu?
Ako tie dva hovoriť k sebe navzájom?
Takže prostredníctvom ukazovateľov alebo adries, ktoré opäť len opísať miesto, kde v
pamäť, a spôsob, ako konkrétne skus číslo, najmä
hodnotu možno nájsť.
Tak spomínam minule taky sme pokračovali príbeh a pozrel sa na
docela buggy programu.
A tento program je kočík pre niekoľko dôvodov, ale väčšina z nich je znepokojujúce
pretože nedokáže zistiť, čo?
>> Jo, to nedokáže kontrolovať vstup.
Je nám ľúto?
>> Ak je to viac ako 12 znakov.
Takže veľmi elegantne, pri volaní memcopy, ktorý, ako už názov napovedá, práve
kópie pamäte z jeho druhý argument do prvej argument.
Tretí argument, veľmi elegantne, je skontrolovať, aby sa ubezpečil, že nemáte
kopírovať viac, v tomto prípade, na dĺžku baru, počet znakov,
do miesta určenia, ktoré je táto pole C. Ale problém je, že to, čo
ak C sám o sebe nie je dostatočne veľká zvládnuť, že?
Budeš kopírovať počtu bajtov, že ste uvedené.
Ale čo v skutočnosti majú viac bajtov, než máte priestor pre?
>> No, tento program veľmi bláznivo len slepo pokračuje vziať, čo je to
dané, ahoj spätné lomítko 0 je skvelé, ak reťazec je krátka
dosť, rovnako ako päť znakov.
Ale či je to naozaj 12 znakov alebo 1200 znakov, sme videli minule
že ste len tak úplne prepísať pamäť,
nepatrí k vám.
A v najhoršom prípade, ak sa prepísať, že Červená časť je, že sme nazvali
spiatočná adresa -
To je presne tam, kde je počítač automaticky za vás, za
scény, brucha ďaleko 32-bitová hodnota, ktorá pripomína to, čo by malo adresa
vráti, až foo, to iná funkcia, sa vykonáva spustením.
Je to chlieb drobček druhov , Na ktoré sa vracia.
Ak nahrávate, že potenciálne ak ste zlý človek, by možné
potenciálne prevziať niečí počítač.
A budete určite zrútenie vo väčšine prípadov.
>> Teraz tento problém bol len zhoršilo keď sme začali hovoriť o pamäti
riadenie všeobecne.
A malloc pre alokáciu pamäte, je funkcie, ktorú môžeme použiť na pridelenie
pamäti, keď nevieme vopred že by sme mohli potrebovať.
Tak napríklad, keď som sa vrátiť k spotrebiču tu.
A otvorím z minulého času hello2.c, pripomínajú tento program, ktorá sem vyzeral
Trochu niečo také, len tri linky -
uviesť svoje meno, potom reťazec meno, na ľavej strane, rovná GetString.
A potom sme ho vytlačiť, meno užívateľa.
>> Tak toto je super jednoduchý program.
Aby bolo jasno, nechajte ma ísť napred a aby ahoj-2.
Chystám sa urobiť bodku lomítko ahoj-2.
Uveďte svoje meno -
David.
Enter.
Ahoj Davide.
Zdá sa, že funguje OK.
Ale to, čo sa naozaj deje pod kapotou tu?
Najprv poďme zlúpnite niektorých vrstiev.
String je len synonymom máme si uvedomil, na čo?
Char hviezda.
Takže poďme robiť to trochu tajomný ale technicky správne, že tento
je char hviezda, čo znamená, že meno, áno, je premenná.
Ale to, čo názov predajne je adresa char, ktorá sa cíti trochu divne
pretože som sa vrátiť reťazec.
Začínam späť viac znaky nie sú char.
>> Ale samozrejme, budete potrebovať len prvý char adresa si spomenúť, kde
Celý reťazec je, pretože prečo?
Ako zistiť, kde koniec reťazec je poznať na začiatku?
Spätné lomítko nula.
Takže s týmito dvoma stopy zistiť, pred začiatkom a na konci
ľubovoľný reťazec je tak dlho, kým sú správne tvarované s týmto null
terminator, že spätné lomítko nula.
>> Ale to volá GetString.
A ukázalo sa, že GetString Celú tú dobu bol druh
podvádzanie pre nás.
Bolo to robí túto prácu, aby ste sa uistili, ako reťazec od užívateľa.
Ale kde je, že pamäť bola z?
Ak sa vrátime k obrázku sem použiť definíciu z takmer
Pred chvíľou, že zásobník je miesto, kde pamäť ide, keď sú volány funkcie,
podľa tejto logiky, keď zavoláte GetString, a potom som písať v
D - V-I-D Enter, kde je D - V-I-D lomítko nulový bod uložený, na základe
Príbeh sme povedali nám ďaleko?
>> Mohlo by sa zdať, že je v zásobník, nie?
Ak voláte získať reťazec dostanete malý plátok pamäte na zásobníku.
Takže je logické, že D - V-I-D spätné lomítko nula je uložený
tam v zásobníku.
Ale počkaj, getString vráti tento reťazec, aby som tak povedal, čo znamená,
je to zásobník z jedálne je prevzatý zo zásobníka.
A my sme povedali minule, že akonáhle funkcia vracia, a vy sa, že
zásobník, aby som tak povedal, zo zásobníka, čo možno predpokladať, o pozostatkoch
že pamäť?
Trochu som překleslil ako otázniky pretože účinne sa
neznáme hodnoty.
Ktoré môžu byť znovu použité, ak nejaké Ďalšia funkcia je volaná.
>> Inými slovami, ak sa stane, na ukladanie -
Budem čerpať rýchlu obrázok tu v zásobníku.
Ak sa stalo, že sa čerpanie spodnej môjho segmentu pamäti, a povieme
že toto je miesto pamäti obsadený hlavný a možno arg C a
arg v a niečo iné v programe, pri volaní GetString,
pravdepodobne dostane GetString kus pamäti tu.
A potom D - V-I-D nejako skončí v tejto funkcii.
A budem zjednodušovať.
Ale predpokladajme, že jej D - V-I-D spätné lomítko nula.
Takže toto množstvo bajtov sa používa v rám pre getString.
>> Ale akonáhle getString vráti, budeme povedal minule, že táto pamäť po
tu všetko sa stáva - Woops! -
všetci sa efektívne vymazané.
A my môžeme myslieť na to teraz ako otázku značky, pretože kto vie
čo sa deje, aby sa stal z tejto pamäte.
Naozaj, veľmi často volať funkcie iné ako GetString.
A akonáhle som volať iné funkcie ako GetString, možno nie v
Tento konkrétny program sa len pozeral na, ale nejaká iná, určite iné
funkcia môže skončiť daná Táto ďalšie miesto v zásobníku.
>> Takže to nemôže byť, že getString obchody D - V-I-D na stacku, pretože by som
okamžite stratí prístup k nemu.
Ale my vieme, že getString vráti len to, čo?
Nie je to návrat do mi šesť znakov.
Čo je skutočne vracia sa sme došli k záveru minule?
Adresa prvý.
Tak nejako, keď si volal GetString, je to prideľovanie kus pamäti
Reťazec, ktorý užívatelia typ a potom sa vracať adresa nej.
A ukázalo sa, že keď chcete funkcie alokovať pamäť v tomto
spôsob a návrat do osoby, ktorá volala že funkcia, adresa
že kus pamäti, ste úplne nie je možné, aby ju do zásobníka na
dno, pretože funkčne je to len bude to stáť tebe moc
rýchlo, takže asi tušíte, kde budeme pravdepodobne bude hodiť
miesto, tzv haldy.
>> Takže medzi spodnou časťou pamäť je rozloženie a horná pamäť je
layout je celá banda segmentov.
Jedným z nich je zásobník a doprava nad ňou je halda.
A halda je len iný kus pamäť, ktorá sa nepoužíva pre funkcie
keď ste volaní.
Používa sa na dlhodobejšie pamäť, keď Ak jedna funkcia chytiť niektoré
pamäte a môcť zavesiť na to bez straty kontroly nad ním.
>> Teraz by snáď okamžite vidieť, že to nie je
nutne dokonalý dizajn.
Ako váš program pridelenej pamäte na zásobník, alebo ako tomu hovoríte a viac
viac funkcií, alebo ako si rozdeliť pamäť na halde s malloc off ako
GetString robí to, čo jasne Zdá sa, že neodvratný problém?
>> Presne tak.
Rovnako ako skutočnosť, že tieto šípky smerovali na seba
neveští nič dobrého.
A skutočne, môžeme veľmi rýchlo dôjsť k zlyhaniu program, v mnohých rôznymi spôsobmi.
V skutočnosti si myslím, že by sme mohli mať urobil náhodne raz.
A ak nie, ideme na to zámerne teraz.
Nechaj ma ísť ďalej a písať Super rýchlo program s názvom dontdothis.c.
A teraz pôjdem sem a sa ostré patrí stdio.h.
Poďme deklarovať funkcie foo sa žiadne argumenty, čo je
označovaný ako dobre prázdnoty.
>> A jediná vec, foo sa chystá urobiť, je volanie foo, ktorý pravdepodobne nie je
nejchytřejší nápad, ale budiž.
Ent hlavné neplatné.
Teraz je jediná vec, hlavné sa deje urobiť, je zavolať foo rovnako.
A len tak pre srandu, ja idem dopredu a tu hovoria printf "Hello from
foo ".
>> OK.
Takže keď som nerobil žiadne chyby, Urobiť dontdothis dot lomítko.
A ideme na to vo väčšom okne -
bodka lomítko, dontdothis.
Tak poď.
Uh oh.
Zdá sa, že to môžete urobiť.
Sakra.
OK.
Počkajte.
Stand by.
Mali sme -
My sme ju použiť s make.
>> [Povzdychne si]
>> Ja viem, ale myslím, že my práve zmazal to.
Uh, jo.
Sakra.
Vyriešte tento Rob.
Čo je?
Je to veľmi jednoduché.
Jo, sme sa obrátili optimalizácia off.
OK, stať ahoj.
Teraz sa cítim lepšie.
OK.
Dobrá.
>> Takže poďme překompilovat to -
Urobiť si dontdothis.
Možno budete musieť premenovať to dothis.c za chvíľu.
Tam ideme.
Ďakujem.
OK.
Fakt, že som bol tlač niečo, čo bolo v skutočnosti len
spomaľuje proces, pri ktorom sa by dosiahol tohto bodu.
OK.
Uf!
>> Takže čo sa vlastne deje?
Dôvodom je, rovnako ako stranou, je robiť nič, pokiaľ ide o vstup a
výstup má tendenciu byť pomalší, pretože písať znaky
obrazovke, má posúvať.
Tak dlhý príbeh krátky, mal som vlastne Stalo sa to tak netrpezlivá, museli by sme
videl konečný výsledok rovnako.
Teraz, keď som dostal jazdu na tlač-up, vidíme to hneď.
Tak prečo sa to deje.
No, jednoduché vysvetlenie, samozrejme, je, že foo asi nemal
bude volať sám.
>> Teraz vo všeobecnej rovine, je to rekurzia.
A mysleli sme si pár týždňov Pred rekurzívne je dobrá.
Rekurzia je to magický spôsob sebavyjadrenia Super stručne.
A to jednoducho funguje.
Ale tam je kľúčovým rysom všetkých rekurzívne programy Hovorili sme
o a pozrel sa na tak ďaleko, čo bolo, že mali čo?
Referenčný prípad, ktorý bol nejaký pevný kódované prípade tým, že v niektorých situáciách
nevolajte foo, ktorý je jasne nie je tento prípad.
>> Takže to, čo sa skutočne deje čo sa týka obrázku?
No, keď hlavný volá foo, že mať úžitok z pamäti.
Keď volá foo foo, dostane plátok pamäti.
Keď volá foo foo, dostane kúsok.
To dostane rez.
Vzhľadom k tomu, foo nikdy vracať.
My nikdy mazanie jedným z tých, rámy zo zásobníka.
Takže sme prefúknutiu hromadu, a to uviesť, kto vie, čo ešte, a
budeme prekračovať hranice našej tzv segment pamäte.
Chyba ísť segmentácia false.
>> Takže riešenie je jasne, nerob to.
Ale väčšie vyplýva, že áno, tam je nejaká hranica, absolútne,
aj keď to nie je dobre definovaná, ako mnoho funkcií, môžete volať do
Program, koľkokrát funkcie môžu volať sám.
Takže aj keď sme kázať rekurziu ako tejto potenciálne magické veci
Pred pár týždňami na sigma funkcie, a keď sme sa získať dáta
štruktúry a CS50, uvidíte ďalšie Žiadosti o tom, že to nie je
nutne tá najlepšia vec.
Vzhľadom k tomu, ak sa volanie funkcie, volá sama seba, aj keď je tu základňa
prípade, ak nechcete zasiahnuť, že základný prípad, 1000 pre hovory alebo hovory 10000, podľa
Vtedy ste možno došli miestnosti na tzv zásobníka a stlačte kláves
niektoré iné časti pamäte.
Tak to je tiež dizajn trade-off medzi eleganciou a medzi
robustnosť váš konkrétny implementácia.
>> Takže tam je ďalšia nevýhoda, alebo ďalšie chyták na to, čo máme
robil tak ďaleko.
Keď som volal GetString -
nechaj ma ísť späť do ahoj-2.
Všimnite si, že volám GetString, ktorý sa vracia adresu.
A tvrdí, že dnes adresa je z haldy.
A teraz som vytlačenie string na tejto adrese.
Ale my sme nikdy nevolal opak GetString.
Nikdy sme museli calll funkciu ako ungetstring, kde ste ruku späť
že pamäť.
Ale úprimne povedané, sme asi by mal byť.
Pretože ak budeme stále pýtajú počítač pre pamäť tým, že spôsob, ako niekoho, ako je
GetString ale nikdy to vrátiť, určite že je tiež nevyhnutne povedie k
problémy, ktorým sme sa spustiť z pamäte.
>> A v skutočnosti, môžeme sa za ne problémy s novým nástrojom, ktorého použitie
je trochu záhadné písať.
Ale dovoľte mi ísť dopredu a nešetriť ju na obrazovke len na chvíľu.
Chystám sa ísť dopredu a spustite Valgrind s parametrom, ktorého prvý príkaz
argument riadok je názov tohto programu ahoj-2.
A bohužiaľ je to výstup je ukrutne
komplexné bezdôvodne.
Vidíme všetko, čo neporiadok.
David je uvedené moje meno.
Tak to je program, vlastne beží.
A teraz si tento výstup.
>> Takže Valgrind je podobný svojím duchom GDB.
Nie je to debugger sebe.
Ale je to spomienka kontrolu.
Je to program, ktorý spustí programovať a poviem vám, ak budete požiadaní
počítač na pamäti a nikdy podal späť, čím čo znamená, že máte
pretečeniu pamäte.
A úniky pamäte majú tendenciu byť zlé.
A vy ste sa užívatelia počítačov majú Pravdepodobne cítil, či máte
Mac alebo PC.
Už ste niekedy používali počítač while a sa nereštartuje v niekoľkých
dni, alebo ste práve dostal veľa programy spustené, a tá prekliata vec
spomalí sa zastavila, alebo aspoň Je to super nepríjemné používať, pretože
všetko, čo práve super slow.
>> Teraz to môže byť ľubovoľný počet dôvodov.
Mohlo by to byť nekonečná slučka, chyba v niečí kód, alebo, viac jednoducho, že
by mohlo znamenať, že používate viac pamäť, alebo sa snaží, ako vaša
počítač v skutočnosti má.
A možno je to chyba v nejakom programe že stále pýtajú na pamäti.
Prehliadače pre roky boli notoricky známi pre to, žiadajú viac a viac pamäte
ale nikdy podal naspäť.
Iste, ak máte iba konečný množstvo pamäti, nemôžete žiadať
nekonečne mnohokrát pre niektoré z týchto pamätí.
>> A tak to, čo vidíte tu, aj keď znovu Valgrind je výstup
zbytočne zložité, aby sa pozrel na Prvá, to je zaujímavá časť.
Heap -
v prevádzke na výstupe.
Tak tu je, koľko pamäte je sa používa v halde na
Čas môj program ukončený -
zrejme šesť bajtov v jednom bloku.
Takže budem mávať rukami v akom je blok.
Myslite na to je len kus, ďalší technický výraz pre kus.
Ale šesť bajtov -
čo je šesť bytov, ktoré boli ešte v použitie?
>> Presne tak.
D-A-V-I-D lomka nula, päť písmeno Názov a null terminátor.
Takže tento program Valgrind si všimol, že som požiadal o šiestich bytoch, zrejme tým, že
spôsob GetString, ale nikdy dal naspäť.
A v skutočnosti, mohlo by to byť tak zrejmé, keď môj program nie je tri
linky, ale je to 300 riadkov.
Takže môžeme skutočne dať iný príkaz linka argument Valgrind na
aby bolo viac ukecaný.
Je to trochu nepríjemné pamätať.
Ale keď to urobím -
pozrime.
Leak -
Bolo to k úniku -
ani nepamätám čo je to preč ruky.
>> - Kontrola tesnosti sa rovná plnej výške.
Jo, ďakujem.
- Kontrola tesnosti sa rovná plnej výške.
Enter.
Rovnaký program beží.
Zadajte v Dávidovi znova.
Teraz vidím trochu podrobnejšie.
Ale pod haldy zhrnutie, čo je totožná s štyri - ah,
je to celkom pekné.
Teraz Valgrind je vlastne hľadá trochu ťažšie v mojom kóde.
A to sa hovorí, že, zdá sa, malloc na riadku -
sme oddialiť.
Na riadku -
nevidíme, aký postoj je.
Ale malloc je prvým vinníkom.
Je to blog na malloc.
>> V poriadku?
OK, no.
Je to tak?
Zavolal som GetString.
GetString zrejme volá malloc.
Takže to, čo riadok kódu je zrejme vinný s
pridelené túto pamäť?
Predpokladajme, že ten, kto napísal malloc bol asi dosť dlho, že je to
nie je ich chyba.
Takže je to asi moja.
GetString v cs50.c - takže je to súbor niekde na počítači -
v riadku 286 sa zdá, že je vinník.
Teraz predpokladajme, že CS50 bolo okolo slušné množstvo času, takže
my sú neomylné.
A tak to asi nie je v getString že chyba spočíva, ale v
ahoj-2.c linka 18.
>> Takže poďme sa pozrieť na čo to linka 18 bola.
Oh.
Nejako tento riadok nie je nevyhnutne buggy, samo o sebe, ale to je dôvod,
za tým pretečeniu pamäte.
Takže proste super, čo by intuitívne Riešením je?
Ak sa pýtate na pamäti, neboli nikdy dať späť, a že sa zdá, že je
problém, pretože v priebehu času svoj počítač môže spustiť z pamäte, môže spomaliť
nadol, môže zlé veci sa stávajú, no, to, čo je jednoduché intuitívne riešenie?
Daj to späť.
>> Ako sa uvoľniť, že pamäť?
No, našťastie je to celkom jednoduché len povedať, bez názvu.
A my sme nikdy nerobil.
Ale môžete v podstate myslieť zadarmo ako protiklad malloc.
zadarmo, je opakom prideľovanie pamäte.
Takže teraz mi dovoľte překompilovat to.
Skontrolujte, ahoj-2.
Dovoľte mi ho spustiť znova. ahoj-2 David.
Takže sa zdá, pracovať v presne rovnakým spôsobom.
Ale keď som sa vrátiť do Valgrind a znovu spustiť že rovnaký príkaz na mojom novo
skompilovaný program písanie v mojom mene, ako predtým -
pekné.
Heap zhrnutie -
používané na výstupe -
nula bajtov nulových blokov.
A to je super pekný, všetky haldy bloky boli oslobodení.
Žiadne úniky sú možné.
>> Takže prísť, nie problému Sada 4, ale Problem Set 5, forenznú
a nasledujúce roky, to tiež stane meradlom správnosti vášho
Program, či máte alebo nemáte alebo nemajú k pretečeniu pamäte.
Ale našťastie, môžete nielen rozum skrze ne intuitívne, čo
je, pravdepodobne, ľahké malých programov ale ťažšie väčších programov,
Valgrind, pre tie väčšie programy, vám môže pomôcť identifikovať
konkrétny problém.
>> Ale je tu ešte jeden ďalší problém ktoré by mohli vzniknúť.
Dovoľte mi otvoriť tento súbor tu, čo je Opäť platí, že trochu jednoduchý príklad.
Ale poďme sa zamerať na to, čo Tento program robí.
To sa nazýva memory.c.
Budeme tento post neskôr dnes zips dnešnej zdrojového kódu.
A zistíte, že mám funkciu nazvanú f že žiadne argumenty a
nevracia nič.
V riadku 20, som vraj vyhlásil ukazovateľ na int a volať to x.
Som priradenie je návrat hodnota malloc.
A len aby bolo jasno, koľko bajtov am Asi som sa vrátiť z malloc
v tejto situácii?
>> Asi 40.
Kde si to zobral?
No, či si spomínate, že int je často 4 bajty, je prinajmenšom v
zariadenie, 10 krát 4 je samozrejme 40.
Takže malloc vracia adresu na kus pamäte a skladovanie, ktoré
riešenie nakoniec v x.
Takže aby bolo jasno, čo potom sa to deje?
No, dovoľte mi vrátiť späť na našom obrázku tu.
Dovoľte mi, aby som nielen kresliť hĺbke pamäti počítača, nechaj ma ísť napred a
nakresliť celý obdĺžnik, ktorý predstavuje všetky mojej pamäti RAM.
>> Povieme, že zásobník je na dne.
A je tu textový segment sa Neinicializované údaje.
Ale ja som jednoducho ísť na tie abstraktné iné veci ďaleko ako bodka, bodka bodka.
Idem len sa odkazovať na to ako hromadu v hornej časti.
A potom v dolnej časti obrázku, predstavujú hlavné, ja idem
aby jej plátky pamäť na zásobníku.
Pre f, idem dať plátok pamäte na zásobníku.
Teraz som sa dostal do prezerám svoj Zdrojový kód znova.
Aké sú lokálne premenné pre hlavné?
Zrejme nič, takže rez je účinne prázdna alebo dokonca ani tak veľký,
ako som čerpané.
Ale f, mám lokálne premenné, ktorý sa nazýva x.
Takže som ísť dopredu a dať f kus pamäti, volať to x.
>> A teraz malloc 10 krát 4, Takže malloc 40, kde je to
pamäť prichádza?
Sme nie je vykreslený obrázok ako predtým.
Ale predpokladajme, že je to skutočne prichádza odtiaľ, tak jeden,
dva, tri, štyri, päť.
A teraz musím 40 z nich.
Tak som si jednoducho urobiť bodku, bodka, bodka navrhnúť že tam je ešte viac pamäte
návrate z haldy.
Teraz, čo je adresa?
Zvoľme ľubovoľný naše riešiť ako vždy -
Ox123, aj keď to asi bude byť niečo úplne iného.
To je adresa prvého bajtu v pamäti, že sa pýtam na malloc.
>> Takže v skratke, akonáhle riadok 20 vykoná, čo je doslova
uložené vnútri x tu?
Ox123.
A vôl je nezaujímavý.
To len znamená, že tu Hexadecimálne číslo.
Ale čo je kľúčové je, že to, čo som obchod x, čo je miestna premenná.
Ale jeho dátový typ, opäť je adresa int.
No, ja idem uložiť Ox123.
Ale na druhú stranu, ak je to trochu moc zložitý zbytočne, keď som listovať
späť, môžeme to preč docela abstraktné rozumne a len povedať, že x je
ukazovateľ na tento kus pamäti.
>> OK.
Teraz je otázka, na dosah ruky je nasledovné -
linka 21, ako sa ukázalo, je chybné.
Prečo?
>> Je nám ľúto?
To nemá -
tvrdí, že ešte raz.
No, to nie je zadarmo.
Tak to je druhý, ale.
Takže je tu ešte jedna, ale špecificky na riadku 21.
>> Presne tak.
Tento jednoduchý riadok kódu je len buffer overflow, pretečenie vyrovnávacej pamäte.
Vyrovnávacia pamäť znamená len kus pamäte.
Ale to kus pamäte o veľkosti 10, 10 celých čísel, čo znamená, že ak by sme
index do nej pomocou syntaktickú cukor z poľa notáciu, námestí
držiaky, máte prístup k x držiak 0 x držiak 1 x,
Držiak bodka, bodka, bodka.
x držiak 9 je najväčší.
Takže keď urobím x držiak 10, kde Ja som vlastne deje v pamäti?
>> No, keď mám 10 int -
poďme vlastne kresliť všetko z nich tu.
Takže to bol prvý päť.
Tu je ďalších päť ints.
Takže x držiak 0 je tu. x držiak 1 je tu. x držiak 9 je tu. x držiak
10 je tu, čo znamená, že hovorím, v riadku 21, počítač, aby
číslo, kde?
Číslo 0, kde?
No, to je 0, tak áno.
Ale len to, že jej 0 je tak trochu náhoda.
Mohlo by to byť číslo 50, pre všetky staráme.
Ale snažíme sa, aby to na x držiaku 10, čo je miesto, kde toto
Otáznik je koncipovaný, čo nie je dobrá vec.
Tento program by mohol veľmi dobre havárie ako výsledok.
>> Teraz poďme ďalej a uvidíme, či to je skutočne to, čo sa stane.
Aby pamäti, pretože súbor sa nazýva memory.c.
Poďme ďalej a spustite programovej pamäte.
Takže sme mali šťastie, v skutočnosti, zdá sa.
Mali sme šťastie.
Ale uvidíme, či budeme teraz beží Valgrind.
Na prvý pohľad by sa mohlo môj program Zdá sa, že je úplne správne.
Ale dovoľte mi spustiť Valgrind sa - Kontrola úniku zodpovedá plnej pamäti.
>> A teraz, keď som tento príkaz -
zaujímavé.
Neplatný zápis o veľkosti 4 na riadok 21 memory.c.
Linka 21 memory.c je, ktorý z nich?
Oh, zaujímavé.
Ale počkajte.
Veľkosť 4, ako je to s odkazom na?
Len som sa raz napísať, ale je to o veľkosti 4.
Prečo je to 4?
Je to preto, že je to int, čo je opäť štyri bajty.
Takže Valgrind našli nejakú chybu, že som, pozrel sa na mojom kóde, nie.
A možno vaše TF alebo by nie.
Čo však Valgrind určite zistil, že že sme urobili chybu, dokonca
ale mali sme šťastie, a počítač rozhodol, čo, nebudem sa zrúti
len preto, že ste sa dotkli jeden bajt, jeden INT stojí za pamäti, že nie
v skutočnosti vlastní.
>> No, čo iné je buggy tu.
Adresa -
To je šialené hľadá adresa v šestnástkovej sústave.
To len znamená, že niekde v halde je nula bajtov po bloku o veľkosti 40
je pridelené.
Dovoľte mi priblížiť tu a uvidíme, či je to trochu ústretovejšie.
Zaujímavý.
40 bajtov definitívne stratil v záznam straty 1 z 1.
Opäť platí, že viac slov, ako je tu veľmi užitočná.
Ale na základe zvýraznené línie, kde asi by som mala zamerať moja
pozornosť na ďalší bug?
Vyzerá to, že linky 20 memory.c.
>> Takže keď sa vrátime k riadku 20, to je ten, ktorý ste určili skôr.
A to nemusí byť nutne buggy.
Ale my sme to zvrátiť jeho účinky.
Tak ako to mám opraviť aspoň jeden z týchto chýb?
Čo som mohol robiť po riadku 21?
Čo som mohol urobiť bez x, takže je vrátiť, že pamäť.
A ako môžem opraviť túto chybu?
Mal by som určite ísť nie ďalej ako 0.
Takže dovoľte mi, aby som sa pokúsila znovu spustiť tento.
Ospravedlňujeme sa, ale určite ísť nie ďalej ako 9.
Urobiť pamäti.
Dovoľte mi, aby som znova Valgrind vo väčšom okne.
A teraz sa pozrite.
Pekný.
Všetky bloky haldy boli oslobodení.
Žiadne úniky sú možné.
A tu hore, tam žiadna zmienka niektorého z neplatné práva.
>> Len dostať chamtivý a poďme zistiť, či ďalšou ukážkou
nejde ako má -
Som šťastie pred chvíľou.
A skutočnosť, že je to 0 je možná zbytočne zavádzajúce.
Urobme 50, trochu svojvoľné počet, značka pamäti dot slash pamäť -
ešte šťastie.
Nič zhadzovať.
Dajme tomu, že to jednoducho urobiť niečo naozaj hlúpe, a ja 100.
Dovoľte mi, aby som prerobiť pamäti, bodka lomítko pamäť -
šťastie znova.
Ako sa o 1000?
ints mimo, hrubo, kde by som mal byť?
Urobiť pamäť -
sakra.
>> [Smiech]
>> OK.
Poďme sa flákať už nie.
Znovu pamäti.
Tam ideme.
Dobrá.
Takže zrejme budete index 100000 ints než kde by ste mali byť v
pamäti, zlé veci sa stávajú.
Tak to samozrejme nie je tvrdé, rýchle pravidlo.
Bol som tak trochu s použitím skúšobnej a chyba sa tam dostať.
Ale to je preto, že dlhý príbeh krátky, pamäti počítača je tiež rozdelená
do týchto vecí tzv segmenty.
A niekedy, že počítač skutočne vám dal trochu viac pamäte
než sa spýtate na.
Ale účinnosť, je to proste jednoduchšie získať viac pamäte, ale iba tí
že ste stále časť.
>> A ak budete mať šťastie niekedy, Preto, mali by ste byť schopní dotknúť
pamäť, ktorá nepatrí k vám.
Nemáte žiadnu záruku, že to, čo hodnota dáte tam zostane tam, pretože
počítač stále si myslí, že to nie je tvoje, ale nie je to nutne deje
udrieť do ďalšieho segmentu pamäti v počítač a vyvolať takú chybu
toto tu.
Dobrá.
Akékoľvek otázky potom na pamäť?
>> Dobrá.
Poďme sa pozrieť tu, potom na niečo, čo sme užívali pre
poskytnutá na nejakú dobu, ktorá v tomto súbore s názvom cs50.h.
Tak to je súbor.
To sú len celá partia komentárov do hornej časti.
A možno ste sa na túto možnosť, ak si tropil okolo na prístroji.
Ukazuje sa však, že po celú dobu, keď sme používali reťazec ako
synonymum prostriedky, ktoré sme deklarovali ktoré bolo synonymom s týmto
kľúčové slovo typedef pre definíciu typu.
A my sme v podstate hovorí, aby navliecť synonymum pre char hviezdy.
, Že prostriedky, ktoré zásobníka vytvorili tieto tréningové kolesá známej ako
reťazec.
>> Tu je to len prototyp pre getchar.
Sme mohli vidieť skôr, ale to je naozaj to, čo robí. getchar
žiadne argumenty, vracia char.
getdouble žiadne argumenty, vracia double.
getfloat žiadne argumenty, vráti float, a tak ďalej.
vezmi_int je tu. getlonglong je tu.
A GetString je tu.
A je to.
Táto fialová linka je ďalšia preprocesor smernice, pretože
hashtag na jeho začiatku.
>> Dobrá.
Takže teraz ma nechaj ísť do cs50.c.
A nebudeme hovoriť príliš dlho na to.
Ale aby vám pohľad na to, čo je sa deje na všetko
čas, nechaj ma ísť do -
jdem getchar.
Takže getchar je väčšinou komentáre.
Ale vyzerá to takto.
Tak toto je skutočná funkcia getchar, že sme boli
pričom za samozrejmosť existuje.
A aj keď sme sa použiť tohle že často, ak vôbec, je to aspoň
pomerne jednoduchý.
Takže je to stojí za to Rýchly pohľad na tu.
>> Takže getchar má nekonečnú slučku, zámerne tak zdanlivo.
Potom zavolá - a to je druh pekný opätovné použitie kódu sami napísali.
Volá GetString.
Pretože to, čo robí znamená dostať char?
No, môžete sa pokúsiť získať celý riadok textu od užívateľa a
potom sa stačí pozrieť na jeden z týchto znakov.
V súlade 60, tu je to trochu trochu zdravý rozum kontroly.
Ak GetString vrátil null, poďme nepokračuje.
Niečo je zle.
>> Teraz je to trochu nepríjemné, ale konvenčné C. char max pravdepodobne
predstavuje to, čo práve na základe jeho meno?
Je to konštanta.
Je to ako číselnú hodnotu Najväčší char môžete reprezentovať s
jedno uhryznutie, čo je pravdepodobne číslo 255, čo je najväčšie číslo, ktoré
predstavujú osem bitov, od nuly.
Takže som sa využiť tejto funkcie, v tejto funkcii, kedy písania tohto kódu len preto,
ak sa niečo pokazí, ale getchar jeho účel v živote je vrátiť
char, musíte byť schopní nejako najavo, že užívateľ, ktorý
sa niečo pokazilo.
Nemôžeme vrátiť hodnotu null.
Ukazuje sa, že je nulový ukazovateľ.
A opäť, getchar má vrátiť char.
>> Takže dohovor, ak sa niečo zle, vy, programátor, alebo
V tomto prípade som sa do knižnice, mal som len rozhodnúť ľubovoľne, pokiaľ
sa niečo pokazí, budem vráti číslo 255, ktorá je skutočne
znamená, že nemôže užívateľ nemôže zadať znak reprezentovaný
číslo 255, pretože sme mali ukradnúť ako tzv sentinelovej hodnotu
predstavujú problém.
Teraz sa ukazuje, že charakter 255 nie je niečo, čo môžete písať na
klávesnice, takže to nie je veľký problém.
Užívateľ nevšimne, že Ja som ukradol tento znak.
Ale ak ste niekedy v manuálových stránkach na počítačový systém nejaký odkaz
všetky čiapky konštantný, ako je táto, ktorá hovorí, v prípade chyby táto konštanta môže
byť vrátené, to je všetko nejaký človek urobil rokmi bol svojvoľne rozhodla
vrátiť túto špeciálnu hodnotu a hovoriť konštanta v prípade
sa niečo pokazí.
>> Teraz mágia stane tu.
Po prvé, ja som vyhlásil v súlade 67 dve postavy, C1 a C2.
A potom v rade 68, je to vlastne riadok kódu, ktorý je pripomínajúce
náš priateľ printf vzhľadom k tomu, že má mať percent Čs v úvodzovkách.
Nevšimnúť, čo sa tu deje. sscanf znamená reťazec skenovanie -
znamená, že skenovanie formátu reťazec, ergo sscanf.
Čo to má znamenať?
To znamená, že odovzdáte sscanf reťazec.
A linka je čokoľvek používateľ zadá palcov
Môžete prejsť na sscanf formátovací reťazec ako to, že hovorí, scanf, aké sú
Dúfate, ktorý zadal používateľ palcov
Tie potom odovzdať v adresách dvoch kúsky pamäti, v tomto prípade,
pretože mám dva zástupné symboly.
Tak som dám jej adresu C1 a C2 na adresu.
>> A pripomínajú, že dáte funkciu, Adresa nejaké premenné, čo je
implikácia?
Čo môže robiť, že funkcie v dôsledku dať jej adresu
Premenná, na rozdiel od premenná sám?
To možno zmeniť, nie?
Ak ste mal niekoho mapu pre fyzické adresu, môžu ísť tam a urobiť
čo chcú na tejto adrese.
Rovnaká myšlienka tu.
Ak neberieme do úvahy, aby sscanf, adresa, z dvoch kúsky pamäti, dokonca aj tie malé
malé kúsky pamäti, C1 a C2, ale povieme jej adresu z nich,
sscanf ho zmeniť.
>> Takže sscanf je zmysel života, keď čítame manuálové stránky, je prečítať, čo
užívateľ zadali, dúfam, že pre užívateľov s zadali znak a možno
iný znak, a to bez ohľadu na užívateľa napísal prvý znak pokračuje
tu, druhý znak ide tu.
Teraz, rovnako ako stranou, a vy by len viem to z dokumentácie,
Skutočnosť, že som dal medzeru tam jednoducho znamená, že je mi jedno, či
používateľ narazí na medzerník málo krát, než on alebo ona má
charakter, budem ignorovať akýkoľvek biely priestor.
Takže, ja viem od dokumentácie.
>> Skutočnosť, že je druhý% c nasledovaný medzerou je v skutočnosti
úmyselné.
Chcem byť schopní zistiť, či používateľ podelal alebo nespolupracovali.
Takže dúfam, že len užívateľ napísal v jednom znaku, a preto dúfam,
že sscanf je až vo chvíli vrátiť hodnota 1, pretože, opäť, keď som čítal
dokumentácie, sscanf je účel život je pre návrat do počtu
premenné, ktoré boli vyplnené užívateľského vstupu.
>> Prešiel som v dvoch premenných adresy, C1 a C2.
Dúfam však, že iba jeden z je zabitý, pretože ak sscanf
vrací2, čo je pravdepodobne implikácia logicky?
Že užívateľ nebol len mi jednu charakter, ako by som mu alebo jej.
Pravdepodobne zadali pri najmenej dva znaky.
Takže keď som namiesto toho nemal druhý % C, len som mal jeden, ktorý
Úprimne povedané by byť viac intuitívne prístup, myslím, že prvý pohľad,
budete nebude schopný detekovať ak bol užívateľ dáva vám viac
Vstupné ako ste vlastne chceli.
Tak to je implicitná forma z kontroly chýb.
>> Ale zistíte, čo robím tu.
Raz som si istý, že mi dal jeden užívateľ postava, som uvoľniť linku, robiť
opak getString, čo používa malloc, a potom sa vrátim
C1, charakter, že som dúfal, že užívateľ k dispozícii a len za predpokladu.
Tak rýchlo zazrel len, ale všetky otázky týkajúce sa getchar?
Vrátime sa k niektorým z ostatných.
>> No, nechaj ma ísť ďalej a robiť to - Predpokladám, že teraz, len motivovať
diskusie v týždni a navyše čas, to je súbor s názvom structs.h.
A opäť, je to len chuť niečoho, čo leží pred nami.
Ale všimnite si, že veľa toto je komentár.
Takže mi dovoľte zdôrazniť iba Zaujímavosťou teraz.
typedef -
tam je to rovnaké kľúčové slovo znova.
typedef používame deklarovať reťazec ako zvláštny typ dát.
Môžete použiť typedef vytvoriť zbrusu nový dátové typy, ktoré neexistovali, keď
C bol vynájdený.
Napríklad, int prichádza s C. char Dodáva sa s C. double prichádza s C. Ale
nie je pojem študenta.
A napriek tomu, že by bolo celkom užitočné mať schopní napísať program, ktorý ukladá
do premennej, študent ID číslo, ich meno, a ich dom.
Inými slovami, tri kusy dát, ako int a
string a iný reťazec.
>> S typedef, čo je dosť silný o tom, a kľúčovým slovom sturct pre
štruktúra, vy, programátor v roku 2013, môže skutočne definovať vlastné
dátové typy, ktoré neexistovali rokov staré, ale to vyhovovalo vašim požiadavkám.
A tak tu, v riadkoch 13 až 19, sme sa prehlasuje, že nový dátový typ, napríklad
int, ale nazývať to študentka.
A vnútri tejto premennej sa chystá tri veci - int, string,
a reťazec.
Takže si môžete myslieť, čo je naozaj stalo, aj keď je to
kúsok zjednodušenie pre dnešok, študent je v podstate deje
takhle vyzerať.
Jeho bude kus pamäť s ID, meno
pole a dom poľa.
A budeme môcť využiť tieto kusy pamäte a pristupovať k nim takto.
>> Keď idem do struct0.c, tu je pomerne dlho, ale po
vzor, ​​kód, ktorý používa tento nový trik.
Takže v prvom rade mi dovoľte, aby som vás upozornil na zaujímavých častí hore hore.
Sharp definuje študentmi 3, prehlasuje, konštantný tzv študenti a nadobúdatelia
je ľubovoľne číslo 3, len takže mám tri študentmi pomocou
Tento program teraz.
Tu je hlavný.
A všimnite si, ako Prehlasujem, rad študentov?
No, len som použiť rovnakú syntax.
Slovo Študent je samozrejme nové.
Ale študent, trieda, konzolové študenti.
>> Takže bohužiaľ je tu veľa opätovného použitia pojmov tu.
To je len číslo.
Takže to je ako povedať tri.
Trieda je len to, čo chcem volať premennú.
Mohol by som hovoriť, že študenti.
Ale trieda, to nie je trieda vo objektovo orientované Java druh spôsobom.
Je to len trieda študentov.
A dátový typ každého prvku v tomto poli je študentom.
Tak to je trochu inak az hovorí niečo
takto, je to len -
Hovorím, daj mi tri študentmi a volať, že triedu poľa.
>> Dobrá.
Tu je to štyri slučky.
Ten chlap pozná - iterate od nuly až na tri.
A tu je nový kus syntaxe.
Program stimuluje ma, človek, aby to študent
ID, čo je int.
A tu je syntax, pomocou ktorého môžete uložiť niečo do poľa ID na
Umiestnenie trieda držiak I. Tak táto syntax nie je nič nové.
To jednoducho znamená, že mi ôsmy študentov v triede.
Ale to je symbol novej.
Až do tejto chvíle sme nemožno použiť bodku, aspoň v kóde ako je táto.
To znamená ísť do struct známy ako študent a dať tam niečo.
Rovnako tak v tejto ďalší riadok, 31, prejsť dopredu a dajte, čo používateľ zadá
na meno tu a čo robia pre dom, to isté, choďte do toho a
vložte ho do. domu.
>> Takže to, čo robí tento program nakoniec robiť?
Môžete vidieť malú ukážku tam.
Nechaj ma ísť ďalej a robiť, aby structs 0 bodka lomítko struct 0, študent ID 1,
povedal David Mather, študent ID 2.
Rob Kirkland, študent ID 3.
Lauren Leverit -
a jediné, čo tento program urobil, ktorý je len úplne svojvoľné, je
Chcel som urobiť niečo, čo s týmito dátami, teraz, keď som učil nás, ako sa
používať structs, je, že som jednoducho musel Táto extra slučka tu.
Aj iterovat cez pole študentov.
Použil som svoju, možno teraz známy priateľ, reťazec porovnaní, stircomp na
Kontrola je 8. študenta dom rovná Mather?
A ak áno, stačí niečo vytlačiť ľubovoľne rada, áno, je.
Ale na druhú stranu, len to, že mi príležitosti používať a opakovane a
znovu túto novú dot notácie.
>> Takže koho to zaujíma, že?
Prísť s študentského programu trochu svojvoľné, ale ukázalo sa,
že môžeme robiť užitočné veci s to, napríklad nasledujúcim spôsobom.
To je oveľa zložitejšie struct v C. Je tu tucet alebo viac polí,
trochu nezrozumiteľné názvy.
Ale ak ste niekedy počuli o grafický formát súboru s názvom bitmapa, BMP, to
Ukazuje sa, že bitmapový formát súboru skoro vyzerá, že.
Je to malá hlúpa smajlíky.
Je to malý obrázok, ktorý som priblíženie na dosť veľký, takže som mohol vidieť každý
jednotlivých bodov čiže pixelov.
Teraz sa ukazuje, môžeme predstavovať čierna bodka s, povedzme, číslo 0..
A biela bodka s číslom 1.
>> Takže inými slovami, ak chcete kresliť Smajlík a okrem toho, že obraz v
počítač, postačí pre uloženie nuly a tie, ktoré vyzerajú ako to, kde,
znova, tie sú biele a nuly sú čierne.
A spoločne, ak skutočne máte Gird jedničiek a núl, máte
mriežka obrazových bodov, a ak si položiť je von, máte roztomilá
malý smajlíky.
Teraz bitmapový obrázok formátu BMP, je efektívne, že pod kapotou
ale s viac pixelov Sot, že môže skutočne reprezentovať farby.
>> Ale keď máte sofistikovanejšie formáty súborov ako BMP a JPEG a GIF
s ktorou by mohlo byť známe, ktoré súbory na disku zvyčajne nie je iba
majú núl a jednotiek na obrazových bodov, ale majú nejaký metadáta a -
meta v tom zmysle, že v skutočnosti nie je dát, ale to je užitočné mať.
Takže tieto polia tu naznačujete, a uvidíme to podrobnejšie v P-set
5, že pred núl a jednotiek, ktoré predstavujú obrazové body v obraze,
je tu banda metadát, ako veľkosť snímky a
šírka obrazu.
A všimnite si, ja som šklbanie preč niektoré ľubovoľné veci tu -
šírka a výška.
Bit obraz a niektoré ďalšie veci.
Takže tam je nejaký metadáta v súbore.
>> Ale tým, že pochopenie toho, ako sú stanovené súbory sa týmto spôsobom, môžete skutočne
potom manipulovať s obrázkami, obnoviť obrázky z disku, veľkosť obrázkov.
Ale to nejde nutne zlepšiť ich.
Potreboval som fotografiu.
Tak som šiel späť do RJ tu, ktorý si videl Na obrazovke sa pomerne dlhú dobu pred.
A keď otvorím Keynote tu, je to čo sa stane, keď sa pokúsite priblížiť a
zvýšenie RJ.
On nedostávajú žiadne naozaj lepší.
Teraz Keynote je trochu rozmazaný, že trochu, len zakrývať
Skutočnosť, že RJ nedostane zvlášť lepšie, keď obraz zväčšíte
A ak sa to urobiť týmto spôsobom, vidieť na námestí?
Áno, môžete určite vidieť štvorca na projektore.
>> To je to, čo dostanete, keď budete zvýšiť.
Ale v pochopení toho, ako naše RJ alebo Smajlík je realizovaný nám umožní
vlastne písať kód, ktorý manipuluje tieto veci.
A ja myslel, že by som skončiť na tejto poznámke, sa 55 sekúnd na zvýšenie je to,
Trúfam si povedzme trochu zavádzajúce.
>> [PLAYBACK]
>> -Klame.
O čo, ja neviem.
>> -Tak čo vieme?
>> -To v 09:15 Ray Santoyo bol pri bankomate.
>> -Takže otázka je, čo robil v 9:16?
>> -Streľba deväť milimetrov na niečo.
Možno videl ostreľovača.
>> -Alebo sa s ním pracovať.
>> -Počkaj.
Vráťte sa jeden.
>> -Čo vidíš?
>> -Prineste mu lícom nahor, na celej obrazovke.
>> -Jeho okuliare.
>> -Je to odraz.
>> -To je baseball Neuvitas tím.
To je ich logo.
>> A hovorí s tým, kto je na sebe bundu.
>> [END PLAYBACK]
>> David J. Malan: To bude Problém je sada 5.
Uvidíme sa budúci týždeň.
>> MALE SPEAKER: Na ďalšie CS50.
>> [Cvrčkov]
>> [Prehrávanie hudby]