[MUSIC Playing] ROB Boden: Rendben. Tehát, az első dolog az első, videó egy ismerős arc. [VIDEÓ LEJÁTSZÁS] -Rendben. Ez CS50, és ez a kezdete három hét. Sajnálom, nem tudtam ott lenni veletek ma, de engedje meg, hogy bemutassam CS50 saját Rob Boden. [END VIDEÓ LEJÁTSZÁS] [Taps és éljenzés] ROB Boden: A filmográfia ben , hogy a videó fantasztikus. Rendben van. Tehát először is, van még egy ebédet. Ez holnap 01:15. Nincs ebéd pénteken. Ez a Quora. És Tommy még nincs itt, de az egyik az emberek ott egykori vezetője CF, Tommy McWilliam. Tehát ő egy jó ember. El kellene jönnöd. Rendben van. Így a múlt héten kezdtük törés egymástól arról, hogy mi a szöveg valójában. Már ismert, hiszen az elején, hogy ez egy karaktersor. De a múlt héten sokat foglalkoztunk az a tény, hogy ami valóban sorozata karakter, nos, most már tömbök karaktereket. És tudjuk, hogy a szöveg, ez egy sor A karakter, a legvégén, itt van ez a speciális NULL byte, ez visszaper 0, amely azt jelzi, a végén a a húr. És így a string tömb karakter, de lehet több, mint csak egy sor karakter, mi lehet egy sor olyan a fajta dolog, amit szeretnénk. Tehát, ha felidézni a múlt héten, a Ages program, David bevezette nagyon gyorsan. Tehát az első dolog, amit meg fogunk tenni a kéri a felhasználót egy egész szám, az több ember a szobában. Ha megvan, hogy egész, mi van érvényben, amely tömb. Figyeljük meg ezt a zárójeles formával. Meg fogod szokni ezt. Szóval nyilvánította egy sor egész nevezett korosztály, és van n egész számok ebben a tömbben. Szóval, ez a minta itt, ez a 4-int i értéke 0, i kisebb, mint n, i és Plusz, hogy szintén lesz egy mintát hogy Önnek nagyon régen. Mert elég sok, hogy te mindig lesz iterációkhoz tömbök. Úgy emlékszem, hogy n hossza a tömb. És itt vagyunk, többször kérte a kor a személy, a szobában. Ezután megyünk le, és bármilyen önkényes ok, akkor majd nyomtassa ki, mennyi idős mennek , hogy egy év múlva. És fut a program, most hogy a kor, pont perjel korosztály számára. Így több ember a szobában, mondjuk három. És azt mondják, az első, aki 13, a következő 26, és az utolsó 30 perc. Tehát akkor majd végighaladni a három emberek, nyomtassa ki a 14., 27., és 31.. Úgy emlékszem, hogy amikor kijelentjük egy tömb mérete n, az indexek, hogy az tömb, a tömb értékeit és indexek 0, 1, 2, egészen n-ig mínusz 1. Tehát, amikor azt mondta, hogy három ember a szobában, és tesszük itt Az első iteráció ezen keresztül hurok, én lesz 0-ra. Így a mutató 0-ra. Mi hozzárendelése az első kor a felhasználó belép. Aztán a következő, mi belépő második n a felhasználó belép, és mellett két, az utolsó n. Tehát észre, hogy egy sor méretű három, nem kell semmit Az index három. Ez nem érvényes. Rendben van. Szóval, megy vissza. Most, hogy már foglalkozott tömbök, van néhány ismerős. Most fogunk lépni a parancs paramétereket, melyek lesznek elég releváns erre a problémára készlet. Tehát eddig, amikor már kijelentette, a fő funkciója, most már mondta int main semmis. Így érvénytelen csak azt jelenti, hogy az mi nem halad olyan érvek ezt a funkciót. Most fogjuk látni, hogy a fő eltarthat egy érvet. Itt hívjuk őket int argc és karakterlánc argv zárójelben. A konzolok, ismét, jelezve hogy van dolgunk tömbök. Tehát itt, karakterlánc argv konzolok, vagyunk foglalkozó egy sor húrok. Tehát argc, hogy fog, jelezve, Hány érv voltunk át ezt a programot. És látni, hogy ez mit jelent, Zárjuk ezt. OK. Tehát eddig, most már fut minden programot, mint a dot perjel korosztály számára. Azt is, meg a parancssorban, múlt át érveket, így a kifejezés, parancs paramétereket. Így az első érv, hello world. Tehát itt, argc lenne három. Ez a gróf érvek a parancssorban. Argc mindig legalább 1, mivel dot perjel korok, maga számít, mint az egyik a parancssori paramétereket. Ezután az első szia. Ha dot slash korosztály a nulladik, majd helló az első, és a világ a második parancssori argumentum. Így a húr argv fogunk látni, tartalmazza a húrok, pont perjel korosztály, hello, és a világ. És David kérésére megyünk lejátszani a videót bevezetésével ezt. [VIDEÓ LEJÁTSZÁS] -Eddig a programokban voltunk írt, most már kijelentjük a fő, int main semmis. És ebben az időben, hogy semmis van egyszerűen csak meghatározza, hogy a program nem vállal semmilyen parancssori paramétereket. Más szóval, ha egy felhasználó egy fut programot, ő adhat parancsot argumentumok írásban további szavak vagy kifejezések után a program nevét a prompt. Nos, ha azt szeretné, hogy a program, hogy hogy parancssori paramétereket, egy vagy több ilyen szó, akkor ki kell cserélni elvesztésével egy pár érv. Így csináljuk. Tartalmazza CS50.h. Tartalmazza szabványos io.h. Int main. És most, ahelyett, hogy üres, fogok adjon meg egy int nevű argc, és tömb húrok nevű argv. Most, argc és argv egyszerűen egyezmények. Mi volna az úgynevezett ezeket az érveket a legtöbb, amit akarunk. De mi az a fontos, hogy a argc van int, mivel a meghatározás szerint ez majd, hogy tartalmazza az érv gróf, a szavak száma összesen, hogy a felhasználó beírt a saját prompt. argv eközben érv vektor, az lesz, hogy valóban egy tömb tároló az összes szó, hogy a felhasználó gépelt a saját prompt. Nézzük folytassa tenni valamit most egy vagy több ilyen parancssori paramétereket. Különösen, menjünk előre, és a nyomtatási bármilyen szót a felhasználó beír után a program nevét A prompt. Nyitó zárójel. Záró zárójel. Printf százalék s karakterláncot és vessző. És most el kell mondanom printf milyen értéket dugót, hogy helyőrző. Azt szeretné, hogy az első szó, a felhasználó gépelt után a program nevét, és így fogom megadni argv konzol 1, közel zárójel, pontosvessző. Nos, miért konzol 1 nem tartó 0-ra? Nos, kiderült, automatikusan tárolja A argv 0 lesz a program tényleges neve. Tehát az első szó, a felhasználó beír után, a program neve, a egyezmény lesz tárolt argv 1. Nézzük most összeállítja és a program futtatásához. Legyen argv 0 pont slash argv 0-ra. És most egy szó, mint a Hello. Adja meg a. És ott van ez, helló. [END VIDEÓ LEJÁTSZÁS] ROB Boden: Rendben. Zárja be ezt. Tehát egy pillantást vetni, hogy a program, hogy Csak be nekünk, nos, csak mutatni, ha nyomtatni argv 0, hogy most mi az, argv 0 pont slash argv 0-ra. Szóval, ahogy várható volt, ez kinyomtatja az a program neve, hiszen argv a 0 mindig lesz a A program megnevezése. De nézzük tenni valamit egy kicsit érdekes. Így a probléma meg, akkor be, hogy ezt a funkciót, atoi. Akkor mi használjuk atoi az? Ez lesz átalakítani a karakterlánc egy egész. Tehát, ha elmegyek a húr, egy, kettő, három, a atoi, hogy majd átalakítani, hogy Az egész, egy-kettő. Így megyünk konvertálni első parancssori argumentum egy egész szám, és aztán csak nyomtatni, hogy egész. Tehát alapvetően, vagyunk olyan reimplementing getInt, csak a egész szám megadása a parancssorban vonal helyett a programban interaktív. Tehát, hogy argv 0, csináljuk ez itt, és zárja be ezt. Így működik az argv 0, és nézzük meg a egész, egy kettő három négy egy kettő. Így fog nyomtatni az egész, egy két, három, négy, egy, kettő. Vannak olyan finomságok, hogy atoi hogy meg fog állni törődve semmit túl érvényes numerikus karakter, de ez nem számít. Nos, mit gondol, mi történik ha én ezt? Segmentation hiba. Miért van ez? Ha visszatekintünk a programban vagyunk konvertáló argv 1, az első érv a program neve után, hogy egy egész szám. De nincs érv telt a program neve után. Tehát itt azt látjuk, hogy ez egy hibás programot, mert, ha megpróbáljuk futtatni nélkül érvek akkor csak összeomlik. Így egy másik közös vonása látni fogod olyasmi, mint, ha argc kevésbé mint két, jelezve, hogy nem volt legalább a program nevét, és a az első érv, aztán valami mint a printf, nem elég parancssori paramétereket. Ez valószínűleg nem egy jó nyomtatni, ez talán valami, mint a meg kell adnunk egy egész számot a parancssorban. Én csak a végén ott. És akkor vissza 1. Úgy emlékszem, hogy a végén a mi programot, ha vissza 0, ez a fajta jelzi sikerét. És a fő automatikusan értéke 0, ha nem. Tehát itt, mi retuning 1 jelzi , hogy ez nem a siker. És akkor vissza, amit akarsz, csak, 0 jelzi siker, és mást jelez. Szóval futni ezt a verziót a dolgok. Tehát most, ha nem adja meg a parancssort érv, akkor az pontosan mondani Számunkra nem elég parancssorban. Nem fejezte be a mondatot. Máskülönben, ha valóban át ez az egyik, akkor a program elvégzéséhez. Tehát ez hogyan fogja használni argc a annak érdekében, hogy érvényesítse a számát parancssori argumentumokat valóban át. Szóval, hogy ez a program egy kicsit bonyolult, és nézd meg a második iteráció a dolgok. Tehát most, mi nem csak a nyomtatás a első parancssori argumentum. Itt vagyunk iterációjával az int i értéke 0, i kevesebb, mint argc, I Plus plusz, és a nyomtatás argv, i index. Tehát ezt a mintát, megint ez ugyanaz minta, mint korábban, kivéve, hogy hívja a változó n, mi használ argc. Tehát ez az iterációt minden index a tömb, és a nyomtatás minden eleme, hogy a tömbben. És így, amikor fut a program, nos, Én nem lépett be semmilyen parancsot érvek, így csak nyomtat a program nevét. Ha én meg egy csomó dolgot, akkor az kinyomtathat egy, mindegyik külön sorban. OK. Szóval vessünk egy lépéssel tovább. És ahelyett, hogy a nyomtatás minden érvelés külön sorban, hadd nyomtassa minden karakter minden egyes érvelés külön sorban. Úgy emlékszem, hogy argv az egy sor húrok. Tehát mi az a szöveg, de a egy sor karaktereket? Tehát ez azt jelenti, hogy argv valójában egy tömb egy sor karakter. Szóval, kihasználva, hogy a nézzük figyelmen kívül hagyja ezt most. Nézzük csak úgy a karakterlánc argv 0-ra. Tehát, ha azt akarjuk, hogy minden egyes karakter argv 0 külön sorba, akkor azt akarom, hogy ezt a mintát vagyunk szokva, i kevesebb, mint a hossza a tömb, ami itt, az strlen az, ami nem az, amit akarok, string s egyenlő argv 0-ra. Tehát i kisebb, mint a hossza a mi tömb, amely ebben az esetben egy tömb karakterekből i plus plus. És így, ahogy azt a múlt héten, ez ideális ha megyünk, hogy strlen kívül Az a feltétel, hiszen n lesz hozzá a strlen s minden alkalommal megyünk a hurok, és ez nem fog változni. Így fogjuk állítani egyenlő n ide. OK. Tehát most, mi az iterációt minden index a tömbben. És így, ha azt akarjuk, hogy nyomtassa ki az összes karakter ebben a tömbben, százalék c A zászlót szeretnénk használni karakterek. És most egy konzol i lesz a string index i karaktert, így ha a karakterlánc voltak helló. akkor s 0 lesz h, s konzol 1 e lesz, és így tovább. Tehát most szeretnénk kombinálni ez a két dolog. Szeretnénk nyomtatni minden egyes karakter Az egyes parancssori argumentum. Szóval megy, hogy a beágyazott a hurok. És hagyományosan, az első számláló Én vagyok az, a következő lesz j, n lesz a strlen az argv én, én kisebb, mint az n-, i plusz plusz. És most, ahelyett, hogy a nyomtatás argv i, így argv konzol i fog index - ez lesz az i-edik parancssori érv, argv i, j fog a j-edik karaktere Az i-edik érv. Én megszabadulni ez itt most már mivel tedd abba a hurok. Tehát egyenértékű string s egyenlő argv i, majd s konzol j. Nos, nem kell bejelenteni ezt a változót s. Ehelyett, akkor csak össze ezeket Két abba, hogy mi volt, argv i, j. SPEAKER 1: [hallható]. ROB Boden: Jó döntés. Szóval ez van törve. Ha valóban futott, mi lenne felismerték ezt. Tehát a számláló törődöm ebben különösen hurok j, a bejáró. Szóval volna befut kérdések, valószínűleg egy végtelen ciklusba, ha nem rögzítette ezt. Ezért mi is beszélünk a hibakeresés ma. OK. Szóval a program futtatásához. És nézzük valóban hozzá egy külön printf itt, hogy csak nyomtatni másik vonalon, hiszen ez azt jelenti, ha a program futtatásához, lesz egy üres vonal egymástól jellege Minden parancssori argumentum. Nos, majd meglátjuk, hogy ez mit jelent. Hopp. Van egy kis hiba. Hiba burkoltan kijelentette könyvtári funkció strlen. Szóval, megy vissza a programot, azt Elfelejtettem hash tartalmazza string.h. Tehát string.h lesz a header fájlt, amely kijelenti, A funkció strlen. OK, azt állítja össze. Na, fussunk neki. Szóval, csak ezt. Ez lesz, hogy nyomtassa ki a program nevét, hello world. Ez a nyomdába minden dolog, minden karakter, külön sorban. OK. Szóval tulajdonképpen ezt egy lépéssel tovább. És ahelyett, hogy a string.h, nézzük gondolni, hogy mi lenne végre a saját strlen funkciót. Szóval akkor azonnal adni funkció aláírást. Szóval hívja my_strlen, és ez megy, hogy egy sor, mint egy érv, és azt várjuk, hogy visszatérjen a hosszát, hogy a húr. Szóval, hol van az a srác? Igen. OK. Úgy emlékszem a korábbi diát, volt a múlt héten, hogy az tömb karakter, nos, egy string, Mondjuk, ez a string s. Tehát, ha s az a karakterlánc, hello, akkor, H-E-L-L-O, a memóriában, hogy fog lenni, és akkor ez a backslash 0. karakter. Szóval hogyan jutunk hosszát s? Nos, a trükk keresi ezt holtjáték 0 karakter, ez a null terminátor. Tehát az algoritmus lesz hogy valami hasonló pár Elég karakterek - vessünk ennek a keze képviselik számláló, nevezzük ezt int hossza. Tehát, kezdve itt vagyunk fog iterációkhoz a string. Tehát az első karakter, ez a H, és ez nem jött vissza perjel 0, így hossza 1 lehet. Hajtogat, hogy a következő karakter, E, és ez nem backslash 0-ra. Hossza 2. L 3. L 4. O 5. És végül, elérjük backslash 0, és így ez azt jelenti, nos, ez a szöveg vége. Tehát térjünk vissza 5. Tehát tulajdonképpen végrehajtó, az első, az n hosszúságú értéke 0, a jobb kezem. És fogunk iterációkhoz - SPEAKER 1: [Nem hallható] ROB Boden: Ó, lő. Jó ötlet. Boom. Tehát n hosszúságú értéke 0-ra. Tehát most, míg s hossza nem azonos majd backslash 0-ra. Úgy emlékszem, ez a backslash 0, ez egy tényleges karakter, és ez azt jelzi, a végén a húr. Csakúgy, mint a szintén, backslash n tényleges karakter. Backslash 0 lesz, jelezve, végén a húr. Nem akarom, hogy, hogy van. És míg s indexelve hossza nem egyenlő a null terminátor, majd mi csak úgy növelni hosszát. Tehát, a végén a program hossza végül fog 5 legyen ebben az esetben. És akkor csak vissza hossza. OK. Tehát most itt, én nem do my_strlen. Nézzük össze, hogy megbizonyosodjon arról, minden zökkenőmentesen menjen végbe. Csináltam 2? Vagy, hogy az 1? Hogy kell csinálni. Rendben van. Tehát ez argv 2. Működik, mint várható, annak ellenére, az volt, hogy az egyik én azt? Igen. OK. Ez a verzió a dolgok nem voltak Az printf új vonal után, de a nem tesz különbséget. OK. Így dolgozott, mint várták. Most már mi is össze egy lépéssel tovább, ahol az értesítést itt is, először, mi megragadta a strlen az argv i, és mi az iterációt minden karakter, hogy a húr. Tehát ahelyett, hogy mi lenne, ha csak össze ezt a logikát a várakozás amíg elérünk backslash 0 jobb ebbe a hurok? Így ismételget míg argv i, j nem nem egyenlő backslash 0-ra. Tehát fussunk neki először. Rendben van. Tehát itt, ez a feltétel azt mondja - tisztázzuk ezt. Tehát most, legyen ez a mi argv. Tehát amikor én csak futott, hogy a program előtt, argv tömb a szálakat. És így, ha elindul a dot slash argv 2, hello world, akkor a argv maga hossza 3, az argv nulla, hello, és a világ. És belsejében minden egyes ilyen indexek, maga is egy tömb, amelyben ez lesz dot, ez lesz slash, nem tudom, ha ez volt a helyes irányba, azt Nem hiszem, hogy az volt. A-R-V kötőjel, több helyre van szüksége. Vágjuk ebbe a tömbbe. A-R-V kötőjel 0, majd backslash 0-ra. És akkor rendetlenség lesz helló. Mondjuk, H-E backslash 0-ra. És végül, W-O backslash 0-ra. Tehát az algoritmus, amit csak írt, A beágyazott a hurok, amit ők ennek az, hogy először a számláló i, majd a j. Ez lenne könnyebb kódot a képernyőn Menjünk vissza ehhez. OK. Tehát észre, hogy én az a bejáró, ami iterációt minden parancs argumentum. És j az iterátor iterációjával az egyes karaktert, hogy parancssori argumentum. Szóval mi ez a legbelső printf csinál van, mi printf argv 0 0, printf argv 0 1, printf argv 0 2 0 3 0 4, 0 5, 0 6, de most, argv 0 7 fog egyenlő backslash 0-ra. Szóval, akkor lépjen ki, hogy hurok, és most én Végig 1-re. És most mi lesz a nyomtatási argv 1 0, argv 1 1 - Nos, mivel én vágott helló rövid, argv 1 2 ismét lesz backslash 0-ra. És így, megnöveljük i és továbbra is, és így tovább, amíg ki kell nyomtatni az összes a világ, és a három parancssor érveket, és mi lépjen ki a A legkülső hurok, és befejezni a programot. OK. Úgyhogy gyere vissza. Tehát akkor szert jártasságot parancssori argumentumok ezen adott probléma beállítva. Most, hibakeresés. Így talán már kellett tennie Néhány hibakeresés a korábbi probléma meg. És egy nagyon egyszerű módja a hibakeresés, Először is, nézzük meg a hibás programot. Nos, séta a program, fogunk kérni a felhasználót egy egész, megragad, hogy egész, majd önkényesen, van egy while ciklus, amely csak megy, hogy csökkentse Én, amíg ez egyenlő 10-ig. Nézzük csak fel, én belépő egy 10-nél nagyobb egész szám. Így csökkentse azt, amíg ez egyenlő 10-ig. És akkor még egy while ciklus , hogy bár én nem egyenlő 0, vagyunk majd csökkentse i 3. Tehát, ha úgy látja, a szándék a hiba itt, az az, hogy ez majd csökkentse i 10, és akkor ez a while ciklus lesz dekrementálás i 10, 7, 4, 1, a negatív 2, 5 a negatív, és így tovább, a negatív végtelen, mert én is soha nem egyenlő 0-ra. És akkor a végén ezt a programot, mi van a foo függvény, amely folyik a nyomtatás, hogy én. Tehát ez egy rövid és triviális program és a hiba nyilvánvaló, különösen azután, hogy én csak azt mondta, amit a hiba volt. De a szándék itt is, nos, ez talán valóban úgy néz ki, mint néhány megoldások kapzsi az utolsó probléma meg, és talán te is, Néhány végtelen ciklusba a programban, , és fogalmad sincs, mi okozza. Tehát egy nagyon hasznos hibakereső módszer az, hogy csak add printf az egész a kódot. Tehát itt akarok printf kívül első while ciklus. És itt szeretnék egy printf, és én csak nyomtatni i. Én még nem első while ciklus, i. Kívül, a második while ciklus. Még egyszer, nyomtassa belül innen, az érték azt. És nézzük futtatásához. Tehát pont perjel debug. Adjon meg egy egész számot. Csináljuk 13. És bumm. Látjuk, hogy mi vagyunk a végtelen hurok belül a második while ciklus. Most már tudjuk, hogy mi a hiba. De printf hibakeresés tökéletesen jó, de ha egyszer a programokat, hogy hosszabb és bonyolultabb, vannak kifinomultabb megoldások szerzés dolog működik. Szóval távolítsa el ezeket a printf. És nézzük, hogy biztos, hogy nem törj össze semmit. OK. Így a program megyünk bevezetni az úgynevezett GDB, GNU Debugger. Nos, valóban, hadd vegye hibakeresés a a második, és a debug újra. Nos, tulajdonképpen az első, egy jó lecke a parancssori paramétereket. Figyeljük meg, hogy ez a csenget a parancs, hogy összeállítása minden továbbadása a parancssorban, ezek parancssori paramétereket. Tehát pontosan hogyan fog használni parancssori paramétereket, mint mi korábban, és mint akkor a Pset 2, ez hogyan csenget is használja őket. Tehát észre, hogy ez az első zászlót, kötőjel ggdb3, mi ez mondani, csenget, meg kell fordítani ezt a fájlt a szándékkal, hogy előbb-utóbb kell debug meg. Tehát, amíg van, hogy a zászló, akkor mi is GDB hibakereső. És akkor nyissa meg a GNU Debugger. Tehát van egy csomó parancsok , hogy meg kell szokni. Először az egyik, hogy akkor valószínűleg azonnal szüksége van Run. Tehát mi a Run fog csinálni? Meg fog kezdeni a programot. Úgy fussatok, kezdve, a program kéri tőlünk, egy egész, 13. És akkor ez a végtelen hurok, mint várható, kivéve, eltávolították a printf, ezért nem is látni. Kilépett rendesen. Oh. Lehetséges, hogy csomagolva a fordítva, vissza - figyelmen kívül hagyva, hogy az. Tegyük fel, hogy nem léphet ki rendesen. Van egy bonyolult választ. Tehát most, ez nem túl hasznos. Tehát csak futó programunk belsejében ez a debugger nem segít minket minden módon, hiszen lehetett volna most tett dot slash hibakeresési kívülről GDB. Tehát az egy parancsot, hogy akkor talán - és én kilép ezt. Control-d, vagy kilép, mind a munka. Szóval nyisd ki újra. Egy másik parancs, hogy akkor valószínűleg azonnal szeretné szokni a szünet. Így fogunk törni a legfontosabb most, majd leírom ezt. Nos, itt azt látjuk, mi meg a töréspontot ebben a sorban debug.c. Tehát mi szünet azt jelenti, hogy amikor én írja távon a program fog tovább fut, amíg Elütöttem egy töréspont. Tehát amikor elütöttem távon a program elindul, majd eltörik, amint belép a fő funkciója. Szünet fő lesz valami akkor elég gyakran csinálni. És most, hogy mutassam be néhány több parancsot. Figyeljük meg itt, hogy mondja meg tört at line 11, amely a printf, meg egy egész szám. Tehát a parancs következő lesz, hogy megyünk a következő kódsort. Ez most lehetővé teszi számunkra, hogy lépést keresztül a program sorról sorra. Így a következő. Most 12. sorban, megyünk hogy az egész. Tovább. És ha csak nyomd meg az Enter gombot, akkor az A legutolsó dolog, amit tett. Szóval nem kell beírni következő minden egyes alkalommal. Tehát meg egy egész szám, 13.. Tehát most, 14. sor, miközben a nagyobb mint 10, és én csinálni. És azt látjuk, megyünk csökkentse i. Így fogunk csökkentse i újra. Tehát most, egy másik hasznos parancs Print. Tehát Print fog kinyomtatni a változó értéke. Hozzuk ki az értéket Az i változó. Nézzük nyomtatni i. Azt fogja mondani i 11. Most ismét a Tovább gombra, amíg i értéke nagyobb, mint 10. Tehát én még mindig nagyobb, mint 10., mivel ez a 11.. i mínusz mínusz. Nézzük nyomtassa i újra. Ahogy az várható volt, ez 10. Tehát most, a következő. Ez megy vissza az a feltétele, i nagyobb, mint 10, de én most 10, így ez nem nagyobb, mint 10, így azt várjuk hogy kiesik a while ciklus. És most mi vagyunk az alábbiakban, hogy sor kódot. És egy másik parancs, lista, csak megy gombot az előző és a következő pár sornyi kódot, a esetben, ha elvesztette magát. Szóval csak elhagyta ezt a while ciklus, és most már be ezt a while ciklus, 18. sor. Tehát amíg én nem egyenlő 0-ra. És a következő, az i értéke i mínusz 3, és mi észre, ez akkor csak menj tovább. És mi lehet nyomtatni i. Minden parancs fajta van hivatkozások. Tehát p rövid a Print. Így lehet p i. Csak ne holding n, vagy csinálom a Tovább gombra. Print megint. Látod, most már a negatív 167. Tehát ez megy a végtelenségig, de nem tényleg örökre, mert most láttam, hogy valóban véget egy bizonyos ponton. Annak érdekében, hogy kezd GDB. De tegyük még egy dolog a GDB. Uh, debug. Tehát, ebben a konkrét esetben a végtelen ciklusba történetesen belsejében a fő funkciója. És most, csak fogadd el, hogy én vagyok költözik a végtelen hurkot A foo függvény. Ne feledd, hogy a végén ez programot, nos, ez eredetileg hívás foo, ami csak nyomdába i. De most mi hívás ize, ami majd csökkentse azt, amíg ez 0, és majd nyomtassa ki a változó. OK. Kivéve, hogy. Legyen debug. És most, gdb debug. OK. Tehát, ha én csak futni, akkor én nem fogok tudja, hogy ténylegesen lépni az én programot line-by-line. Tehát Nézzük a legfontosabb, majd írja futni. Így végig ezt, printf adja egy egész, hogy a egész, 13.. Így fogjuk tartani csökkentő amíg az i nagyobb, mint 10 um. Majd megyünk esik át a while ciklus, és kap a vonal - nyissuk fel egy külön ablakban. Így csökkenhet, míg én már nem volt nagyobb, mint 10, és aztán úgynevezett funkció ize. Szóval, mi történt, amint azt hit function ize, nos, az úgynevezett ize, és akkor már nem volt felett GDB. Tehát, amint hit Next ezt a sort, a dolgok egészen ez történt, ahol a program kilépett, amikor - Feltételezem, hogy nem létezik végül. Láttad szünet egy kicsit mégis. Akkor miért nem vesztek felett a program ezen a ponton? Nos, amikor azt írja továbbá, hogy megy A szó szerinti következő kódsort, hogy végrehajtja. Szóval miután line 21, a következő kódsor , amely végrehajtja a 22. sor, mely, kilépéskor fő. Szóval nem akarom, hogy csak menni a következő kódsort. Azt akarom, hogy menjen be a funkciót, ize, és akkor is át lehet lépni azok sornyi kódot. Tehát az, hogy van egy másik. Nézzük kilép újra. Szünet fő. Uh, 1, a következő, a következő, a 13., a következő, a következő, a következő, óvatosan, mielőtt elérünk vonal foo. OK. Most vagyunk a sorban a 21., ahol meghívhatjuk az ize. Nem akarjuk, hogy írja be a következő, mivel ez majd csak hívja a function ize, és megy a következő kódsort. Mi azt akarjuk, hogy a lépés. Szóval van egy különbség a Step és a következő, ahol a lépés belép a működik, és a következő megy át a funkciót. Ez csak végrehajtja a teljes egészében a funkció és folyamatosan megy. Tehát Step fog hozni minket a funkciót, ize. És azt látjuk, itt, most, mi vissza ez a while ciklus, ami elméletileg, folytatódni fog örökké. És ha bejön lépésben, ha még csak nem is egy függvényt hívni, akkor ez megegyezik a Tovább gombra. Tehát ez csak, ha éppen egy sort, hogy hív egy függvényt, Step fog eltér a Tovább gombra. Így Step fog minket. Lépés, lépés, lépés, lépés, lépés, lépés, és mi csak végtelen ciklusba örökre. Szóval lehet szokni, hogy az Ön azonosításának módját végtelen hurkok, az csak tartja ezt az Enter billentyűt hol elakad. Vannak jobb módja van, de most, hogy tökéletesen elegendő. És stílusa, hogy megfeleljenek a stílus 50, azt kellett volna ezt. OK. Tehát az egyik utolsó parancs bevezetni. Nos, a gdb hibakereső be Tehát ahelyett, hogy a törés a fő, ha ismeri a foo funkció is a probléma, akkor tudtam volna, csak mondta, break at ize helyett. Tegyük fel, hogy eltörnek mind a fő-és ize. Így be annyi töréspont amennyit csak akar. Amikor azt írja futni, ez lesz megállítani a - ó, hadd újrafordítani, hiszen Megváltoztattam a dolgokat. Majd meglátod ezt a sort, figyelmeztetés, forrás fájl újabb, mint futtatható. Tehát ez azt jelenti, hogy most ment itt és megváltoztatta ezek megfelelnek a stílus 50, de nem újrafordítani a programot. Tehát GDB tesz engem vele. Majd kilép, hogy hibakeresés ismét hit gdb debug. OK. Tehát most, vissza, mit csinálok. Szünet fő, szünet ize. Most, ha a program futtatásához, így folytatjuk, amíg eléri a töréspont. Ez a töréspont történik az első, aki a legfontosabb. Most, ahelyett, hogy a következő, a következő, a következő, next, next, amíg elütöttem ize, azt írja is, amely továbbra is amíg el nem éred a következő töréspont. Azt meg kell adnia az egész első. Folytassa addig folytatódik, amíg elütöttem a következő töréspont, ami az, hogy funkciója ize. Így Run-ig tart bejön a töréspont, de csak akkor írja be a Futtatás kezded a programot, majd attól kezdve, hogy folytassa. Ha csak nem törik a fő-és akkor futott, akkor eltöröm a fő-, majd folytassa. Mivel én nem egy töréspontot a foo, adja meg az egész, akkor most én vagyok nem fog megtörni az ize. Ez csak megy, hogy végtelen loop addig. OK. Szóval ez Intro a GDB. Meg kell kezdeni a meg a probléma készletek. Ez nagyon hasznos lehet azonosítani a hibákat. Ha valóban csak, line-by-line, go át a kódot, és hasonlítsa össze mi valójában történik, mit vársz történik, akkor ez elég Nehéz nem észrevenni a hibákat. OK. Így a múlt héten Dávid hozta fel ezt a titkos kulcsú dolgot a első alkalommal, amikor nem akarjuk jelszavakat csak kell tárolni a számítógép néhány egyszerű szöveges fájl, ahol a valaki tud jönni, és csak nyissa fel, és olvassa el. Ideális esetben lennének titkosítva valamilyen módon. És a probléma Set 2, akkor lehet szó az egyik módszer a titkosítás, vagy, nos, a két módszer, de ezek nem olyan nagy. Ha a hacker kiadás, akkor is lesz szó dekódolás néhány dolgot. Tehát a kérdés most az, nos, akkor is, ha mi van a legerősebb titkosítási algoritmus a világon, ha úgy dönt a különösen rossz jelszót, akkor nem segít túl sokat, mivel az emberek továbbra is képes kitalálni. Ha látta a titkosított karaktersorozatot és úgy néz ki, mint a rendetlenség szemetet ez semmit sem jelent számukra, ha még csak meg kell próbálni néhány jelszó kitalálni, akkor nem túl biztonságos. Így néz egy video, hogy teszi, hogy a pont. [VIDEÓ LEJÁTSZÁS] -Helmet, te gazember. Mi folyik itt? Mit csinálsz a lányommal? -Engedje meg, hogy bemutassam a ragyogó fiatal plasztikai sebész, Dr. Phillip Schlotkin, a legnagyobb orr munkahely férfi az egész világegyetem, Beverly Hills. -Felség. -Orr munkát? Nem értem. Ő már volt egy orr munkát. Ez egy édes tizenhat jelen van. -No. Ez nem az, amire gondolsz. Sokkal, sokkal rosszabb. Ha nem adja meg a kombináció a levegő pajzs, Dr. Schlotkin fog adja a lányát vissza a régi orrát. -No. Hol szerezted ezt? -Rendben. Megmondom. Megmondom. Nem, apu. Nem, nem szabad. -Igazad van, kedvesem. Hiányozni fog az új orrát. De nem fogom elmondani neki a kombináció, nem számít, mit. -Nagyon jól. Dr. Schlotkin, nem a legrosszabb. -Szívesen. [Munkagépek kihegyezett] -No. Várjon. Várjon. Megmondom. Megmondom. -Tudtam, hogy ez működni fog. Rendben van. Add ide nekem. -A kombináció egy. -One. -One. -Kettő. -Kettő. -Kettő. -Három. -Három. -Három. Hatvankilenc. Hatvankilenc. Hatvankilenc. -Öt. -Öt. -Öt. -Tehát a kombináció egy, kettő, három, négy, öt. Ez a leghülyébb kombináció , Amit valaha hallottam életemben. Ez az a fajta dolog, amit egy idióta volna az ő poggyász. Köszönöm, Felség. -Mit csináltál? -Kikapcsoltam a falat. -Nem, nem. Ha ki van kapcsolva az egész filmet. -Azt kell nyomni a megfelelő gombot. Nos, tedd vissza. Tedd a filmet vissza. -Igen, uram. Igen, uram. -Menjünk, Arnold. Gyere, Gretchen. Persze, tudom, hogy akkor is kell a számla kiállításához ezt. [END VIDEÓ LEJÁTSZÁS] ROB Boden: Rendben. Most, hogy mi már beszélünk biztonság bizonyos szempontból, szép kis film plakát, így az elmúlt nap, ezek a kérdések az NSA nyomon mindent. Nehéz lehet, hogy úgy érzi, mint te valamiféle magánélet online világban, bár azt nem tudta megmondani leginkább a részleteket PRISM. Tehát túllépve PRISM, nem megyünk meg kell beszélni, hogy most gondolj a laptop. Tehát itt, szeretnék váltani hogy a tényleges számla, az én kis pingvin. Szóval van egy jelszó beállítva, és hogy jelszó, amit akarok, hogy legyen. De ne feledjük, hogy amit én fakitermelés be, így ez a login prompt, néhány programot. Ez valami program volt írta néhány személy. És így, hogy az a személy, amennyiben különösen a rosszindulatú, tudtak azt mondta, rendben, így ha a jelszó hogy meg egyenlő a aktuális jelszót, vagy ez egyenlő Egyes speciális jelszót - David félelmetes, vagy valami - majd hagyd, hogy be Így egy rosszindulatú programozó volna hozzáférést biztosít az összes Mac, vagy a A Windows, vagy bármi. Szóval ez nem nagy aggodalomra ad okot, hiszen Úgy értem, ez a login program ami szállított OS X, több száz vagy több ezer ember felül ezt a kódot. És így, ha a kódot valahol, akkor azt mondják, ha ez a karakterlánc egyenlő az egyenlők David félelmetes, login, akkor valaki lesz, mint, várj. Ez nem helyes. Ez nem lehet itt. Tehát ez az egyik módja annak, hogy a dolgokat hogy milyen biztonságos. De gondolj még programok hogy írsz. Tegyük fel, hogy azt írta a login programot. Szóval ez a login programot, amit írt, Tehát nyilvánvaló, hogy van egy jó programozó. Ugye nem megy, hogy a rosszindulatú ha x értéke egyenlő David félelmetes be a kódot. De ez a program, mit használni fordítani ezt a programot? Valami ilyesmi csenget. Mi van, ha az a személy, aki történetesen levelet csenget speciális tokozású csenget valami ilyesmit, ha én vagyok összeállítása be a program, majd adja meg a kódot a login programot, amely azt mondja, ha a x értéke egyenlő David félelmetes? Tehát még nem teljesen, de ugyanaz a kérdés itt, ahol csenget, nos, ezer, ha nem több tízezer ember nézett csenget, van nézett a sornyi kódot, és azt mondta, minden rendben, nincs semmi rossz itt. Nyilvánvaló, hogy senki nem csinál semmit a rosszindulatú. De mi van csattanással is, mint mi van, ha össze csenget? Mit tegyek, ha van néhány fordítónak, hogy lefordul csenget, hogy szúr a csenget ezt a különleges hack, amely azt mondja, minden rendben, amikor össze csenget, majd a futtatható kapok meg kell külön keresni belül a login programot és betét ezt a jelszót, egyenlő az egyenlők Dave félelmetes? Úgy emlékszem, hogy a fordító maga kell összeállítani egy bizonyos ponton. Tehát, ha az, amit úgy dönt, hogy össze csenget is, maga a rosszindulatú, akkor lehet csavarni az egész út le a pályáról. Tehát itt van Ken Thompson és Dennis Ritchie. Tehát ez egy ikonikus fénykép. Dennis Ritchie a jobb oldalon. Ő az egyik legfontosabb - nagyon sokat írt C, így köszönöm neki ezt az osztályt. Ken Thomson van a bal oldalon. A kettő alapvetően írta UNIX. Nos, voltak nagy szerepük UNIX. Voltak mások. Tehát Ken Thompson, egy bizonyos ponton, megnyeri a Turing-díjat. És a Turing-díjat, én mindig hallottam úgy hivatkozott így, ez a Nobel-díj a számítógép-tudomány. Tehát a Turing-díjat, ő a adja az ő beszédében. És ő adja ezt a nagyon híres beszéd Most hívott Gondolatok Bízva Trust, amely már kapcsolódik Ahhoz, hogy a pályán honlapján. És ez a beszéd, azt mondja, jól van, ezért írtam UNIX, és most minden Ön ember használja UNIX. Nos, ne feledje, ma, hogy a Linux közvetlen leszármazottja UNIX. OS X közvetlenül használja UNIX. A Windows nem annyira, de a sok Az ötletet vett UNIX. Így aztán felmegy a színpadra, és azt mondja, Rendben, írtam UNIX. És csak hogy tudjátok, én vagyok tud bejelentkezni a minden egyetlen egy számítógépen. Mivel tettem egy ilyen különleges, ha x értéke egyenlő Ken Thomson félelmetes, akkor én szabad belépni. Tehát az emberek olyanok, mint, nos, Hogy csináltad? Megnéztük a login programot és semmi sem ott van. Olyan, mint, nos, én módosította a fordító hogy jelentkezzen be a login programot így a login program most lesz hogy x értéke egyenlő Ken Thompson félelmetes. És azt mondják, jó, ez nem igaz. Keressük a fordító, és a fordító nincs vonalak kód ilyesmi. Olyan, mint, rendben van, de mi van összeállítása a fordító az? És azt hiszik, és ő, mint, nos, Én vagyok az, aki adta a fordító Ön használja fordítani a fordító, így akkor összeállítása a fordító, hogy Maga rosszindulatú, és megtörni a login programot. Tehát alapvetően, ezen a ponton, ott van Nincs mód arra, hogy nézd meg a forrást kódja login programot , hogy mi a baj. Lehet nem is néz ki a forráskódját a fordító , hogy mi a baj. Meg kellene nézni a gépen kódot, a tényleges bináris a össze fordító látni, várj, ezek sornyi kódot nem kellene itt lennie. De Ken Thompson lépett egy lépéssel tovább, és azt mondta, jól van ezek a speciális programok, amelyek ténylegesen segít olvassa el a bináris programok, és így ha valaki használják, hogy a program olvassa el a bináris, akkor ezeket a sornyi kódot. Úgy módosították a programok mondani, minden jobb, ha ránézünk a fordító, ne jelenjen meg az adott meg a bináris. Szóval, akkor meg kell, hogy ezt a lépést tovább, és alapvetően, hogy lehetett volna venni többszintű indirekció, és egy bizonyos ponton, senki valójában lesz ellenőrzés. Tehát a történet tanulsága az, hogy te nem fog írni Csattanással ebben az osztályban. Fogsz használni hegymászás Csattanással sokat ebben az osztályban. Minden tudod, csenget egy rosszindulatú program, amely szabotálja minden egyetlen program, amit valaha is össze. És hagyom, hogy a nagyon baljós figyelmét, találkozunk szerdán. [Taps] SPEAKER 2: A következő CS50. SPEAKER 3: Nem merem mondani, hogy. Meg tudod csinálni. Ha már ilyet, meg tudod csinálni ma, meg tudod csinálni holnap. Már ezt évek óta. Csak menj oda, és erre a célra. Meg tudod csinálni. [MUSIC Playing]