>> [Zenelejátszási]
David J. MALAN: Ez olyan, mint elsős szeminárium ma.
OKÉ.
Szóval nagyon csapadékos ki.
Ez általában történni szerdán, de annál lehetőséget
A kérdés ma.
Szóval kezdjük el ténylegesen a film csak egy pillanatra.
De kezdjük nagyvonalúan, mint mindig.
>> Ez CS50, és ez a a vége a 4. héten.
Tehát, ha valaha is nézte TV vagy egy film, ahol
van néhány számítógépes szakemberek és a rendőrség, vagy az FBI, vagy valamilyen hivatal
próbál elkapni néhány ellenféltől, nos, akkor már
Valószínűleg hallotta ezt a kifejezést "fokozza" amely szerint a technikus valahogy
varázslatosan ráközelít végtelenül messze, hogy a bűnözők
identitás, illetve a rendszám még a csillogó tükör
vagy a csillogása valakinek a szemét.
Tehát valóban, vessünk egy pillantást Néhány ilyen jeleneteket Hollywoodban.
[Videó lejátszás]
-OK, Most térjünk egy jó pillantást Önnek.
>> -Tartsd.
Fuss, hogy vissza.
>> Várj egy percet.
Menj jobbra.
>> -Van, Fagyasztható, hogy.
-Teljes képernyő.
-OK, Fagyasztható, hogy.
-Tighten Fel, hogy jó?
Vektor be, hogy srác a hátsó kereket.
-zoom Az itt ezen a helyen.
-Az A megfelelő felszereléssel, a kép bővülhet, és élesebbé vált.
-Az mi?
-Ez Egy tartozékot programot.
-Használható, Akkor egyértelmű, hogy akár minden?
-Nem Tudom.
Nézzük fokozza azt.
>> -Enhance Részén A6.
>> -I Fokozta a részletekre, és-- Szerintem van
elég ahhoz, hogy fokozza, engedje meg, hogy én képernyőn.
-I Fokozta a reflexió a szemében.
>> -Let Futtatáskor ez a video javítása.
-Edgar, Meg tudja növelni ezt?
>> -Várj.
>> -I've Már dolgozom a reflexió.
>> -Someone Gondolkodás.
Reflexió.
-Van Egy tükrözi a férfi arcát.
-A Tükrözi.
-Van Egy reflexió.
-zoom Az a tükör.
-Te Is látni tükrözi.
-Használható Akkor fokozza a kép innen?
-Használható, Ha emeli őt itt?
-Használható, Ha emeli meg?
Tud fokozza ez?
>> -Használható Mozdítható ez?
>> -Használható, Ha emeli meg?
Lefelé mutató nyíllal jelölt a második, én fokozza.
-zoom Be az ajtón.
-Times 10.
-zoom.
-Beköltözni.
-Több.
Várj, állj.
-Állj meg.
-Pause Azt.
-Rotate Velünk 75 fok körüli függőleges, kérem.
-Állj meg.
Menj vissza a részét az ajtóval, ismét.
>> -Got Egy képet fokozó, amely bitmap?
>> -Hé, Talán fel tudjuk használni a Pradeep Sen módszer, hogy a Windows.
-Ez A szoftver a legkorszerűbb.
>> -A Sajátérték ki.
>> -A Jobb kombinációja algorithm--
>> -Ő A megtett megszüntetése algoritmusok a következő szintre,
és tudom használni őket fokozza ezt a fényképet.
>> -Lock, És bővíteni a z-tengely.
>> -Enhance.
-Freeze És fokozza.
>> [Lejátszás vége]
>> David J. MALAN: Rendben, Mindezen valójában szó.
Ők csak csapott össze egy hogy valójában nem érzékelhető.
És valóban, CS50 és tanfolyamok tetszik hajlamos tönkretenni a sok TV és filmek
neked.
Mert ha azok, számítógépes szakemberek a csörgő le szerződési mondván
extra dolgot, mint sajátvektorai, és a z-tengely,
és tetszőleges számú egyéb valójában több technikai feltételek,
ők tényleg csak drót szó együtt túl gyakran.
Az, hogy az egyik reményeink szerint, Mellékhatásként a tanfolyamot
mint ez, majd többen a világban ténylegesen képes mérlegelni a
és csak alig észrevehetően befolyásolja a minőségét és pontosságát ezeket a filmeket?
>> Tény, vessünk egy pillantást a valóság.
Tehát itt van a személyzet fotó Mária, az egyik tanítási társaik.
És tegyük fel, ő gyanús valami.
És mégis, van egy halvány Néhány bizonyíték a szeme,
vagy a tükörképe a szemüvegét.
Nos, ha nem teszünk, ahogyan a filmek javaslatot, amelyben azt zoom és a "fokozza",
ez mennyi információt a Mária arca
ha a kép készítése össze az eredeti felbontás.
>> És valóban, akkor ezeket a pontokat.
És ezek mik úgynevezett pixel, P-I-X-E-L-S,
amely csak egy négyzet jellemzően hogy egy pont, hogy komponál egy képet.
És vissza a nap, és valójában még ma néhány mai LED TV
vagy LCD TV-k, ha van Egy a szobában, vagy otthon,
Ha felmész szuper közel hozzá, és különösen, ha ez a valamivel idősebb TV,
akkor talán még látni ezeket a pontokat és ez az, amit komponálni egy képet.
>> És nincs több információt, mint ez.
Mi lehetne "fokozza", abban az értelemben, elsimítani, és egyfajta
következtetünk fajta, fajta, amit színes legyen mellette Mary szeme
úgy, hogy ez valójában nem így kimaradnak.
De ha tovább nagyítás, ott a rosszfiú a szemében.
Mint ez az összes információval rendelkezünk.
Ön nem hozhat létre információk a semmiből.
Már csak egy véges bitek száma ott.
>> Tehát a probléma Set 4, ahol Önnek lehetősége van arra,
játszani ezt a fajta világot.
Ebben Probléma Set 4, akkor tárja fel a világába grafika, és a kriminalisztika,
és valójában írni kódot hogy visszanyeri elvesztett képek.
Majd kódot írni, hogy manipulálja meglévő képek
és végül megérteni, mi folyik a motorháztető alatt.
>> És kiderül, hogy valójában Nem olyan bonyolult.
Például, ha azt akartuk, hogy képviselnek egy mosolygó arc, ahol
ezekkel a fekete képpontok, vagy ezek a fekete pöttyök,
Nos, egyszerűen képviseli őket igazán bitmap.
És ha valaha is hallottam, hogy véleménynyilvánítás bitmap, talán
most kezdődik, hogy egy kicsit több értelme ma.
>> Azt már tudjuk, hogy mi egy kicsit is.
Ez 0 vagy 1.
És egy térképet is csak valami mint egy darab papír
hogy elmagyarázza, és Talán egy rács x és y koordinátákat.
Tehát itt van egy bitmap.
Ez egy térképet bit melynek során egy 1 látszólag
fogja képviselni fehér pixel, és a 0 képviselnek majd egy fekete pixel.
De akkor pedig fordítsa körbe.
Ez nem igazán számít, így Amíg mi vagyunk következetesek.
És itt van, hogyan, a binary-- belül a számítógép memóriájában, vagy akár belülről
egy fájl a merevlemezen drive-- tudna tárolni
A legegyszerűbb mosolygó arc képek.
De mik vagyunk mi, persze, hiányzik ez a kép?
Színes, ugye?
Ez egy nyilvánvaló következő lépés, vagy javítása javítani ezen a színes.
Így sajnos csak egyetlen bit, 0 vagy 1, akkor jelenthet színét.
Ez lehet piros, vagy kék, vagy fekete, vagy fehér, vagy zöld, vagy rózsaszín,
vagy pár színeket.
De az egyszerűség kedvéért, akkor csak feltételezem, fekete és fehér.
>> Tehát mi logikusan van szükségünk, ha kívánja megvalósítani színes a kép?
Mit kell tennünk?
Mint ha a korlátozó tényező itt az, hogy egy kicsit akkor csak
képviselik két állam, 0 vagy 1, fehér vagy fekete, mit akarsz csinálni?
Közönség: Több adat.
David J. MALAN: több bit, Igen több adatot, több bitet.
És valóban, pontosan hogyan színes képek képviselteti magát.
Ahelyett, hogy egyetlen bit, egy 0 vagy 1 minden egyes pixelen Minden pontra,
csak használja több.
Talán használja 8, talán még gyakrabban használja a 24, sőt, a probléma szett
4, fogsz játszani egy fájlt formátum, mely 24 bites általában.
>> De a legtöbben valószínűleg ismerik JPEG.
Ha valaha is tett egy fotó a telefonon,
vagy feltölteni vagy látott valamit Facebook, vagy a Flickr, bármennyi
A fotó alapú weboldalak, akkor már Nyilván mindenki látott egy JPEG képet, mielőtt.
És kiderül, ez a fájl formátumban fogunk használni PSET 4,
ahol fogsz Van, hogy visszaszerezze képek
hogy már véletlenül törölt egy sérült memóriakártya a fényképezőgépben,
ha úgy tetszik.
>> És kiderül, hogy bár JPEG elég kiforrott
ez sokkal kifinomultabb mint a fekete és fehér pontok
láttuk az imént, mert van valóban divatos algoritmusok,
sűrítésére használnak JPEG, így hogy lehet egy igazán szép,
minőségű kép, de a viszonylag kevés bit.
És mi jön vissza tömörítés előtt hosszú.
Kiderül, hogy az első három byte olyan JPEG image--
nem számít, mit hozott egy fényképet of-- azok az értékek 255, 216, 255.
>> Más szóval, ha csak lásd ezt a mintát a bitek,
Az itt bemutatott három bájt, illetve 24 bites Total,
nagy valószínűséggel akkor arra következtethetünk, hogy nézed meg ezt első három
byte JPEG.
És ez az, amit ismert, mint az aláírása JPEG.
Sok fájlformátumok ott szokták kezdeni
bizonyos mintákat 0 és 1-esek, úgy, hogy a Windows és a Mac OS és iOS,
és az Android tudom, milyen fájlt általuk vannak, amellett, hogy az úgynevezett fájl
kiterjesztése, hogy sok fájl van.
Ha .jpg, ez Egy másik nyom a számítógépet.
>> Úgyhogy most nézd meg ezt egy kicsit technikailag.
Tudjuk, hogy a tizedes rendszer 0-tól 9.
Tudjuk bináris 0 és 1.
És ha úgy gondolja, vissza PSET 0, mi volt akkor birkózni,
Egy kicsit, valami úgynevezett hexadecimális,
ahol van 16 számjegy, 10 helyett vagy 2 helyett.
És azok a számok, megállapodás szerint, 0 és 9 között, majd egy
keresztül f, ahol f képviseli azt, amit decimális szám, csak egy gyors józanság
csekk?
Szóval, 15.
És kell képviselniük 10, csak a jellege a rendelési hogy megadtam.
Ez csak egy önkényes konvenció, de ez meglehetősen szabványos.
>> Tehát, ha megnézzük ezt a mintát Három bytes-- nézzük
csak elkezd nézni, hogy a összeegyeztethető módon, hogyan
számítógépes szakemberek általában nézd meg és gondolj fájlokat.
Akkor biztosan gondolkodni fájlok 0s és 1s, és a decimális,
de a valóságban, hajlamosak vagyunk a bináris vagy még tipikusabban hexadecimal--
vissza PSET 0.
Szóval hadd javaslom, hogy 255, 216, és 255 Íme, ezek a minták a 0 és 1-esek.
És akkor nézd ezt, ha akar csinálni a matek-re hét 0.
De most, csak feltételezik, hogy ez valóban helyes.
Épp most újraírt három tizedes szám három bináris értékeket.
Most mit fogok csinálni a Csak adjunk hozzá egy kevés fehér térben,
Csak az olvashatóság kedvéért.
És észre, én csak fog mozgatni a dolgokat egymástól.
Tehát előtt, után, előtt, után.
Csinálok semmi érdekes más mint terjed a dolgokat úgy,
E közlemény egyes sor nyolc bit most két négy bit.
Ez azért hasznos, mert hexadecimális Különösen divatos
mert minden hexadecimális jegy lehet 0 f, vagy még pontosabban 0 és 15,
leírható pontosan négy bit.
Más szóval, a hexadecimális ha szeretnénk, hogy képviselje a 0, ez csak 0000,
négy nulla.
És ha azt szeretnénk, hogy képviselje 15, ez 1111, amely négy bit.
És ha nem a matematika, ha ez az egyesek helyére,
ez az a hely, 16S, hogy fog adni you--
inkább azt, hogy folyik alábbiakra: bocs, bináris,
hogy meg fog adni neked 15, egyesek helyére, kettesével helyen, négyes és nyolcas sor.
Szóval hadd javasolni, hogy ez a Állítsa be a négy bit a bal
az, amit mi fogunk hívni f.
Ez a legnagyobb szám képviselhet négy bit.
És már tudjuk hexadecimális, f a legnagyobb jegyű hexadecimális.
Van egy másik f ott, két odaát.
És most, csak hogy a hit amit tettem a matek jogot
és, hogy a bal fél e bitek, 1101,
ez ugyanaz, mint a d hexadecimális.
És a jobb kéz, 1000, mindössze 8.
>> És ez az ember könnyen belátható, ugye?
A 8 represents-- igaza van alatta, hogy a nyolcas sor.
Tehát van egy a nyolcas oszlop és semmi a négyes, kettesével is.
Szóval most még hagyományosan, az emberek hajlamosak hogy írjon hexadecimális számjegy, mint ez,
csak a giccs őket, majd előtagot őket 0x.
Ez azt jelenti, nem más, mint a vizuális nyom egy human--
itt jön egy hexadecimális value--, mert ez egyébként nem nyilvánvaló.
>> Ami azt jelenti, végső soron, hogy a minta a nullák és egyesek,
vagy a minta hexadecimális számjegy azzal egyenértékű, hogy te
fog kezdeni A probléma szett 4 this--
És a probléma szett 4 spec fog járni végig ezt a több detail--
de észre a fajta misztikus, mint ez tűnhet első pillantásra,
fogsz újra látni ezt a sok.
És valóban, még a GDB, a debugger bevezettük hétfőn
és Dan bevezeti a PSET 3, folyik hogy gyakran mutassa meg hexadecimális értékek
csak azért, mert általában sokkal hagyományos, mint decimális vagy bináris
A számítógépek világában.
Most, hogy ezt az összefüggések.
Talán sokan emlékeznek ezt kép itt lépett a mi?
Vista, így még korábban, mint hogy a Windows XP tette ezt debütált.
Szóval ez egy gyönyörű táj.
És valóban, ha piszkálni körül online-- Azt hiszem, ez egy Wikipedia cikket,
ahol valaki nagyon elképesztően kiment találtam ezt a helyét a világban létrehozott
ő kamera pontosan a megfelelő place--
és ez ma úgy néz ki, de az általam elvártnál ez pontosan ugyanaz a beállítás.
Ez a kép, bár ez a fájl formában nevű bitmap, b-m-p.
És mi fog tartani egy szuper pillantás, mit jelent ez.
>> De bitmap csak egy másfajta képviselő képek még mindig a pixel
A 0 és 1-esek, végső soron.
De gyors pillantást, azt egy érdekes aláírás
elején a fájlt.
Ez nem csak a három bájt, hanem van
egy csomó minták bájtok amelyek előre meghatározott jelentése.
Például, valahol a első néhány byte bitmap kép
lesz a méret a kép, a szélessége a kép,
a magassága a kép, így hasznos metaadatokat, ha úgy tetszik.
Hasznos információk, hogy a Photoshop vagy bármilyen grafikai program, amit használ
Lehet, tényleg érdekel.
>> Szóval erről bővebben Probléma Set 4, de ez a
csak azt mondani, hogy végén az a nap
minden fájlformátum van már használja A years-- Microsoft Word fájlokat,
Számok fájlok, Excel fájlok, tetszőleges számú fájlformátumok
hogy köze van egymáshoz ismert fájl kiterjesztését
csak 0 és 1-esek a motorháztető alatt.
És az emberek úgy döntöttek, mi a konvenciók,
milyen mintákat 0 és 1-esek képviselik Word file szemben egy Excel fájlt,
versus számos más formátumok.
Tehát PSET 4, akkor van egy arra, hogy játsszon vele.
>> De mit is jelent az, hogy a struktúra.
Ez tulajdonképpen egy szép Segue most a C, amely csak egy pár
A további funkciók, még nem nézett még.
Ez egy nagyon kis nyelv és az egyik A szép képességgel a C egy struct.
Például, ha akarta represent-- nézzük
mondod, szeretett volna egy változó, képviseli a diák valamilyen programot.
Lehet, hogy írtak egy tanfolyam regisztrációs program, vagy magot vásárlás
eszközt, vagy valami ilyesmi.
Mik a darab kapcsolatos adatok hogy egy diák jöhetnek szóba?
Mint egy diák képviselteti magát, milyen értékeket?
Igen?
Van egy név, mint egy diák.
Mit csinál egy tipikus diák van?
>> Közönség: [hallható]
>> David J. MALAN: Szóval, sajnálom.
>> Közönség: Kor.
>> David J. MALAN: Egy kor vagy születésnapi azzal egyenértékű, aha.
Mi más?
Közönség: azonosító száma?
David J. MALAN: Tehát egy azonosító számot, talán egy telefonszámot, talán egy kollégiumi, vagy házat,
vagy főiskolai, vagy valami ilyesmi.
Bármilyen számú darab adatok lehet, hogy a névjegyzékben
van, mi lehet meghatározni egy diák.
Tehát ha azt akartuk, hogy ezt, a kódot, talán nem valami egyszerű, mint ez.
Talán van egy programot, hogy van mondjuk, int main (void).
És ha azt akarom, hogy képviselje a tanuló talán van, például,
egy string nevű nevét, hogy a hallgatói, egy string nevű kollégiumi, hogy a hallgatói,
Talán egy int hívott azonosítóját, hogy a tanuló.
És mivel én vagyok a húr, én kell, hogy menjen vissza, és tedd fel CS50.h.
Talán szükségem lesz stdio.h.
Szóval hadd preemptively nem azok, és én vagyok Felhívom ezt student.c most
és mentse ezt.
>> És most tudok tenni valamit ezekkel a változókkal.
És mi csak fog írni hogy megjegyzésként a pszeudo-kód,
mert ez nem érdekes mit teszünk most.
OK, így ez egy olyan program, Valahogy tárolja egy diák.
Mit akarok csinálni, ha én szeretnénk tárolni két diák?
Szóval az első ösztöne megy hogy minden rendben, várj egy percet,
ha van egy másik diák miért nem csak nem karakterláncnevet 2, string kollégiumi 2,
int id2.
És mi csináltunk elment ezen az úton, mielőtt
és mi volt a megoldás, amit úgy tűnik hogy egyfajta Hackish másolás beillesztés
munkát itt?
Közönség: Egy tömb.
David J. MALAN: Igen, tudtuk használni egy tömbben.
Erre nagyon gyorsan lesz nehézkes.
Meg kell rendezni az önkényesen kezdeni elnevezése az összes ilyen változó.
És te, az emberi, meg kell tartani követni, hogy OK name2 megfelel
A dorm2 megfelel id2.
Csak lesz a káosz.
Szóval ez sokkal könnyebb, visszahívja a néhány héttel ezelőtt,
hogy csak úgy, hogy az úgynevezett karakterlánc neve és talán nekünk három is.
És akkor talán van karakterlánc alvás és
három e, vagy egy állandó, int azonosítók és három e.
De még most is ezt érzi, egy kicsit hanyag, ugye.
Beszélünk diákok és mégis Én nagyon rágódni alacsony szintje
végrehajtásának részleteit.
A diák egy név és egy kollégiumi és ID.
>> Miért nem tudok csak, hogy egy változót nevű diák és hívjuk s.
És ha azt akarom, egy másik diák, miért nem én csak hívom t.
Vagy ha akarok egy csomó A diákok, miért nem én csak
mondom, van egy egész osztály diákok, és ez a hárman.
Más szóval, miért nem tudok jönni akár a saját adatok típusát, az úgynevezett
Diákok, amelynek belsejében van Egy név, egy azonosítót, egy kollégiumi,
bármilyen számú egyéb területeken.
És kiderül, hogy lehet csinálni, hogy pontosan.
>> Tehát C ezt a funkciót nevű struktúra.
Ez egy nyelvet funkció, amely lehetővé teszi számunkra, hogy pontosan ezt.
Megyek, hogy menjen előre és megnyitja structs.h
hová megyünk, hogy a következő meghatározást egy diák.
Kiderül, - és ez még egyszerűbb, mint az, amely magában foglal egy azonosítót
Egy perccel ezelőtt.
Ha azt szeretnénk, hogy dolgozzon ki a házi adatok típusát,
és emellett a INT, és char és lebegnek és ezek mások, hogy léteznek,
megteheti szó szerint írásban typedef struct,
majd néhány kapcsoszárójele, belsejét, amit
sorolja fel a változókat szeretne társítani új egyéni adatok
írja ki, mint egy név és egy kollégiumi, majd miután a kapcsos zárójelek
adsz egy nevet az új típusú adatokat.
Így például, diák.
>> És mi a szép erről most az, hogy Ha megnézzük a megfelelő kódot,
Az egyezmény első Mindenekelőtt az, hogy ezt a
nevű fájlt valami dot h, header fájl, amely már nem
elkezdtem használni magunkat túl sok.
De mi fog kezdeni segítségével egy kicsit most.
És mit tehetünk ezzel, és végül is ez a néhány sornyi kódot
A kijelentik, hogy pontosan adattípus, egy diák.
És most nézzük használni.
>> Megyek most menj be nevű fájlt structs1.c.
És vessünk egy pillantást a Néhány jellemzők itt.
Tehát a dolog itt van többnyire ismerik, és mi
gyere vissza, amit nem ismerős csak egy pillanatra.
Ez természetesen beleértve a saját header fájlt, ami új is,
kivéve PSET 3 ahol, Emlékezzünk, mi helpers.h.
Szóval lehet, hogy emlékszem #include helpers.h.
>> Miért bár használom idézetek helyett szögletes zárójelben?
Mikor választhat közülük?
Szinte mindig úgy tűnik, a szögletes zárójelben szerepel.
És akkor, hirtelen a soros hathengeres Én idézőjelek.
Miért lenne az?
Igen?
>> Közönség: [hallható]
David J. MALAN: Ez egy tényleges, mi?
Közönség: Ez a IDE.
David J. MALAN: Igen, ez az én tényleges IDE.
És ne lakjanak a IDE, mert ez csak egy eszköz, hogy én vagyok a.
Ez az én jelenlegi könyvtár, konkrétan.
Tehát structs.h az én saját fájl nincs telepítve az IDE,
az operációs rendszer maga, inkább az én aktuális könyvtárban.
Így az egyezmény, ha azt szeretnénk, hogy vegye fel saját header fájlt,
csak használja idézőjelek között.
>> Mit nevezünk ezt a dolgot 8. sor, általában?
Ez az, amit?
#define valamit.
Ez jelenti állandók, nem igaz?
Ha azt szeretnénk, hogy egy értéket a programban
hogy használjon egy egész párszor, hogy
Jó egyezmény faktort ki, állapítsa meg, a hash szimbólum
meghatározni, akkor a konvenció szerint minden nagybetűs word-- bár ez nem
feltétlenül szükséges, de ez az emberi konvenció
tőkét kovácsolni állandók úgy, hogy kiugranak
rád visually-- tér és akkor az érték akarsz lenni
egyenértékű konstans nevét.
Nem pontosvessző, hanem egyszerűen kövesse ezt a mintát is.
>> Szóval mit csinálok ezen a tényleges kódot.
Szóval vessünk egy pillantást A fő program itt.
Összhangban 12 mert van tüntetve structs.h,
Én most már varázslatosan én rendelkezésünkre áll egy új típusú adatokat.
Én nem csak férhetnek hozzá int, és char, és lebegnek, és a szöveg,
és a kék és mások.
Én már elérhető a egy diák típusú adatokat.
Tehát a 12-es vonal, én ötvözi a két ideái egy egyéni adat típusát és két,
egy mezőhöz.
És így ebben a programban, ha Azt akarom, hogy ténylegesen támogatást
Három különböző diákok az én programot,
Elég annyit mondani, hogy nekem egy változó nevezett diákok, amelyek mindegyike
a típusa diákok, amelyek az én egyéni adattípus.
És különösen adj Három ilyen az én tömb.
>> Tehát most mit tegyünk ebben a programban?
Itt csak egy for ciklus iterációjával 0-3, mert ez
mi az érték a hallgatók.
Én csak a felhasználó megkérdezése add nekem a diák nevét.
És akkor a 17. sorban, mi Van egy többnyire ismerős sort.
Megvan a régi barát GetString a jobb oldalon.
És mi darab szintaxis látszólag új,
ha soha nem programozott C előtt, és soha nem használta az struktúrákat?
Igen?
>> Közönség: A .name.
David J. MALAN: A .name.
De ez nem túl sok egy ugrás, mert most a diákok zárójelbe i
megadja az i-edik diák.
És ha szeretne merülni belsejét, hogy a struktúra,
csak használja egy ideig, és akkor a változó nevét belsejében,
vagy az ingatlan található, amelyek azt szeretnénk, hogy hozzáférjenek a.
Hasonlóképpen akkor, ha majd kéri a felhasználó, adj a hallgató kollégiumi,
akkor hasonlóképpen tárolni, hogy húr a kollégiumi belüli változókat
Az, hogy a hallgatói szerkezetét.
>> És most a dolgok egy kicsit divatos.
És ez meg fog nézni A talán sok nagyon hamar.
De látni fogod ezt sokkal inkább PSET 4, úgyhogy csak pillantást most.
Kiderül, hogy a 23. sor keresztül 38, mit gondolsz én talán csinál?
Már eltávolították a hozzászólások A mai, de az a változat
A kód online hivatkozás az összes hozzászólás.
Mit Úgy látszik, hogy vagy?
>> Közönség: A fájl mentése minden Az információ, hogy a felhasználó által megadott.
>> David J. MALAN: Igen, Pontosan, ez egy új módja
hogy látunk két, egy másik jellemzője a C,
ahol tudok létrehozni saját fájlokat.
Eddig szinte minden program írtál hontalan.
Amint ez megtörtént fut, ennyi.
Nincs memória, vagy emlékezetbe.
Nincs mentett fájl.
De ha nem akarjuk, hogy menteni bemenet, amely
történt, mint egy játék vagy program mint ez kiderül, akkor megteheti.
És látni fogod ezt tovább A PSET 4 és pontban.
De ezen a vonalon 23 lényegében létrehoz egy fájlt úgynevezett students.csv.
És lehet, hogy láttam ilyet.
Még ha soha nem tanult CS előtt, CSV vesszővel elválasztott változókat.
Ez olyan, mint egy nagyon szegény ember változatát egy Excel fájlt,
ami azt jelenti, hogy azt úgy lehet nyitni Az Excel és az Apple számok,
és van sorok és oszlopok.
De ez nem egy saját formátumban, mint a Microsoft vagy az Apple.
Ez csak vesszővel elválasztva a értékeket, majd meglátjuk, egy pillanat.
>> És csak akkor gondolom.
Összhangban a 23., a nagyon végén, a második érv
hogy ez az új funkció kerül meghívásra f nyitva fájl megnyitása w.
Mi lehet w jelöl?
Igen?
>> Közönség: Ez lehetővé teszi, írni a fájlt?
>> David J. MALAN: Lehetővé teszi, írsz a fájlt.
Szóval van egy pár változatok hogy mi lehet csatlakoztatni itt.
De ha csak azt olvasni A fájl, ami nézd meg
és olvasd el a memóriába, csak használja idézet idézőjel bezárva "r".
Ha azt szeretnénk, hogy írjon a fájlt, akkor használja idézet idézőjel bezárva "w".
Van még hozzáfűzni, és egy pár más dolog
Ha azt szeretnénk, hogy módosítsák a meglévő fájlokat.
Most megyünk, hogy látta ezt a dolog, aztán gyere vissza, hogy sorban 24.
NULL, kiderül, van Egy különös érték
vissza lehet bizonyos funkciók ha valami nem wrong--
Ha a fájl nem létezik, ha már elfogyott a memória,
vagy egy csomó más hibákat.
De most, most csak feltételezik, hogy a csak a hagyományos hibák ellenőrzése.
Itt a sorban 26, én ismételve 0-3 egész tanítványaim.
És ez a fajta rendezés Egy új funkció, fprintf,
de csak akkor gondolom.
Ha printf csak print formázott szöveget,
Mit fprintf valószínűleg azt jelenti?
Közönség: nyomtathatunk fájlba.
David J. MALAN: Nyomtatás egy formázott karakterlánc egy fájlba.
Ez az, amit a kiegészítő f úton van a fájl.
És az új első érv kell, hogy legyen A változó, amely a fájl.
Ezután már csak egy méret húr, mint a printf.
És bár ez a szintaxis új, ez csak
azt jelenti, csatlakoztassa a hallgató nevét, plug-in a hallgató kollégiumi, majd
A fclose, lezárja az ügyet.
És akkor lastly-- ez az új és mi visszatérünk erre a
mielőtt long-- Én felszabadítása A diák miatt
ami történt fönt van.
De mi jön vissza előttihez long--
ez azért, mert milyen getString van valóban dolgozik a motorháztető alatt.
>> Szóval vessünk egy gyors pillantást ide.
Ha én írja ls az én könyvtár, észre, hogy én nem
Van egy fájlt úgynevezett students.csv, csak nem ott, nem létezik.
Tehát ha én most fordítani ezt a programot, hogy struktúrákat-1,. / struktúrákat-1,
és én megyek előre, és írja be Andi, aki él Berkeley a Yale.
Megyünk, hogy Rob, aki él Thayer ezekben a napokban.
És hadd jöjjön fel, ahol Ez, azt hiszem, Maria van Mather,
ha jól emlékszik.
>> Tehát semmi sem történik.
De ha én írja ls most, van students.csv.
Menjünk előre, és nyitott students.csv.
Ez megint egy nagyon könnyű formátumban.
De én már csak elfogadott egyezmény hogy van két sorok és oszlopok itt.
Az első oszlop ember első neveket.
A második oszlop a hallgató kollégiumi, vagy főiskolai, vagy házat, vagy miegymás.
És most hagytam ezt állandó jelleggel egy fájlt.
>> Szóval ez nem olyan érdekes.
De ez csak egy lépcsőfok most hogy képes fennállnak információk
véglegesen.
Nézzük most mi többet tudunk csinálni ezekkel és egyéb jellemzőit.
De először, bármilyen kérdése?
Ez rengeteg, és hogy gyors volt.
De látni fogod azt a sok több PSET 4, valamint.
Igen?
>> Közönség: Van úgy, hogy továbbra nevek hozzáadását a fájlt?
>> David J. MALAN: Jó kérdés.
Van úgy, hogy továbbra is nevek hozzáadását a fájlt?
Igen.
És valóban, ha a végén akár újra megnyitja a fájlt,
Ön is használja idézettel idézet vége "a" hozzáfűzés,
ami csak egy új sort, a Új sort újra és újra, pontosan.
Jó kérdés.
Más kérdés?
Igen?
Közönség: Ha futtatta a program ismételt most,
lenne megtartani a nevek hozzáadását a fájl vagy lenne nyitni egy új fájlt?
>> David J. MALAN: Ah, jó kérdés.
Ha futott a program ismét jobbra Most, talán gépelt új nevek,
lenne hozzá, hogy a fájl vagy felülírja a fájlt?
Az utóbbi, mert én vagyok Nem használ hozzáfűzési mód.
És mivel én csak vakon A fájl megnyitása írásra,
ez csak fog felülírni.
Szóval valóban kell tennie, hogy csatolja, ha azt akarom, hogy valóban van egy hosszú távú
adatbázisban.
>> Most CSV hasznos, őszintén szólva, még a hasonló ha writing--
és mi végül látni ezt később a félévben, amikor
használjuk CSVs más célokra.
Ha szeretné tárolni az összes ember aki regisztrált valamilyen esemény,
vagy iratkozott fel a diák csoport, vagy valami ilyesmi,
az adatok tárolásának ez a fajta A formátum szuper kényelmes.
Mert a szó szoros értelmében, ha voltak tölteni ezt a fájlt.
Tudtam double-- és nézzük valóban megpróbálják ezt
ha van Excel vagy számok itt.
>> Megyek a jobb gombbal vagy a Control fájlom.
Hoppá.
Kattintson a jobb gombbal vagy a Control fájlom.
Gyerünk, az egér nem működik együtt.
Download-- fogok összes fájl letöltése itt ilyen
Csak így tudok megragad ez.
És lássuk, ha ez működik students.csv-- először
Már aktiválva.
Most akarják látni a kapcsolataimat.
Most azt kell regisztrálni.
Látod, milyen egyszerű a használata CSVs?
Igen, csak így tovább a mai napig.
OK, most már készen állunk az osztályban.
OK, ó, mi újság?
OK, közel.
Ez volt varázslatos.
OK, most már frissíteni.
És most, hogy elfelejtettem, mit fájlt, amit eredetileg megnyitott,
de mi egy-- is vagyunk.
OK, így most van egy Excel fájlt.
Köszönöm.
>> OK, így amit tettem volt a könnyebbik rész.
Természetesen tudtam volna előre telepített Excel, vagy számok, vagy bármit.
De ez szép, mert most lehet manipulálni
Az adatok szabványos formátumban.
>> Így most nézzük összefüggésben váltani, ahol abbahagytuk
utolsó időben, ami volt, hogy indul felszállni képzés kerekek.
De először meg nem lásd ezt a korábbi ebéd
ismét történik itt Tűz és Ice Cambridge, Sitar New Havenben.
Iratkozzon fel CS50s honlapján ASAP hogy csatlakozzon CS50 hallgatók és oktatók.
>> Így került a képzés kerekek off hétfőn follows--
karakterlánc nyilvánították CS50s könyvtár egy ideig.
És ez szép, mert lehetővé teszi, hogy beszéljünk változókat, hogy a
teljes szavakat és mondatokat, és így tovább.
De kiderül, húr nem létezik.
Ez csak egy szinonimája, vagy egy álnevet, hogy hoztunk létre valamit,
valójában egy kicsit technikai úgynevezett char *.
>> És valóban, láttunk példát A program hétfőn
hogy nem viselkedett annyira vártunk.
Ez volt a fájl, hasonlítsa össze-0.
És emlékszem, hogy hasonlítsa össze-0, ha Én újrafordítani a hétfői programot
és fuss hasonlítsa-0 és írja be a MOM kisbetűs, és anyukám kisbetűs újra.
A program ragaszkodott hozzá, írja különböző dolog,
annak ellenére, anya, mind a kisbetűs, azonos vizuálisan.
Tehát mi volt a rövid válasz miért a számítógép gondolkodik
E két húrok különböző?
Igen?
>> Közönség: [hallható]
David J. MALAN: Így van.
Szóval, anyu, az első alkalommal Azt írja be azt, hogy a
tárolni valahol az én számítógép memória, de egy másik helyen
mint a második alkalom, írja az anya.
Most ez persze lehetne optimalizálni.
A számítógép is okos és megvalósítani a két húrok, hé,
ők azonosak.
Hadd ne redundáns tárolja.
De a számítógépek nem csinál ilyet optimalizálási ha nem mondja nekik, hogy.
Szóval, alapértelmezés szerint, ők Csak lesz a vége
két különböző helyen a memóriában.
És így, hogy több egyértelmű, ha összehasonlítottuk a két szöveget,
Az első hívták s, A második hívták
t, konkrétan mit is tartottam összehasonlítva itt a 13-as vonal?
Igen.
>> Közönség: Ez az a hely a memóriában hogy a változó fog mutatni.
>> David J. MALAN: Pontosan, én voltam összehasonlítjuk az a hely a memóriában
hogy azokat a változókat mutatott.
Tehát konkrétan, ha anyu volt bájt szám 1 és 2, és 3,
és 4-- mert emlékszem a backslash 0 kell lennie egészen a végén.
És a másik példánya anyuka, m-o-m, volt cím 10, 11, 12, és 13.
Én összehasonlítjuk 1, ezt a címet, ezen a helyen a memóriában,
ellen 10, ami nyilvánvalóan nem ugyanaz.
1 nem 10.
>> Szóval ez szép, hogy ez elég egyértelmű.
De ez problémás, mivel úgy tűnik nem tudjuk összehasonlítani szálakat.
Tehát fundamentally-- és ezen az alacsony szinten,
ha akart végrehajtani program összehasonlítani
két külön szó, hogy a felhasználó begépelte a minőség,
vajon sorakoznak char számára char, csak általánosságban,
Mit kell tennünk, látszólag?
Ez nem elegendő csupán nézd meg ezt a két címet.
Mit kell tennünk?
Igen?
>> Közönség: végiglépkedhetünk A string [hallhatatlan].
>> David J. MALAN: Igen, hadd halad végig a húr.
Vegyünk egy for ciklus egy while ciklus, vagy bármit is a legkényelmesebb.
És ha van két húrok valahol a memóriában, nézzük meg minden a
első karakter, akkor minden második karaktert, majd a harmadik, és a negyedik,
és az ötödik, míg elérünk milyen speciális sentinel érték?
Közönség: [hallható]
David J. MALAN: Igen, a backslash nulla, ekkor mindkét húr
tudjuk eldönteni, hogy ez az.
Van már kiegyenlített minden egyes karakter?
Ha nem, akkor vissza hamis.
Ha igen, vissza igaz.
És így, hogy pontosan mi ez a verzió A program hasonlítson-1.c csinál.
Ez azonos azzal, amit mi nézett hétfő kivéve, hogy én már
megszabadult a szó string-- bár hogy nincs funkcionális impact-- összes
Csinálok most eltávolítja valamilyen vizuális képzés kerekek,
de tisztán látni, hogy s és t címeket.
És ez az, amit a csillag, A csillaggal jelölt képviseli
egy cím, más néven nagyobb technikai mutatóként.
>> Tehát, ha kijelentem, s az 9. sorban, és azt mondják, char * s,
ez nem jelenti azt, hogy nekem egy string.
Ez azt jelenti, hogy nekem egy változó, amelynek célja az életben, hogy tárolja egy címet.
Mert én vagyok arról, hogy a címét egy string bele.
És valóban, getString, hogy tiszta, nem tér vissza a húr.
Nem ad vissza anya backslash nulla, önmagában.
Mit jelent getString kifejezetten és pontosan vissza?
Közönség: [hallható]
David J. MALAN: Egy cím, a címét, az első karakter
néhány húr ez ütött.
És így most látjuk Egy speciális kulcsszó újra.
És utaltam erre korábban.
Ez lesz a jó egyezményt hogy majd meglátjuk, újra és újra most.
Én ellenőrzi, hogy megbizonyosodjon arról, hogy s nem nulla, és t nem null.
Mert alapján én tényleg Gyors említést korábban,
mit is jelenthet, ha getString vissza nem egy címet, de az N-U-L-L, amely ismét,
Néhány különleges értéket?
>> Közönség: Hiba.
>> David J. MALAN: Ez egy hiba.
Valami elromlott.
És mi jellemzően megtörténhet, különösen,
A strings-- esetleg Az ismeretlen hossza advance--
Lehet, hogy a számítógépek " elfogyott a memória, talán
beírt egy ilyen Hosszú szó vagy mondat
vagy beillesztett ilyen hatalmas esszé Egyszerűen nincs elég memória.
És így getString nem tud visszatérni A címe az egészet,
Tehát csak vissza semmit.
És azt mondja, hogy hiba történt visszaküldésével speciális NULL érték.
Ez a nulla címét, hogy úgy mondjam.
>> Most kiderül, C jön egy funkciót, hogy nem, hogy ismétlés.
Nem kell végrehajtani ezt a egy for ciklus vagy while ciklus magunkat.
Mi lehet használni a funkciót, nevű tömören,
keverjük comp, vagy string összehasonlítani, akinek célja az életben, hogy pontosan erre.
Adod két mutató, két címet, és ez fog menni azokra a címekre
majd összehasonlítani levél levél levél minőségű,
megállás csak akkor, ha mi igaz?
Amikor ösztönösen kell kavarni comp abbahagyja iterációjával, csak hogy legyen világos?
Amikor eléri a backslash 0 bármelyik húr, amely ponton azt eldöntheti
már mindent kiegyenlített, vagy nem volt még olyan ellentmondás?
>> Tehát, ha futunk ezt most, és próbálja a mi kis kapitalizáció játék,
úgyhogy győződjön meg összehasonlítandó-1, ./compare-1, és írja anyuka a kisbetűs mindkét alkalommal.
Most ez ugyanaz a dolog.
És ha én azt újra a kis- és akkor talán nagybetűs.
Most valóban megkülönbözteti között kis- és a nagybetűk.
Szóval nem olyan nehéz, vagy varázslatos, de ez most megmagyarázni
mi folyik a motorháztető alatt.
>> Tehát mi több, tudjuk kivonat Az ilyenfajta leckét?
Szóval vessünk egy pillantást erre.
Én megyek előre, és levelet gyors program itt nevű copy-0.
És most menjünk előre, és ténylegesen csináljuk this-- a copy-0,
vessünk egy pillantást, amit kaptam itt.
Én először mondani a felhasználó, mondj valamit.
Aztán kap egy húr és én tárolt azt s.
Aztán ellenőrizd, s egyenlő egyenlő NULL, csak vissza 1.
Szóval ez csupán a standard hibák ellenőrzése.
Semmi érdekes nem történt.
És valóban, ha megszabadulunk a hiba ellenőrzi, ez úgy néz ki, mint a heti 1-kód
abban a pillanatban.
De már kezdett egy kicsit jobban róla.
>> Most sorban 16, egy héttel ezelőtt, talán még egy pár napig, vagy perce
mondhatnánk vonal 16 ami egy változó nevű t
és másolás s bele.
És ez egy tökéletesen ésszerű elvihető.
De pontosabban most.
Mi történik a 16. sorban?
Mit kezd másolni jobbról balra?
Igen?
Közönség: Van t kapok egy címét s?
>> David J. MALAN: Pontosan, t kezd a címe s.
Szóval, hogy most tiszta, ha elmegyek vissza, hogy a korábbi példa
és én felhívni arra a dolog, amit beírt.
És amit beírt in-- itt s, és itt
az, amit beírt valahol memória, anya, majd egy backslash
0, ami hozzáadott számomra.
Amit tárolt itt, emlékszem, ez a helyen 1, 2, 3, 4,
Ez az, amit jelenleg s.
Tehát, ha a 16. sorban, azt mondom, hogy nekem másik változó nevű t és tárolja
AT az s értéke, mi lesz itt tárolt nem anya
hanem inkább csak az 1-es szám.
>> Tehát, ha előre tekintünk ebben a programban Most, hogy mi fog történni?
Így észreveszed, hogy van Ez a funkció lehet, hogy
használták ezt a néhány évvel ezelőtt Caesar, vagy Vigenère, vagy talán egyáltalán nem.
Azt állítják, az én printf vagyok fog tőkét kovácsolni a másolatot t.
Első sorban a 19., gyors józanság ellenőrizze, strlen ellenőrzések hossza t.
Mert nem akarom, hogy megpróbál valamit nagybetűvel
ha nincs húr van.
Ha a felhasználó az Enter leütése, nincs semmi tőkét kovácsolni.
Szóval én nem akarok 21-es vonal.
Így a vezetékben 21 capitalizing melyik betű, nyilvánvalóan, t?
>> Közönség: m?
David J. MALAN: Úgy néz ki, mintha másolást melyiket?
Közönség: m.
David J. MALAN: Uh, m.
OK, így az első m, mert észre, hogy én vagyok
átadva TOUPPER, amely ha soha nem láttam, hogy ez
Csak egy függvényt tőkét kovácsolni, mint a bemeneti.
t tartó nulla jelenti, hogy nekem a nulla karakter t.
És igen, hogyan működik ez Képet változás, hogy világos?
Mit kell, hogy átírt vagy megváltozott tekintetében s és t és a MOM
backslash nulla.
>> Közönség: [hallható]
>> David J. MALAN: Igen, így ez itt egyszerűen
kell, hogy megváltozott az alábbiakra: fix this-- kell, hogy megváltozott a főváros m.
De most, nézd később a programot, ha ki kell nyomtatni
s, t, mint én tiszta itt, nézzük, mi az, fog történni kinyomtatásával s és t.
Tehát, hogy copy-0, ./copy-0.
Hadd menjen előre, és írja az anya a csupa kisbetűvel.
Figyeljük meg az eredeti és a A másolási tudták kihasználni.
Miért?
Nos, s és t egyaránt mutat, ha úgy tetszik, ugyanaz a darab memória.
És őszintén szólva, ez kezd Tényleg uninteresting-- az a tény,
hogy mi használ címet nullán.
Úgy értem, nem igazán érdekel ahol cucc a memóriában.
Elnézést törlése egy kicsit túl sok.
De nem igazán érdekel ahol a dolgok a memóriában.
És igen, valóban ezt programozók hajlamosak gondolni
az, hogy ha beszélni egy címet, vagy egy mutatót,
kit érdekel, hol van a memóriában.
Nem érdekel, ha ez a bájt egy vagy egymilliárd.
Csak érdekel, hogy ez a változó hatékonyan
mutatva, hogy darabja a memóriát.
És így ezentúl inkább kibúvó több mint tetszőleges memória címek, hadd
csak elkezd rajzolni mutatók a mutatók, mint a nyíl.
Szóval mit s és t valójában, szerint ez a program,
mert az, hogy létrehoztam t, ez csak két különböző változók
rámutatva ugyanakkor darab memória.
És nem érdekel, hogy hol vannak.
Így tudjuk elvonatkoztatni, hogy részletesen.
>> Szóval hogyan lehet ezt orvosolni?
Ha azt akarom, hogy írjon egy változata a másolás program ténylegesen példányban a húr
és kihasználja csak a másolatot, csak ösztönösen,
mi van, hogy egy Hozzávalók a mi megoldás?
Közönség: [hallható]
David J. MALAN: Szükségünk van egy mi?
Közönség: darab memória.
David J. MALAN: Szükségünk Egy másik darab memória, ugye?
Nem tudjuk, hogyan kell csináld még, feltétlenül.
De milyen kell, hogy ez megtörténjen, így hogy az eredeti anya kisbetűvel
végül, hogy extra darab memória.
Aztán amikor változtatni a másolás, I Nem akarja megváltoztatni ezt a példányt itt.
Én inkább szeretnénk változtatni csak ezt másolatot, így az eredeti változatlan marad.
>> Szóval, lássuk, hogyan lehet ezt csinálni.
Ebben copy-1, amely már megfosztották megjegyzést,
de kommentálta az interneten.
Mi ehelyett nem a following-- ezeket vonalak azonos, hozz egy húr
és hívjuk s.
De most nézzük meg az egyik legnagyobb összetett, de az utolsó a komplexitás
Egy darabig 16. sor pontosan ezt teszi.
Tehát, ha a kényelmes a Képet mi csak drew--
adj egy új darab memória, másolni mindent bele,
Nézzük meg, hogyan tudjuk lefordítani, hogy a kódot.
>> Tehát vonal 16, a bal oldali, char * t ad nekem ezt a dobozt ide.
Ez minden, hogy nem.
A jobb oldali, m alloc, vagy malloc,
a memória kiosztás, szuper divatos, Egy rejtélyes módon csak azt mondom,
adj egy darab memóriát.
Mennyi memória van szükségünk?
Nos, ez a fajta egy nagy kifejezése.
De lássuk, mit mond itt.
Tehát ez, persze, hogy nekem a húr hossza s.
Szóval, anyu meg kell, mi?
Tehát csak három, nem igaz? anyuka három karakter.
Nem számít a backslash egy nulla
beszélni a karakterlánc hosszát ez valójában az emberi látható betűket.
Szóval anya, így ez ad nekem 3.
De várj egy percet, én most hozzá 1.
Miért valóban akar kiosztani 4 byte, és nem csak 3?
Igen?
>> Közönség: a Sentinel érték?
>> David J. MALAN: Pontosan, e sentinel értéket.
A backslash nulla, Szükségem 4 byte összesen.
Szóval kell hosszát A karakterlánc plusz 1.
És akkor csak a jó measure-- jóllehet ez a rendszer,
ez mindig lesz 1-- mondok megszorozzuk a méret a char.
Kiderült, sizeof van Az üzemben a C, hogy
Csak azt mondja, a byte-ok száma, ez
amelyek bizonyos típusú adatokat.
Nem működik a tömbök, jellemzően, néha nem.
De az általános esetben, nem.
De akkor mondja meg, hogy hány bájt a char, melyről kiderül, mindig 1.
Tehát ez olyan, mint megszorozzuk 1.
>> Szóval szuper rejtélyes keres kódsort.
De minden ez is ad nekem egy darab memóriát.
De nem is úgy tűnik, hogy a másolás semmit, hogy a memória?
Még nem.
És akkor mi van ugye a 22. sorban, és 23, 24, 25, nos, azt egyszerűen megteheted ezt.
És ez a fajta old school cucc most.
Ez olyan, mint PSET 2, ahol te csak mozgó dolgok
körül a memóriában, vagy inkább a szálakat.
>> Úgyhogy iterációjával 0 A string hossza s.
És én másolás i-edik karakter S be az i-edik karaktere t.
És mert a programozó készült Ügyeljen arra, hogy fordítsanak pontosan annyi bájt
ahogy kell, ez tökéletes egy-egy kapcsolat.
És én másolni anyuka a kisbetűs az újat.
És akkor végül, én ezt a vonalat.
És így a hatás csak kihasználni ezt a t itt.
Szóval sok elnyelni, de ha csak úgy
mi folyik valójában A a motorháztető alatt
csak, ha ezeket a byte körül, minden,
szükséges, hogy megoldják ezt a problémát Csak, hogy nekünk ez a darab a memóriát.
Most azzal a veszéllyel jár elsöprő, hadd mutassam
Egy másik példa, hogy majdnem azonos, kivéve ez az egy
kódsort.
Szóval ez a hacker verzió E program, ha úgy tetszik.
De nézzük csak distill azt, hogy mi folyik.
24. sor szokott lenni ez t konzol i jelentkeznek s konzol i.
Most én vagyok a változó ezt A sokkal rejtélyes csillagos t
plusz 1 egyenlő csillagos s plusz 1.
>> Szóval, mi történik és miért van még egy csillag karaktert?
Láttuk a csillag előtt, és ez is használható eltérően itt.
Mi korábban látott char *, most látok Egy csillag az elején, és ez rendben is van.
Mert kiderül, mi lehet egyfajta következtetni, csak
azoktól első elvek, mi folyik itt.
Szóval, csak hogy tisztázzuk, mi az ok?
A múlt héten volt egy string.
Ez nem elegendő többé.
Mi s, konkrétan?
>> Közönség: [hallható]
>> David J. MALAN: Ez egy mutató.
Ez a címe első karaktere most beírtunk.
OK, mi t?
>> Közönség: [hallható]
>> David J. MALAN: A címét, az első bájt
t, hogy a darab memória átcsoportosítani.
Így kiderül, hogy amikor ismételget 0, egészen a húr
length-- először, i indul a 0, mert
Ennek a régi iskola hurok dolog.
Tehát csak az egyszerűség kedvéért, hadd Feltételezzük, hogy az első sorban a kódot
tényleg csak ezt, ugye.
Ha én nulla, hozzátéve nulla hogy valamit feltehetően
nem fog mutatkozni.
>> Szóval mi ez a mondás?
Kiderül, hogy a sztár üzemeltető ebben az összefüggésben
a hivatkozás feloldási üzemben, amely csak
divatos szóval menni az alábbi címre.
Tehát, ha s a címe az első karakter ebben darab memória,
* s eszközzel megy oda.
És mivel mi már kidolgozott a kép ezen a módon,
akkor fogadja el a következő mentális modell.
Ha ez ok, és azt mondod * s * s olyan, mint csúszdák és létrák,
Ha emlékszik a játékot a gyermekkorból, olyan, mint követni, hogy nyílra, és menjen
a címet.
>> * t ugyanaz a dolog.
Tehát itt kezdődnek, megy a darab.
Nem tudok csak támaszkodni Ezen a képernyőn, hogy így.
* t jelenti, hogy megy itt.
És akkor, a for ciklus csak mondván mozog ez a karakter van,
mozog ez a karakter van, mozog ez a karakter itt.
De hogyan tudom ezt növelés?
Meg kell visszavonni, amit én csak törölni.
Ez az, ami általában az úgynevezett pointer aritmetika, amely
azt jelenti, matematikai címekkel.
>> Amennyiben ebben a hurok, Folyton megnő i,
és s jelentése egy cím és t jelentése címét, ha csak tartani, hogy 1,
ez csak azt jelenti folyamatosan halad előre, és továbbítja, és továbbítja a memóriában.
Olyan ez, mint az Oxford Street, a utcán, hogy a CS épületben van kapcsolva.
A CS épületek pedig 33 Oxford Street.
Tehát, ha azt írjuk, hogy 33 Az Oxford Street plusz 1,
hogy hozza meg a 34 Oxford Utcáig, majd 35 Oxford Street,
majd 36 Oxford Street, függetlenül azok épületek valójában - ha vannak ilyenek.
És igen, ez minden, amit csinálsz Itt a mutató aritmetika.
>> Szóval ez egy szuper misztikus módon kifejezni magunkat.
De minden, ami történik a motorháztető alatt
csak követi ezeket a címeket, mint a következő egy térképet, ha úgy tetszik,
vagy azt követően nyilak, mint amit rajzolt a képernyőn.
OK, sok megemészteni.
Bármilyen kérdés szintaxis, koncepciók, mutatók, malloc, vagy hasonlók.
Igen, itt először.
>> Közönség: Szóval, ha ez mondja * t egyenlő toupper * t,
az, hogy lesz kihasználni összes betűt vagy csak--
>> David J. MALAN: Ah, nagyon jó kérdés.
Tehát ebben a sorban van, 31, ez megy, hogy tőkét
Az első betűjét vagy minden betűjét.
Úgyhogy válaszolni, hogy megy Vissza az első elvek.
És az első elvek itt azt értem, csak megy alapmeghatározásait
A mi szó.
Tehát toupper egy funkciót hasznosítja a char.
Ez minden.
* t jelenti megy a first-- megy a címet t.
Szóval, a képen, ha ez a darab Az emlékezet malloc,
és ez t, * t jelenti megy itt.
>> Közben te halad ez az érték, kisbetűs m
hogy toupper, kapsz vissza tőke M, hová üzembe?
Te amivel azt, hogy ugyanazon a helyen.
És így az, hogy a logika e alapvető meghatározások ez csak
Kihasználva az első levél hacsak nem ismételget az i vagy
A hurok vagy while ciklus, ez nem fog másra, mint kérdezed meg.
Jó kérdés.
Igen?
>> Közönség: Miért használja a hivatkozás feloldási módszer helyett
a tömb?
>> David J. MALAN: Ah, jó kérdés.
Miért használjuk a hivatkozás feloldási módszer helyett a tömb módszer?
Nincs különösebb oka, hogy őszinte legyek.
És valóban, erre a fajta például, jobbra,
Én csak azzal érvelve, hogy a programot bonyolultabb,
Több szem üvegezés fölött, az emberek megnézni
mert ez úgy néz ki, szuper misztikus, de annak ellenére, hogy ugyanazt a dolgot.
És így, őszintén szólva, ez egy Feleslegesen vizuálisan komplex megoldás
a problémára.
>> Még mindig jó design, Öt az öt tervezési,
függetlenül attól, hogy a konzol jelölést vagy a mutató jelöléssel.
De-- különösen, ha megkapjuk később a kurzus PSET 5
amikor végre, hogy szótárból Már említettem néhány times--
akkor tényleg érdekel a alacsony memória címek
hogy valóban megértsük mi történik.
>> Ám most, kiderül, hogy ez a kódsort itt szögletes zárójelben
nem igazán létezik.
Ezek az úgynevezett szintaktikai cukor, amelynek
csak hátborzongatóan jó szóval a fordító alakítja szögletes zárójelben kell
hogy a matematikai kifejezés.
Szóval ez egy emberi konvenció hogy képes legyen csak írni
Ezek nagyon felhasználóbarát zárójelben.
De mi a fordító, csengés, valóban csinál bármikor
írsz, mi kiemelt sorban 24, a motorháztető alatt ez tényleg
átkonvertálja ezt.
Ez csak sokkal élvezetesebb, mint egy emberi olvasni és írni kódot, mint a sorban 24.
De végül azok, képzés kerekek is jön le
ha az ember saját kényelmét erősödik.
>> Rendben, emlékszem majd, hogy ez a az a fajta legnagyobb probléma
botlottunk.
És ez az, ami felkeltette az egész átkozott beszélgetés mutatók,
és címét, és a másolás dolgokat.
Azért, mert mi megbotlott ez a hülye, hülye kérdés, amellyel
Én végre logically-- Lauren itt a demo és a narancslé
A milk-- tökéletesen algoritmikusan helyes működés
átszivatásáho két változó " értékeket, de az átkozott
nem volt tartós, vagy állandó, hatása a kódomat.
>> És miért volt ez?
Dióhéjban, miért van ez végrehajtása swap-
logikailag helyes, de nincs hatása a változókat, amelyek a neki átadott,
mint x és y a fő?
Mi volt a lényeg, hogy ezt a kérdést?
Igen?
Közönség: Mivel változó készül példányban változó a pass
through funkcióval.
>> David J. MALAN: Pontosan, ha át változók egy függvény, vagy érvek
egy függvény, ők által elfogadott példányát, amely
azt jelenti, kapsz egy azonos keres minta bitek mind x és y,
itt nevezik a és b.
És bármit megtehetsz akarsz Ezeket a példányokat,
de ők fognak nincs hatása a hívó függvényben.
És valóban, felhívtuk, hogy kép a képernyőn, visszahívás
utoljára, ahol ha Tényleg azt hiszed, hogy mi a
folyik alatta a hood-- ha ez a számítógép memóriájában,
és le itt a darab memória használják fő,
ez a darab használt memóriába a csere,
és így még ha fő van két változó, x és y,
csereügylet lehet azonos keres értékek, amelyek mindegyike az 1. és 2.,
de ők teljesen különböző darabokat a memóriában.
>> Tehát szükségünk van egy megoldás erre.
És őszintén szólva, úgy tűnik, hogy most van egy megoldás erre a problémára, jobbra.
Ha most már a képessége, hogy manipulálni a dolgokat útján címek
és, egyfajta csúszdák és létrák stílus, a következő nyilak
és menj sehova akarunk a memóriában, nem tudtuk
megoldja ezt a problémát, halad fő cserélni
Nem az értékeket akarunk csereügylet, de csak ösztönösen
mit tehettünk volna át a swap helyett?
>> [Közbeiktatásával VOICES]
>> David J. MALAN: Miért nem csak adja át a címeket, ugye?
Miért nem ad swap-egy kincses térképet, ha úgy tetszik,
hogy vezet, hogy a tényleges értékek x és y.
Nézzük csere, valóban változtatni azok eredeti bit, ahelyett
csak múló példányban a bitek.
És így, sőt, ez az, ami lesz a megoldás.
Ez a verzió itt egyértelműen a rossz és elhibázott.
És most, az első pillantásra, csak úgy néz ki mint mi hozzá egy csomó csillagok véletlenszerűen
és keresztbe ujjainkat hogy ez összeállítani.
De, akkor most összeállítani.
>> De lássuk, mit jelentenek ezek.
És, sajnos, a szerzők C választhatott volna egy másik szimbólum
hogy ez egy kicsit világosabb, de a csillag üzemeltető
van más jelentése Két különböző kontextusokban.
És láttunk mindkét, de nézzük megkülönböztetni.
>> Szóval fel a tetején van, amikor megváltoztak a és b
attól, hogy int a az rossz változat int csillagok, az A és B,
Korábban voltak egészek.
Milyen a és b most A jó, a zöld változat?
Ők címeket.
Címét, mi, hogy világos?
Címét egészek.
Tehát az a tény, hogy én vagyok mondván int csillagos eszközökkel
ez a címe egy egész szám, specifikusan.
>> Tehát most hirdetmény a sorból, valami más is megváltozott.
tmp ugyanaz marad, mert ez csak ideiglenes egész,
nincs memória varázslat van.
De a most szüksége van egy csillag.
És, sőt, minden más említés a és b,
észre, hogy minden, ami változó pirosról zöldre
az, hogy én előtaggal azokat a változókat a csillagok.
Mert nem akarom másolni a és b.
Mert ha csak másolja a és b és swap a és b, mi vagyok én valójában csere?
Csak címeket, szeretnék cserélni mi forog ezeket a címeket.
Oda akarok menni.
És így a csillag üzemeltető belső én funkciót,
nem belül a paraméter lista, azt jelenti, elmész azokra a címekre
és valóban változtatni ezeket az értékeket.
>> Tehát mi nem a kép kinézni helyett.
Nos, ha ahelyett, hogy én vagyok halad a A és B nem 1 és 2--
Igazából kell hozzá Egy másik meghatározás itt.
Tehát tegyük fel, hogy ez a darab memória áll helyre 10.
>> Ez a hely 11, de ez egy kicsit egyszerűsítés
Én most két választási tudom átadni x és y vagy tudom átadni a címüket?
Ha elmegyek a címüket mint ez, én csak
Most végre kell hajtani swap-per a zöld-kód
úgy, hogy amikor lát és amikor b látja, hogy nem csak másolja a és b
és mozgassa a tej és a narancslé.
A tej és a narancslé metafora most elromlik,
mert ezek azok kupák Folyékony és nem térképeket.
Mi ehelyett kell menni hogy foglalkozzon 10 és
kell menni, hogy foglalkozzon a 11., és a majd hajtsa végre, hogy csere logikája.
>> Tehát a logika ugyanaz, de szükségünk van egy kicsit másképp
elérésének azokat a változókat.
És így a végén, amit a programot kell kinéznie ez.
Ebben swap.c szó másolt és beillesztette a zöld változata.
De azt kell, hogy egy változás.
Ez nem elegendő csak megváltoztatni csere.
Milyen más kódsort Hogy tudok változtatni?
Igen?
>> Közönség: Hol tart az érveket.
>> David J. MALAN: Hol tart az érvelését.
Szóval, ha felfelé a fő, én Nem lehet csak átadni az x és y,
és ígérem, az utolsó darab új szintaxis ma.
Azt kell, hogy adja át a nem x és y de a címét x és y.
És kiderül, a szimbólum hogy a szerzők a C választotta
ha használod-jel van, hogy nem tévesztendő össze a bitenkénti-jel,
ha használja-jel itt és itt-jel,
ezt kitalálja az Ön számára, mi a címe az x,
talán 10, mi a címét y, talán
11, és átadja azokat a helyett.
>> Szóval egy csomó, hogy felszívja az összes egyszerre.
De nézzük most gyorsan a maradék négy perc
ahol a dolgok félrecsúszik.
És mint félretéve, valóban Vettem ezt a képet,
TF ezt a képet egy-két évvel ezelőtt.
Szóval ez a hátsó sarokban Eliot Dining Hall.
Pointerek talán a legnehezebb A téma, hogy lefedjük a CS50.
Tehát, ha aggódsz a rendezés A lejtőn, mint talán
Több mint hokiütő mint ez, észre
Mi vagyunk a fajta közeledik a csúcs Ami a fogalmi komplexitást.
>> És hozom fel ezt fotó, mert esküszöm
Istennek, az ősszel, amikor 1996-vettem CS50 az én tanítási fickó,
Nishat Mehta, aki leültetett a sarkában a Eliot D. Csarnok ebéd közben,
vagy vacsora, vagy valami, hogy megpróbálja hogy segítsen megérteni mutatók.
És ez az, ahol én voltam hét után vezették be, amikor előadás
Végül megértettem mutatók.
És biztos vagyok benne, hogy ez a majd kattintson messze hamarabb az Ön számára.
De észre ezt egyáltalán között A kifinomultabb témák
átnéztük.
De ez közül a legerősebb.
És amikor már azt, hogy tényleg minden csak úgy, hogy végül jön össze.
Így biztos lehetsz benne, hogy nem kell minden mosogató ma.
>> Tehát itt az utolsó program fogunk nézni.
És mi lesz a vége egy Gyors három percen claymation
által barátunk, Nick Parlante.
Itt egy programot, amely a felső két vonalak kijelenti változó x és y.
Mindkét amelyek címek Egész számok, AKA mutatók.
Ezután osztják elég memóriát egy int
és tárolja a címet Az, hogy a memória x.
Szóval, ez még egyszerűbb mint a példa korábban.
Adj nekem négy bájt memóriát, ez a méret egy int,
és tedd azt a címet x.
Ez a vonal itt azt jelenti, megy a címet x
és tedd értelmében az élet, a szám 42 van.
De ezen a vonalon aggaszt.
Csillag y azt jelenti, megy a címet y, és tegye a szerencsétlen szám 13 van.
Miért veszélyes, ezen a ponton A story-- noha gyorsan elmondta
a mi fogyó perc here-- miért nem jó ez
hogy azt mondjam, menj a címet y?
>> Közönség: Nem [hallható].
David J. MALAN: én nem tegyen semmit y.
Tehát mi az értéke y, Ezen a ponton a történet?
Fogalmunk sincs.
Ez valami szemetet értéke és az sem Muci tudom.
Ha a végén ezt a jegyzetet.
>> [Videó lejátszás]
>> -Hé, Muci, ébredj fel.
Itt az ideje mutató móka.
>> -Az mi?
Ismerje meg a mutatók?
Ó, szobaasszony.
>> -Nos, Az induláshoz, azt hiszem, mi vagyunk Szükségem lesz egy-két mutató.
>> -OKÉ.
Ez a kód oszt két pointert amelyek rámutatnak, hogy egész számok.
>> -OK, Jól látom a két mutató, de
Nem úgy tűnik, hogy mutat semmit.
>> -Ez így van.
Kezdetben pointerek Nem mutat sehova.
A dolgok rámutatnak a nevű pointees és számukra a kialakításukban
egy külön lépésben.
>> -Ó, Jobb, jobb.
Tudtam.
A pointees külön.
Szóval hogyan lehet lefoglalni egy pointee?
>> -OK, Valamint ezt a kódot kiosztja Új integer pointee,
és ez a rész az x, hogy pont azt.
>> -Hé, Hogy jobban néz ki.
Tehát, hogy ez nem valami.
>> -OK, Én dereference a mutatót x A szám tárolásához 42 bele pointee.
Mert ez a trükk, szükségem lesz az én varázspálcája dereferencing.
>> -A Varázspálcája dereferencing?
Uh, hogy ez nagyszerű.
>> -Ez Az, amit a kód így néz ki.
Én csak létre száma és--
>> [POP SOUND]
>> -Hé, Nézd meg ott megy.
Szóval, csinál egy hivatkozás feloldási a következőképpen x A nyilat a pointee.
Ebben az esetben, hogy tárolja 42 ott.
Hé, próbálja meg azt a számot tárolni 13, a másikon mutatót, y.
>> -OKÉ.
Megyek át ide y, és kap a 13-as szám létre.
Majd megteszi a pálcát a dereferencing és csak--
>> [Csengő hang]
>> -Ó, Hé, hogy nem működött.
Azt mondják, uh, Muci, én nem gondolom dereferencing
y egy jó ötlet, mert a kötés fel a pointee egy külön lépésben.
És nem hiszem, hogy valaha csináltam.
>> -Hmm, Jó pont.
>> -Igen, Mi juttatott a mutatót, y, de mi soha meg azt, hogy pont egy pointee.
>> -Hmm, Nagyon figyelmes.
-Hé, Te jól nézel ki ott, Muci.
Meg tudná javítani úgy, hogy y pont hogy az azonos pointee mint x.
>> -Sure, Tudom használni a varázspálcát A mutató feladat.
>> -Van, Hogy lesz probléma, mint korábban?
>> -Nem, Ez nem ér hozzá a pointees.
Csak megváltoztatja egy mutatót hogy pont ugyanazt thing--
>> [Pattogó hang]
--as másik.
>> -Ó, értem.
Most y pont ugyanazon a helyen, mint x.
Na várjunk csak, most y rögzített.
Ez egy pointee.
Így próbálja a pálcát a dereferencing újra elküldeni a 13 feletti.
>> -Ó, OK, itt megy.
>> -Hé, Nézd meg ezt.
Most dereferencing alkotások y.
És mivel a pointerek megosztása hogy az egyik pointee, mindketten lásd a 13.
>> -Igen, Megosztás, uh, mindegy.
Szóval, megyünk helyet cserélnek most?
>> -Ó, Nézd kifogytunk az időből.
>> -De--
>> -Csak Emlékeznek a három mutató szabályokat.
1. szám, az alapvető szerkezete az, hogy van egy mutatót,
és ez pont fölött egy pointee.
De a kurzort, pointee külön.
És a gyakori hiba hogy hozzanak létre egy mutatót
de elfelejteni, hogy ez egy pointee.
>> 2. szám, mutató dereferencing kezdődik a mutató
és követi annak nyíl fölött hogy hozzáférjen az pointee.
Mint tudjuk, ez csak akkor működik, ha van egy pointee, milyen visszaér
uralkodni száma 1.
>> 3. szám, mutató hozzárendelés úgy egy mutatót
és megváltoztatja azt, hogy pont a ugyanolyan pointee, mint egy másik mutatót.
Tehát miután a megbízást, A két mutató
fog mutatni az azonos pointee, néha, hogy hívják megosztását.
És ez minden van, tényleg.
Viszlát most.
>> [Lejátszás vége]
>> David J. MALAN: Ennyi CS50.
Hála professzor Nick Parlante.
Találkozunk a jövő héten.
>> [Elektronikus zene szól]