[Prehrávanie hudby] DAVID J. Malan: To je ako nováčik seminár dnes. OK. Takže veľmi daždivé von. To má tendenciu stať sa v stredu, ale o to viac príležitostí pre otázky dnes. Takže poďme začať skutočne s filmom za chvíľu. Ale začneme vznešene ako vždy. To je CS50, a to je koniec týždňa 4. Takže ak ste niekedy sledovali Televízie alebo filmu, kde tam je nejaký počítačoví experti a polícia, alebo FBI, alebo nejaká agentúra sa snaží chytiť nejaké protivník, no, som pravdepodobne počuli výraz "posilniť," čím že technik akosi magicky zväčší nekonečne ďaleko vidieť zločinca totožnosti alebo ŠPZ aj v tom trblietania zrkadla alebo záblesk niečí oko. Takže naozaj, poďme sa pozrieť na len pár takých scén z Hollywoodu. [Videoprehrávanie] -OK, Teraz poďme dobré pozrieť sa na vás. -Drž to. Spustiť to späť. -Počkaj minútu. Choďte doprava. -Je, Zmraziť, že. -Celá obrazovka. -OK, Zmraziť, že. Sprísnenie pri súčasnom sa na to, že budete? -Vector V na to človek od zadného kolesa. -zvětšení Priamo tu na tomto mieste. -S Pravé zariadenie, obrázok by mohol byť rozšírený a naostrené. -Čo je to? -To Je program vylepšenia. Vieš jasné, že sa nejaké? -Neviem. Poďme zvýšenie. -Enhance Časť A6. -I Lepšie detail, a-- Myslím, že je dostatočne zvýšiť, uvoľnite ju na mojej obrazovke. -I Lepšie odraz v očiach. -Nechaj To beh toto cez vylepšenia videa. -Edgar, Môžete zvýšiť toto? -Počkaj. -I've Pracuje na tejto úvahy. -Someone Odraz. -Reflection. -Je To odraz mužovho tváre. -the Reflexia. -Je To odraz. -zvětšení Na zrkadlo. -Môžete Vidieť odraz. Vieš zlepšiť obraz odtiaľto? Vieš ho zlepšiť tu? Vieš to zlepšiť? Môžeš to zlepšiť? -Možno Zvyšujeme to? Vieš to zlepšiť? -Hold Na sekundu, budem zvýšiť. -zvětšení Na dvere. -Times 10. -zoom. -Nasťahovať sa. -viac. Počkať, zastaviť. -Stop. -Pause To. -Rotate Nám 75 stupňov okolo vertikálnej, prosím. -Stop. Vráťte sa do časti o dvere, znova. -Máš S Image Enhancer, ktorá môže bitová mapa? Hej, možno môžeme použiť Pradeep Metóda Sen vidieť do okien. Tohle softvér je stav techniky. -the Eigenvalue je vypnutý. -S Vpravo Kombinácia algorithm-- Prijatá eliminácia -Je algoritmy na ďalšiu úroveň, a ja sa ich použiť na zlepšiť túto fotografiu. Blok ďalej a rozšíriť os z. -Enhance. -Enhance. -Enhance. -Freeze A zlepšiť. [END Prehrávanie] DAVID J. Malan: Dobre, tak všetky z nich sú v skutočnosti slová. Sú to len navlečené dohromady v tak, že to v skutočnosti nie je rozumné. A v skutočnosti, CS50 a kurzy páči inklinuje zničiť veľa televíziu a filmy pre teba. Vzhľadom k tomu, keď tie počítačové odborníkmi sú drnčanie off termíny a hovoriť efektné veci, ako je vlastné vektory, a z osi, a akýkoľvek počet iné v skutočnosti viac technické termíny, sú to naozaj len navliecť Slová spolu príliš často. Je to jeden z našich nádejí je, ako vedľajší účinok prijatia kurzov ako je táto, bude viac ľudí do world skutočne schopná vážiť a len niekedy tak trochu ovplyvniť kvalita a presnosť týchto filmov? V skutočnosti, poďme sa pozrieť na realitu. Takže tu je zamestnancovi foto Márie, jeden z našich výukových chlapi. A predpokladám, že ona je podozrivý z niečoho. A napriek tomu, je tu iskrička niektorí dôkaz v oku, alebo v odraze jej okuliarov. No, ak budeme robiť presne to, čo filmy navrhovať, kde sme sa priblížiť a "zvýšiť", To je, koľko informácií je v Máriinom tvári Pri robení snímky s pôvodným rozlíšenie. A v skutočnosti, môžete vidieť tieto body. A to sú aké sú tzv pixelov, P-I-X-E-L-S, čo je len štvorec typicky to je bod, ktorý komponuje snímku. A späť v deň, a vlastne aj dnes s niektorými z dnešných LED televízory alebo LCD televízory, ak máte človek vo svojej izbe, alebo doma, ak ste ísť až veľmi blízko k nej, a najmä ak je to trochu staršie TV, môžete pravdepodobne ešte vidieť tieto bodky a to je to, čo kompozíciu snímky. A nie je tam žiadny ďalší informácie, než je táto. Mohli by sme "zvýšiť", v tom zmysle, vyhladenie veci znovu a druh vyvodzovanie druh, tak nejako to, čo Farba by mala byť vedľa Marie oko takže to nie je vlastne tak pixelated. Ale keď som stále priblíženia, tam je zlý človek v oku. Rovnako ako, že je o informácie, ktoré máme. Nemôžete vytvoriť Informácie z ničoho. Je tu len konečný počet bitov tam. Takže Zadanie problému 4, kde máte možnosť hrať sa s týmto druhom sveta. V Zadanie problému 4, budete preskúmať svet grafiky a forenznej, a vlastne písať kód že obnovuje stratená obrázky. Budete písať kód, ktorý manipuluje existujúcich snímok a nakoniec pochopiť, čo je to deje pod kapotou. A to dopadá, je to vlastne nie je všetko tak zložité. Napríklad, ak chceme predstavujú smajlíky kde s týmito čierne pixely, alebo sú tieto čierne bodky, dobre, mohli by sme jednoducho predstavovať je ako naozaj bitmapy. A ak ste mali niekedy počuli, že výraz bitmap, snáď Teraz začne, aby sa trochu väčší zmysel dnes. Už vieme, čo je to trochu je. To je 0 alebo 1. A Mapa je proste niečo, ako kus papiera ktorá vám dáva pokyny a má možná mriežka X a Y súradníc. Takže tu je bitmapový. Je to mapa bitov pričom 1 je zrejme bude reprezentovať biele pixelu, a 0 bude reprezentovať čiernu pixelu. Ale my sme mohli určite hodiť okolo. To nie je naozaj jedno, tak Kým sme dôslední. A tu je, ako, v binary-- vnútri z pamäte počítača, alebo dokonca aj vnútri na súbor na pevnom drive-- by ste mohli uložiť najjednoduchšie smajlíkom obrazov. Ale to, čo sme, samozrejme, chýba v tomto obrázku? Color, že jo? Je to jasné, ďalší krok, alebo Vylepšenia zlepšiť to s farbou. Takže bohužiaľ sa len jeden bit, 0 alebo 1, môžeme znázornenie farieb. To by mohlo byť červené, alebo modré čierna, alebo biela, alebo zelená, alebo ružové, alebo akékoľvek párov farieb. Ale pre jednoduchosť, budeme len predpokladať, čiernej a bielej. Takže to, čo logicky potrebujeme, keby sme chcú zaviesť farby v obraze? Čo musíme urobiť? Rovnako ako v prípade, že limitujúcim faktorom je tu je, že s jedným bitom môžete iba predstavujú dva štáty, 0 alebo 1, biely alebo čierny, čo chceš robiť? Divákov: ďalšie dáta. DAVID J. Malan: Viac bitov, jo viac dát, viac bitov. A naozaj, to je presne to, ako farebné obrazy sú zastúpené. Skôr ako používať jeden bit, je 0 alebo 1 pre každý obrazový bod, každá bodka, stačí použiť násobok. Možno použitie 8, možno viac obyčajne použitie 24, a naozaj, v Zadanie problému 4, budete hrať so súborom formát, ktorý používa 24 bitov obvykle. Ale väčšina z vás pravdepodobne oboznámení s JPEG. Ak ste niekedy vziať Fotografie na vašom telefóne, alebo uložiť alebo niečo vidieť na Facebook, Flickr alebo ľubovoľný počet webových stránok foto-based, nemáš Pred pravdepodobne videli obrázok JPEG. A ukázalo sa, je to súbor formát budeme používať v pset 4, kedy budete musieť obnoviť obrázky že som omylom zmazané od A poškodené pamäťové karty vo fotoaparáte, ak chcete. A ukázalo sa, že aj keď JPEG je celkom sophisticated-- je to oveľa zložitejšie než čiernych a bielych bodiek sme videli pred chvíľou, pretože tam je skutočne efektné algoritmy, ktoré sa používa ku kompresii JPEG, takže že môžete mať naozaj pekné, kvalita obrazu, ale s použitím relatívne málo kúskov. A vrátime sa do kompresie onedlho. Ukazuje sa, že prvé tri byty v image-- JPEG bez ohľadu na to, čo ste si vzal fotografiu of-- sú hodnoty 255, 216, 255. Inými slovami, ak ste práve vidieť, že vzorka bitov, tu zastúpené ako tri bajtov alebo 24 bitov celkom, s vysokou pravdepodobnosťou možno usudzovať, že hľadáte sa na to prvé tri bajtov JPEG. A to je to, čo je známe ako podpis vo formáte JPEG. Mnoho formátov súborov tam zvyčajne začínajú s niektorými vzormi 0s a 1s, tak, že systém Windows a Mac OS a iOS, a Android vedieť, aký druh súboru, ktorý sú, okrem tzv súboru rozšírenie, ktoré veľké množstvo súborov má. Ak ste .jpg, to je ďalšie vodítko k počítaču. Takže poďme sa teraz pozrieť na to trochu viac technicky. Poznáme desatinné systém je 0 až 9. Vieme, že binárne je 0 a 1. A ak si myslíte, späť do pset 0, mali sme vás zápasiť s, pre trochu, niečo volal hexadecimálne, kde budete mať 16 číslic, miesto 10, alebo miesto 2. A tie číslice, podľa konvencie, sú od 0 do 9 a potom až f, kde f predstavuje to, čo desatinné číslo, rovnako ako rýchly zdravý rozum skontrolovať? Tak, 15. A musí predstavovať 10, len tým, povahe usporiadanie, ktoré som dané. Je to len svojvoľnými, ale je to celkom bežná. Takže ak sa pozrieme na tohto vzoru z troch bytes-- poďme len začať sa na to pozrieť v súlade s tým, ako počítačoví odborníci všeobecne pozrieť sa na a premýšľať o súboroch. Určite môžete premýšľať o tom, súbory v 0s a 1s, a desatinná, ale v skutočnosti, máme tendenciu používať binárne alebo viac typicky hexadecimal-- späť z pset 0. Dovoľte mi teda navrhnúť, aby 255, 216 a 255 sú práve tieto vzory 0s a 1s. A môžete to skontrolovať, či ste Chcete si to spočítajte od týždňa 0. Ale teraz, len predpokladať, že toto je naozaj správne. Práve som prepísať tri desatinné Čísla ako tri binárne hodnoty. A teraz, čo budem robiť, je stačí pridať nejaký biely priestor, len pre Čitateľnosť príčinu. A upozornenie, ja som jednoducho ísť presunúť veci od seba. Tak pred, po, pred, po. Robím nič zaujímavého ostatné než len šíri veci tak, že oznámenie každá sada ôsmich bitov je teraz dve sady štyroch bitov. To je užitočné, pretože hexadecimálne je obzvlášť v móde pretože každý hexadecimálne znak 0 až f, alebo konkrétnejšie 0 až 15, môžu byť reprezentované s presne štyri bity. Inými slovami, ak ste v hexadecimálne chcú reprezentovať 0, je to len 0000, štyri nuly. A ak chcete reprezentovať 15, to je 1111, čo je štyri bity. A ak si to spočítajte, ak sa jedná o tie, miesto, To je miesto, 16S, že sa chystá dať vás-- skôr, čo sa deje to-- ľúto, v binárne, , Čo sa deje, aby vám 15, tie miesta, Dvojky miesto, štyri a osmičky miesto. Dovoľte mi teda, že navrhne, aby Sada štyroch bitov, na ľavej strane je to, čo budeme hovoriť f. Je to najväčšie číslo môže predstavovať štyri bity. A my už vieme z šestnástkovej, f je najväčší číslice v šestnástkovej sústave. Máme ďalšie f tam, ďalšie dva tamto. A teraz, len sa na vieru že som urobil matematický právo a že ľavá polovica z týchto bitov, 1101, je to isté ako D v hexadecimálne sústave. A pravá ruka, 1000, sa nachádza iba 8. A ten človek je ľahké vidieť, že jo? 8 represents-- má pravdu pod týmto ôsmy mieste. Takže máme jeden v stĺpci ôsmy a nič v štyroch, dvojky alebo ty. Takže teraz viac konvenčne, ľudia majú tendenciu zapisovať hexadecimálne číslice, ako je táto, stačí prebiť dohromady, a potom je prefix 0x. To znamená, že nič iné ako vizuálne vodítko k human-- prichádza hexadecimálne value--, pretože to by mohlo inak byť zrejmé. Čo znamená, že v konečnom dôsledku, že vzor núl a jednotiek, alebo vzor hexadecimálne Číslice ekvivalentne, že ste začnú hľadať v Zadanie problému 4 tohle-- a problém Set 4 spec bude chodiť ste cez to vo viacerých detail-- ale uvedomiť si, ako druh Arcane as to môže vyzerať na prvý pohľad, sa chystáte začať vidieť to veľa. A v skutočnosti, dokonca aj v GDB sa debugger sme predstavili v pondelok a Dan predstaví v pset 3, sa deje často ukáže hexadecimálne hodnoty len preto, že majú tendenciu byť viac konvenčné než desiatkovej alebo binárne vo svete počítačov. A teraz poďme dať to do kontextu. Mnohí z vás by mohol pamätať Fotografie: tu, ktorý prišiel z čoho? Vista, takže ešte skôr, než to, že systém Windows XP to urobil debut. Takže toto je krásna krajina. A v skutočnosti, ak sa v kurze porozhliadnuť online-- Myslím, že je to článok Wikipédie, kde niekto veľmi prekvapivo vyšiel našiel miesto na svete, nastaviť jeho alebo jej kamera vo presne pravý place-- a to dnes vyzerá, ale jako-- je to presne rovnaké nastavenie. Tento obraz, aj keď je v súbore formát nazvaný bitmap, b-m-p. A budeme brať super Rýchly pohľad na to, čo to znamená. Ale bitmapa je len iný spôsob, ako predstavujúce obrazy stále používate pixelov na 0s a 1s, nakoniec. Ale v letmom pohľade, to má zaujímavejšie podpis Na začiatku súboru. Nie je to len tri bajtov, skôr je tu celá partia vzorcov bytov že mať vopred stanovené význam. Napríklad, niekde v Prvých pár bajtov bitmapový obraz bude veľkosť z obrazu, šírka obrázka, výška obrazu, takže užitočné metadáta, ak chcete. Užitočné informácie, ktoré Photoshop alebo akékoľvek grafický program, ktorý používate by v skutočnosti mohli záleží. Takže o tom viac v Zadanie problému 4, ale to je len povedať, že na konci dňa všetky formáty súbor, ktorý ste používali pre years-- súbory Microsoft Word, Čísla súbory, súbory Excel, Ľubovoľný počet formátov súborov ktoré by mohli mať niektoré známa prípona súboru sú len 0 a 1 pod pokrievku. A ľudia sa rozhodli, čo konvencie sú, aké vzory 0s a 1s predstavujú Word súbor oproti súboru Excel, proti ľubovoľným počtom iných formátov súborov. Takže pset 4, budete mať možnosť hrať s tým. Ale čo to znamená, že majú struct. To je vlastne pekný segue teraz do C, ktorý má len pár o ďalšie funkcie, ktoré sme sa pozrel na doteraz. Je to celkom malý jazyk a jeden z pekných vlastností o C, je struct. Napríklad, ak ste chcel represent-- poďme že ste chceli mať premenné predstavuje študent v nejakom programe. Možno ste písali kurz registrácia programu, alebo jadro nákupy nástroj, alebo niečo také. Aké sú kusy dát súvisiacich študentovi, ktoré prichádzajú na myseľ? Rovnako ako študent reprezentovaný sa, aké hodnoty? Jo? Máte meno ako študent. Čo ešte typický študentka mať? Divákov: [Nepočuteľné] DAVID J. Malan: Takže, je mi ľúto. Divákov: Age. DAVID J. Malan: veku, alebo narodeniny ekvivalentne, jo. Čo ešte? Divákov: ID číslo? DAVID J. Malan: Takže ID číslo, možno telefónne číslo, možno koľaji alebo dom, alebo vysoká škola, alebo niečo také. Akýkoľvek počet kusov dát, ktoré môžete mať v zozname kontaktov je to, čo by mohlo definovať študenta. Takže ak sme chceli, aby to, v kóde, by sme mohli urobiť niečo jednoduchého, ako to. My by sme mohli mať tak, aby program má povedzme, int main (void). A keď chcem predstavovať študentka by som mohol mať, napríklad, reťazec s názvom názov pre tento študent, reťazec s názvom koľaji pre túto študenta, Možno int nazýva ID pre tento študenta. A pretože som pomocou reťazca, ja je potrebné sa vrátiť a postaviť CS50.h. Možno budem potrebovať stdio.h. Dovoľte mi teda preventívne urobiť ty a ja bude volať tento student.c teraz a uložiť to. A teraz môžem niečo urobiť s týmito premennými. A my sme len tak písať že ako komentár v pseudo kódu, pretože to nie je zaujímavé, to, čo robíme teraz. OK, takže to je program, ktorý nejako ukladá študenta. Čo chcem robiť, keď som chcete uložiť dvoch študentov? Takže môj prvý inštinkt sa deje v poriadku, počkajte chvíľu, keď mám ďalšieho študenta, prečo nie ja proste Názov reťazca 2, string koľaj 2, int ID2. A urobili sme preč touto cestou pred a to, čo bolo naše riešenie, čo sa zdá byť druh hackish Kopírovať Vložiť práca tu? Divákov: Pole. DAVID J. Malan: Jo, by sme mohli použiť pole. Hneď to veľmi rýchlo sa stáva nepraktické. Musíte sa zoradiť ľubovoľne začiatok vymenovať všetky tieto premenné. A vy, človek, mať na dráha, ktorá OK meno2 zodpovedá s dorm2 zodpovedá ID2. Proste sa stane neporiadok. Takže je to oveľa jednoduchšie, vyvolať z pred niekoľkými týždňami, len museli nadávali reťazcových a možno nám tri z nich. A potom možno máme reťazec dorms a majú Tri z týchto, alebo s konštantnou, int ID a majú tri z nich. Ale aj teraz to cítia trochu nedbalý, že jo. Hovoríme o študentov a ešte Som naozaj býva na nízkej úrovni detaily implementácie. Študent je názov a koľaji a ID. Prečo nemôžem len deklarovať premennú volal študent a hovoria to. A keď chcem ďalšieho študenta, prečo nie ja len hovorím t. Alebo keď chcem veľa študentov, prečo nie ja len povedať, že som celú triedu študentov, a to tri z nich. Inými slovami, prečo nemôžem prísť up s mojou vlastnou dátový typ, nazvaný Študenti, vnútri ktorej je názov, je ID, je koľaji, je akékoľvek číslo z iných odborov. A ukázalo sa, že môže robiť presne to. Takže C má túto funkciu nazvanú struct. To je funkcia, jazyk, ktorý nám umožňuje robiť presne to. Chystám sa pokračovať a otvoriť structs.h kde budeme vidieť Nasledujúce definície študenta. Ukazuje sa, že - a toto je ešte jednoduchšie než jeden zahŕňajúce ID pred chvíľou. Ak chcete prísť s vaše domáce typ dát, a navyše na int a char a float a všetky tieto ďalšie, ktoré existujú, môžete tak urobiť doslova písanie typedef struct, potom niektoré zložené zátvorky, vnútri ktoré ste zoznam premenných, ktoré chcete stýkať sa s touto novou vlastné dáta zadajte ako meno a koľaji, a potom po zložených zátvorkách dávate mena do nového dátového typu. Tak napríklad, študentka. A čo je pekné o tom teraz je, že Ak sa pozrieme na príslušný kód, konvencie, ako prvý zo všetkých, je, aby to v súbore s názvom niečo dot h, súbor hlavičky, ktoré my nie začali používať sami seba príliš veľa. Ale my sa chystáte začať použitím celkom dosť teraz. A čo môžeme robiť s tým, nakoniec, v týchto niekoľkých riadkov kódu je vyhlásiť, že presne typ dát, študent. A teraz poďme používať. Chystám sa teraz ísť do súbor s názvom structs1.c. A poďme sa pozrieť na Niekoľko charakteristiky tu. Takže veci, tu hore je väčšinou poznajú, a my vrátiť sa k tomu, čo nie je oboznámení za chvíľu. To samozrejme je, vrátane mojej vlastnej hlavičkový súbor, ktorý je nové, rovnako, s výnimkou pset 3, ak Pripomeňme, máme helpers.h. Takže si možno pamätáte #include helpers.h. Prečo aj keď mám používať citácie miesto uhlových konzol? Keď si mám vybrať medzi nimi? Takmer vždy som sa zdajú používať špicaté zátvorky. A potom, zrazu na linka šiestich Som pomocou dvojitej úvodzovky. Prečo by to mohlo byť? Jo? Divákov: [Nepočuteľné] DAVID J. Malan: To je skutočný, čo? Divákov: To je v IDE. DAVID J. Malan: Jo, že je v mojom skutočnom IDE. A nesmieme býva na IDE, pretože to je len nástroj, ktorý som pomocou. To je v mojom prúde adresár, konkrétne. Takže structs.h je môj vlastný súbor nie je nainštalovaný v IDE, v operačnom systéme samotnom, skôr to v mojej aktuálnom adresári. Takže dohovor je, ak chcete, uviesť svoje vlastné záhlavie súboru, stačí použiť dvojité úvodzovky. Čo nazývame túto vec linka 8, všeobecne povedané? To je to, čo? #define niečo. To predstavuje konštanty, že jo? Ak chcete mať Hodnota vo vašom programe že používate celé banda z časov, to je dobrý konvencie faktor na to, deklarovať to, symbolom hash definovať, potom sa podľa konvencie, vo všetkých veľké písmená word-- keď to nie je nevyhnutne nutné, ale Je to ľudská konvencie zarobiť konštanty tak, aby sa vyskočiť na vás visually-- priestor a potom hodnota chcete byť čo zodpovedá menu táto konštanta je. Nie bodkočiarka, ale jednoducho vyplývalo, že vzor tam. Takže to, čo som robil v tomto skutočnom kóde. Takže poďme sa pozrieť na hlavný program tu. V súlade 12, pretože som zahŕňali structs.h, Teraz mám ako mávnutím čarovného prútika v mojej Likvidácia nový dátový typ. Nemám jednoducho mať prístup k int, a char, a float a string, a modrej a ďalšie. Aj teraz majú prístup k typ študenta dát. Takže v rade 12, som kombináciou dvoch ideas-- jeden vlastný dátový typ a dva, pomocou poľa. A tak v tomto programe, ak Chcem skutočne podporiť tri rôzne študenti v mojom programe, ja možno jednoducho povedať, daj mi premennú tzv študentov, z ktorých každá je študentov typu, ktoré je môj vlastný dátový typ. A konkrétne, daj mi tri z tých, v mojom poli. Tak čo teraz budeme robiť v tomto programe? Tu je len pre slučky iterácie od 0 do 3, pretože to je čo je hodnota študentov. Len som vyzvanie užívateľa daj mi meno študenta. A potom v riadku 17, sme majú väčšinou známu linku. Máme starého priateľa GetString na pravej strane. A čo kus syntaxe je zrejme nový, ak ste nikdy naprogramovaný v C predtým, a nikdy nepoužilo structs? Jo? Divákov: .name. DAVID J. Malan: The .name. Ale to nie je príliš veľký skok, pretože teraz študenti aj bracketing dáva vám i-teho študenta. A ak chcete potápať vnútri tejto štruktúry, stačí použiť jedno obdobie a potom názov premennej vo vnútri, alebo vlastnosť, že vo vnútri Ak chcete získať prístup k. Podobne potom, keď som potom prinúti Užívateľ, daj mi študenta koľaji, Podobne môžete uložiť, že reťazec v premennej koľaji vnútri tohto študenta štruktúry. A teraz sa veci trochu fantázie. A to bude vyzerať na možná veľa celkom skoro. Ale budete vidieť ďaleko viac v pset 4, tak nech to jednoducho pohľad na to teraz. Ukazuje sa, že v potrubí 23 prostredníctvom 38, čo si myslíte, že som snáď robíš? Odstránil som pripomienky dnes, ale verzia kódu online referencie má všetky komentáre. Čo mi zdá, že robiť? Divákov: uloženie súboru so všetkými informácie, ktoré užívateľ zadal. DAVID J. Malan: Jo, presne, to je nový spôsob že vidíme dve, Ďalším znakom C, čím som si vytvárať svoje vlastné súbory. Doteraz, takmer každý program, čo ste napísali, je bez štátnej príslušnosti. Akonáhle je to hotovo beh, to je všetko. Nie je pamäte alebo spomienka na neho. Neexistuje žiadny súbor uložený. Ale ak si chcete uložiť vstup, ktorý má sa stalo, rovnako ako v hre alebo programu takto to dopadá, môžeme tak urobiť. A budete vidieť viac v pset 4 av §. Ale táto linka 23 v podstate vytvorí súbor s názvom students.csv. A možno ste predtým videl. Dokonca aj keď ste nikdy študoval SK predtým, CSV je oddelené čiarkou premennej. Je to ako veľmi zlý muža verzia súboru programu Excel, čo znamená, že by mohol byť otvorený v Exceli a v číslach Apple, a má riadkov a stĺpcov. Ale nie je to proprietárnu formát ako Microsoft alebo Apple. Je to len čiarky oddeľujúcej hodnoty, ktoré uvidíme za chvíľu. A stačí sa hádať. V súlade 23, na samom koniec, môj druhý argument, na túto novú funkciu nazvanú f otvorená pre otvorenom súboru je w. Čo by mohlo naznačovať w? Jo? Divákov: To vám umožní zapísať do súboru? DAVID J. Malan: To vám umožní napíšete do súboru. Takže je tu niekoľko variantov že sa môžeme pripojiť tu. Ale ak si len chcete prečítať Súbor, ktorý sa na to pozrieť a prečítajte si ju do pamäti, vám stačí použiť citácie unquote "r". Ak chcete písať na súbor, môžete použiť ponuku koniec citátu "w". K dispozícii je tiež pripojiť a niekoľko ďalších vecí Ak chcete upraviť existujúce súbory. Teraz budeme držať vidieť toto vec, potom sa vrátime na linku 24. NULL, to dopadá, je špeciálna hodnota, ktorá môže byť vrátený určitých funkcií ak niečo wrong-- v prípade, že súbor neexistuje, ak ste spustiť z pamäte, alebo veľa ďalších chýb. Ale teraz, poďme len predpokladať, že tento je kontrola len konvenčné chybe. Tu v rade 26, som iterácie od 0 do 3 nad všetkými mojich študentov. A to je druh druh nové funkcie, fprintf, ale stačí sa hádať. Ak printf je len pre tlač formátovaný reťazec, Čo fprintf pravdepodobne znamená? Divákov: Tlač do súboru. DAVID J. Malan: Vytlačte formátovaný reťazec do súboru. To je to, čo to ďalší f prostriedkom je súbor. A nový prvý argument musí byť premenná, ktorá predstavuje súbor. Potom sme jednoducho formát string rovnako ako printf. A aj keď to syntax je nové, to len znamená pripojiť meno študenta, plug-in študentské koľaji, a potom s fclose, zatvorte súbor. A potom je to nový lastly-- a vrátime sa k tomu Pred long-- Som uvoľnenie študent z dôvodov, že sa stalo tam hore. Ale my sa vrátime sa, že pred long-- že je to kvôli tomu, ako je GetString skutočne pracuje pod kapotou. Takže poďme sa rýchlo pozrieť tu. Keby som zadajte ls vo svojom adresári, Všimnite si, že nemám mať súbor s názvom students.csv, len nie tam, neexistuje. Takže keď som sa skompilovať tento program, aby structs-1. / Structs-1, a budem pokračovať a napíšte Andi, ktorý žije v Berkeley v Yale. Budeme mať Rob, kto žije v Thayer v týchto dňoch. A poďme prísť s tým, kde je, myslím, Mária je v Mather, ak som si pamätal. Takže sa zdanlivo nič nedeje. Ale keď som typ ls teraz, je students.csv. Poďme ďalej a otvorená students.csv. Jedná sa opäť o veľmi ľahký formát súboru. Ale ja som proste prijala konvencii že mám dve riadky a stĺpce tu. V prvom stĺpci je krstné mená ľudí. Druhý stĺpec je študenta koľaji, alebo vysoká škola, alebo dom, alebo ktovie čo ešte. A teraz som zachránil to trvalo v súbore. Takže to nie je všetko tak zaujímavé. Ale to je len odrazovým mostíkom teraz k schopnosti pretrvávať informácií natrvalo. Tak uvidíme, teraz čo viac môžeme robiť s týmito a ďalšími funkciami. Ale najprv, nejaké otázky? To bolo veľa, a to bolo rýchle. Ale uvidíte mnoho viac pset 4, rovnako. Jo? Divákov: Existuje spôsob, ako pokračovať v pridávaní mien do tohto súboru? DAVID J. Malan: Dobrá otázka. Existuje spôsob, ako pokračovať pridávanie mien do tohto súboru? Áno. A v skutočnosti, ak ste skončili up re-otvorenie súboru, by ste použili citáciu koniec citátu "A" pre append, čo by len pridať nový riadok, je Nová linka znova a znova, presne tak. Dobrá otázka. Ďalšie otázky? Jo? Divákov: Ak ste spustili Program znovu práve teraz, to by držať pridanie mien do súboru alebo by to otvoriť nový súbor? DAVID J. Malan: Á, dobrá otázka. Ak znovu hneď bežal program Teraz, možno zadali novými menami, by bolo pridať do súboru alebo prepísať súbor? Ten, pretože som nepoužívajú pripájací režimu. A pretože ja som len slepo otvorenie súboru pre zápis, je to len bude súbor prepísať. Takže by som naozaj musíte urobiť, je pripojiť, keď chcem skutočne dlhodobý databáz. Teraz CSV je užitočný, úprimne povedané, ani pre obdobné ak ste writing-- a my budeme nakoniec vidieť neskôr v semestri, kedy využívame CSVŠ na iné účely. Ak chcete uložiť všetkých ľudí ktorí sa registrovali na nejakú udalosť, alebo sa prihlásili pre študenta skupina, alebo niečo také, ukladanie dát v tomto druhu formátu je super pohodlné. Vzhľadom k tomu, doslova, ak I mali stiahnuť tento súbor. Mohol by som double-- a poďme sa skutočne snaží tento keď mám Excel alebo čísla tu. Budem pravým tlačidlom alebo s klávesom Ctrl môj súbor. Jejda. Kliknite pravým tlačidlom alebo s klávesom Ctrl môj súbor. No, moja myš nespolupracuje. Download-- Idem stiahnuť všetky súbory, takže tu Len tak môžem chytiť tento jeden. A uvidíme, či to funguje students.csv-- prvýkrát Ja som aktivovaný. Teraz chcú vidieť svoje kontakty. Teraz som potrebné sa zaregistrovať. Pozrite sa, ako ľahké je používať CSVŠ? Áno, udržiavať ju v aktuálnom stave. OK, teraz sme pripravení na triedu. OK, oh, čo je nové? OK, úzkym. To bolo čarovné. OK, teraz musíme aktualizovať. A teraz, je to zabudol, čo súbor Pôvodne som otvoril, ale to, čo tam je-- ideme. OK, takže teraz máme súbor programu Excel. Ďakujem. OK, takže to, čo som urobil, bolo jednoduché. Samozrejme, že som mohol už nainštalované Excel, alebo čísla, alebo čokoľvek iného programu. Ale to je pekné, pretože teraz môžem manipulovať údaje v štandardnom formáte. Takže teraz poďme kontext prejsť na miesto, kde sme prestali Naposledy, ktorý mal začať vzlietnuť kolieska. Ale najprv, to nie vidieť tento skorší obed sa opäť deje na Fire a Ice v Cambridge, sitaru v New Havene. Zaregistrujte sa na stránkach CS50s ASAP vstúpiť CS50 študentov a zamestnancov. Tak sme vzali kolieska off v pondelok follows-- string bola vyhlásená v CS50s knižnica pre určitú dobu. A je to pekné, pretože umožňuje nás hovoriť o premenné ako kompletné slová a vety a ďalšie. Ale ukazuje sa reťazec neexistuje. To je len synonymom, alebo alias, že sme vytvorili niečo, čo v skutočnosti je trochu viac technické volal char *. A skutočne, videli sme príklad programu v pondelok že nesprával úplne, ako sme očakávali. Jednalo sa o súbor, porovnávať-0. A pripomínajú, že porovnávať-0, ak Pondelkového programu som překompilovat a spustiť porovnávať-0 a zadajte medzimesačne v malé písmená, a mamička malými písmenami znova. Program trval na tom, I typ rôzne veci, aj keď mama, všetko v malá, je totožný vizuálne. Takže to, čo bolo krátka odpoveď prečo si myslí, že počítač tieto dva reťazce sa líšia? Jo? Divákov: [Nepočuteľné] DAVID J. Malan: Správne. Takže, mamu, prvýkrát Píšem ho, je byť uložené niekde v mojom počítači pamäti, ale na inom mieste ako druhá, kedy som písať matkou. Teraz je určite by mohol byť optimalizovaný. Počítač by mohol byť šikovný a realizáciu týchto dva reťazce, hej, sú identické. Dovoľte mi, aby som to nadbytočne uložiť. Ale počítače nerobia, že Optimalizácia ak poviete im. Takže, v predvolenom nastavení, sú to práve chystá skončiť v dvoch rôznych miestach v pamäti. A tak, aby sa viac zrejmé, keď sme porovnali dva reťazce, Prvý bol tzv s, druhý bol nazývaný t, čo konkrétne som bol nákupný tu na riadku 13? Jo. Divákov: Je to miesto v pamäti že premenná bude ukazovať. DAVID J. Malan: Presne tak, som bol nákupný miesto v pamäti že tieto premenné ukázal. Tak konkrétne v prípade, matka bola na Byte číslo 1, a 2, a 3, a 4-- preto, že si na spätné lomítko 0 musí byť úplne na konci. A tá druhá inštancia medzimesačne, m-o-m, bol na adrese 10, 11, 12, a 13. Bol som porovnávanie 1, že adresa, že umiestnenie v pamäti, proti 10, ktorý je samozrejme nie je rovnaký. 1 nie je 10. Tak to je pekné, že v je to celkom jednoduché. Ale je to problematické, ak môžeme sa zdá, porovnanie reťazcov. Tak fundamentally-- a na tejto nízkej úrovni, ak by ste chceli realizovať program pre porovnanie dve jednotlivé slová, že užívateľ zadal na kvalitu, sa im line up pre char char, len vo všeobecnej rovine, čo musíme urobiť, zrejme? Nestačí len pozrite sa na tie dve adresy. Čo musíme urobiť? Jo? Publikum: iterovat reťazec [nepočuteľné]. DAVID J. Malan: Jo, poďme iterovat reťazca. Poďme použiť pre sláčiky, sláčiky while, alebo čo ste najviac vyhovuje. A ak máme dva reťazce kdesi v pamäti, poďme sa pozrieť na každý let prvý znak, potom každý druhý znak, potom tretej a štvrtej, a piaty, až sme narazili Aké špeciálne Sentinel hodnota? Divákov: [Nepočuteľné] DAVID J. Malan: Jo, spätné lomítko nula, na ktorom mieste v jednom reťazci Môžeme sa rozhodnúť, že to je všetko. Už sme uzavreté každý znak? Ak tomu tak nie je, vráti false. Ak áno, vráti true. A tak to je presne to, čo táto verzia programu porovnať-1.c. robí. To je totožné s tým, čo sme Pozrel sa na pondelok okrem toho, že som zbavili slová string-- hoci že nemá žiadny funkčný impact-- all Robím teraz je odstránenie niektoré vizuálne školenia kolesá, ale jasne vidieť, že s a t sú adresy. A to je to, čo je hviezda, hviezdička, predstavuje je adresa, inak známy technicky ako ukazovátko. Takže keď Prehlasujem ov na linka 9 a hovoria, char * s, to neznamená, že mi dať reťazec. To znamená, že daj mi premenné, ktorej Zmyslom života je uložiť adresu. Pretože som chcel dať adresa reťazca do neho. A skutočne, GetString, byť jasné, nevracia reťazec. To nevracia mamu spätné lomítko nula, samy o sebe. Čo getString špecificky a presne vrátiť? Divákov: [Nepočuteľné] DAVID J. Malan: adresa zadaná, adresa prvého znaku v nejakom reťazci to dostal. A tak teraz vidíme opäť špeciálny kľúčové slovo. A, spomínal som sa skôr. To bude dobré konvencie že uvidíme znova a znova teraz. Ja som kontrolu, aby sa uistil, že s nie je null, a t nie je null. Vzhľadom k tomu, na základe mojich naozaj rýchla zmienka skôr, čo by mohlo znamenať, ak GetString vráti nie adresa, ale N-U-L-L, ktorý je opäť, nejaký zvláštny hodnota? Divákov: Chyba. DAVID J. Malan: Je to chyba. Niečo sa pokazilo. A to, čo typicky Môže sa stať, najmä s strings--, ktoré by mohli byť neznáme dĺžky v advance-- Možno, že počítače " nedostatok pamäti, možno ste zadali v takom dlhé slovo alebo vetu alebo vložiť také obrovské esej tam jednoducho nie je dostatok pamäte. A tak GetString nemôže vrátiť adresa celej veci, tak to proste vráti nič. A to hovorí, že chyba sa stalo vrátením špeciálnu hodnotu NULL. Je to nulová adresa, aby som tak povedal. Teraz sa ukazuje, C je dodávaný s Funkcia, ktorá robí túto iteráciu. Nemáme to vykonať s cyklus for alebo while sami. Môžeme použiť funkciu, volal stručne, miešajte Comp, alebo reťazec porovnať, ktorého Zmyslom života je urobiť presne to. Môžete dať dva ukazovatele, dve adresy, a pôjde na tieto adresy a potom porovnať list pre list pre list pre kvalitu, zastavenie iba vtedy, keď to, čo je pravda? Kedy by mal intuitívne miešať comp prestanú Iterácie, len aby bolo jasno? Keď narazí na spätné lomítko 0 buď reťazec, na ktorom mieste sa môže rozhodnúť má všetko uzavreté, alebo došlo na rozdiel? Takže, keď narazíme to teraz a skúste náš malý kapitalizácie hra, takže sa porovnávať-1, ./compare-1, a zadajte mama malými písmenami v oboch prípadoch. Teraz je to to isté. A ak by som to znovu s malé písmená, a potom možno veľké písmená. Teraz to naozaj odlišuje medzi veľkými a malými písmenami. Takže nie je tak ťažké, alebo magický, ale to teraz vysvetliť čo sa deje pod kapotou. Takže čo viac môžeme extrahovať z tohto druhu lekcie? Takže poďme sa pozrieť na to. Chystám sa ísť dopredu a napísať rýchly program, tu nazvaný copy-0. A teraz poďme do toho a vlastne poďme robiť tohle-- s kópiou-0, sa pozrieť na to, čo som sa sem dostal. Prvýkrát som povedať užívateľovi, povedz niečo. Potom som si reťazec a ja som uložil je v s. Potom som sa skontrolovať, či je rovná rovná NULL, jednoducho vráti 1. Tak to je len kontrola štandardná chyba. Nič zaujímavého nestalo. A v skutočnosti, ak by sme sa zbaviť chyby kontrola, to vyzerá ako týždeň 1 kód práve teraz. Ale ja som začal dostať trochu lepšie o tom. Teraz v rade 16, pred týždňom, možno dokonca pár dní alebo minútami, dalo by sa povedať linka 16 vytvorenie premennej nazvanej t a kopírovanie to do neho. A to je úplne rozumné stánok s jedlom. Ale buďte teraz presnejšie. Čo sa deje v rade 16? To, čo je stále skopírovaný sprava doľava? Jo? Divákov: Je t dostať adresy s? DAVID J. Malan: Presne tak, t je stále adresu s. Tak aby bolo jasno hneď, keď pôjdem späť k tej predchádzajúcej príklad a ja som upozorniť na vec, ktorú som zadali. A to, čo som napísal in-- tu je s, a tu je to, čo som napísal v niekde v pamäť, mama a potom spätné lomítko 0, ktorá je pridaná pre mňa. To, čo som uložené v tu, pripomínajú, To je v mieste 1, 2, 3, 4, To je to, čo je v súčasnej dobe v s. Takže ak na linke 16, hovorím, daj mi ďalšie premennú s názvom t a obchod v na hodnotu s, čo dostane uložené tu nebude mamička ale skôr len číslo 1. Takže ak sa pozrieme dopredu v tomto programe teraz, čo sa bude diať? Takže si všimnúť, že tam je Táto funkcia vám mohlo využili to už pred časom pre Caesara, alebo Vigener, alebo možno vôbec nie. Tvrdím s mojím printf, ja som bude kapitalizovať kopírovanie t. Najprv v riadku 19, rýchle zdravého rozumu skontrolujte, strlen skontroluje dĺžku t. Pretože nechcem, aby sa snažia zarobiť niečo v prípade, že to nie je žiadna reťazec. V prípade, že používateľ jednoducho stlačiť Enter, nič zarobiť. Takže nechcem robiť riadku 21. Takže linka 21 je zarábať ktoré písmeno, zdá sa, že vt? Publikum: m? DAVID J. Malan: Vyzerá to, ako by to kopírovanie, ktorý z nich? Divákov: m. DAVID J. Malan: Uh, m. OK, takže prvé m, pretože oznámenie, že som prechodom na toupper, ktorý ak ste nikdy nevidel, že je to len funkcie využiť ako vstup. t držiak nula znamená dať me znak nula t. A tak ako to Zmeniť obrázok, aby bolo jasné? Čo je potrebné, aby sa prepisujú alebo zmeniť s ohľadom na S a T a mama spätné lomítko nula. Divákov: [Nepočuteľné] DAVID J. Malan: Jo, tak toto tu proste potrebuje získať zmenil to-- opraviť tohle-- je potrebné, aby sa zmenil na kapitálové m. Ale teraz, pozrite sa neskôr v Program, keď som vytlačiť s a t, ako som tu upratať, sledujte, čo je bude diať vytlačenie s a t. Tak, aby copy-0, ./copy-0. Nechaj ma ísť dopredu a zadajte V medzimesačne v malými. Všimnite si, ako pôvodné a kópie boli aktivované. Prečo? No, s a t sú oba smerujúce k, ak chcete, rovnaký kus pamäte. A úprimne povedané, to už je Naozaj uninteresting-- skutočnosť že sme pomocou adresy nula tu. Chcem povedať, že to naozaj jedno, kde veci sú v pamäti. Ospravedlňujem sa, že som mazanie trochu moc. Ale ja naozaj nestarám kde veci sú v pamäti. A tak, naozaj to, čo programátori majú tendenciu premýšľať o tom, je, že keď hovoríte o adresu, alebo ukazovateľ, koho to zaujíma, kde je v pamäti. Je mi jedno, či je to na byte jeden alebo miliarda. Len ma to zaujíma, že to premenná je účinne ukázal na tomto kusu pamäti. A tak odteraz, skôr než slovíčkaření nad svojvoľným adresy pamäti, poďme len začať kresliť ukazovatele ako ukazovatele, ako šípky. Takže to, čo s a t naozaj sú, Podľa tohto programu, kvôli tomu, ako som vytvoril t, je to len dva samostatné premenné ukázal na rovnakom kusu pamäti. A je nám jedno, kde sú. Takže môžeme abstraktné preč tohto detailu. Tak ako to mám opraviť? Ak chcem napísať verzii kópie program, ktorý vlastne kopíruje reťazec a kapitalizuje iba kopírovanie, len intuitívne, čo má byť prísada do nášho riešenia? Divákov: [Nepočuteľné] DAVID J. Malan: Potrebujeme čo? Divákov: Chunk pamäte. DAVID J. Malan: Potrebujeme ďalší kus pamäti, že jo? Nevieme, ako sa to napriek tomu, nutne. Ale nejako som Potrebujem sa to stalo tak, že pôvodný mamička malými písmenami skončí v extra kusu pamäti. A potom, keď som sa zmeniť kópiu, ja nechcú zmeniť túto kópiu tu. Namiesto toho som chcel zmeniť iba tento kópie tak, že originál je nezmenený. Takže, poďme sa pozrieť, ako by sme mohli urobiť. V copy-1, ktorý má už bol zbavený komentár, ale je komentoval online. Namiesto toho sme robiť following-- títo linky sú identické, daj mi reťazec a hovoria to. Ale teraz sa pozrime na jednom z našich najviac zložitý, ale posledný zložitosti na chvíľu, riadok 16 robí presne to. Takže ak vaše pohodlné s picture sme práve drew-- daj mi nový kus pamäti, kopírovať všetko do toho, pozrime sa, ako preložiť do kódu. Takže linka 16, na ľavej strane, char * t mi dáva toto políčko tu. To je všetko, čo robí. Na pravej strane, m Alloc, alebo malloc, je alokácia pamäte, super fantázie, mystický spôsob, ako len hovorím daj mi kus pamäte. Koľko pamäte potrebujeme? No, je druh veľkého výrazu. Ale poďme sa pozrieť, čo to hovorí tu. Takže to, samozrejme, je dať me dĺžka reťazec s. Takže, mama by to malo byť, čo? Takže len tri, nie? mama je tri znaky. Nemusíte počítať spätné lomítko nulu, keď vás hovorí o dĺžke reťazca je to Vlastne ľudskej viditeľné listy. Takže mama, takže to mi dáva 3. Ale počkajte, ja som teraz pridaním 1. Prečo vlastne chcú, aby prideliť 4 bajty a nie len 3? Jo? Divákov: Pre hodnotu sentinel? DAVID J. Malan: Presne tak, pre tento sentinelovej hodnotu. Pre spätné lomítko nula, Potrebujem celkom 4 byty. Tak som potrebné dĺžka reťazca plus 1. A potom už len pre dobrý measure-- , Aj keď v tomto systéme, vždy to bude 1-- hovorím vynásobte to podľa veľkosti char. Ukázalo sa, že je sizeof operátor v C, ktorý Len vám povie počet bajtov, ktoré je potrebný pre určitý typ dát. Nefunguje pre polia, typicky, niekedy to robí. Ale v všeobecnom prípade, no. Ale to mi povedať, koľko bajtov char je, ktorý dopadá je vždy 1. Takže toto je ako násobením 1. Tak výborný mystický hľadá riadok kódu. Ale všetko, čo robí, je dáva mi kus pamäte. Ale to sa zdá, že kopírovanie niečo do tej pamäti? Ešte nie. A tak čo mám na linke 22 a 23, 24, 25, no, som jednoducho urobiť. A to je druh old school teraz veci. To je ako pset 2, kde ste len v pohybe veci okolo v pamäti, alebo skôr v reťazcoch. Takže som iterácie od 0 do dĺžka reťazca s. A ja kopírovanie i-ty znak v S do i-tého znaku v t. A pretože som programátor, robil Uistite sa, že prideliť presne toľko bajtov ako potrebujem, je to perfektné one-to-one vzťah. A ja kopírovať medzimesačne v malé písmená na nový. A potom konečne, mám tento riadok. A tak je účinok je len zúročiť tento t tu. Takže veľa absorbovať, ale ak ste práve do úvahy čo sa naozaj deje Na pod pokrievku je len pohybujúce sa tieto bajtov okolo, všetko, čo je potrebné na vyriešenie tohto problému je len preto, aby nám tento kus pamäte. Teraz na riziko ohromujúci, dovoľte mi ukázať jeden ďalší príklad, ktorý je takmer identické, s výnimkou pre tento jeden riadok kódu. Tak toto je verzia hacker tohto programu, ak chcete. Ale nech to len destilovať že do toho, čo sa deje. Linka 24 slúži k byť týmto t držiak aj dostane y držiak i. Teraz, ja sa mením to oveľa viac mystický hviezda t plus 1 sa rovná hviezda s plus 1. Takže to, čo sa deje a prečo máme hviezdy postavu? Už sme nevidel hviezdu, a je to byť používané odlišne tu. Už skôr sme videli char *, teraz som videl hviezda na začiatku, a to je v poriadku. Vzhľadom k tomu, to dopadá sme môže druh odvodiť len od tých, ktoré najprv zásady, čo sa deje. Len aby bolo jasné, čo je to? Minulý týždeň to bol reťazec. To nestačí už nie. Čo je s, konkrétne? Divákov: [Nepočuteľné] DAVID J. Malan: Je to ukazovateľ. Je to adresu Prvý znak sme zadali. OK, čo je t? Divákov: [Nepočuteľné] DAVID J. Malan: The adresa prvého bajtu v t, že kus pamäte pridelená. Tak to dopadá, že keď sme sa opakovať od 0 až na reťazec length-- v prvom rade, aj začína na 0, pretože z tejto starej školy pre slučky vec. Tak práve pre jednoduchosť, poďme Predpokladajme, že prvý riadok kódu je naozaj len to, že jo. Keby som je nula, nula sčítanie k niečomu pravdepodobne nebude mať vplyv. Takže to, čo je to hovorí? Ukazuje sa, že hviezdy Operátor sa v tejto súvislosti je dereferencia operátor, čo je len ozdobný spôsob, ako hovoriť ísť na nasledujúcu adresu. Takže ak s je adresa prvou charakter v tomto kusu pamäti, * S prostriedkami tam. A pretože sme ťahané obraz týmto spôsobom, môžete prijať po mentálnej model. Ak je to s, a vy hovoríte: * S *, s niečo ako šmýkačiek a rebríky, ak si spomeniete hry z detstva, je ako sledovať túto šípku a ísť na adresu. * T je to isté. Takže začať tu, choďte na jeho bloku. Nemôžem len tak čerpať z táto obrazovka, že tak. * T znamená ísť sem. A potom je pre slučka je len porekadlá presunúť tento znak tu, presunúť tento znak tu, presunúť tento znak tu. Ale ako to mám urobiť inkrementácia? Musím sa vrátiť späť to, čo som práve zmazal. To je to, čo sa všeobecne nazýva ukazovateľ aritmetický, ktorý znamená, že matematiku s adresami. Ak sa v tomto pre sláčiky, Stále postupne i, a s je adresa a t je adresa, keď som len držať prídavkom 1, to len znamená, že neustále v pohybe vpred, a dopredu, a odovzdať do pamäte. Je to ako Oxford Street sa ulice, že budova je na SK. SK budovy je 33 Oxford Street. Takže ak by ste mali robiť 33 Oxford Street plus 1, ktorá vás privedie na 34 Oxforde Street, potom 35 Oxford Street, potom 36 Oxford Street, bez ohľadu na tých, budovy v skutočnosti sú - v prípade, že existujú. A tak to je všetko robíme tu s ukazovateľom aritmetiky. Takže je to super tajomný cesta vyjadriť sami. Ale to všetko sa deje pod pokrievku práve po tieto adresy, ako po mapu, ak chcete, alebo po šípky, ako je sme vykreslený na obrazovku. OK, veľa stráviteľné. Akýkoľvek dotaz na syntax, koncepty, ukazovatele, malloc, alebo podobne. Jo, tu ako prvý. Divákov: Tak kde to hovorí * t rovná toupper * t, je to, že bude ťažiť všetky písmená alebo jenom-- DAVID J. Malan: Ah, naozaj dobrá otázka. Takže v tomto riadku tu, 31, to bude zarábať prvé písmeno alebo všetky písmená. Takže poďme odpovedať tým, že ide späť do prvých princípov. A prvé pravidlá tu mám na mysli stačí ísť do základné definície , Čo sa jedná. Takže toupper je funkcia ťažiace char. To je všetko. * T znamená ísť do first-- prejsť na adresu v t. Takže, v obraze, pokiaľ sa jedná o blok pamäte pridelené sme s malloc, a to je t, * t znamená nájdete tu. Medzitým ste absolvovaní že hodnota, malé písmená m na toupper, ste stále späť kapitál M, kde ste ho dávať? Tie uvedení v tom istom mieste. A tak touto logikou tých, základné definície je to len kapitalizácie prvé písmeno ak iteráciu s I alebo cyklus for alebo while, že to nebude robiť nič viac, než si to opýtať. Dobrá otázka. Jo? Divákov: Prečo ste použiť dereferencia spôsobe skôr než poľa? DAVID J. Malan: Á, dobrá otázka. Prečo by ste používať dereferencia Spôsob namiesto metódy poľa? Žiadny osobitný dôvod, aby som bol úprimný. A v skutočnosti, pre toto druh napríklad doprava, Ja som len dohadovať urobiť Program zložitejšie, viac oči sú zasklenie nad, ľudia sú mimo kontroly pretože to vyzerá mimoriadne tajomný, ale aj keď to robí to isté. A tak, úprimne povedané, je to zbytočne vizuálne komplexné riešenie k problému. Je to stále dobrý dizajn, päť z piatich pre návrh, či už je to v držiaku notácie alebo sa kurzor notácie. Ale-- zvlášť keď sa dostaneme Neskôr v priebehu v pset 5 keď sme sa realizovať tento slovník, ktorý Zmienil som sa o pár times-- budeme vlastne starať o pamäťové adresy nízkoúrovňové že sme naozaj pochopili čo sa deje. Ale teraz sa ukazuje, že táto riadok kódu tady hranatých zátvoriek v skutočnosti neexistujú. Oni sú to, čo sa nazýva syntaxe cukor, ktorý je len podivne chladný spôsob, ako hovoriť kompilátor prevedie hranaté zátvorky byť že matematický výraz. Takže je to ľudské konvencie aby bolo možné len písať Tieto veľmi užívateľsky príjemný zátvorkách. Ale to, čo prekladač, zvonenie, Je naozaj robia kedykoľvek napíšete, čo je zdôraznené v rade 24, pod kapotou je to naozaj premieňať to na to. Je to jednoducho oveľa príjemnejšie ako človek čítať a písať kód, ako je potrubie 24. Ale nakoniec tí, koliesok príliš zložiť keď niečí vlastné pohodlie dostane silnejší. Dobre, takže pripomínajú potom, že to bol druh najväčším problémom sme narazili na. A to je to, čo zapálilo tento celok sakramentsky rozhovor o ukazovatele, a adresy a kopírovanie veci. Bolo to preto, že sme zakopnúť to hlúpa, hlúpa otázka, pričom Som implementoval logically-- s Lauren tu na demo a pomarančového džúsu V milk-- dokonale algoritmickým správnu funkciu pre prečerpanie dve premenné " hodnoty, ale tá prekliata vec nemal žiadne perzistentné, alebo trvalý, vplyv na mojom kódu. A prečo to bolo? Stručne povedané, prečo je to implementácia swapu logicky správne, ale nemá žiadny vplyv o premenné, ktoré sú odovzdané k nemu, ako x a y na hlavnej? Aká bola podstata problému? Jo? Divákov: Vzhľadom k tomu, variabilný vyrobené kópia premenné v priesmyku prostredníctvom funkcie. DAVID J. Malan: Presne tak, keď miniete premenné do funkcie, alebo argumenty, do funkcie, oni sú prešiel exemplári, ktorý znamená, že dostanete identický hľadá vzorka bitov pre obe x a y, tu nazýva a b. A môžete robiť čokoľvek Chcete sa týchto kópií, ale oni budú mať žiadny Vplyv na volajúci funkciu. A v skutočnosti, že sme vyžrebovali obraz na obrazovke, odvolanie naposledy, pričom ak ste naozaj myslíte, že o tom, čo je to deje Naspodku hood-- pokiaľ To je pamäť počítača, a sem je kus Pamäť sa používa pre hlavné, to je kus Pamäť sa používa ako odkladací priestor, a tak aj keď má hlavnú dve premenné, x a y, odkladacia môžu mať totožný hľadá hodnoty, ktoré sú oba 1 a 2, ale sú úplne rôzne kúsky pamäti. Takže potrebujeme riešenie pre toto. A úprimne povedané, zdá sa, že teraz majú riešenie tohto problému, vpravo. Ak by sme teraz majú schopnosť manipulovať veci prostredníctvom adries a, niečo šmýkačky a rebríky štýl, postupujte podľa nasledujúcich šípok a ísť kamkoľvek chceme v pamäti, nemohli sme vyriešiť tento problém prechodu z hlavnej vymeniť nie hodnoty chceme Swap, ale len intuitívne to, čo by sme mohli prejsť na miesto vymeniť? [Vložením hlasy] DAVID J. Malan: Prečo nie my len prejsť to adresy, je to tak? Prečo dávame swap mapu pokladu, ak chcete, ktorý vedie ju do Skutočné hodnoty x a y. Poďme swapu, skutočne zmení tieto originálne kúsky, skôr než práve prechádzajúcej kópie bitov. A tak, v skutočnosti, to je to, čo je bude riešenie. Táto verzia je tu jasne zlé a chybné. A teraz, na prvý pohľad, to jednoducho vyzerá ako sme pridali veľa hviezd náhodne a prešiel naše prsty že by to zostaviť. Ale to by teraz zostaviť. Ale poďme sa pozrieť, čo tieto veci znamenajú. A bohužiaľ autori C mohol zvoliť ďalší symbol aby sa tento malý jasnejšie, ale operátor hviezda má iný význam v dva rôzne kontexty. A videli sme obaja, ale poďme rozlišovať. Tak sa na tam hore, keď som sa zmenil a a b od bytia INT v zlej Verzia pre int hviezdy, A a B, skôr, boli celé čísla. Aké sú a a b teraz v dobrý, zelené verzie? Sú adresy. Adresy z toho, čo, aby bolo jasné? Adresy celých čísel. Takže k tomu, že som povediac: int hviezdička znamená, to je adresa celé číslo, konkrétne. Takže teraz oznámenia v riadky kódu, niečo iné zmenilo taky. tmp zostáva rovnaký, pretože je to len dočasná celé číslo, pamäťová kúzlo tam. Ale teraz potrebuje hviezdu. A v skutočnosti, v každom ďalšie zmienka o a a b, Všimnite si, že všetko, čo je zmena z červenej na zelenú je to, že som prefixing tieto premenné s hviezdami. Pretože nechcem kopírovať a a b. Pretože keď som len skopírovať a a b a odkladací a a b, čo mám vlastne vymieňať? Len adresy, chcem vymeniť čo je v týchto adries. Chcem tam ísť. A tak sa operátor hviezda vnútri mojej funkcie, nie vo vnútri zoznamu parametrov, znamená, že ísť na tieto adresy a skutočne zmeniť tieto hodnoty. Takže to, čo robí obrázok teraz vyzerať miesto. No, keď namiesto toho som okolo in pre A a B nie 1 a 2-- Vlastne som potrebné pridať jeden ďalší definície tu. Takže predpokladám, že tento kus pamäte je na mieste 10. To je v mieste 11, ale toto je kúsok zjednodušenie, Teraz mám dve možnosti mám prejsť x a y alebo môžem prejsť ich adresy? Keby som prejsť ich adresy takto, len som Teraz je potrebné realizovať swapu na zelené kódom tak, že keď je to vidia a kedy ju b vidí, že nejde len kopírovať a a b a presunúť mlieko a pomarančový džús. Mlieko a pomarančový džús metafora sa pokazí, pretože tí sú poháre kvapalných a nie máp. Namiesto toho musíme ísť osloviť 10 a my musieť ísť riešiť 11, a vykonajte túto odkladanie logiku. Takže logika je rovnaká, ale potrebujeme trochu iný spôsob, ako prístupu k tieto premenné. A tak na konci, to, čo Program má vyzerať ako je toto. V swap.c doslovne skopírovaný a vložili zelenú verziu. Ale musím urobiť jednu zmenu. Nestačí len meniť swapu. Aké ďalšie riadok kódu musím zmeniť? Jo? Divákov: Tam, kde to trvá argumenty. DAVID J. Malan: Kde to vyžaduje jeho argument. Takže keď som sa posunúť až na hlavné, I Nemôžete len odovzdať x a y, a sľubujem, posledný kus novú syntaxou dnes. Musím odovzdať nie x a y, ale adresa x a y. A ukázalo sa, symbol že autori vybrali C je, ak používate ampersand tu, nie byť zamieňať s bitové ampersand, ak používate ampersand tu a tu ampersand, to vyrieši za vás, Čo je adresa x, možno je to 10, čo je adresa y, možno je to 11, a tie, ktoré prechádza v miesto. Takže veľa absorbovať všetky naraz. Ale pozrime sa teraz rýchlo Naši zostávajúce štyri minúty kde sa veci môžu ísť nakrivo. A ako stranou, v skutočnosti Vzal som si tento obrázok, TF vzal tento obrázok rok alebo dva lety. Tak toto je zadný roh Eliota jedálni. Ukazovatele sú snáď najťažšie tému, ktoré budeme rozprávať v CS50. Takže ak máte starosti ten typ svahu je ako možno je to viac hokejkou takto, si uvedomiť, sme trochu blíži vrchol v Podmienky koncepčného zložitosti. A ja vychovávať to foto, pretože prisahám bohu, na jeseň roku 1996, keď som sa CS50 s mojím výučby kolegami, Nishat Mehta, posadil ma v roh Eliota D. sále pri obede, alebo večera, alebo niečo sa pokúsiť aby mi pomohol pochopiť ukazovateľov. A to je miesto, kde som bol týždne potom, to bolo predstavené v prednáške, keď Konečne som pochopil odkazy. A dúfam, že to klikne oveľa skôr pre vás. Ale si to uvedomujú absolútne medzi Sofistikovanejšie témy sme sa pozrel na. Ale je to medzi najsilnejšie. A keď si to, je to naozaj všetko len tak, aby konečne dohromady. Takže buďte si istý, že nie je je potrebné pre všetkých umývadlom dnes. Tak tu je posledný program budeme pozerať. A budeme končiť s rýchle tri minúty claymation vyrobený náš priateľ, Nick Parlante. Tu je program, ktorý na dva najvyššie linky deklaruje premennú x a y. Ktoré sú obe adresy celých čísel, AKA ukazovatele. Potom sme prideliť dosť pamäť pre uloženie int a uložiť adresu tejto pamäte v x. Takže, je to ešte jednoduchšie než napríklad pred. Daj mi štyri bajtov pamäti, to je veľkosť int, a dať túto adresu x. Táto linka znamená, že tu prejsť na adresu v x a dal význam život, číslo 42 tam. Ale tento riadok mi robí starosti. Hviezda y znamená ísť na adresu v y, a dal nešťastné číslo 13 tam. Prečo je to nebezpečné, v tomto bode v story-- hoci rýchlo povedal v našej zmrštenie minút here-- prečo je to zlé keď poviem, choďte na adresu v y? Divákov: Nemáte [nepočuteľných]. DAVID J. Malan: nemám dal čokoľvek y. Takže to, čo je hodnota y, v tomto bode príbehu? Nemáme tušenie. Je to nejaký odpad hodnota a ani Binky vedieť. Ak by sme mohli skončiť v tejto poznámke. [Videoprehrávanie] Hej, Binky, prebudiť. Je čas na ukazovateľ zábavu. -Čo je to? Ďalšie informácie o ukazovatele? Oh, dobrota. No, aby mohli začať, myslím, že sme bude potrebovať pár rád. -OK. Tento kód prideľuje dva ukazovatele ktorý môže poukázať na celé čísla. -OK, Dobre vidím dva ukazovatele, ale oni nezdá sa, že by ukazoval na čokoľvek. -To je správne. Spočiatku na ukazovatele neukazujú na nič. Veci, ktoré poukazujú na sú volal pointees a ich nastavenie je samostatný krok. Oh, jasne, jasne. Vedel som to. Tieto pointees sú oddelené. Tak ako sa vám prideliť pointee? -OK, No to kód alokuje nové číslo pointee, a Táto časť stanovuje x poukázať na to. Hej, to vyzerá lepšie. Tak, aby to niečo urobiť. -OK, Budem dereferencia ukazovateľ x do uložiť číslo 42 do jeho pointee. Pre tento trik, budem potrebovať moje kúzelná palička dereferencing. -Váš Kúzelná palička dereferencing? Uh, to, to je skvelé. Toto je to, čo kód vyzerá. Ja si len nastaviť číslo a-- [POP SOUND] Hej, pozrite sa tam to ide. Takže, robí dereferencia na x nasleduje šípka na prístup k jeho pointee. V tomto prípade, na uloženie 42 tam. Hej, skúste použiť na ukladanie číslo 13 prostredníctvom druhého ukazovatele, y. -OK. Pôjdem sem na y, a získať číslo 13 nastaviť. A potom sa paličku dereferencing a jen-- [Bzučiak] Oh, hej to nefungovalo. Povedzme, uh, Binky, vôbec sa mi nepáči myslíte dereferencing y je to dobrý nápad, pretože nastavenie up na pointee je samostatný krok. A nemyslím si, že sme kedy urobili. -Hmm, Dobrý postreh. Jo, máme pridelené ukazovateľ, y, ale nikdy sme ju nastavte na poukazujú na pointee. -Hmm, Veľmi pozorný. Hej, vy hľadáte dobre tam, Binky. Môžete to opraviť tak, aby y body na rovnakú pointee ako x. Jasné, som použiť svoj čarovnou paličkou priradenie ukazovatele. -Je Že Bude to Problém, ako predtým? Nie, to nie dotýkať pointees. Je to len jeden ukazovateľ zmení poukázať na rovnakej thing-- [Praskavý zvuk] --as iného. -OH vidím. Teraz y odkazuje na rovnakom mieste ako x. Takže, počkajte, teraz y je pevná. To má pointee. Takže si môžete vyskúšať prútik dereferencing znovu odoslať 13 konca. Oh, OK, tu ide. Hej, pozri sa na to. Teraz dereferencing práce na y. A pretože ukazovatele sú zdieľanie že jeden pointee, obaja viď 13. Jo, zdieľanie, uh, čokoľvek. Takže, budeme prejsť miesta teraz? Oh, pozri sme mimo čas. -But-- -Len Pamätajte na tri pravidlá ukazovateľ. Číslo 1, základná štruktúra je, že máte ukazovateľ, a poukazuje cez k pointee. Ale ukazovateľ a pointee sú oddelené. A Častou chybou je nastaviť ukazovateľ ale zabudnúť, aby to pointee. Číslo 2, ukazovateľ dereferencing začína na ukazovateľ a sleduje jeho šípku nad pre prístup k pointee. Ako všetci vieme, to funguje iba v prípade, že je pointee, aký druh dostane späť na pravidlo číslo 1. Číslo 3, ukazovateľ Priradenie trvá jeden ukazovateľ a menia ho, aby ukazoval na Rovnaký pointee ako ďalší ukazovateľ. Takže po zadaní, dva ukazovatele bude ukazovať na rovnakej pointee, Niekedy sa hovorí, že zdieľanie. A to je všetko, čo je k tomu, naozaj. Zbohom teraz. [END Prehrávanie] DAVID J. Malan: To je pre CS50. Vďaka profesorovi Nick Parlante. Uvidíme sa budúci týždeň. [ELECTRONIC prehrávanie hudby]