>> [Přehrávání hudby]
DAVID J. Malan: To je jako nováček seminář dnes.
DOBŘE.
Takže velmi deštivé ven.
To má tendenci stát se ve středu, ale o to více příležitostí
pro dotazy dnes.
Takže pojďme začít skutečně s filmem za chvíli.
Ale začneme vznešeně jako vždy.
>> To je CS50, a to je konec týdne 4.
Takže pokud jste někdy sledovali Televize nebo filmu, kde
tam je nějaký počítačoví experti a policie, nebo FBI, nebo nějaká agentura
se snaží chytit nějaké protivník, no, jsem
pravděpodobně slyšeli výraz "posílit," čímž že technik jaksi
magicky zvětší nekonečně daleko vidět zločince
totožnosti nebo SPZ i v tom třpytu zrcadla
nebo záblesk něčí oko.
Takže opravdu, pojďme se podívat na jen pár takových scén z Hollywoodu.
[VIDEOPŘEHRÁVÁNÍ]
-OK, Teď pojďme dobré podívat se na vás.
>> -Držet to.
Spustit to zpátky.
>> -Počkej chvíli.
Jděte doprava.
>> -Je, Zmrazit, že.
-Celá obrazovka.
-OK, Zmrazit, že.
Zpřísnění při současném se na to, že budete?
-Vector V na to člověk od zadního kola.
-zvětšení Přímo tady na tomto místě.
-S Pravé zařízení, obrázek by mohl být rozšířen a naostřené.
-Co je to?
-To Je program vylepšení.
Umíš jasné, že se nějaké?
Já nevím.
Pojďme zvýšení.
>> -Enhance Část A6.
>> -I Lepší detail, a-- Myslím, že je
dostatečně zvýšit, uvolněte ji na mé obrazovce.
-I Lepší odraz v očích.
>> -Nech To běh toto přes vylepšení videa.
-Edgar, Můžete zvýšit tohle?
>> -Vydrž.
>> -I've Pracuje na této úvahy.
>> -Someone Odraz.
-Reflection.
-Je To odraz mužova obličeje.
-The Reflexe.
-Je To odraz.
-zvětšení Na zrcadlo.
-Můžete Vidět odraz.
Umíš zlepšit obraz odsud?
Umíš ho zlepšit tady?
Umíš to zlepšit?
Můžeš to zlepšit?
>> -Lze Zvyšujeme to?
>> Umíš to zlepšit?
-Hold Na vteřinu, budu zvýšit.
-zvětšení Na dveře.
-Times 10.
-zoom.
-Nastěhování.
-Více.
Počkat, zastavit.
-Stop.
-Pause To.
-Rotate Nám 75 stupňů kolem vertikální, prosím.
-Stop.
Vraťte se do části o dveře, znovu.
>> -Máš S Image Enhancer, která může rastrový obrázek?
>> Hej, možná můžeme použít Pradeep Metoda Sen vidět do oken.
Tohle software je stav techniky.
>> -The Eigenvalue je vypnutý.
>> -S Vpravo Kombinace algorithm--
>> Přijata eliminace -Je algoritmy na další úroveň,
a já se je použít k zlepšit tuto fotografii.
>> Blok dál a rozšířit osu z.
>> -Zlepšit.
-Freeze A zlepšit.
>> [END Přehrávání]
>> DAVID J. Malan: Dobře, tak všechny z nich jsou ve skutečnosti slova.
Jsou to jen navlečené dohromady v tak, že to ve skutečnosti není rozumné.
A ve skutečnosti, CS50 a kurzy líbí inklinuje zničit hodně televizi a filmy
pro tebe.
Vzhledem k tomu, když ty počítačové odborníky jsou drnčení off termíny a říkat
efektní věci, jako je vlastní vektory, a z osy,
a jakýkoliv počet jiné ve skutečnosti více technické termíny,
jsou to opravdu jen navléci Slova spolu příliš často.
Je to jeden z našich nadějí je, jako vedlejší účinek přijetí kurzů
jako je tato, bude více lidí do world skutečně schopna vážit
a jen někdy tak trochu ovlivnit kvalita a přesnost těchto filmů?
>> Ve skutečnosti, pojďme se podívat na realitu.
Takže tady je zaměstnanci foto Marie, jeden z našich výukových chlapi.
A předpokládám, že ona je podezřelý z něčeho.
A přesto, je tu jiskřička někteří důkaz v oku,
nebo v odrazu jejích brýlí.
No, pokud budeme dělat přesně to, co filmy navrhovat, kde jsme se přiblížit a "zvýšit",
To je, kolik informací je v Mariině tváři
Při pořizování snímku s původním rozlišení.
>> A ve skutečnosti, můžete vidět tyto body.
A to jsou jaké jsou tzv pixelů, P-I-X-E-L-S,
což je jen čtverec typicky to je bod, který komponuje snímek.
A zpět v den, a vlastně i dnes s některými z dnešních LED televizory
nebo LCD televizory, pokud máte člověk ve svém pokoji, nebo doma,
pokud jste jít až velmi blízko k ní, a zvláště pokud je to poněkud starší TV,
můžete pravděpodobně ještě vidět tyto tečky a to je to, co kompozici snímku.
>> A není tam žádný další informace, než je tato.
Mohli bychom "zvýšit", v tom smyslu, vyhlazení věci znovu a druh
vyvozování druh, tak nějak to, co Barva by měla být vedle Marie oko
takže to není vlastně tak pixelated.
Ale když jsem pořád přiblížení, tam je špatný člověk v oku.
Stejně jako, že je o informace, které máme.
Nemůžete vytvořit Informace z ničeho.
Je tu jen konečný počet bitů tam.
>> Takže Zadání problému 4, kde máte možnost
hrát si s tímto druhem světa.
V Zadání problému 4, budete prozkoumat svět grafiky a forenzní,
a vlastně psát kód že obnovuje ztracená obrázky.
Budete psát kód, který manipuluje existujících snímků
a nakonec pochopit, co je to děje pod kapotou.
>> A to dopadá, je to vlastně není všechno tak složité.
Například, pokud chceme představují smajlíky kde
s těmito černé pixely, nebo jsou tyto černé tečky,
dobře, mohli bychom jednoduše představovat je jako opravdu bitmapy.
A pokud jste měli někdy slyšeli, že výraz bitmap, snad
Nyní začne, aby se trochu větší smysl dnes.
>> Už víme, co je to trochu je.
To je 0 nebo 1.
A Mapa je prostě něco, jako kus papíru
která vám dává pokyny a má možná mřížka X a Y souřadnic.
Takže tady je bitmapový.
Je to mapa bitů přičemž 1 je zřejmě
bude reprezentovat bílé pixelu, a 0 bude reprezentovat černou pixelu.
Ale my jsme mohli jistě hodit kolem.
To není opravdu jedno, tak Dokud jsme důslední.
A tady je, jak, v binary-- uvnitř z paměti počítače, nebo dokonce i uvnitř
na soubor na pevném drive-- byste mohli uložit
nejjednodušší smajlíkem obrazů.
Ale to, co jsme, samozřejmě, chybí v tomto obrázku?
Color, že jo?
Je to jasné, další krok, nebo Vylepšení zlepšit to s barvou.
Takže bohužel se jen jeden bit, 0 nebo 1, můžeme znázornění barev.
To by mohlo být červené, nebo modré černá, nebo bílá, nebo zelená, nebo růžové,
nebo jakékoliv párů barev.
Ale pro jednoduchost, budeme jen předpokládat, černé a bílé.
>> Takže to, co logicky potřebujeme, kdybychom chtějí zavést barvy v obraze?
Co musíme udělat?
Stejně jako v případě, že limitujícím faktorem je zde je, že s jedním bitem můžete pouze
představují dva státy, 0 nebo 1, bílý nebo černý, co chceš dělat?
Diváků: další data.
DAVID J. Malan: Více bitů, jo více dat, více bitů.
A opravdu, to je přesně to, jak barevné obrazy jsou zastoupeny.
Spíše než používat jeden bit, je 0 nebo 1 pro každý obrazový bod, každá tečka,
stačí použít násobek.
Možná použití 8, možná více obyčejně použití 24, a opravdu, v Zadání problému
4, budete hrát se souborem formát, který používá 24 bitů obvykle.
>> Ale většina z vás pravděpodobně obeznámeni s JPEG.
Pokud jste někdy vzít Fotografie na vašem telefonu,
nebo uložit nebo něco vidět na Facebook, Flickr nebo libovolný počet
webových stránek foto-based, nemáš Před pravděpodobně viděli obrázek JPEG.
A ukázalo se, je to soubor formát budeme používat v pset 4,
kdy budete muset obnovit obrázky
že jsem omylem smazané od A poškozené paměťové karty ve fotoaparátu,
chcete-li.
>> A ukázalo se, že i když JPEG je docela sophisticated--
je to mnohem složitější než černých a bílých teček
jsme viděli před chvílí, protože tam je skutečně efektní algoritmy, které
se používá ke kompresi JPEG, takže že můžete mít opravdu pěkné,
kvalita obrazu, ale s použitím relativně málo kousků.
A vrátíme se do komprese zanedlouho.
Ukazuje se, že první tři byty v image-- JPEG
bez ohledu na to, co jste si vzal fotografii of-- jsou hodnoty 255, 216, 255.
>> Jinými slovy, pokud jste právě vidět, že vzorek bitů,
zde zastoupeny jak tři bajtů nebo 24 bitů celkem,
s vysokou pravděpodobností lze usuzovat, že hledáte se na to první tři
bajtů JPEG.
A to je to, co je známo jako podpis ve formátu JPEG.
Mnoho formátů souborů tam obvykle začínají
s některými vzory 0s a 1s, tak, že systém Windows a Mac OS a iOS,
a Android vědět, jaký druh souboru, který jsou, kromě tzv souboru
rozšíření, které velké množství souborů má.
Pokud jste .jpg, to je další vodítko k počítači.
>> Takže pojďme se nyní podívat na to trochu více technicky.
Známe desetinné systém je 0 až 9.
Víme, že binární je 0 a 1.
A pokud si myslíte, zpět do pset 0, měli jsme vás zápasit s,
pro trochu, něco volal hexadecimální,
kde budete mít 16 číslic, místo 10, nebo místo 2.
A ty číslice, podle konvence, jsou od 0 do 9 a poté
až f, kde f představuje to, co desetinné číslo, stejně jako rychlý zdravý rozum
zkontrolovat?
Tak, 15.
A musí představovat 10, jen tím, povaze uspořádání, které jsem dané.
Je to jen svévolnými konvencemi, ale je to docela běžná.
>> Takže pokud se podíváme na tohoto vzoru ze tří bytes-- pojďme
jen začít se na to podívat v souladu s tím, jak
počítačoví odborníci obecně podívat se na a přemýšlet o souborech.
Určitě můžete přemýšlet o tom, soubory v 0s a 1s, a desetinná,
ale ve skutečnosti, máme tendenci používat binární nebo více typicky hexadecimal--
zpět z pset 0.
Dovolte mi tedy navrhnout, aby 255, 216 a 255 jsou právě tyto vzory 0s a 1s.
A můžete to zkontrolovat, zda jste Chcete si to spočítejte od týdne 0.
Ale teď, jen předpokládat, že toto je opravdu správné.
Právě jsem přepsat tři desetinná Čísla jako tři binární hodnoty.
A teď, co budu dělat, je stačí přidat nějaký bílý prostor,
jen pro Čitelnost příčinu.
A upozornění, já jsem prostě jít přesunout věci od sebe.
Tak před, po, před, po.
Dělám nic zajímavého ostatní než jen šíří věci tak,
že oznámení každá sada osmi bitů je nyní dvě sady čtyř bitů.
To je užitečné, protože hexadecimální je obzvláště v módě
protože každý hexadecimální znak 0 až f, nebo konkrétněji 0 až 15,
mohou být reprezentovány s přesně čtyři bity.
Jinými slovy, pokud jste v šestnáctkové soustavě chtějí reprezentovat 0, je to jen 0000,
čtyři nuly.
A pokud chcete reprezentovat 15, to je 1111, což je čtyři bity.
A pokud si to spočítejte, pokud se jedná o ty, místo,
To je místo, 16S, že se chystá dát vás--
spíše, co se děje to-- líto, v binární,
, co se děje, aby vám 15, ty místa, Dvojky místo, čtyři a osmičky místo.
Dovolte mi tedy, že navrhne, aby Sada čtyř bitů, na levé straně
je to, co budeme říkat f.
Je to největší číslo může představovat čtyři bity.
A my už víme z šestnáctkové, f je největší číslice v šestnáctkové soustavě.
Máme další f tam, další dva támhle.
A teď, jen se na víru že jsem udělal matematický právo
a že levá polovina z těchto bitů, 1101,
je totéž jako D v hexadecimální soustavě.
A pravá ruka, 1000, se nachází pouhých 8.
>> A ten člověk je snadné vidět, že jo?
8 represents-- má pravdu pod tímto osmý místě.
Takže máme jeden ve sloupci osmý a nic ve čtyřech, dvojky nebo ty.
Takže nyní více konvenčně, lidé mají tendenci zapisovat hexadecimální číslice, jako je tato,
stačí přebít dohromady, a pak je prefix 0x.
To znamená, že nic jiného než vizuální vodítko k human--
přichází hexadecimální value--, protože to by mohlo jinak být zřejmé.
>> Což znamená, že v konečném důsledku, že vzor nul a jedniček,
nebo vzor hexadecimální Číslice ekvivalentně, že jste
začnou hledat v Zadání problému 4 tohle--
a problém Set 4 spec bude chodit jste přes to ve více detail--
ale uvědomit si, jak druh Arcane as to může vypadat na první pohled,
se chystáte začít vidět to hodně.
A ve skutečnosti, dokonce i v GDB se debugger jsme představili v pondělí
a Dan představí v pset 3, se děje často ukáže hexadecimální hodnoty
jen proto, že mají tendenci být více konvenční než desítkové nebo binární
ve světě počítačů.
A teď pojďme dát to do kontextu.
Mnozí z vás by mohl pamatovat Fotografie: tady, který přišel z čeho?
Vista, takže ještě dříve, než to, že systém Windows XP to udělal debut.
Takže tohle je krásná krajina.
A ve skutečnosti, pokud se v kurzu porozhlédnout online-- Myslím, že je to článek Wikipedie,
kde někdo velmi překvapivě vyšel našel místo na světě, nastavit
jeho nebo její kamera ve přesně pravý place--
a to dnes vypadá, ale jako-- je to přesně stejné nastavení.
Tento obraz, i když je v souboru formát nazvaný bitmap, b-m-p.
A budeme brát super Rychlý pohled na to, co to znamená.
>> Ale bitmapa je jen jiný způsob, jak představující obrazy stále používáte pixelů
na 0s a 1s, nakonec.
Ale v letmém pohledu, to má zajímavější podpis
Na začátku souboru.
Není to jen tři bajtů, spíše je tu
celá parta vzorců bytů že mít předem stanovená význam.
Například, někde v Prvních pár bajtů bitmapový obraz
bude velikost z obrazu, šířka obrázku,
výška obrazu, takže užitečné metadata, chcete-li.
Užitečné informace, které Photoshop nebo jakékoliv grafický program, který používáte
by ve skutečnosti mohly záleží.
>> Takže o tom více v Zadání problému 4, ale to
je pouze říci, že na konci dne
všechny formáty soubor, který jste používali pro years-- soubory Microsoft Word,
Čísla soubory, soubory Excel, Libovolný počet formátů souborů
které by mohly mít některé známa přípona souboru
jsou jen 0 a 1 pod pokličku.
A lidé se rozhodli, co konvence jsou,
jaké vzory 0s a 1s představují Word soubor oproti souboru Excel,
proti libovolným počtem jiných formátů souborů.
Takže pset 4, budete mít možnost hrát s tím.
>> Ale co to znamená, že mají struct.
To je vlastně hezký segue nyní do C, který má jen pár
o další funkce, které jsme se podíval na dosud.
Je to docela malý jazyk a jeden z pěkných vlastností o C, je struct.
Například, pokud jste chtěl represent-- pojďme
že jste chtěli mít proměnné představuje student v nějakém programu.
Možná jste psali kurz registrace programu, nebo jádro nákupy
nástroj, nebo něco takového.
Jaké jsou kusy dat souvisejících studentovi, které přicházejí na mysl?
Stejně jako student reprezentován se, jaké hodnoty?
To jo?
Máte jméno jako student.
Co ještě typický studentka mít?
>> Diváků: [Neslyšitelné]
>> DAVID J. Malan: Takže, je mi líto.
>> Diváků: Age.
>> DAVID J. Malan: věku, nebo narozeniny ekvivalentně, jo.
Co dalšího?
Diváků: ID číslo?
DAVID J. Malan: Takže ID číslo, možná telefonní číslo, možná koleji nebo dům,
nebo vysoká škola, nebo něco takového.
Jakýkoli počet kusů dat, které můžete mít v seznamu kontaktů
je to, co by mohlo definovat studenta.
Takže pokud jsme chtěli, aby to, v kódu, bychom mohli udělat něco jednoduchého, jako to.
My bychom mohli mít tak, aby program má řekněme, int main (void).
A když chci představovat studentka bych mohl mít, například,
řetězec s názvem název pro tento student, řetězec s názvem koleji pro tuto studenta,
Možná int nazývá ID pro tento studenta.
A protože jsem pomocí řetězce, já je třeba se vrátit a postavit CS50.h.
Možná budu potřebovat stdio.h.
Dovolte mi tedy preventivně udělat ty a já bude volat tento student.c teď
a uložit to.
>> A teď můžu něco udělat s těmito proměnnými.
A my jsme jen tak psát že jako komentář v pseudo kódu,
protože to není zajímavé, to, co děláme teď.
OK, takže to je program, který nějak ukládá studenta.
Co chci dělat, když jsem chcete uložit dva studenty?
Takže můj první instinkt se děje v pořádku, počkejte chvíli,
když mám dalšího studenta, proč ne já prostě Název řetězce 2, string kolej 2,
int id2.
A udělali jsme pryč touto cestou před
a to, co bylo naše řešení, co se zdá být druh hackish Kopírovat Vložit
práce tady?
Diváků: Pole.
DAVID J. Malan: Jo, bychom mohli použít pole.
Hned to velmi rychle se stává nepraktické.
Musíte se seřadit libovolně začátek jmenovat všechny tyto proměnné.
A vy, člověk, mít na dráha, která OK jméno2 odpovídá
s dorm2 odpovídá ID2.
Prostě se stane nepořádek.
Takže je to mnohem jednodušší, vyvolat z před několika týdny,
jen museli nadávali řetězcových a možná nám tři z nich.
A pak možná máme řetězec dorms a mají
Tři z těchto, nebo s konstantní, int ID a mají tři z nich.
Ale i teď to cítí trochu nedbalý, že jo.
Mluvíme o studenty a ještě Jsem opravdu bydlí na nízké úrovni
detaily implementace.
Student je název a koleji a ID.
>> Proč nemohu jen deklarovat proměnnou volal student a říkají to.
A když chci dalšího studenta, proč ne já jen říkám t.
Nebo když chci spoustu studentů, proč ne já jen
říct, že jsem celou třídu studentů, a to tři z nich.
Jinými slovy, proč nemůžu přijít up s mou vlastní datový typ, nazvaný
Studenti, uvnitř které je název, je ID, je koleji,
je jakékoli číslo z jiných oborů.
A ukázalo se, že může dělat přesně to.
>> Takže C má tuto funkci nazvanou struct.
To je funkce, jazyk, který nám umožňuje dělat přesně to.
Chystám se pokračovat a otevřít structs.h
kde budeme vidět Následující definice studenta.
Ukazuje se, že - a tohle je ještě jednodušší než jeden zahrnující ID
před chvílí.
Chcete-li přijít s vaše domácí typ dat,
a navíc na int a char a float a všechny tyto další, které existují,
můžete tak učinit doslova psaní typedef struct,
pak některé složené závorky, uvnitř které jste
seznam proměnných, které chcete stýkat se s touto novou vlastní data
zadejte jako jméno a koleji, a pak po složených závorkách
dáváte jména do nového datového typu.
Tak například, studentka.
>> A co je hezké o tom nyní je, že Podíváme-li se na příslušný kód,
konvence, jako první ze všech, je, aby to
v souboru s názvem něco dot h, soubor záhlaví, které my ne
začali používat sami sebe příliš mnoho.
Ale my se chystáte začít použitím docela dost nyní.
A co můžeme dělat s tím, nakonec, v těchto několika řádků kódu
je prohlásit, že přesně typ dat, student.
A teď pojďme používat.
>> Chystám se nyní jít do soubor s názvem structs1.c.
A pojďme se podívat na Několik charakteristiky zde.
Takže věci, tady nahoře je většinou znají, a my
vrátit se k tomu, co není obeznámeni za chvíli.
To samozřejmě je, včetně mé vlastní hlavičkový soubor, který je nové, stejně,
s výjimkou pset 3, jestliže Připomeňme, máme helpers.h.
Takže si možná pamatujete #include helpers.h.
>> Proč i když mám používat citace místo úhlových konzol?
Když si mám vybrat mezi nimi?
Téměř vždy jsem se zdají používat špičaté závorky.
A pak, najednou na linka šesti Jsem pomocí dvojité uvozovky.
Proč by to mohlo být?
To jo?
>> Diváků: [Neslyšitelné]
DAVID J. Malan: To je skutečný, co?
Diváků: To je v IDE.
DAVID J. Malan: Jo, že je v mém skutečném IDE.
A nesmíme bydlí na IDE, protože to je jen nástroj, který jsem pomocí.
To je v mém proudu adresář, konkrétně.
Takže structs.h je můj vlastní soubor není nainstalován v IDE,
v operačním systému samotném, spíš to v mé aktuálním adresáři.
Takže úmluva je, pokud chcete, uvést své vlastní záhlaví souboru,
stačí použít dvojité uvozovky.
>> Co nazýváme tuto věc linka 8, obecně řečeno?
Tohle je co?
#define něco.
To představuje konstanty, že jo?
Chcete-li mít Hodnota ve vašem programu
že používáte celé banda z časů, to je
dobrý konvence faktor na to, deklarovat to, symbolem hash
definovat, pak se podle konvence, ve všech velká písmena word-- když to není
nezbytně nutné, ale Je to lidská konvence
vydělat konstanty tak, aby se vyskočit
na vás visually-- prostor a pak hodnota chcete být
což odpovídá jménu tato konstanta je.
Ne středník, ale prostě vyplývalo, že vzor tam.
>> Takže to, co jsem dělal v tomto skutečném kódu.
Takže pojďme se podívat na hlavní program zde.
V souladu 12, protože jsem zahrnovaly structs.h,
Nyní mám jako mávnutím kouzelného proutku v mé Likvidace nový datový typ.
Nemám prostě mít přístup k int, a char, a float a string,
a modré a další.
I nyní mají přístup k typ studenta dat.
Takže v řadě 12, jsem kombinací dvou ideas-- jeden vlastní datový typ a dva,
pomocí pole.
A tak v tomto programu, pokud Chci skutečně podpořit
tři různé studenti v mém programu, já
lze jednoduše říci, dej mi proměnnou tzv studentů, z nichž každá
je studentů typu, které je můj vlastní datový typ.
A konkrétně, dej mi tři z těch, v mém poli.
>> Tak co teď budeme dělat v tomto programu?
Zde je jen pro smyčky iterace od 0 do 3, protože to je
co je hodnota studentů.
Jen jsem vyzvání uživatele dej mi jméno studenta.
A pak v řádku 17, jsme mají většinou známou linku.
Máme starého přítele GetString na pravé straně.
A co kus syntaxe je zřejmě nový,
pokud jste nikdy naprogramován v C předtím, a nikdy nepoužilo structs?
To jo?
>> Diváků: .name.
DAVID J. Malan: The .name.
Ale to není příliš velký skok, protože nyní studenti i bracketing
dává vám i-tého studenta.
A pokud chcete potápět uvnitř této struktury,
stačí použít jedno období a pak název proměnné uvnitř,
nebo vlastnost, že uvnitř Chcete-li získat přístup k.
Podobně pak, když jsem pak přiměje Uživatel, dej mi studenta koleji,
Podobně můžete uložit, že řetězec v proměnné koleji uvnitř
tohoto studenta struktury.
>> A teď se věci trochu fantazie.
A to bude vypadat na možná hodně docela brzy.
Ale budete vidět daleko více v pset 4, tak ať to prostě pohled na to teď.
Ukazuje se, že v potrubí 23 prostřednictvím 38, co si myslíte, že jsem snad děláš?
Odstranil jsem připomínky dnes, ale verze
kódu online reference má všechny komentáře.
Co mi zdá, že dělat?
>> Diváků: uložení souboru se všemi informace, které uživatel zadal.
>> DAVID J. Malan: Jo, přesně, to je nový způsob
že vidíme dvě, Dalším znakem C,
čímž jsem si vytvářet své vlastní soubory.
Doposud, téměř každý program, co jste napsali, je bez státní příslušnosti.
Jakmile je to hotovo běh, to je vše.
Není paměti nebo vzpomínka na něj.
Neexistuje žádný soubor uložen.
Ale pokud si chcete uložit vstup, který má
se stalo, stejně jako ve hře nebo programu takhle to dopadá, můžeme tak učinit.
A budete vidět více v pset 4 av §.
Ale tato linka 23 v podstatě vytvoří soubor s názvem students.csv.
A možná jste předtím viděl.
Dokonce i když jste nikdy studoval CS předtím, CSV je oddělené čárkou proměnné.
Je to jako velmi špatný muže verze souboru aplikace Excel,
což znamená, že by mohl být otevřen v Excelu a v číslech Apple,
a má řádků a sloupců.
Ale není to proprietární formát jako Microsoft nebo Apple.
Je to jen čárky oddělující hodnoty, které uvidíme za chvíli.
>> A stačí se hádat.
V souladu 23, na samém konec, můj druhý argument,
na tuto novou funkci nazvanou f otevřena pro otevřeném souboru je w.
Co by mohlo naznačovat w?
To jo?
>> Diváků: To vám umožní zapsat do souboru?
>> DAVID J. Malan: To vám umožní napíšete do souboru.
Takže je tu několik variant že se můžeme připojit zde.
Ale pokud si jen chcete přečíst Soubor, který se na to podívat
a přečtěte si ji do paměti, vám stačí použít citace unquote "r".
Pokud chcete psát na soubor, můžete použít nabídku konec citátu "w".
K dispozici je také připojit a několik dalších věcí
Chcete-li upravit existující soubory.
Teď budeme držet vidět toto věc, pak se vrátíme na linku 24.
NULL, to dopadá, je speciální hodnota, která
může být vrácen určitých funkcí pokud něco wrong--
v případě, že soubor neexistuje, pokud jste spustit z paměti,
nebo spoustu dalších chyb.
Ale teď, pojďme jen předpokládat, že tento je kontrola jen konvenční chybě.
Tady v řadě 26, jsem iterace od 0 do 3 nad všemi mých studentů.
A to je druh druh nové funkce, fprintf,
ale stačí se hádat.
Pokud printf je jen pro tisk formátovaný řetězec,
Co fprintf pravděpodobně znamená?
Diváků: Tisk do souboru.
DAVID J. Malan: Vytiskněte formátovaný řetězec do souboru.
To je to, co to další f prostředkem je soubor.
A nový první argument musí být proměnná, která představuje soubor.
Pak jsme prostě formát string stejně jako printf.
A i když to syntax je nové, to jen
znamená připojit jméno studenta, plug-in studentské koleji, a poté
s fclose, zavřete soubor.
A pak je to nový lastly-- a vrátíme se k tomu
Před long-- Jsem uvolnění student z důvodů,
že se stalo tam nahoře.
Ale my se vrátíme se, že před long--
že je to kvůli tomu, jak je GetString skutečně pracuje pod kapotou.
>> Takže pojďme se rychle podívat zde.
Kdybych zadejte ls ve svém adresáři, Všimněte si, že nemám
mít soubor s názvem students.csv, jen ne tam, neexistuje.
Takže když jsem se zkompilovat tento program, aby structs-1. / structs-1,
a budu pokračovat a napište Andi, který žije v Berkeley v Yale.
Budeme mít Rob, kdo žije v Thayer v těchto dnech.
A pojďme přijít s tím, kde je, myslím, Maria je v Mather,
pokud jsem si pamatoval.
>> Takže se zdánlivě nic neděje.
Ale když jsem typ ls teď, je students.csv.
Pojďme dál a otevřená students.csv.
Jedná se opět o velmi lehký formát souboru.
Ale já jsem prostě přijala konvenci že mám dvě řádky a sloupce zde.
V prvním sloupci je křestní jména lidí.
Druhý sloupec je studenta koleji, nebo vysoká škola, nebo dům, nebo kdoví co ještě.
A teď jsem zachránil to trvale v souboru.
>> Takže to není všechno tak zajímavé.
Ale to je jen odrazovým můstkem nyní ke schopnosti přetrvávat informací
natrvalo.
Tak uvidíme, teď co víc můžeme dělat s těmito a dalšími funkcemi.
Ale nejdřív, nějaké otázky?
To bylo hodně, a to bylo rychlé.
Ale uvidíte mnoho více pset 4, stejně.
To jo?
>> Diváků: Existuje způsob, jak pokračovat v přidávání jmen do tohoto souboru?
>> DAVID J. Malan: Dobrá otázka.
Existuje způsob, jak pokračovat přidávání jmen do tohoto souboru?
Ano.
A ve skutečnosti, pokud jste skončili up re-otevření souboru,
byste použili citaci konec citátu "A" pro append,
což by jen přidat nový řádek, je Nová linka znovu a znovu, přesně tak.
Dobrá otázka.
Další otázky?
To jo?
Diváků: Pokud jste spustili Program znovu právě teď,
to by držet přidání jmen do souboru nebo by to otevřít nový soubor?
>> DAVID J. Malan: Á, dobrá otázka.
Pokud znovu hned běžel program Nyní, možná zadali novými jmény,
by bylo přidat do souboru nebo přepsat soubor?
Ten, protože jsem nepoužívají přidávacího režimu.
A protože já jsem jen slepě otevření souboru pro zápis,
je to jen bude soubor přepsat.
Takže bych opravdu musíte udělat, je připojit, když chci skutečně dlouhodobý
databází.
>> Nyní CSV je užitečný, upřímně řečeno, ani pro obdobné pokud jste writing--
a my budeme nakonec vidět později v semestru, kdy
využíváme Csvs pro jiné účely.
Chcete-li uložit všechny lidi kteří se registrovali na nějakou událost,
nebo se přihlásili pro studenta skupina, nebo něco takového,
ukládání dat v tomto druhu formátu je super pohodlné.
Vzhledem k tomu, doslova, pokud I měli stáhnout tento soubor.
Mohl bych double-- a pojďme se skutečně snaží tento
když mám Excel nebo čísla tady.
>> Budu pravým tlačítkem nebo s klávesou Ctrl můj soubor.
Jejda.
Klepněte pravým tlačítkem nebo s klávesou Ctrl můj soubor.
No, moje myš nespolupracuje.
Download-- Jdu stáhnout všechny soubory, takže zde
Jen tak můžu chytit tento jeden.
A uvidíme, jestli to funguje students.csv-- poprvé
Já jsem aktivován.
Teď chtějí vidět své kontakty.
Teď jsem třeba se zaregistrovat.
Podívejte se, jak snadné je používat Csvs?
Ano, udržovat ji v aktuálním stavu.
OK, teď jsme připraveni na třídu.
OK, oh, co je nového?
OK, úzkým.
To bylo kouzelné.
OK, teď musíme aktualizovat.
A teď, je to zapomněl, co soubor Původně jsem otevřel,
ale to, co tam je-- jdeme.
OK, takže teď máme soubor aplikace Excel.
Děkuji.
>> OK, takže to, co jsem udělal, bylo snadné.
Samozřejmě, že jsem mohl již nainstalovány Excel, nebo čísla, nebo cokoliv jiného programu.
Ale to je pěkné, protože teď mohu manipulovat
údaje ve standardním formátu.
>> Takže teď pojďme kontext přejít na místo, kde jsme přestali
Naposled, který měl začít vzlétnout kolečka.
Ale nejdřív, to ne vidět tento dřívější oběd
se opět děje na Fire a Ice v Cambridge, sitar v New Havenu.
Zaregistrujte se na stránkách CS50s ASAP vstoupit CS50 studenty a zaměstnance.
>> Tak jsme vzali kolečka off v pondělí follows--
string byla vyhlášena v CS50s knihovna pro určitou dobu.
A je to hezké, protože umožňuje nás mluvit o proměnné jako
kompletní slova a věty a další.
Ale ukazuje se řetězec neexistuje.
To je jen synonymem, nebo alias, že jsme vytvořili něco, co
ve skutečnosti je trochu více technické volal char *.
>> A skutečně, viděli jsme příklad programu v pondělí
že nechoval úplně, jak jsme očekávali.
Jednalo se o soubor, porovnávat-0.
A připomínají, že porovnávat-0, pokud Pondělního programu jsem překompilovat
a spustit porovnávat-0 a zadejte meziměsíčně v malá písmena, a maminka malými písmeny znovu.
Program trval na tom, I typ různé věci,
i když máma, vše v malá, je totožný vizuálně.
Takže to, co bylo krátká odpověď proč si myslí, že počítač
tyto dva řetězce se liší?
To jo?
>> Diváků: [Neslyšitelné]
DAVID J. Malan: Správně.
Takže, mámu, poprvé Píšu ho, je být
uloženy někde v mém počítači paměti, ale na jiném místě
než druhá, kdy jsem psát matkou.
Nyní je určitě by mohl být optimalizován.
Počítač by mohl být chytrý a realizaci těchto dva řetězce, hej,
jsou identické.
Dovolte mi, abych to nadbytečně uložit.
Ale počítače nedělají, že Optimalizace pokud řeknete jim.
Takže, ve výchozím nastavení, jsou to právě chystá skončit
ve dvou různých místech v paměti.
A tak, aby se více zřejmé, když jsme porovnali dva řetězce,
První byl tzv s, druhý byl nazýván
t, co konkrétně jsem byl porovnání tady na řádku 13?
To jo.
>> Diváků: Je to místo v paměti že proměnná bude ukazovat.
>> DAVID J. Malan: Přesně tak, jsem byl porovnání místo v paměti
že tyto proměnné ukázal.
Tak konkrétně v případě, matka byla na byte číslo 1, a 2, a 3,
a 4-- proto, že si na zpětné lomítko 0 musí být úplně na konci.
A ta druhá instance meziměsíčně, m-o-m, byl na adrese 10, 11, 12, a 13.
Byl jsem porovnávání 1, že adresa, že umístění v paměti,
proti 10, který je samozřejmě není stejný.
1 není 10.
>> Tak to je hezké, že v je to docela jednoduché.
Ale je to problematické, pokud můžeme se zdá, porovnání řetězců.
Tak fundamentally-- a na této nízké úrovni,
pokud byste chtěli realizovat program pro porovnání
dvě jednotlivá slova, že uživatel zadal na kvalitu,
se jim line up pro char char, jen v obecné rovině,
co musíme udělat, zřejmě?
Nestačí jen podívejte se na ty dvě adresy.
Co musíme udělat?
To jo?
>> Publikum: Iterovat řetězec [neslyšitelné].
>> DAVID J. Malan: Jo, pojďme iterovat řetězce.
Pojďme použít pro smyčce, smyčce while, nebo co jste nejvíce vyhovuje.
A pokud máme dva řetězce kdesi v paměti, pojďme se podívat na každý let
první znak, pak každý druhý znak, pak třetí a čtvrté,
a pátý, až jsme narazili Jaké speciální Sentinel hodnota?
Diváků: [Neslyšitelné]
DAVID J. Malan: Jo, zpětné lomítko nula, na kterém místě v jednom řetězci
Můžeme se rozhodnout, že to je všechno.
Už jsme uzavřeno každý znak?
Pokud tomu tak není, vrátí false.
Pokud ano, vrátí true.
A tak to je přesně to, co tato verze programu porovnat-1.c dělá.
To je totožné s tím, co jsme Podíval se na pondělí kromě toho, že jsem
zbavili slova string-- ačkoli že nemá žádný funkční impact-- all
Dělám teď je odstranění některé vizuální školení kola,
ale jasně vidět, že s a t jsou adresy.
A to je to, co je hvězda, hvězdička, představuje
je adresa, jinak známý technicky jako ukazovátko.
>> Takže když Prohlašuji ů na linka 9 a říkají, char * s,
to neznamená, že mi dát řetězec.
To znamená, že dej mi proměnné, jejíž Smyslem života je uložit adresu.
Protože jsem chtěl dát adresa řetězce do něj.
A skutečně, GetString, být jasné, nevrací řetězec.
To nevrací mámu zpětné lomítko nula, samy o sobě.
Co getString specificky a přesně vrátit?
Diváků: [Neslyšitelné]
DAVID J. Malan: adresa zadána, adresa prvního znaku
v nějakém řetězci to dostal.
A tak teď vidíme opět speciální klíčové slovo.
A, zmiňoval jsem se dřív.
To bude dobré konvence že uvidíme znovu a znovu teď.
Já jsem kontrolu, aby se ujistil, že s není null, a t není null.
Vzhledem k tomu, na základě mých opravdu rychlá zmínka dříve,
co by mohlo znamenat, pokud GetString vrátí ne adresa, ale N-U-L-L, který je opět,
nějaký zvláštní hodnota?
>> Diváků: Chyba.
>> DAVID J. Malan: Je to chyba.
Něco se pokazilo.
A to, co typicky Může se stát, zejména
s strings--, které by mohly být neznámé délky v advance--
Možná, že počítače " nedostatek paměti, možná
jste zadali v takovém dlouhé slovo nebo větu
nebo vložit takové obrovské esej tam prostě není dostatek paměti.
A tak GetString nemůže vrátit adresa celé věci,
tak to prostě vrátí nic.
A to říká, že chyba se stalo vrácením speciální hodnotu NULL.
Je to nulová adresa, abych tak řekl.
>> Nyní se ukazuje, C je dodáván s Funkce, která dělá tuto iteraci.
Nemáme to provést s cyklus for nebo while sami.
Můžeme použít funkci, volal stručně,
míchejte Comp, nebo řetězec porovnat, jehož Smyslem života je udělat přesně to.
Můžete dát dva ukazatele, dvě adresy, a půjde na tyto adresy
a pak porovnat dopis pro dopis pro dopis pro kvalitu,
zastavení pouze tehdy, když to, co je pravda?
Kdy by měl intuitivně míchat comp přestanou Iterace, jen aby bylo jasno?
Když narazí na zpětné lomítko 0 buď řetězec, na kterém místě se může rozhodnout
má všechno uzavřeno, nebo došlo na rozdíl?
>> Takže, když narazíme to teď a zkuste náš malý kapitalizace hra,
takže se porovnávat-1, ./compare-1, a zadejte máma malými písmeny v obou případech.
Teď je to totéž.
A pokud bych to znovu s malá písmena, a pak možná velká písmena.
Teď to opravdu odlišuje mezi velkými a malými písmeny.
Takže není tak těžké, nebo magický, ale to teď vysvětlit
co se děje pod kapotou.
>> Takže co víc můžeme extrahovat z tohoto druhu lekce?
Takže pojďme se podívat na to.
Chystám se jít dopředu a napsat rychlý program, zde nazvaný copy-0.
A teď pojďme do toho a vlastně pojďme dělat tohle-- s kopií-0,
se podívat na to, co jsem se sem dostal.
Poprvé jsem říci uživateli, řekni něco.
Pak jsem si řetězec a já jsem uložil je v s.
Pak jsem se zkontrolovat, zda je rovná rovná NULL, prostě vrátí 1.
Tak to je jen kontrola směrodatná chyba.
Nic zajímavého nestalo.
A ve skutečnosti, pokud bychom se zbavit chyby kontrola, to vypadá jako týden 1 kód
v tomto okamžiku.
Ale já jsem začal dostat trochu lepší o tom.
>> Nyní v řadě 16, před týdnem, možná dokonce pár dní nebo minutami,
dalo by se říct linka 16 vytvoření proměnné nazvané t
a kopírování to do něj.
A to je naprosto rozumné stánek s jídlem.
Ale buďte teď přesnější.
Co se děje v řadě 16?
To, co je stále zkopírován zprava doleva?
To jo?
Diváků: Je t dostat adresy s?
>> DAVID J. Malan: Přesně tak, t je stále adresu s.
Tak aby bylo jasno hned, když půjdu zpět k té předchozí příklad
a já jsem upozornit na věc, kterou jsem zadali.
A to, co jsem napsal in-- tady je s, a zde
je to, co jsem napsal v někde v paměť, máma a pak zpětné lomítko
0, která je přidána pro mě.
To, co jsem uložené v tady, připomínají, To je v místě 1, 2, 3, 4,
To je to, co je v současné době v s.
Takže pokud na lince 16, říkám, dej mi další proměnnou s názvem t a obchod
v na hodnotu s, co dostane uloženy zde nebude maminka
ale spíše jen číslo 1.
>> Takže pokud se podíváme dopředu v tomto programu teď, co se bude dít?
Takže si všimnout, že tam je Tato funkce vám mohlo
využili to již před časem pro Caesara, nebo Vigenere, nebo možná vůbec ne.
Tvrdím s mým printf, já jsem bude kapitalizovat kopírování t.
Nejprve v řádku 19, rychlé zdravého rozumu zkontrolujte, strlen zkontroluje délku t.
Protože nechci, aby se snaží vydělat něco
v případě, že to není žádná řetězec.
V případě, že uživatel jednoduše stisknout Enter, nic vydělat.
Takže nechci dělat řádku 21.
Takže linka 21 je vydělávat které písmeno, zdá se, že vt?
>> Publikum: m?
DAVID J. Malan: Vypadá to, jako by to kopírování, který z nich?
Diváků: m.
DAVID J. Malan: Uh, m.
OK, takže první m, protože oznámení, že jsem
přechodem na toupper, který pokud jste nikdy neviděl, že je to
jen funkce využít jako vstup.
t držák nula znamená dát me znak nula t.
A tak jak to Změnit obrázek, aby bylo jasné?
Co je potřeba, aby se přepisují nebo změnit s ohledem na S a T a máma
zpětné lomítko nula.
>> Diváků: [Neslyšitelné]
>> DAVID J. Malan: Jo, tak tohle tu prostě
potřebuje získat změnil to-- opravit tohle-- je třeba, aby se změnil na kapitálové m.
Ale teď, podívejte se později v Program, když jsem vytisknout
s a t, jak jsem tady uklidit, sledujte, co je bude dít vytištění s a t.
Tak, aby copy-0, ./copy-0.
Nech mě jít dopředu a zadejte V meziměsíčně v malými.
Všimněte si, jak původní a kopie byly aktivovány.
Proč?
No, s a t jsou oba směřující k, chcete-li, stejný kus paměti.
A upřímně řečeno, to už je Opravdu uninteresting-- skutečnost
že jsme pomocí adresy nula zde.
Chci říct, že to opravdu jedno, kde věci jsou v paměti.
Omlouvám se, že jsem mazání trochu moc.
Ale já opravdu nestarám kde věci jsou v paměti.
A tak, opravdu to, co programátoři mají tendenci přemýšlet o tom,
je, že když mluvíte o adresu, nebo ukazatel,
koho to zajímá, kde je v paměti.
Je mi jedno, jestli je to na byte jeden nebo miliarda.
Jen mě to zajímá, že to proměnná je účinně
ukázal na tomto kusu paměti.
A tak od nynějška, spíše než slovíčkaření nad svévolným adresy paměti, pojďme
jen začít kreslit ukazatele jako ukazatele, jako šipky.
Takže to, co s a t opravdu jsou, Podle tohoto programu,
kvůli tomu, jak jsem vytvořil t, je to jen dva samostatné proměnné
ukázal na stejném kusu paměti.
A je nám jedno, kde jsou.
Takže můžeme abstraktní pryč tohoto detailu.
>> Tak jak to mám opravit?
Pokud chci napsat verzi kopie program, který vlastně kopíruje řetězec
a kapitalizuje pouze kopírování, jen intuitivně,
co má být přísada do našeho řešení?
Diváků: [Neslyšitelné]
DAVID J. Malan: Potřebujeme co?
Diváků: Chunk paměti.
DAVID J. Malan: Potřebujeme další kus paměti, že jo?
Nevíme, jak se to přesto, nutně.
Ale nějak jsem Potřebuji se to stalo tak, že původní maminka malými písmeny
skončí v extra kusu paměti.
A pak, když jsem se změnit kopii, já nechtějí změnit tuto kopii zde.
Místo toho jsem chtěl změnit pouze tento kopie tak, že originál je nezměněn.
>> Takže, pojďme se podívat, jak bychom mohli udělat.
V copy-1, který má již byl zbaven komentář,
ale je komentoval online.
Místo toho jsme dělat following-- tito linky jsou identické, dej mi řetězec
a říkají to.
Ale teď se podívejme na jednom z našich nejvíce složitý, ale poslední složitosti
na chvíli, řádek 16 dělá přesně to.
Takže pokud vaše pohodlné s picture jsme právě drew--
dej mi nový kus paměti, kopírovat všechno do toho,
podívejme se, jak přeložit do kódu.
>> Takže linka 16, na levé straně, char * t mi dává toto políčko tady.
To je vše, co dělá.
Na pravé straně, m Alloc, nebo malloc,
je alokace paměti, super fantazie, mystický způsob, jak jen říkám
dej mi kus paměti.
Kolik paměti potřebujeme?
No, je druh velkého výrazu.
Ale pojďme se podívat, co to říká tady.
Takže to, samozřejmě, je dát me délka řetězec s.
Takže, máma by to mělo být, co?
Takže jen tři, ne? máma je tři znaky.
Nemusíte počítat zpětné lomítko nulu, když vás
mluví o délce řetězce je to Vlastně lidské viditelné dopisy.
Takže máma, takže to mi dává 3.
Ale počkejte, já jsem teď přidáním 1.
Proč vlastně chtějí, aby přidělit 4 bajty a ne jen 3?
To jo?
>> Diváků: Pro hodnotu sentinel?
>> DAVID J. Malan: Přesně tak, pro tento sentinelové hodnotu.
Pro zpětné lomítko nula, Potřebuji celkem 4 byty.
Tak jsem třeba délka řetězce plus 1.
A pak už jen pro dobrý measure-- , i když v tomto systému,
vždycky to bude 1-- říkám vynásobte to podle velikosti char.
Ukázalo se, že je sizeof operátor v C, který
Jen vám řekne počet bajtů, které je
potřebný pro určitý typ dat.
Nefunguje pro pole, typicky, někdy to dělá.
Ale v obecném případě, no.
Ale to mi říci, kolik bajtů char je, který dopadá je vždy 1.
Takže tohle je jako násobením 1.
>> Tak výborný mystický hledá řádek kódu.
Ale vše, co dělá, je dává mi kus paměti.
Ale to se zdá, že kopírování něco do té paměti?
Ještě ne.
A tak co mám na lince 22 a 23, 24, 25, no, jsem prostě udělat.
A to je druh old school teď věci.
To je jako pset 2, kde jste jen v pohybu věci
kolem v paměti, nebo spíše v řetězcích.
>> Takže jsem iterace od 0 do délka řetězce s.
A já kopírování i-tý znak v S do i-tého znaku v t.
A protože jsem programátor, dělal Ujistěte se, že přidělit přesně tolik bajtů
jak potřebuju, je to perfektní one-to-one vztah.
A já kopírovat meziměsíčně v malá písmena na nový.
A pak konečně, mám tento řádek.
A tak je účinek je jen zúročit tento t zde.
Takže hodně absorbovat, ale pokud jste právě v úvahu
co se opravdu děje Na pod pokličku
je jen pohybující se tyto bajtů kolem, vše, co
je zapotřebí k vyřešení tohoto problému je jen proto, aby nám tento kus paměti.
Nyní na riziko ohromující, dovolte mi ukázat
jeden další příklad, který je téměř identické, s výjimkou pro tento jeden
řádek kódu.
Tak tohle je verze hacker tohoto programu, chcete-li.
Ale ať to jen destilovat že do toho, co se děje.
Linka 24 slouží k být tímto t držák i dostane y držák i.
Teď, já se měním to mnohem více mystický hvězda t
plus 1 se rovná hvězda s plus 1.
>> Takže to, co se děje a proč máme hvězdy postavu?
Už jsme neviděl hvězdu, a je to být používány odlišně zde.
Již dříve jsme viděli char *, teď jsem viděl hvězda na začátku, a to je v pořádku.
Vzhledem k tomu, to dopadá jsme může druh odvodit jen
od těch, které nejprve zásady, co se děje.
Jen aby bylo jasné, co je to?
Minulý týden to byl řetězec.
To nestačí už ne.
Co je s, konkrétně?
>> Diváků: [Neslyšitelné]
>> DAVID J. Malan: Je to ukazatel.
Je to adresu První znak jsme zadali.
OK, co je t?
>> Diváků: [Neslyšitelné]
>> DAVID J. Malan: The adresa prvního bajtu
v t, že kus paměti přidělena.
Tak to dopadá, že když jsme se opakovat od 0 až na řetězec
length-- v první řadě, i začíná na 0, protože
z této staré školy pro smyčky věc.
Tak právě pro jednoduchost, pojďme Předpokládejme, že první řádek kódu
je opravdu jen to, že jo.
Kdybych je nula, nula sčítání k něčemu pravděpodobně
nebude mít vliv.
>> Takže to, co je to říká?
Ukazuje se, že hvězdy Operátor se v této souvislosti
je dereference operátor, což je jen
ozdobný způsob, jak říkat jít na následující adresu.
Takže pokud s je adresa první charakter v tomto kusu paměti,
* s prostředky tam.
A protože jsme tažené obraz tímto způsobem,
můžete přijmout po mentální model.
Pokud je to s, a vy říkáte: * S *, s něco jako skluzavek a žebříky,
pokud si vzpomenete hry z dětství, je jako sledovat tuto šipku a jít
na adresu.
>> * t je totéž.
Takže začít tady, jděte na jeho bloku.
Nemůžu jen tak čerpat z tato obrazovka, že tak.
* t znamená jít sem.
A pak je pro smyčka je jen rčení přesunout tento znak zde,
přesunout tento znak zde, přesunout tento znak zde.
Ale jak to mám udělat inkrementaci?
Musím se vrátit zpět to, co jsem právě smazal.
To je to, co se obecně nazývá ukazatel aritmetický, který
znamená, že matematiku s adresami.
>> Pokud se v tomto pro smyčce, Pořád postupně i,
a s je adresa a t je adresa, když jsem jen držet přídavkem 1,
to jen znamená, že neustále v pohybu vpřed, a dopředu, a předat do paměti.
Je to jako Oxford Street se ulice, že budova je na CS.
CS budovy je 33 Oxford Street.
Takže pokud byste měli dělat 33 Oxford Street plus 1,
která vás přivede na 34 Oxfordu Street, pak 35 Oxford Street,
pak 36 Oxford Street, bez ohledu na ty, budovy ve skutečnosti jsou - v případě, že existují.
A tak to je všechno děláme zde s ukazatelem aritmetiky.
>> Takže je to super tajemný cesta vyjádřit sami.
Ale to všechno se děje pod pokličku
právě po tyto adresy, jako po mapu, chcete-li,
nebo po šipky, jako je jsme vykreslen na obrazovku.
OK, hodně stravitelné.
Jakýkoliv dotaz na syntaxi, koncepty, ukazatele, malloc, nebo podobně.
Jo, tady jako první.
>> Diváků: Tak kde to říká * t rovná toupper * t,
je to, že bude těžit všechna písmena nebo jenom--
>> DAVID J. Malan: Ah, opravdu dobrá otázka.
Takže v tomto řádku tady, 31, to bude vydělávat
první písmeno nebo všechna písmena.
Takže pojďme odpovědět tím, že jde zpět do prvních principů.
A první pravidla tady mám na mysli stačí jít do základní definice
, co se jedná.
Takže toupper je funkce těžící char.
To je vše.
* t znamená jít do first-- přejít na adresu v t.
Takže, v obraze, pokud se jedná o blok paměti přidělené jsme s malloc,
a to je t, * t znamená naleznete zde.
>> Mezitím jste absolvování že hodnota, malá písmena m
na toupper, jste stále zpět kapitál M, kde jste ho dávat?
Ty uvedení v tomtéž místě.
A tak touto logikou těch, základní definice je to jen
kapitalizace první písmeno pokud iteraci s I nebo
cyklus for nebo while, že to nebude dělat nic víc, než si to zeptat.
Dobrá otázka.
To jo?
>> Diváků: Proč jste použít dereference způsobu spíše než
pole?
>> DAVID J. Malan: Á, dobrá otázka.
Proč byste používat dereference Způsob namísto metody pole?
Žádný zvláštní důvod, abych byl upřímný.
A ve skutečnosti, pro toto druh například doprava,
Já jsem jen dohadovat učinit Program složitější,
více oči jsou zasklení nad, lidé jsou mimo kontrolu
protože to vypadá mimořádně tajemný, ale i když to dělá to samé.
A tak, upřímně řečeno, je to zbytečně vizuálně komplexní řešení
k problému.
>> Je to stále dobrý design, pět z pěti pro návrh,
ať už je to v držáku notace nebo se kurzor notace.
Ale-- zvláště když se dostaneme Později v průběhu v pset 5
když jsme se realizovat tento slovník, který Zmínil jsem se o pár times--
budeme vlastně starat o paměťové adresy nízkoúrovňové
že jsme opravdu pochopili co se děje.
>> Ale teď se ukazuje, že tato řádek kódu tady hranatých závorek
ve skutečnosti neexistují.
Oni jsou to, co se nazývá syntaktický cukr, který
je jen podivně chladný způsob, jak říkat kompilátor převede hranaté závorky být
že matematický výraz.
Takže je to lidské konvence aby bylo možné jen psát
Tyto velmi uživatelsky příjemný závorkách.
Ale to, co překladač, zvonění, Je opravdu dělají kdykoliv
napíšete, co je zdůrazněno v řadě 24, pod kapotou je to opravdu
přeměňovat to na to.
Je to prostě mnohem příjemnější jako člověk číst a psát kód, jako je potrubí 24.
Ale nakonec ti, koleček příliš sundat
když něčí vlastní pohodlí dostane silnější.
>> Dobře, takže připomínají pak, že to byl druh největším problémem
jsme narazili na.
A to je to, co zažehlo tento celek zatraceně rozhovor o ukazatele,
a adresy a kopírování věci.
Bylo to proto, že jsme zakopnout to hloupá, hloupá otázka, přičemž
Jsem implementoval logically-- s Lauren tady na demo a pomerančového džusu
V milk-- dokonale algoritmicky správnou funkci
pro přečerpání dvě proměnné " hodnoty, ale ta zatracená věc
neměl žádné perzistentní, nebo trvalý, vliv na mém kódu.
>> A proč to bylo?
Stručně řečeno, proč je to implementace swapu
logicky správné, ale nemá žádný vliv o proměnné, které jsou předány k němu,
jako x a y na hlavní?
Jaká byla podstata problému?
To jo?
Diváků: Vzhledem k tomu, variabilní vyrobené kopie proměnné v průsmyku
prostřednictvím funkce.
>> DAVID J. Malan: Přesně tak, když minete proměnné do funkce, nebo argumenty,
do funkce, oni jsou prošel exempláři, který
znamená, že dostanete identický hledá vzorek bitů pro obě x a y,
zde nazývá a b.
A můžete dělat cokoliv Chcete se těchto kopií,
ale oni budou mít žádný Vliv na volající funkci.
A ve skutečnosti, že jsme vylosovali obraz na obrazovce, odvolání
naposledy, přičemž pokud jste opravdu myslíte, že o tom, co je to
děje Vespod hood-- pokud To je paměť počítače,
a sem je kus Paměť se používá pro hlavní,
to je kus Paměť se používá jako odkládací prostor,
a tak i když má hlavní dvě proměnné, x a y,
odkládací mohou mít totožný hledá hodnoty, které jsou oba 1 a 2,
ale jsou zcela různé kousky paměti.
>> Takže potřebujeme řešení pro toto.
A upřímně řečeno, zdá se, že nyní mají řešení tohoto problému, vpravo.
Pokud bychom nyní mají schopnost manipulovat věci prostřednictvím adres
a, něco skluzavky a žebříky styl, postupujte podle následujících šipek
a jít kamkoliv chceme v paměti, nemohli jsme
vyřešit tento problém přechodu z hlavní vyměnit
ne hodnoty chceme Swap, ale jen intuitivně
to, co bychom mohli přejít na místo vyměnit?
>> [Vložením hlasy]
>> DAVID J. Malan: Proč ne my jen projít to adresy, je to tak?
Proč dáváme swap mapu pokladu, chcete-li,
který vede ji do Skutečné hodnoty x a y.
Pojďme swapu, skutečně změní tyto originální kousky, spíše než
právě procházející kopie bitů.
A tak, ve skutečnosti, to je to, co je bude řešení.
Tato verze je zde jasně špatné a chybné.
A teď, na první pohled, to prostě vypadá jako jsme přidali spoustu hvězd náhodně
a přešel naše prsty že by to sestavit.
Ale to by teď sestavit.
>> Ale pojďme se podívat, co tyto věci znamenají.
A bohužel autoři C mohl zvolit další symbol
aby se tento malý jasnější, ale operátor hvězda
má jiný význam v dva různé kontexty.
A viděli jsme oba, ale pojďme rozlišovat.
>> Tak se na tam nahoře, když jsem se změnil a a b
od bytí INT ve špatné Verze pro int hvězdy, A a B,
dříve, byly celá čísla.
Jaké jsou a a b nyní v dobrý, zelené verze?
Jsou adresy.
Adresy z toho, co, aby bylo jasné?
Adresy celých čísel.
Takže k tomu, že jsem řka: int hvězdička znamená,
to je adresa celé číslo, konkrétně.
>> Takže teď oznámení v řádky kódu, něco jiného změnilo taky.
tmp zůstává stejný, protože je to jen dočasná celé číslo,
paměťová kouzlo tam.
Ale teď potřebuje hvězdu.
A ve skutečnosti, v každém další zmínka o a a b,
Všimněte si, že všechno, co je změna z červené na zelenou
je to, že jsem prefixing tyto proměnné s hvězdami.
Protože nechci kopírovat a a b.
Protože když jsem jen zkopírovat a a b a odkládací a a b, co mám vlastně vyměňovat?
Jen adresy, chci vyměnit co je v těchto adres.
Chci tam jít.
A tak se operátor hvězda uvnitř mé funkce,
ne uvnitř seznamu parametrů, znamená, že jít na tyto adresy
a skutečně změnit tyto hodnoty.
>> Takže to, co dělá obrázek nyní vypadat místo.
No, když místo toho jsem kolem in pro A a B ne 1 a 2--
Vlastně jsem třeba přidat jeden další definice zde.
Takže předpokládám, že tento kus paměti je na místě 10.
>> To je v místě 11, ale toto je kousek zjednodušení,
Nyní mám dvě možnosti mám projít x a y nebo mohu projít jejich adresy?
Kdybych projít jejich adresy takhle, jen jsem
Nyní je třeba realizovat swapu na zelené kódem
tak, že když je to vidí a kdy ji b vidí, že nejde jen kopírovat a a b
a přesunout mléko a pomerančový džus.
Mléko a pomerančový džus metafora se porouchá,
protože ti jsou poháry kapalných a ne map.
Místo toho musíme jít oslovit 10 a my
muset jít řešit 11, a poté proveďte tuto odkládání logiku.
>> Takže logika je stejná, ale potřebujeme trochu jiný způsob, jak
přístupu k tyto proměnné.
A tak na konci, to, co Program má vypadat jako je tohle.
V swap.c doslovně zkopírován a vložili zelenou verzi.
Ale musím udělat jednu změnu.
Nestačí jen měnit swapu.
Jaké další řádek kódu musím změnit?
To jo?
>> Diváků: Tam, kde to trvá argumenty.
>> DAVID J. Malan: Kde to vyžaduje jeho argument.
Takže když jsem se posunout až na hlavní, I Nemůžete jen předat x a y,
a slibuji, poslední kus novou syntaxí dnes.
Musím předat ne x a y, ale adresa x a y.
A ukázalo se, symbol že autoři vybrali C
je, pokud používáte ampersand tady, ne být zaměňována s bitové ampersand,
pokud používáte ampersand tady a tady ampersand,
to vyřeší za vás, Co je adresa x,
možná je to 10, co je adresa y, možná je to
11, a ty, které přechází v místo.
>> Takže hodně absorbovat všechny najednou.
Ale podívejme se nyní rychle Naši zbývající čtyři minuty
kde se věci mohou jít nakřivo.
A jak stranou, ve skutečnosti Vzal jsem si tento obrázek,
TF vzal tento obrázek rok nebo dva lety.
Tak tohle je zadní roh Eliota jídelně.
Ukazatele jsou snad nejtěžší téma, které budeme povídat v CS50.
Takže pokud máte starosti ten typ svahu je jako možná je to
více hokejkou takhle, si uvědomit,
jsme trochu blíží vrcholu v Podmínky koncepčního složitosti.
>> A já vychovávat to foto, protože přísahám
bohu, na podzim roku 1996, když jsem se CS50 s mým výuky kolegy,
Nishat Mehta, posadil mě v roh Eliota D. sále u oběda,
nebo večeře, nebo něco se pokusit aby mi pomohl pochopit ukazatelů.
A to je místo, kde jsem byl týdny poté, to bylo představeno v přednášce, když
Konečně jsem pochopil odkazy.
A doufám, že to klikne mnohem dříve pro vás.
Ale si to uvědomují naprosto mezi Sofistikovanější témata
jsme se podíval na.
Ale je to mezi nejsilnější.
A když si to, je to opravdu všechno jen tak, aby konečně dohromady.
Takže buďte ujištěni, že není je třeba pro všechny umyvadlem dnes.
>> Tak tady je poslední program budeme dívat.
A budeme končit s rychlé tři minuty claymation
vyroben náš přítel, Nick Parlante.
Zde je program, který na dva nejvyšší linky deklaruje proměnnou x a y.
Které jsou obě adresy celých čísel, AKA ukazatele.
Pak jsme přidělit dost paměť pro uložení int
a uložit adresu této paměti v x.
Takže, je to ještě jednodušší než například před.
Dej mi čtyři bajtů paměti, to je velikost int,
a dát tuto adresu x.
Tato linka znamená, že zde přejít na adresu v x
a dal význam život, číslo 42 tam.
Ale tento řádek mi dělá starosti.
Hvězda y znamená jít na adresu v y, a dal nešťastné číslo 13 tam.
Proč je to nebezpečné, v tomto bodě v story-- byť rychle řekl
v naší smrštění minut here-- proč je to špatné
když řeknu, jděte na adresu v y?
>> Diváků: Nemáte [neslyšitelných].
DAVID J. Malan: nemám dal cokoliv y.
Takže to, co je hodnota y, v tomto bodě příběhu?
Nemáme tušení.
Je to nějaký odpad hodnota a ani Binky vědět.
Pokud bychom mohli skončit v této poznámce.
>> [VIDEOPŘEHRÁVÁNÍ]
>> Hej, Binky, probudit.
Je čas na ukazatel zábavu.
>> -Co je to?
Další informace o ukazatele?
Oh, dobrota.
>> No, aby mohli začít, myslím, že jsme bude potřebovat pár rad.
>> -DOBŘE.
Tento kód přiděluje dva ukazatele který může poukázat na celá čísla.
>> -OK, Dobře vidím dva ukazatele, ale oni
nezdá se, že by ukazoval na cokoliv.
>> -To je pravda.
Zpočátku na ukazatele neukazují na nic.
Věci, které poukazují na jsou volal pointees a jejich nastavení
je samostatný krok.
>> Oh, jasně, jasně.
Věděl jsem to.
Tyto pointees jsou oddělené.
Tak jak se vám přidělit pointee?
>> -OK, No to kód alokuje nové číslo pointee,
a Tato část stanoví x poukázat na to.
>> Hej, to vypadá lépe.
Tak, aby to něco udělat.
>> -OK, Budu dereference ukazatel x do uložit číslo 42 do jeho pointee.
Pro tento trik, budu potřebovat moje kouzelná hůlka dereferencing.
>> -Váš Kouzelná hůlka dereferencing?
Uh, to, to je skvělé.
>> Tohle je to, co kód vypadá.
Já si jen nastavit číslo a--
>> [POP SOUND]
>> Hej, podívejte se tam to jde.
Takže, dělá dereference na x následuje šipka na přístup k jeho pointee.
V tomto případě, pro uložení 42 tam.
Hej, zkuste použít k ukládání číslo 13 prostřednictvím druhého ukazatele, y.
>> -DOBŘE.
Půjdu sem na y, a získat číslo 13 nastavit.
A pak se hůlku dereferencing a jen--
>> [Bzučák]
>> Oh, hej to nefungovalo.
Řekněme, uh, Binky, vůbec se mi nelíbí myslíte dereferencing
y je to dobrý nápad, protože nastavení up na pointee je samostatný krok.
A nemyslím si, že jsme kdy udělali.
>> -Hmm, Dobrý postřeh.
>> Jo, máme přiděleno ukazatel, y, ale nikdy jsme ji nastavte na poukazují na pointee.
>> -Hmm, Velmi pozorný.
Hej, vy hledáte dobře tam, Binky.
Můžete to opravit tak, aby y body na stejnou pointee jako x.
>> Jasně, jsem použít svůj kouzelnou hůlkou přiřazení ukazatele.
>> -Je Že Bude to Problém, jako předtím?
>> Ne, to ne dotýkat pointees.
Je to jen jeden ukazatel změní poukázat na stejné thing--
>> [Praskavý zvuk]
--as jiného.
>> -Aha, chápu.
Nyní y odkazuje na stejném místě jako x.
Takže, počkejte, teď y je pevná.
To má pointee.
Takže si můžete vyzkoušet hůlku dereferencing znovu odeslat 13 konce.
>> Oh, OK, tady jde.
>> Hej, podívej se na to.
Nyní dereferencing práce na y.
A protože ukazatele jsou sdílení že jeden pointee, oba viz 13.
>> Jo, sdílení, uh, cokoliv.
Takže, budeme přejít místa teď?
>> Oh, podívej jsme mimo čas.
>> -But--
>> -Jen Pamatujte na tři pravidla ukazatel.
Číslo 1, základní struktura je, že máte ukazatel,
a poukazuje přes k pointee.
Ale ukazatel a pointee jsou oddělené.
A Častou chybou je nastavit ukazatel
ale zapomenout, aby to pointee.
>> Číslo 2, ukazatel dereferencing začíná na ukazatel
a sleduje jeho šipku nad pro přístup k pointee.
Jak všichni víme, to funguje pouze v případě, že je pointee, jaký druh dostane zpět
na pravidlo číslo 1.
>> Číslo 3, ukazatel Přiřazení trvá jeden ukazatel
a mění ho, aby ukazoval na Stejný pointee jako další ukazatel.
Takže po zadání, dva ukazatele
bude ukazovat na stejné pointee, Někdy se říká, že sdílení.
A to je všechno, co je k tomu, opravdu.
Sbohem teď.
>> [END Přehrávání]
>> DAVID J. Malan: To je pro CS50.
Díky profesoru Nick Parlante.
Uvidíme se příští týden.
>> [ELECTRONIC přehrávání hudby]