>> [MUSIC PLAYING]
>> DAVID J. MALAN: Rendben.
>> [Nevetés]
>> Isten hozott.
Ez CS50.
És ez a hét végére öt.
És eddig, most már elég sok szedett számára mindez
létezik ez a fordító, csenget, hogy már is hivatkozva útján a
más eszköz, a Legyen valahogy varázslatosan átalakítja a forráskódot
a tárgykód, a nullák és egyesek hogy a számítógép CPU, központi
feldolgozó egység, ténylegesen meg is érti.
De kiderül, hogy van egy szám, ami folyik a motorháztető alatt a
bemenet és kimenet között.
>> És szeretném javasolni, hogy hús hogy ki egy kicsit részletesebben a
ezt a négy lépést, van valami neve előkezelést, valami
nevű összeállítása, amit láttunk, úgynevezett összeszerelés, és a
úgynevezett összekötő.
Tehát eddig, a néhány programok, volt éles tartalmazza.
A közelmúltban már volt néhány éles határoz meg az állandók.
Így kiderül, hogy azok a dolgok, hogy az előtagja a hash szimbólum vagy
A font szimbólum pre-processzor irányelvek.
Ez csak egy divatos szóval ez egy sor kód valójában
át valami mássá, mielőtt a számítógép is próbálja átalakítani a
programot nullák.
>> Például, éles szabvány tartalmazza I / O. H, nagyjából csak azt jelenti, megy
előre, ragadd meg a fájlok tartalmát stdio.h be őket ott.
Tehát nem nullák és egyesek ezen a ponton még.
Ez tényleg csak egy cserét.
És ez történt az úgynevezett előfeldolgozás szakaszban, ha
valójában fut csenget vagy kifejezetten Legyen a legtöbb esetben.
Tehát mindez történt először automatikusan eddig.
>> Aztán jön a fordítás lépést.
De már leegyszerűsített összeállítása.
Program fordítás valójában azt jelenti, hogy vegye ki valami, mint a C, a
forráskód mi már írás, le az úgynevezett szerelvény.
Assembly nyelv alacsonyabb szintre nyelv, szerencsére, nem fogunk
volt sok alkalmam írni ebben a félévben.
De ez a legalacsonyabb szinten, a értelemben, hogy a szó szoros értelmében írásához
összeadni és kivonni és sokasodjatok, és terhelés a memória, és mentse a memória, a
nagyon alapvető utasítások, hogy a számítógép, a motorháztető alatt,
ténylegesen meg is érti.
>> Végül, szerelés veszi, hogy a nyelv A nullák és egyesek, hogy már
leíró eddig.
És tényleg végül ott van az úgynevezett összekötő szakasz, amely fogjuk
hogy csak egy pillanat, amely egyesíti a A nullák nullákkal és
azok az emberek előtt létrehozott.
>> Tehát úgy ezt a szuper egyszerű program.
Ez volt az 1. hét.
Csak azt mondta, Hello World, a képernyőn.
Mi ezt a csenget.
Vagy lefuttattam Legyen lezajlott csenget.
És outputted abban az időben, amikor Néhány nullák.
De kiderül, van egy közbenső lépés.
Ha elmegyek ide - hoppá, nem szeretnénk látni még.
Ha elmegyek ide, hogy a készülék és én nyit hello.c itt
az, hogy ugyanaz a program.
És mit fogok csinálni a terminál ablak itt fogok
fuss Clang ahelyett, hogy, ami automatizálja mind a négy
ezeket a lépéseket nekünk.
És én fogom csinálni csenget-S és akkor hello.c majd adja meg.
>> És kapok egy villogó prompt újra, ami jó.
És most egy kicsit nagyobb ablak, Fogok nyitni gedit itt.
És fogok nyitni egy fájlt, Kiderült, az úgynevezett hello.s ezt
tartalmaz, hogy assembly nyelven Utaltam korábban.
És ez az, amit a neve összeszerelés nyelv, viszonylag alacsony
utasításokat az Intel CPU vagy bármi is az, hogy bent
ért.
És MOV a lépés. hívás a hívás, nagyon alacsony szintű függvény.
sub is a kivonás.
>> Tehát, ha van egy bizonyos CPU belsejében a számítógép, mi teszi
különböző, összevetve más CPU a piacon, amely az utasítások
megérti és gyakran mennyire hatékony ez az, hogy milyen gyorsan áll végrehajtása néhány
ezen utasítások.
Most erről többet, akkor vegye következő őszi CS61 a főiskolán.
De itt van, például, egy pár azonosítók, amelyek ismerős.
hello.c a program nevét.
>> . Szöveg -
nem sok érdekes van most, emlékeztetnek arra, hogy a szöveg
szegmensben, mint a hétfő, ahol a memória a programot végül az.
Szóval ez legalább homályosan ismerős ott.
Itt természetesen egy említést a mi fő funkciója.
Lefelé görgetve, utal is a dolgokat úgynevezett regiszter, nagyon kicsi darabok
memória benne a tényleges CPU.
És ha lapozás még tovább, látok valami
közvetett említése ASCII.
És ott, valóban, hogy a string, hello, vessző, világ.
>> Tehát hosszú történet rövid, ez volt történik, automatikusan,
a motorháztető alatt minden ebben az időben.
És mi történt valójában, ha már fut csenget, vagy oly módon,
Legyen, akkor már az első, A forráskód, a
úgynevezett assembly nyelven.
Ezután Clang konvertáló a szerelvény nyelv le a nullák és egyesek.
És ez az a dia, hogy elkezdtük a vitát a 0. héten be -
majd hét 1 tovább.
És végül, a nullák és egyesek kombinálják a nullák és egyesek
azoktól könyvtárak voltunk véve biztosra mint Standard I / O vagy a
Szövegkönyvtár vagy akár A CS50 könyvtár.
>> Tehát festeni ezt a képet több vizuálisan, van hello.c.
És, persze, használja a printf működnek mondani, hello world.
Az összeállítás lépés veszi le a a fájl láttunk hello.s is
bár ez általában törölt automatikusan az Ön számára.
De ez a kódban a közepén lépésben.
És amikor össze a közgyűlés nyelv, hogy úgy mondjam, ez, ha
hogy ezeket a nullák és egyesek.
Így már nagyított hatékonyan ma mi az, amit vesz biztosra,
azt jelenti, lesz forráskód tiltakozni kódot.
>> De végül, most, hogy ugyanazt a képet - nézzük lök át a
a bal oldali.
És vegye figyelembe, hogy a tetején van Említettem stdio.h.
Ez egy fájlt, amit már bele szinte az összes
programokat is írtam.
És ez az, melynek tartalmát kap copy beillesztett,
hatékonyan tetején a kódot.
De kiderült, hogy a számítógépen rendszer valahol, ott feltehetően
stdio.c fájlt valaki írta évekkel ezelőtt, hogy megvalósítja az összes
funkciók nyilvánított A stdio.h.
>> Most a valóságban ez valószínűleg nem Mac vagy PC-n vagy akár a
CS50 készülék a C kódnak.
Valaki már össze, és tartalmazza . O fájl objektum kódot vagy. A
fájlt, arra utal, hogy a megosztott könyvtár hogy a már előre telepített és
előre lefordított az Ön számára.
De tegyük fel, hogy valóban létezik számítógépünkön stdio.c párhuzamosan
A csenget.
A kódex is össze és összeszerelni.
stdio.c 's kód kerül össze, és összeszerelt, hogy ez a legutolsó
lépést, ide, meg kell valahogy kapcsolat, hogy úgy mondjam, a nullák és egyesek
az ő vagy a nullák és egyesek az egyik egyszerű program, amely végső soron
meghívni, Hello.
>> Szóval ez az egész a varázslat, ami történt eddig.
És továbbra is, hogy ezeket a folyamatok nyújtott, de rájönnek,
van egy csomó szaftos részletek folyik alatta ott.
És ez az, ami a számítógép Intel belső
különösen különböző.
>> Szóval, hogy figyelmét, hogy szeretne csatlakozzon hozzánk ebédre a péntek, nem megy
A szokott helyen cs50.net/rsvp, 13:15 a péntek.
És most néhány bejelentések.
Tehát van néhány jó hír.
És van egy rossz hírem.
Kezdjük néhány jó hír.
>> [GROANING]
>> Rendben van.
Nos, ez gyakorlatilag egy ünnep, így ez nem annyira ajándék tőlünk.
De aztán a rossz hír természetesen.
>> [GROANING]
>> Töltöttem sok időt ezen animációk.
>> [Nevetés]
>> Lesz egy felülvizsgálati ülésén a jövő hétfő.
Ez lesz a 05:30.
Mi emlékeztetni fogja ezeket a részleteket e-mailben a pályán a
honlapján csak egy pár nap múlva.
Ez lesz filmre és elérhető nem sokkal később.
Tehát, ha nem tudja, hogy hétfő éjszaka slot, ne aggódj.
§ a jövő héten is elsősorban felülvizsgálat a kvíz.
Ha a szakasz hétfőn, ami Valóban egyetemi ünnep, mi lesz
továbbra is megfelelnek a részben.
Ha egyszerűen csak nem tudja, hogy részben azért, mert mész
el, hogy rendben van.
Vegyen részt a vasárnap vagy kedd részben vagy dallam-be Jason rész, ami
elérhető online.
>> Így, több rossz hír.
Így szerint a tanterv, mi előadás jövő pénteken.
De a jó hír -
világosan, töltöttem túl sok időt erre.
>> [Nevetés]
>> Majd törölje jövő pénteki előadások.
Ahhoz, hogy lesz egy ajándék a számunkra, így valóban egy szép haladékot
között ezen a héten, és két hét múlva.
Tehát nem előadások a jövő héten, csak egy kis kis kvíz, amelyek meg kell
egyre inkább izgatott.
>> Úgyhogy most viszont a figyelmet valamit, ami valóban több, vizuális
és sokkal izgalmasabb, és a terepet hogy mi lesz a láthatáron
csak egy pár hét múlva.
Az első teszt, akkor kapcsolja be a hangsúly a probléma határozza másik
területen sajátos problémája, hogy a törvényszéki vagy biztonsági általában.
>> Tény, hogy a hagyomány ezt a problémát meg számomra az egyik
tanítás fickó vagy EH járni az egész campus vesz néhány képet
azonosítható, de nem egyértelmű az emberek, helyeken, vagy a dolgok, akkor minden évben
valahogy véletlenül töröl vagy sérült a digitális médiakártya
ez a mi belső kamera.
De nem nagy ügy.
Tudok menni előre, és dugja hogy a gépemet.
Tudom, hogy egy törvényszéki képet, így beszélni, a másolás a nullák és
is le, hogy a memóriakártya-e az SD kártya vagy Compact Flash kártya vagy
bármit is ismeri.
És akkor lehet adni, hogy ki.
>> És így a kihívás előtt, többek között dolgokat az Ön számára, az lesz, hogy írni
C kód, amely helyreállítja a csomó JPEG számomra, és kiderült, lesz
Azok az emberek, helyek és dolgok.
És mi is beszélünk, hogy ez a probléma meg, és az elkövetkezõ napokban, a
grafikus általában.
Már használják őket, a tanfolyam, A kitörni.
De te valami magától értetődőnek létezik a magas szintű fogalmak
a téglalap és ovális.
De a motorháztető alatt vannak pixel.
És kellett kezdeni gondolkodni ezekről.
Vagy ha a p-set 4 kell gondolni a különbség a tégla, hogy
gyorsan maga labda mozog az egész a képernyőn kitörni.
Tehát ezt a fogalmat a pontok a képernyőn, ami
jöhet számításba már.
>> Most már, hogy mit lát, de az, amit kap a számítógép képernyőjén.
Ha valaha is nézte jó vagy rossz TV, esély elég jól
kezeli a közönség, mint technofóbok akik nem igazán
sokat tudnak számítástechnika.
És ez így nagyon könnyű a rendőrség detektív azt mondani, nem igaz
tiszta, hogy akár nekem?
Vagy növeli, igaz?
Fokozza olyan, mint a buzz szó a legtöbb olyan bűncselekmény kapcsolódó show.
És a valóság az, ha egy nagyon homályos kép egy gyanús csinál
valami rossz, akkor nem csak fokozza azt.
Nem lehet nagyítani a végtelenségig.
Nem lehet látni a csillogó valaki szem, hogy az elkövető
különösen a bűnözés, annak ellenére, hogy a prevalenciája a tévében.
>> És így ezzel nézzük motiválja, hogy következő probléma meg egy pillantás
Néhány mutatja, amellyel ismerős lehet.
>> [VIDEÓ LEJÁTSZÁS]
>> -OK.
Most pedig kap egy jó pillantást rád.
>> -Egy pillanat.
Fuss vissza.
>> -Várj egy percet.
Menj jobbra.
>> -Ott.
Freeze ezt.
>> -Teljes képernyő.
>> -OK.
Freeze ezt.
>> -Húzza fel, hogy jó?
>> -Vector be, hogy a srác a hátsó kerék.
>> -Zoom in itt, ezen a helyen.
>> -A megfelelő eszköz a leképezett bővíthető és kihegyezett.
>> -Mi az?
>> -Ez egy tartozékot programot.
>> -Meg tudod tisztázni, hogy akár minden?
>> -Nem tudom.
Nézzük fokozza azt.
>> -Enhance rész A-6.
>> -I fokozta a részletek és a -
>> -Azt hiszem, ahhoz, hogy fokozza.
Engedje meg, hogy a képernyőt.
>> -Fokozza a tükörképét szeme.
>> -Fussunk át a video javítása.
>> -Edgar, meg tudja fokozza ezt?
>> -Várj.
>> -Már dolgozik a közös gondolkodáshoz.
>> -Valaki gondolkodás.
>> -Reflection.
>> -Van egy reflexió A férfi arca.
>> -Az elmélkedés.
>> -Van egy reflexió.
>> Nagyítás-a tükör.
>> -Láthatjuk tükrözi.
>> -Tud fokozza a kép innen?
>> -Tud fokozza neki itt?
>> -El tudod növelni, hogy?
>> -Tudjuk fokozzák ezt?
>> -El tudod növelni, hogy?
>> -Várj egy kicsit, én fokozza.
>> -Zoom be az ajtón.
>> -X10.
>> -Zoom.
>> [Nevetés]
>> -Move in
>> -Várj, állj.
>> -Stop.
>> Szünet-azt.
>> -Forgatása 75 fok körül a függőleges kérem.
>> [Nevetés]
>> -Stop, és vissza a rész az ajtót.
>> -Van egy Image Enhancer hogy képes bitmap?
>> -Talán használhatjuk a Pradeep Sen módszer, hogy a Windows.
>> -Ez a szoftver a legkorszerűbb.
>> -Az ikon érték ki van kapcsolva.
>> -A megfelelő kombináció algoritmusok.
>> -Elvette megvilágítás algoritmusok a következő szintre, és tudom használni őket, hogy
fokozzák ezt a fényképet.
>> -Lock, és bővíteni a z-tengely.
>> -Javítása.
>> -Freeze és fokozza.
>> [END VIDEÓ LEJÁTSZÁS]
>> DAVID J. MALAN: So Probléma Set 5. mi vár ránk ott.
Így hamarosan, hogy jobban megértsék mikor és miért lehet
és mi nem növeli az említett módon.
De először is, nézzük vissza a figyelmünket néhány az építőelemek fogjuk
kell tudni mondani a történetet.
>> Így emlékeztetni arra, hogy felhívta ezt a képet a Hétfő és egy kicsit a múlt héten.
És ez írja le az elrendezés a dolgok a számítógép memóriájában, amikor
fut néhány programot.
A tech szegmens fel tetején, visszahívás utal a tényleges nullák és egyesek
alkotó a program.
Van, hogy az alábbiakban néhány inicializált vagy inicializált adat, ami általában
utal a dolgok, mint konstans vagy szövegek és globális változók, amelyek
bejelentették előre.
Ott van a halom, de majd jön vissza, hogy egy kicsit.
>> És akkor ott van a verem.
Hasonlóan egy köteg tálcák a cafeteria, ez az, ahol a memória lesz
réteges és réteges, amikor azt teszed, amit a programban?
Mi a stack használatát?
>> Igen?
>> Call of funkciót.
Minden alkalommal, amikor hívja a függvényt, akkor adott szelet memória a
lokális változók vagy a paramétereit.
És képileg, azt látjuk, hogy minden követő funkció neve, ha A
hívások B hívások C hívások D, akkor kap rakott a verembe.
És egyes fenti szelet memória lényegében egyedülálló hatály
adott funkció, amely, természetesen, problematikus, ha azt szeretné, hogy kézzel
egyik funkcióról a másikra egy darab Az adatok azt szeretné, hogy
mutáció vagy módosíthatja.
>> Tehát mi volt a megoldás, hogy lehetővé tegye A függvény képviseli egy verem
keret változtatni a memória benne Egy másik stack frame?
Hogyan két beszélni egymással?
Így útján mutatók vagy címek, ami megint csak le, ahol
memória, útján egy specifikus harapás szám, az adott
érték megtalálható.
Így emlékszem utoljára is folytattuk a történet, és nézett
meglehetősen hibás program.
És ez a program hibás, néhány okok miatt, de a leginkább aggasztó az egyik
mert nem, hogy ellenőrizze, mi?
>> Igen, nem, hogy ellenőrizze a bemenet.
Tessék?
>> Ha ez több, mint 12 karakter.
Tehát nagyon okosan, amikor a hívás memcopy, amely, mint a neve is sugallja, csak
másolatokat memória második argumentumként be az első érv.
A harmadik érv, nagyon okosan, a ellenőrizni, hogy megbizonyosodjon arról, hogy nem
több, mint másolja, ebben az esetben, a hossza Bar, karakterek száma,
a hely, ami a array C. De a probléma az, hogy milyen
ha C önmagában nem elég nagy kezelni ezt?
Fogod másolni száma byte, amit kapott.
De mit valójában több bájt, mint van hely?
>> Nos, ez a program nagyon ostobán csak vakon halad, hogy bármi legyen is az
adott, helló backslash a 0 nagyszerű, ha karakterlánc rövid
Elég, mint öt karakter.
De ha ez tényleg 12 karakter vagy 1200 karakterekből láttuk utoljára
hogy csak most lesz teljesen felülírják memória
nem a tiéd.
És ami a legrosszabb esetben, ha felülírja, hogy piros része, ott, hogy hívják a
vissza cím -
ez az, éppen ott, ahol a számítógép automatikusan, az Ön számára, mögött
jelenetek, redő el egy 32 bites érték, emlékeztet, hogy milyen címre kellene
vissza, amikor foo, ez a másik funkció történik végrehajtása.
Ez egy morzsát a fajta amelyre visszatér.
Ha felülírja, hogy a potenciálisan ha te vagy a rossz fiú, lehet lehetne
potenciálisan átvenni valakinek számítógépét.
És akkor minden bizonnyal összeomlik ez a legtöbb esetben.
>> Most ez a probléma csak súlyosbította ahogy elkezdtünk beszélni memória
kezelés általában.
És malloc, a memória kiosztás, egy funkció, hogy tudjuk használni, hogy fordítsanak
memóriát, ha nem tudjuk előre , hogy szükség lehet néhány.
Így például, ha visszamegyek a készüléket itt.
És megnyitja a múlt idő hello2.c, emlékszem a program itt, ami úgy festett,
egy kis valamit, mint ez, mindössze három sor -
meg nevét, majd a karakterlánc nevét, a bal oldalon, egyenlő getstring.
És akkor nyomtassa ki, a felhasználó nevét.
>> Szóval ez egy szuper egyszerű program.
Ahhoz, hogy tiszta, hadd menjek előre és hello-2.
Fogok csinálni dot slash hello-2-.
Mi a neve -
David.
Enter.
Helló David.
Úgy tűnik, hogy a munka az OK gombra.
De mi folyik valójában alatt Hood itt?
Először hadd húzza vissza néhány réteg.
Karakterlánc csak egy szinonimája voltunk rájött, milyen?
Char csillag.
Szóval, hogy ez egy kicsit misztikus de technikailag korrekt, hogy ez a
egy char csillag, ami azt jelenti, hogy a név, igen, ez a változó.
De milyen nevet tárolja a címe a char, amely úgy érzi, egy kicsit furcsa
mert én kapok vissza a string.
Kezdek újra több karakter nem char.
>> De persze, csak akkor kell az első char címét emlékezni, ahol a
egész szöveg, mert miért?
Hogyan kitalálni, ahol a végén a szöveg is tudta az elején?
A backslash nulla.
Tehát a két nyomokat kitalálni kezdete előtt és a végén a
minden húr van, mindaddig, amíg ők megfelelően alakult azzal a null
terminátor, hogy backslash nulla.
>> De ez hívja getstring.
És kiderül, hogy getstring Ennyi idő már egyfajta
csalás nekünk.
Már ezt a munkaerő, az biztos, kapok egy húr a felhasználó.
De hol van a memória nem jön?
Ha visszamegyünk a kép itt meghatározását alkalmazni, mindössze egy
az előbb, hogy a verem, ahol memória megy, ha függvény megkapja,
az, hogy a logika, amikor telefonál getstring, aztán írja
D-A-V-I-D Enter, ahol a D-A-V-I-D backslash nulla tárolt alapuló
történetet már elmondta messzire?
>> Úgy tűnik, hogy a a verem, nem igaz?
Ha telefonál, hogy kapsz egy húr kis szelet memóriát a stack.
Így magától értetődik, hogy a D-A-V-I-D backslash nulla tárolja
ott a verem.
De várjunk egy percet, getString visszatér hogy a string, hogy úgy mondjam, ami azt jelenti,
ez tálcát a cafeteria lekerült a verem.
És mi azt mondtuk utolsó alkalom, hogy amint a függvény, és hogy ezt a
tálcát, hogy úgy mondjam, le a verem, milyen lehet feltételezni, a maradék
hogy a memória?
Valahogy átrajzolták őket kérdőjelek válnak, mert hatásosan
ismeretlen értékeket.
Ezeket újra fel lehet használni, ha valamilyen következő függvényt.
>> Más szóval, ha történetesen kell tárolni -
Én rajzolni egy gyors kép Itt a verem.
Ha történetesen rajz aljára Az emlékezetemben szegmensben, és mi mondjuk
, hogy ez az a hely a memória által elfoglalt fő és talán arg C
arg v és bármi mást, a programban, ha getstring hívják,
feltehetően getstring lesz egy darab memória itt.
És akkor D-A-V-I-D valahogy végül ezt a funkciót.
És fogok túlzottan leegyszerűsít.
De tegyük fel, hogy a D-A-V-I-D backslash nulla.
Tehát ennyi bájtot használják A keret getstring.
>> De amint getstring visszatér, akkor mondta utolsó alkalom, hogy a memória több mint
itt minden lesz - woops! -
minden lesz hatékonyan törli.
És mi lehet gondolni ezt most olyan kérdés pont azért, mert ki tudja,
mi fog válni, hogy a memóriát.
Sőt, gyakran hívják funkciók kivéve getstring.
És amint hívom más funkció, mint getstring, talán nem
az adott program keretében csak nézett at, de egy másik, biztosan más
funkció lehet, hogy a végén, hogy adott Ez a következő helyszínen, a verem.
>> Tehát nem lehet, hogy getstring üzletek D-A-V-I-D a verem mert én
azonnal elveszítik hozzáférést.
De mi tudjuk, hogy getString csak akkor tér vissza, mi?
Ez nem tér vissza a nekem hat karakter.
Mit, hogy valóban vissza nem arra a következtetésre jutunk utoljára?
A cím az első.
Tehát valahogy, mikor hívott getstring, ez elosztása egy darab memória
a szöveg, hogy a felhasználók típusa és akkor vissza címét is.
És kiderül, hogy ha azt szeretné, hogy funkció segítségével a memória ebben
útra vagy oda annak a személynek, aki hívott ezt a funkciót, a címét
hogy a darab a memória, akkor feltétlenül nem tudod, hogy a verem, a
alul, mert funkcionálisan ez csak majd nem lesz a tiéd túl
gyorsan, így valószínűleg hiszem, ha mi valószínűleg lesz, hogy dobálják meg
ehelyett, az úgynevezett kupac.
>> Tehát az alján az emlékezet elrendezése és a tetején a emlékezet
elrendezés egy csomó szegmensben.
Az egyik a verem, és a jobb felett ez a kupac.
És halom csak egy másik darab memória nem használható funkciók
ha ők hívják.
Ez használt hosszú távú memóriát, ha szeretnénk egy funkciót, hogy megragad néhány
memória és képesnek kell lennie, hogy tarts ki, hogy anélkül, hogy elveszítené az irányítást felette.
>> Most talán azonnal látni, hogy ez nem
feltétlenül tökéletes design.
Mivel a program támogatását, memória a verem, vagy hívja egyre több és
több funkciót lát el, vagy ahogy osztja memóriát a kupac malloc le, mint
getstring csinál, amit egyértelműen úgy tűnik, hogy elkerülhetetlen probléma?
>> Rendben.
Mint a tény, hogy ezek a nyilak mutatnak egymásnak
nem jót.
És valóban, mi is nagyon gyorsan összeomolhat egy programot a tetszőleges számú módon.
Sőt, azt hiszem, lehet, hogy tette ezt véletlenül egyszer.
Vagy ha nem, csináljuk szándékosan most.
Hadd menjek előre, és írni szuper gyorsan a program neve dontdothis.c.
És most megyek ide, és nem éles tartalmazzák stdio.h.
Nézzük kijelentik function ize vesz nem érv, ami
jelöli, jól semmis.
>> És az egyetlen dolog foo fog tenni a meghívni az ize, ami valószínűleg nem a
legokosabb ötlet, de hát legyen.
Ent fő semmis.
Most az egyetlen dolog fontos lesz tennie, hogy hívja ize is.
És csak a hecc kedvéért, én megyek előre, itt, és azt mondják, printf "Hello
foo ".
>> OK.
Tehát, ha nem hibázni, Legyen dontdothis dot perjel.
És tegyük azt egy nagyobb ablak -
dot slash, dontdothis.
Gyerünk.
Uh oh.
Úgy tűnik, meg tudod csinálni.
A fenébe is.
OK.
Várjon.
Készenlét.
Vajon mi -
Mi nem használjuk a make.
>> [Sóhaj]
>> Tudom, de azt hiszem, csak hagyni, hogy az.
Uh, igen.
A fenébe is.
Megoldani ezt a Rob.
Mi van?
Ez nagyon egyszerű.
Igen, mi lett optimalizálás ki.
OK, állvány szia.
Most már jobban érzem magam.
OK.
Rendben van.
>> Szóval újrafordítani a -
Legyen Ön dontdothis.
Lehet, hogy nevezze át ezt a dothis.c csak egy pillanat.
Ott vagyunk.
Köszönöm.
OK.
Tehát az a tény, hogy én nyomtatás valami volt, valójában csak
lassítja a folyamat, amely által volna el ezen a ponton.
OK.
Pfuj!
>> Tehát mi történik valójában?
Az ok, mint egy félre, nem bármit tekintetében bemeneti és
kimenet általában a lassabb, mert kell írni a karaktereket
képernyőn Meg görgetni.
Tehát hosszú történet rövid volt, én valójában történt, így türelmetlen, mi lett volna
látta ezt a végeredmény is.
Most, hogy van út a print-up, látjuk azonnal.
Miért történik ez.
Nos, az egyszerű magyarázat, persze, az, hogy a foo talán nem kellene
is nevezte magát.
>> Most általánosságban, ez rekurziót.
És úgy gondoltuk, egy pár hétig óra rekurzív jó.
Rekurzió ez varázslatos módon kifejezni magát super tömören.
És ez csak működik.
De van egy fontos jellemzője az A rekurzív programok beszéltünk
szó és nézett eddig, ami az volt, hogy volt, mi?
A alapeset, ami néhány kemény kódolt esetben, mondta bizonyos helyzetekben
nem hívja ize, ami egyértelműen nem ez a helyzet.
>> Tehát mi történik valójában tekintve ezt a képet?
Nos, amikor a fő hívja ize kap egy szeletet a memória.
Amikor foo foo hívja, nem lesz egy szelet memóriát.
Amikor hívja foo foo, kap egy szeletet.
Kap egy szeletet.
Mivel foo soha nem vissza.
Mi soha nem töröl egy ilyen keretek a veremből.
Szóval fúj át a kupac, nem beszélve ki tudja még mit, és
mi túllépése határain a úgynevezett szegmens a memória.
Hiba megy szegmentálás hamis.
>> Tehát a megoldás van nyilvánvalóan nem ezt.
De a nagyobb következmény az, hogy igen, van egyáltalán némi limit,
még akkor is, ha ez nem jól definiált, hogy miként számos olyan funkcióval hívhatja a
programot, hányszor egy függvény is nevezi magát.
Így, bár a mi prédikálni rekurzió mivel ez potenciálisan varázslatos dolog, amit egy
Néhány héttel ezelőtt a szigma funkció, és amikor megkapjuk az adatokat
struktúrák és CS50, akkor látni más alkalmazások is, ez nem
feltétlenül a legjobb dolog.
Mert ha egy függvény nevezi magát, nevezi magát, akkor is, ha van egy alap
az esetben, ha nem nyomja meg, hogy alapesetben a 1000 hívások vagy 10000 hívásokat, a
Akkor lehet, hogy elfogy a hely az úgynevezett stack és hit
más szegmensei memóriát.
Tehát ez is egy tervezési trade-off között elegancia között
megbízhatóságát az adott végrehajtását.
>> Tehát van egy másik hátránya, vagy egy másik fontos dolog, amire mi már
csináltál eddig.
Amikor felhívtam getstring -
hadd menjek vissza a hello-2.
Figyeljük meg, hogy én hívom getstring, amely visszatér egy címet.
És azt állítják, hogy ma cím ez a kupac.
És most én vagyok kinyomtatása a szöveg azon a címen.
De soha nem nevezett ellentéte getstring.
Soha nem kellett calll funkció, mint a ungetstring, ahol a kéz vissza
hogy a memória.
De őszintén akkor valószínűleg kellett volna.
Mert ha folyamatosan azt kérdezi, a számítógép memória útján valaki, mint
getstring de soha nem adja vissza, biztosan ez is köteles vezetni a
problémák ahol elfogy a memória.
>> És valóban, akkor keresse meg ezeket a problémák az új eszköz, amelynek használatát
egy kicsit rejtélyes, hogy írja.
De hadd menjen előre, és pancsoló fel A képernyőn csak egy pillanat.
Én megyek előre, és fuss Valgrid paraméterrel amelynek első parancs
argumentum a neve Az, hogy a program hello-2.
És sajnos ez kimenet atrociously
komplex ok nélkül.
Tehát látjuk, hogy a rendetlenség.
David az állami nevem.
Szóval ez a program ténylegesen fut.
És most, hogy ez a kimenet.
>> Tehát Valgrind hasonló lélekben GDB.
Ez nem egy debugger önmagában.
De ez egy memória-ellenőrző.
Ez egy program, amely fut a programozását és megmondja, ha kéri a
számítógép memória és soha nem adta vissza, ami azt jelenti, hogy van
memóriavesztés.
És a memória szivárgás általában rossz.
És neked, felhasználói számítógépek Valószínűleg éreztem, hogy van-e
Mac vagy PC.
Használtál már a számítógépet ideig, és nem újraindul több
nap, vagy épp most van egy csomó program fut, és a szart
lassítja az őrlési megállt, vagy legalábbis ez szuper idegesítő a használata, mert a
minden csak most szuper lassú.
>> Most, hogy lehet tetszőleges számú oka.
Ez lehet egy végtelen ciklus, a hiba valaki kódot, vagy még egyszerűbben, a
azt jelentheti, hogy a 'használ több memória, vagy megpróbálja, mint az
számítógép valójában.
És talán van egy hiba a programban hogy folyamatosan azt kérdezi a memória.
Böngészők évek hírhedt Ehhez kér egyre több memóriát
de soha nem adják vissza.
Bizonyára, ha csak véges memória, nem lehet kérni
végtelen sokszor bizonyos, hogy a memóriát.
>> És amit itt látsz, bár Ismét Valgrind kimenete
szükségtelenül bonyolult, hogy pillantást Először is, ez az érdekes rész.
Heap -
használatban exit.
Tehát itt van, hogy mennyi memória volt használatban van az a kupac
alkalommal, amikor a programot kilépett -
látszólag hat bájt egyben.
Így fogok hullám kezem hogy mi a blokk.
Gondold azt, hogy csak egy darab, egy technikai szó darab.
De hat bájt -
milyen hat byte még használatban?
>> Pontosan.
D-A-V-I-D backslash nulla, öt betű nevét, valamint a null terminátor.
Így ez a program valgrind észre, hogy én kért hat bájt, úgy tűnik, a
módja getstring, de soha nem adta vissza.
És valóban, ez lehet, hogy nem annyira Nyilvánvaló, ha a program nem három
vonalak, de 300 sor.
Tehát valójában hogy egy másik parancs argumentum a Valgrid a
hogy még inkább bőbeszédű.
Ez egy kicsit bosszantó, hogy emlékezzen.
De ha -
lássuk.
Szivárgás -
Volt szivárgás -
még nem emlékszem mi az, ki kezét.
>> - Szivárgás-ellenőrzés teljes értéke.
Igen, köszönöm.
- Szivárgás-ellenőrzés teljes értéke.
Enter.
Ugyanaz a program fut.
Írja be a David újra.
Most már látom, egy kicsit részletesebben.
De lent a kupac összefoglalóját megegyezik a négy - ah,
ez elég szép.
Most Valgrind valóban keres egy kicsit nehezebb a kódomat.
És ez azt mondja, hogy, úgy tűnik, malloc sorban -
mi kicsinyíteni.
Sorban -
nem látjuk, mi vonal van.
De malloc az első bűnös.
Van egy blog malloc.
>> Minden rendben?
OK, nem.
Nem igaz?
Felhívtam getString.
getstring látszólag hívások malloc.
Tehát mi kódsor látszólag a hibás, amiért
juttatott a memória?
Tegyük fel, hogy aki írta malloc már kb elég hosszú, hogy ez
nem az ő hibájuk.
Így talán az enyém.
getString in cs50.c -, hogy ez a fájlt valahol a számítógépen -
sorban 286 úgy tűnik, hogy a tettes.
Most tegyük fel, hogy CS50 volt körül tisztességes mennyiségű időt, így
mi is tévedhetetlen.
És így talán nem getString hogy a hiba abban rejlik, hanem
hello-2.c 18. sor.
>> Szóval vessünk egy pillantást hogy mi volt a 18. sor.
Oh.
Valahogy ez a sor nem feltétlenül hibás, per se, de ez az oka
mögött memóriavesztés.
Tehát egyszerűen szuper, mi lenne ösztönösen a megoldás itt?
Ha kérünk a memória, soha nem így vissza, és úgy tűnik, hogy a
probléma, mert az idő múlásával a számítógép is elfogy a memória, esetleg lassú
le, rossz dolgok történnek, nos, mi az egyszerű intuitív megoldás?
Csak add vissza.
>> Hogyan szabaduljon fel, hogy a memória?
Nos, szerencsére ez nagyon egyszerű hogy csak annyit szabad nevét.
És még soha nem csináltam ilyet.
De akkor lényegében gondolni szabad, mint az ellenkezője malloc.
szabad az ellentéte kiosztása memória.
Tehát most hadd fordítanod ezt.
Legyen hello-2.
Hadd futtassa újra. hello-2-David.
Tehát úgy tűnik, hogy a munka pontosan ugyanúgy.
De ha visszamegyek a Valgrid és újra futni hogy ugyanazt a parancsot az én újonnan
lefordított programot, gépelés az én nevemben, mint korábban -
szép.
Heap Összegzés -
használatban kilépés -
nulla bájt nulla blokkokat.
És ez szuper jó, minden halom blokkok felszabadult.
Szivárgás nem lehetséges.
>> Tehát jön, nem a problémás Set 4 de probléma Set 5, a törvényszéki
és tovább, ez is lesz mérőszáma helyességét
programot, függetlenül attól, hogy van vagy nincs memóriavesztés.
De szerencsére, nem csak, hogy érvelni rajtuk keresztül ösztönösen, ami
az, vitathatatlanul, könnyű kis programok de nehezebb a nagyobb programok
Valgrind, azoknak nagyobb programok segít azonosítani
az adott problémát.
>> De van egy másik probléma , hogy az esetleg.
Hadd nyissa meg ezt a fájlt itt, ami, ismét egy kissé egyszerű példát.
De nézzük koncentrálni, hogy mit ez a program nem.
Ezt hívják memory.c.
Majd tegye később ma a zip a mai forráskódját.
És észre, hogy van egy függvény neve f argumentum nélküli és
vissza semmit.
A vonal 20, én látszólag nyilvánító mutató egy int, és felszólította, hogy x.
Én hozzárendelése a visszatérés értéke malloc.
És csak hogy tisztázzuk, hogy hány bájt vagyok Talán kapok vissza malloc
ebben a helyzetben?
>> Valószínűleg 40.
Honnan veszed ezt?
Nos, ha emlékeztetni arra, hogy egy int gyakran 4 bájt, legalább is a
készülék, 10-szer 4 nyilvánvalóan 40..
Így malloc visszatér a címet, egy darab memória és tárolja, hogy
foglalkozni végül az x.
Tehát egyértelmű, hogy mi akkor történik?
Nos, hadd váltson vissza a mi képet.
Hadd ne csak felhívni az alján az én számítógép memóriája, hadd menjen előre, és
felhívni az egész téglalap képviseli az összes az én RAM.
>> Azt mondjuk, hogy a verem van az alján.
És van egy szöveges szegmens A nem inicializált adat.
De én csak megy, elvont azokat más dolog, el, mint pont, pont pont.
Elmegyek, hogy olvassa el ezt a mivel a kupac tetején.
És akkor az alján ezt a képet, képviseletére fő, megyek
hogy ez egy szelet memória a verem.
A f, megyek, hogy ez egy szelet memória a verem.
Most kaptam, hogy konzultáljon a forrás kódot.
Melyek a lokális változók legfontosabb?
Úgy látszik semmi, hogy a szelet gyakorlatilag üres, vagy nem is olyan nagy
ahogy már készült is.
De f, van egy helyi változó, amely az úgynevezett x.
Szóval megyek előre, és f egy darab memória, amelyben az x.
>> És most malloc 10-szer 4 Tehát malloc 40, hol van
memória érkezik?
Már nem készült a kép mint ez előtt.
De tegyük fel, hogy ez hatékonyan érkező van, így az egyik,
kettő, három, négy, öt.
És most kell 40 e.
Úgyhogy csak csináld, pont, pont, pont, hogy azt sugallják, hogy van még több memóriát
jön vissza a kupac.
Most mi a címe?
Nézzük választani a tetszőleges kezelni, mint mindig -
Ox123, annak ellenére, hogy valószínűleg meg , hogy valami teljesen más.
Ez a címe az első byte-ban memória kérek malloc számára.
>> Tehát röviden, ha egyszer sor 20 végrehajtja, mi szó
tárolt az x itt?
Ox123.
Az ökör is érdektelen.
Ez csak azt jelenti, itt egy hexadecimális szám.
De mi a legfontosabb az, hogy amit én már boltban x-ben, amely egy helyi változót.
De az adatok típusát, ismét egy cím egy int.
Nos, én megyek, hogy tárolja Ox123.
De ismétlem, ha ez egy kicsit túl bonyolult feleslegesen, ha görgetni
vissza tudjuk absztrakt ezt el egészen ésszerűen és csak annyit, hogy az x
mutatót, hogy a darab a memória.
>> OK.
Most az a kérdés kéznél a következő -
line 21, kiderült, hibás.
Miért?
>> Tessék?
Nem kell -
azt mondják, hogy még egyszer.
Nos, ez nem szabad.
Szóval ez a második, de.
Tehát itt van egy másik, de kifejezetten at line 21.
>> Pontosan.
Ez az egyszerű vonal a kód csak egy puffer túlcsordulás, puffer túllépése.
A buffer csak azt jelenti, egy darab memóriát.
De ez a darab memória mérete 10, 10 egész számok, ami azt jelenti, ha
index bele a szintaktikai cukor A tömb jelölés, a tér
zárójelben, van hozzáférése x 0 x tartó konzol 1 x,
konzol pont, pont, pont.
x konzol 9 a legnagyobb.
Tehát, ha én x konzol 10, ahol Én valóban megy a memóriában?
>> Nos, ha már 10 int -
nézzük valóban felhívni minden ezek itt.
Szóval ez volt az első öt.
Itt van a másik öt ints.
Tehát x konzol 0 van itt. x konzol 1 itt. x konzol 9 itt. x konzol
10. itt van, ami azt jelenti, én mondom, sorban 21, a számítógép, hogy a
számát, ahol?
A szám 0, ahol?
Nos, ez 0, igen.
De az a tény, hogy a 0 egyfajta véletlen.
Lehet, hogy a szám 50, minden érdekel.
De próbáljuk tedd x konzol 10, ott, ahol ez a
kérdőjel készül, amely nem egy jó dolog.
Ez a program is nagyon jól ennek eredményeként összeomlik.
>> Nos, menjünk előre, és nézd meg, ez Valóban, mi történik.
Legyen memória, mivel a fájl hívják memory.c.
Menjünk előre, és fuss A program memória.
Tehát van szerencsénk, valóban, úgy tűnik.
Szerencsénk van.
De lássuk most fut Valgrind.
Első pillantásra, a program esetleg úgy tűnik, hogy teljesen korrekt.
De hadd futni Valgrid a - Szivárgás-ellenőrzés felel teljes a memória.
>> És most, amikor én vezetem ezt -
érdekes.
Hibás írni méret 4-es vonal 21 memory.c.
Vonal 21 memory.c az melyik?
Ó, érdekes.
De várjunk csak.
Méret: 4, mi ez utal?
Csak nem egy ír, de ez a 4-es méretű.
Miért 4?
Azért, mert ez egy int, amely , ismét négy bájt.
Tehát Valgrind találtál egy hibát, hogy én, pillantva a kód, nem.
És talán a TF, illetve nem.
Milyen De Valgrind biztos megállapította, hogy a már hibázott is, akkor is,
de szerencsénk volt, és a számítógép úgy döntött, igaz, én nem fog zuhanni
csak azért, mert megérintett egy byte, egy int-nyi memória, hogy nem
tulajdonképpen saját.
>> Nos, mi mást is hibás itt.
Cím -
ez egy őrült keresi cím hexadecimális.
Ez csak azt jelenti, valahol a halom nulla byte után egy blokk mérete 40
osztják.
Hadd kicsinyítés ide, és nézd meg ez egy kicsit több segítséget.
Érdekes.
40 bájt egyértelműen elveszett veszteség rekord 1 of 1.
Ismét több szót, mint hasznos itt.
Alapján azonban a kiemelt vonalak, hol Talán fókuszálom
figyelmet egy bug?
Úgy néz ki, mint egy sor 20 memory.c.
>> Tehát, ha megyünk vissza a sorban 20, ez a az egyik, hogy korábban kijelölt.
És ez nem feltétlenül hibás.
De mi ez megfordult hatásait.
Szóval hogyan tudom kijavítani legalább egy ilyen hibát?
Mit tehettem volna, miután line 21?
Tehettem mentes x, így a , hogy adja vissza, hogy a memória.
És hogyan tudom kijavítani ezt a hibát?
Azt kell feltétlenül megy nem messzebb, mint 0-ra.
Hadd próbálja újra futtatásához.
Sajnálom, biztosan menni nem messzebb, mint 9.
Legyen memória.
Hadd futtasd Valgrid egy nagyobb ablak.
És most meg.
Szép.
Minden halom blokkok felszabadult.
Szivárgás nem lehetséges.
És itt fönt, nincs említés többé az érvénytelen jobbra.
>> Csak azért, hogy kapzsi, és nézzük ha újabb bizonyítéka
nem megy a tervezettnek -
Én szerencsés egy perce.
És az a tény, hogy ez talán 0 feleslegesen félrevezető.
Csak csináljuk 50, egy kissé önkényes szám, hogy a memória pont perjel memória -
még mindig szerencsés.
Semmi sem összeomlik.
Tegyük fel, hogy csak nem valami igazán ostoba, és én 100 fő.
Hadd remake memória, dot slash memória -
szerencséje volt megint.
Hogy a 1000?
ints túl durván, hol kellene?
Legyen memória -
a fenébe is.
>> [Nevetés]
>> OK.
Ne szórakozz körül már.
Futtasd memória.
Ott vagyunk.
Rendben van.
Szóval úgy tűnik, hogy index 100.000 ints túl, ahol kellett volna
memória, rossz dolgok történnek.
Tehát ez nyilvánvalóan nem kemény, gyors szabály.
Kedves volt a vizsgálat és hiba, hogy ott.
De ez azért van, mert hosszú történet rövid, A számítógép memóriája is megosztott
be ezeket a dolgokat nevezett szegmensben.
És néha, a számítógép valóban adott egy kicsit több memóriát
mint kér.
De a hatékonyság, ez csak egyszerűbb még több memóriát, de csak neked
hogy kapsz egy részét.
>> És ha szerencséd lesz néha, Ezért lehet, hogy képes megérinteni
memória, ami nem a tiéd.
Ön nincs garancia arra, hogy milyen értéket teszel nem lesz ott, mert
a számítógép még mindig azt hiszi, hogy nem a tiéd, de ez nem feltétlenül fog
a hit egy másik szegmens a memória, a számítógép és indukál hiba, mint
ezt itt.
Rendben van.
Bármilyen kérdése majd memória?
>> Rendben van.
Vessünk egy pillantást ide, akkor, olyasmi, amit már szedett
nyújtott jó ideje, amely Ebben nevű fájlt cs50.h.
Tehát ez a fájl.
Ez csak egy csomó Hozzászólások fel tetején.
És lehet, hogy nézett erre, ha Ön megbökte körül a készülék.
De kiderül, hogy minden alkalommal, amikor használtam karakterláncot
szinonimája, az eszköz, ami által deklarált hogy szinonimája volt a
kulcsszó typedef, típusú definíció.
És mi lényegében azt mondja, hogy a string egy szinonimája char csillag.
Ez az eszköz, amellyel a verem létre ezek a képzés kerekek ismert
a húr.
>> Most itt van, csak a prototípus A getchar.
Talán már látta korábban, de ez sőt, hogy mit csinál. getchar
argumentum nélküli, vissza char.
getdouble argumentum nélküli, visszaad egy dupla.
getFloat argumentum nélküli, vissza egy úszó, és így tovább.
getInt van itt. getlonglong van itt.
És getstring van itt.
És ennyi.
Ez a lila vonal másik előfeldolgozó irányelvet, mert az
hashtag elején azt.
>> Rendben van.
Tehát most hadd menjen cs50.c.
És nem fogunk beszélni túl sokáig ezt.
De, hogy egy pillantást, hogy mi folyik mindez
idő, hadd menjen -
csináljuk getchar.
Tehát getchar többnyire megjegyzéseket.
De úgy néz ki, mint ez.
Tehát ez a tényleges funkció getchar, hogy már
Ha igaz, létezik.
És bár még nem használja ezt gyakran, ha egyáltalán, akkor legalább
viszonylag egyszerű.
Tehát érdemes egy gyors pillantást itt.
>> Tehát getchar van egy végtelen ciklusba, szándékosan így látszólag.
Ezután hívja - és ez egyfajta szép újrafelhasználását kód magunk írta.
Arra kéri getstring.
Mert mit is azt jelenti, hogy egy char?
Nos, lehet, hogy meg is próbálja, hogy egy egész sor szöveget a felhasználó és
akkor csak nézd meg egy ezeket a karaktereket.
A vonal 60, itt van egy kis kis józanság csekket.
Ha getstring vissza null, ne folytassa.
Valami nem stimmel.
>> Most ez kissé bosszantó, de hagyományos C-ben char max talán
képviseli azt, amit csak név alapján?
Ez egy állandó.
Ez olyan, mint a numerikus értéke legnagyobb char is képviselt
egy falatot, ami talán a 255, amely a legnagyobb szám
képviseli nyolc bit, kiindulva nulla.
Úgyhogy ezt, hogy ezt a funkciót, ha a írom ezt a kódot, csak azért, mert
Ha valami elromlik, de getchar a célja az életben, hogy vissza
char, meg kell, hogy valahogy képes hogy jelezze a felhasználónak, hogy
valami elromlott.
Nem tér vissza null.
Kiderül, hogy egy null mutató.
És ismét, getchar van vissza a char.
>> Így az egyezmény, ha valami rossz, te, a programozó, vagy
Ebben az esetben nekem a könyvtárban volt a csak úgy önkényesen, ha
valami elromlik, megyek vissza a szám 255, amely valóban
azt jelenti, hogy nem, a felhasználó nem írja a karakter által képviselt
szám 255, mert volt egy ellopni mint egy úgynevezett sentinel értéket
jelentenek problémát.
Most kiderült, hogy a karakter 255 nem az, amit akkor írja be
a billentyűzet, így nem nagy ügy.
A felhasználó nem veszi észre, hogy Loptam ezt a karaktert.
De ha valaha is látni man oldalakat a számítógépes rendszer néhány utalás egy
nagybetűs állandó, mint ez, azt mondja, abban az esetben hiba ez az állandó erővel
vissza, ez minden egyes emberi nem évvel ezelőtt önkényesen úgy döntött, hogy
vissza ezt a különleges értéket, és ez egy állandó, ha
valami elromlik.
>> Most a varázslat történik itt.
Először is, én kijelentette sorban 67 két karakter, C1 és C2.
És akkor a sorban 68, van valójában egy sor kód, amely az emlékeztető
barátunk printf, tekintettel arra, hogy nem rendelkezik százalékos Cs. idézi.
De vegyük észre, mi történik itt. sscanf jelenti húr Scan -
azt beolvasása formázott string, ergo sscanf.
Mit jelent ez?
Ez azt jelenti, hogy át sscanf egy string.
És vonal bármi a felhasználó beír be
Azt át sscanf a formátum string, mint ez, ami megmondja scanf mik
Ön remélve, hogy a felhasználó által beírt szöveg
Ezután át-a címét két darabokban a memóriát, ebben az esetben,
mert van két helyőrző.
Így fogom, hogy ez a cím A C1 és C2 a címét.
>> És emlékszem, hogy adjon egy funkciót a címét, néhány változó, mi
a hatása?
Mit lehet tenni, hogy a funkció eredményeként Az így ez a címét
változó, szemben a változó maga?
Meg lehet változtatni, igaz?
Ha lenne valaki, egy térképet a fizikai cím, akkor ott, és nem
amit akarnak az adott címre.
Ugyanaz ötlet.
Ha át sscanf, a cím két darabokban a memóriát, még ezek az apró
kis darabokban a memóriát, a C1 és C2, de azt mondani, hogy a cím őket,
sscanf megváltoztathatja.
>> Így sscanf célja az életben, ha azt olvassuk a man oldalt, hogy olvassa el, amit a
felhasználó beírt, remélem, hogy a felhasználónak, beírt egy karaktert, és talán
másik karakter, és, amit a felhasználó gépelt, az első karakter megy
Itt, a második karakter megy itt.
Most, mint egy félre, ezt, és akkor csak hogy ez a dokumentáció,
az a tény, hogy tettem egy üres hely van csak azt jelenti, hogy nem érdekel, ha
a felhasználó megnyomja a szóköz, néhány szer, mielőtt ő veszi a
karakter fogom figyelmen kívül hagyni minden fehér térben.
Úgy, hogy tudom, a dokumentációt.
>> Az a tény, hogy van egy másik% c majd szóköz valójában
szándékos.
Azt akarom, hogy képes érzékelni, ha a felhasználó elrontottam, vagy nem működött együtt.
Szóval remélem, hogy a felhasználó csak beírt egy karakter, ezért remélem,
hogy sscanf csak akkor fog visszatérni a értéke 1, mert újra, ha olvastam
A dokumentáció sscanf célja a élet, hogy visszatérjen a számát
változók töltöttek a felhasználói.
>> Átmentem a két változó címeket, a C1 és C2.
Remélem azonban, hogy csak az egyik megölik őket, mert ha sscanf
vissza 2, mi feltehetőleg a hatása logikus?
Ez a felhasználó nem csak add nekem karaktert, mint mondtam neki.
Valószínűleg begépelt legalább két karakter.
Tehát, ha ahelyett, hogy nem volt a második % C, csak volt egy, amely
őszintén lenne intuitívabb megközelítés, azt hiszem, az első pillantásra,
akkor nem lesz képes felismerni ha a felhasználó már így több
input, mint amennyit valójában akart.
Tehát ez egy implicit formában hiba ellenőrzése.
>> De észre, mit csinálok itt.
Egyszer vagyok benne, hogy a felhasználó adott nekem egy karakter, azt szabad a vonal, ennek
az ellenkezője getstring, ami viszont használ malloc, aztán vissza
C1, a karakter, hogy reméltem a Felhasználó által megadott, és csak biztosítani.
Tehát egy gyors megpillantotta csak, de a bármilyen kérdése van getchar?
Majd gyere vissza néhány, a többiek.
>> Nos, hadd menjen előre, és ezt - Tegyük fel, hogy csak motiválni
vita egy hét plusz idő, ez a egy fájl neve structs.h.
És ismét, ez csak egy kis ízelítőt valami, ami előttünk.
De vegyük észre, hogy sok erre megjegyzéseket.
Hadd kiemelni csak az érdekes része most.
typedef -
van, hogy ugyanazt a kulcsszót újra.
typedef használjuk nyilatkozni húr egy speciális adattípust.
Használhatja typedef létre új adattípusok nem létezett, amikor
C találták.
Például, int jön C. char jön a C. dupla jön C. De
nincs fogalma a diák.
És mégis lenne elég hasznos, hogy képes írni egy programot, amely tárolja
a változó, a diák azonosító száma, a neve, és a házukat.
Más szavakkal, három darab Az adatok, mint egy int, és a
szöveg és egy másik string.
>> A typedef, mi elég erős erről, és a kulcsszó a sturct
struktúra, akkor a programozó 2013-ban, ténylegesen meg a saját a
adattípusok nem létezett év ezelőtt, de hogy illeszkedjen a célra.
És itt, a sorok 13 keresztül 19, mi nyilvánító új adattípus, mint a
int, de nevezni diák.
És azon belül a változó fog három dolgot - int egy string,
és egy sor.
Szóval lehet gondolni, mi az igazán itt történt, annak ellenére, hogy ez a
kicsit egyszerűsítése a mai, egy diák lényegében folyik
hogy néz ki.
Hogy lesz egy darab memória egy azonosítót, a nevet
mezőt, és egy házat a területen.
És képes lesz használni ezeket a darabokat memória és elérheti őket az alábbiak szerint.
>> Ha bemegy struct0.c, itt van egy viszonylag hosszú, de a következő egy
minta, a kód használja ezt az új trükköt.
Tehát először, hadd hívjam fel a figyelmet Az érdekes részek felfelé tetején.
Sharp határozza meg a diákok 3, kijelenti, állandó nevezett diákok és a jogutód
azt önkényesen a 3-as szám, csak így már három diák segítségével
ezt a programot most.
Itt jön Main.
És figyelje, hogyan kijelentem egy sor diák?
Nos, csak használja ugyanazt a szintaxist.
A szó hallgató nyilvánvalóan új.
De diák, osztály, konzol diákok.
>> Így sajnos nagyon sok újrafelhasználás kifejezések itt.
Ez csak egy szám.
Tehát ez, mintha azt mondanánk három.
Class csak amit akarok hívni a változó.
Nevezhetném diákok.
De osztály, ez nem egy osztály egy objektum-orientált Java módján.
Ez csak egy osztály a diákok.
És az adatokat a fajta minden eleme abban a tömb diák.
Tehát ez egy kicsit más és mond valamit
mint ez, ez csak -
Azt mondom, hogy nekem három diák és hívja a tömbben osztályban.
>> Rendben van.
Most itt van a négy hurok.
Ez a fickó ismerős - hajtogat nullától akár három.
És itt van az új darab szintaxis.
A program fog megkérdezze, az ember, hogy ez a diák
Azonosító, amely int.
És itt van a szintaxis, amellyel tárolja valamit az ID mező
elhelyezkedés osztály konzol I. Tehát Ez a szintaxis nem új.
Ez csak azt jelenti, hogy nekem a nyolcadik tanuló az osztályban.
De ez a szimbólum az új.
Eddig, már nem használt pont, legalábbis kódot, mint ez.
Ez azt jelenti, megy a struct ismert egy diák és valami ott.
Hasonlóképpen, a következő sorban, 31, menj előre, és tedd, amit a felhasználó beír
a nevét itt, és mit csinálnak a ház, ugyanaz a dolog, megy előre, és
tegye. házban.
>> Mit is jelent ez a program végül csinálni?
Láthatjuk a kis teaser is.
Hadd menjek előre, és nem teszik struktúrákat 0 dot slash struct 0, hallgatói azonosító 1,
mondjuk David Mather, diákigazolvány 2..
Rob Kirkland, diákigazolvány 3.
Lauren Leverit -
és az egyetlen dolog, amit ez a program nem, ami csak teljesen önkényes, a
Szerettem volna tenni valamit ezekkel az adatokkal, most, hogy megtanította nekünk, hogyan
használata struktúrákat, az csak volt az extra loop itt.
Én hatunk végig tömb diákok.
Régebben a, talán most már ismerős barát, karakterlánc összehasonlítani, stircomp a
ellenőrzés 8. diák háza egyenlő Mather?
És ha igen, csak nyomtatni valami önkényesen tetszik, igen, ez az.
De ismétlem, csak hogy nekem lehetőséget használni, és újra, és
újra az új pont jelölést.
>> Tehát kit érdekel, igaz?
Jön egy hallgató program kissé önkényes, de kiderült,
amit tehetünk hasznos dolgokat Ez például a következőképpen.
Ez egy sokkal bonyolultabb struktúra C-ben Van rajta egy tucat vagy több területen,
kissé rejtélyesen nevét.
De ha valaha is hallottam, hogy egy grafikus fájlformátumot úgynevezett bitmap, BMP, akkor
Kiderül, hogy a bitmap formátumban nagyjából így néz ki, hogy ez a.
Ez egy buta kis mosolygó arc.
Ez egy kis képet, hogy én már nagyított az elég nagy, hogy láttam minden
Az egyes pontok vagy pixel.
Most kiderül, mi is jelenthet fekete pont, mondjuk, a 0 szám.
És egy fehér pont az 1-es szám.
>> Más szóval, ha azt szeretnénk, hogy dolgozzon a Smiley és mentse a képet a
számítógép, elegendő tárolására nullák és is, hogy néz ki, hol,
Ismét, közül, fehér és nullák fekete.
És együtt, ha hatékonyan kell a övez egyesek és nullák, van egy
rács pixel, és ha laikus őket, van egy aranyos
kis smiley.
Most bitmap formátumban, BMP, a hatékonyan, hogy a motorháztető alatt,
de több pixel iszákos, hogy valóban képviseli színeket.
>> De ha van kifinomultabb formátumok, mint a BMP és a JPEG és GIF
amellyel lehet, hogy ismeri, azok fájlok a lemezen általában nem csak
van nullák a pixel, de van néhány metaadatokat is -
meta-ban az értelemben, hogy nem igazán adatokat, de nem árt, ha van.
Tehát ezek a mezők itt céloz, és majd meglátjuk ezt részletesebben P-set
5., hogy mielőtt a nullák és egyesek, hogy képviseli a képpontok,
van egy csomó, mint a metaadatok a méret a kép és a
a kép szélességét.
És észre én kopasztás ki néhány önkényes dolog van -
szélesség és magasság.
Bit-szám és néhány más dolog.
Szóval egy kis metaadatokat a fájlban.
>> De hogy miként fájlok cikkben ki ily módon, akkor valóban
akkor dolgozhatja fel a képeket, vissza képeket lemezről, a képek átméretezése.
De nem feltétlenül fokozza őket.
Szükségem volt egy fénykép.
Szóval visszamentem RJ itt, ki látta A képernyőn jó néhány évvel ezelőtt.
És ha én nyit Keynote itt, ez mi történik, ha megpróbálja a nagyításhoz és a
fokozza RJ.
Ő nem lesz jobb igazán.
Most Keynote egyfajta elmosódás, hogy egy kicsit, csak azért, hogy a elkendőz
tény, hogy a RJ nem lesz különösen jobb, ha nagyításhoz
És ha ezt így, lásd a négyzetek?
Ja, akkor feltétlenül látni A négyzetek egy projektor.
>> Ez az, amit kapunk, ha növeli.
De hogy miként az RJ vagy Smiley arc végre megengedi, hogy
valójában kódot írni, hogy manipulálja ezeket a dolgokat.
És azt gondoltam, hogy véget ér ez a megjegyzés, a 55 másodperc az fokozza, hogy ez,
Merem, mondjuk inkább félrevezető.
>> [VIDEÓ LEJÁTSZÁS]
>> -Hazudik.
Arról, hogy mi, azt nem tudom.
>> -Szóval, mit tudunk?
>> -Az at 09:15 Ray Santoya volt az ATM.
>> -Tehát a kérdés az, hogy mi csinált a 09:16?
>> -A kilenc milliméteres Fényképezés valamit.
Lehet, hogy látta a mesterlövész.
>> -Vagy dolgozott vele.
>> -Várjon.
Menj vissza egy.
>> -Mit látsz?
>> -Hozd az arcát, teljes képernyőn.
>> -A szemüvegét.
>> -Van egy reflexió.
>> -Ez az Neuvitas baseball csapat.
Ez a logó.
>> És ő beszél bárki is rajta, hogy kabát.
>> [END VIDEÓ LEJÁTSZÁS]
>> DAVID J. MALAN: ez Probléma lehet Set 5.
Látni fogjuk, hogy a jövő héten.
>> FÉRFI SPEAKER: A következő CS50.
>> [Tücskök csiripelnek]
>> [MUSIC PLAYING]