[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? -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. -Javítása. -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. 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. 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]