[Predvaja glasba] ROB BODEN: V redu. Torej, prva stvar, prvič, video od znanega obraza. [Predvajanje videa] -V redu. To je CS50, in to začetek tritedenskega. Žal mi je, ne morem biti z vami danes, vendar mi dovolite, da se predstavim CS50 lastne Rob Boden. [END Predvajanje videa] [Aplauza in CHEERS] ROB BODEN: filmografija v da video je fantastičen. Vse je v redu. Torej, najprej pa obstaja še en kosilo. To je jutri ob 1:15. Ni kosilo v petek. To je z Quora. Tommy ni tukaj še, ampak eden od ljudje tam je nekdanji CF glavo, Tommy McWilliam. Torej je zabaven fant. Moral bi priti. Vse je v redu. Torej, prejšnji teden smo začeli razbiti kaj niz je res. Poznala sva se že od začetka, da je zaporedje znakov. Toda prejšnji teden smo posegel v resnici da je tisto, kar v resnici zaporedje znaki, no, sedaj imamo nizi znakov. In vemo, da je niz, je niz znakov, na samem koncu, imamo to posebno null bajt, to backslash 0, ki označuje konec niz. In tako niz je niz znaki, vendar smo lahko več kot le niz znakov, imamo lahko niz kateremkoli vrsta stvari želimo. Torej, če se spomnite iz prejšnjega tedna, Vek program, David uvedla res hitro. Torej prva stvar, ki jo boš naredil, je od uporabnika zahteva za celo število, število oseb v sobi. Ko smo to celo, smo razglasitvi niz. Opazili ta nosilec sintakso. Boš navaditi na to. Torej smo razglasitvi niz števil imenovano starosti, in tam so n cela števila v tej matriki. Torej ta vzorec tukaj, ta 4 int i je enak 0, I, nižje od n, i plus plus, da je tudi, da bo vzorec da boste dobili zelo navajeni. Ker to je precej, kako ste Vedno gre za ponovitev nad nizi. Torej, ne pozabite, da je n Dolžina naše matrike. In tako sem, smo se večkrat sprašuje, na starost človeka, ki ga v prostoru. Po tem, gremo dol, in ne glede na samovoljno razlog, potem smo izpisal koliko je star gredo da bo leto dni. In teče ta program, dajva da starost, dot Slash starosti. Tako število ljudi v prostoru, recimo, da obstajajo tri. In pravijo, prva oseba, ki je 13, Naslednja je 26, in nazadnje je 30. Torej bo to ponovitev čez tiste tri ljudje, natisnite 14, 27, in 31. Torej, ne pozabite, da ko izjavljamo matrika velikosti n, indeksi v navedenem matrika, matrika ima vrednote in indeksi 0, 1, 2, vse do n minus 1. Torej, ko smo rekli, da so bili trije ljudje v sobi, in mi dal notri Prva ponovitev skozi to zanke, i se bo 0. Torej, v indeksu 0.. Mi smo dodeljevanje prvi S staranjem uporabnik vnese. Nato pa v naslednjem, smo vstopajo Drugi n uporabnik vnese, in poleg dveh, zadnji n. Tako opazili, da matrika velikosti tri nima ničesar v indeksu tri. To ni veljavna. Vse je v redu. Torej, grem nazaj. Torej sedaj, ko smo se ukvarjali z nizi, imamo nekaj poznam. Zdaj bomo prešli na ukaz Argumenti line, ki se bodo zelo pomembno, da ta problem nizu. Torej, do sedaj, kadar koli ste razglasila svojo glavno funkcijo, ki smo jih je dejal int main neveljavne. Zato nična samo pomeni, da ne bomo mimo koli Argumenti za to funkcijo. Zdaj bomo videli, da je glavna lahko traja nekaj argumentov. Tu jim pravimo int argc in niza argv nosilci. Polnila, še enkrat, kar pomeni, da imamo opravka z nizi. Torej, tukaj, niz argv nosilci, smo , ki se ukvarjajo z vrsto nizov. Torej argc, da se dogaja, da se navede koliko argumenti ki smo jih opravili s tem programom. In videti, kaj to pomeni, dajmo zapreti to. OK. Torej, do sedaj smo teči vsak Program kot pika poševnicama starosti. Mi lahko tudi v ukazni vrstici, mimo mimo argumente, torej izraz, ukaz Argumenti linijo. Torej prva trditev, zdravo svet. Torej, tukaj bi argc trije. To je število argumentov v ukazni vrstici. Argc je vedno vsaj 1, saj pika slash starosti, sama, šteje kot ena od argumenti v ukazni vrstici. Potem zdravo je prvi. Če dot poševnica starosti je Ničti, nato Zdravo je prvi, in svet je Drugi argument ukazne vrstice. Torej niz argv, smo videli, vsebuje nize, pika poševnica starosti, zdravo in svet. In z zahtevo Davida, greva predvajati video posnetek, ki uvaja. [Predvajanje videa] -Do sedaj v programih, ki smo jih napisal, da smo razglasi Glavni kot int main neveljavne. In ves ta čas, da je nična enostavno se navede, da Program ne odgovarja za kakršnokoli Argumenti linija poveljevanja. Z drugimi besedami, ko uporabnik zažene Program, on ali ona lahko zagotovi ukaz Argumenti vrstice s pisanjem dodatna besede ali besedne zveze po programu je ime na poziv. No, če ne želite, da vaš program na sprejme argumente ukazni vrstici, eno ali več takih besed, smo morali zamenjati izničijo z nekaj argumentov. Torej, kaj je to. Vključi CS50.h. Vključujejo standardno io.h. Int main. In zdaj, namesto neveljavne, bom Določite int imenovano argc, in Array strun imenovanih argv. Zdaj, argc in argv so preprosto konvencij. Lahko bi poklical te trditve Najbolj karkoli hočemo. Toda, kaj je pomembno je, da je argc int saj po definiciji, je dogaja, da vsebuje štetje argument, število besed skupaj, da Uporabnik je tipkal na njegovo ali njeno poziv. argv, medtem, argument vektor, je bo dejansko niz shranjevanje vse besede, ki jih ima uporabnik tipkal na njegovo ali njeno poziv. Kaj je nadaljevati nekaj storiti zdaj z enim ali več izmed njih Argumenti linija poveljevanja. Še posebej, gremo naprej in print ne glede beseda uporabnik vnese po imenu programa Ob pozivu. Oklepaj. Zaklepaj. Printf odstotkov s backslash in vejico. In zdaj moram povedati printf kakšno vrednost priključite na to ogrado. Želim prvo besedo, ki je uporabnik tipkal po imenu programa, in tako bom, da določite argv nosilec 1, blizu oklepaj, podpičje. Zakaj nosilec 1 in ne nosilec 0? No, izkazalo se je, se samodejno shranijo v argv 0 se bo Dejansko ime programa. Torej, prva beseda, da uporabnik vnese ko ime programa, je po Konvencija, bo shranjeni v argv 1. Pojdimo zdaj zbira in zagon tega programa. Naredite argv 0, pika slash argv 0. In sedaj beseda kot zdravo. Enter. In tam jo imamo, pozdravljena. [END Predvajanje videa] ROB BODEN: V redu. Zaprite to. Torej ob pogled na ta program, ki smo pravkar uvedla za nas, dobro, samo pokazati, če želimo natisniti argv 0, poskrbite, zdaj kaj je to, argv 0, pika slash argv 0. Tako, kot je bilo pričakovano, da se tiskanje ime programa, saj argv je 0 vedno bo ime programa. Ampak kaj je naredil nekaj, kar bit bolj zanimivo. Torej, problem nizu, boste uveden s to funkcijo, atoi. Torej, kaj bomo uporabili za atoi? To bo za pretvorbo niz na celo število. Torej, če sem mimo niz, ena dva tri, za atoi, da boste spremeniti, da k celo število, ena, dva, tri. Torej bomo za pretvorbo prvi ukazni vrstici argument celo število, in potem samo natisnete to celo število. Torej v bistvu sva nekako reimplementing getint, samo število je vpisana na ukaz linija namesto v programu interaktivno. Torej, zaradi česar argv 0, naredimo je tukaj, in zapreti to. Torej teče argv 0, in naj začne celo, ena dva tri, štiri ena dva. Tako da bomo natisnili celo število, eno dva tri, štiri ena dva. Obstaja nekaj razlik, da atoi, da da bomo prenehali skrbeti o ničemer presegajo veljavne numeričnega znaka, ampak to ni važno. Torej, kaj misliš, da se zgodi če to storim? Segmentacije krivda. Torej, zakaj je to? Če se ozremo na naš program, smo pretvorbo argv 1, prvi argument za imenom programa, na celo število. Ampak ni argument za imenom programa. Torej, tukaj vidimo, da je ta buggy Program, saj, če se trudimo, da bi sistem deloval brez kakršnih koli argumentov, to bo samo crash. Torej še en pogost vzorec boste videli je nekaj takega, kot če je argc manj razen dveh, kar kaže, da ni bilo vsaj ime programa in Prvi argument, potem bomo nekaj storiti kot printf, ni dovolj Argumenti linija poveljevanja. To verjetno ni dobra za tiskanje, to je verjetno nekaj, kot so morate vnesti celo v ukazni vrstici. Jaz bom samo to konča. In se nato vrne 1. Torej, ne pozabite, da je na koncu našega Program, če se vrnemo 0, da nekako označuje uspeh. In glavni samodejno vrne 0, če ne boš. Torej, tukaj, smo retuning 1, ki označuje da to ni uspeh. In da se lahko vrnete, kar hočeš, samo, 0 označuje uspeh, in kaj kaže na neuspeh. Torej, kaj je teči ta različica stvari. Torej, zdaj, če ne bomo vnesite ukazno vrstico Trditev, da bomo pravilno povedal nas, ni dovolj v ukazni vrstici. Ni končal stavek. Else, če bi dejansko šlo skozi eno, je mogoče zaključiti program. Torej, to je, kako bi lahko uporabite v argc Za potrditev število argumenti v ukazni vrstici, da so dejansko opravili. Torej, kaj je, da ta program nekoliko bolj zapletena, in pogled na sekundo ponovitev stvari. Torej, zdaj, bomo ne le tiskanje Argument linija prva zapoved. Tukaj smo ponavljanjem iz int i je enak 0, i manj kot argc, i plus plus, in tiskanje argv, indeks i. Torej ta vzorec, spet, da je to isti vzorec kot prej, razen namesto kliče spremenljivko n, smo s pomočjo argc. Torej je ta ponavljanjem nad vsako indeksa v matriki in tiskanje vsakega element v tej matriki. In tako, ko smo zagon tega programa, dobro, Nisem vstopijo v vse ukazno vrstico argumenti, zato je le odtisi ime programa. Če vpišem kup stvari, da bomo natisniti eno, vsak na svoji vrstici. OK. Torej, vzemimo to en korak naprej. In namesto tiskanje vsako trditev v svoji vrstici, dajmo natisnite vsako značaj vsakega argumenta na svojo linijo. Torej, ne pozabite, da je argv matrika nizov. Torej, kaj je niz, vendar nabor znakov? To pomeni, da je res argv array array znakov. Tako izkoriščajo, da dajmo prezreti to za zdaj. Reciva, menijo niz argv 0. Torej, če želimo, da bi vsak značaj argv 0 v svoji vrstici, nato pa hočem narediti vzorec smo uporabili za, i manjša od dolžine matrike, ki je tu, je strlen v, to je ni tisto, kar želim storiti, niz i enaka 0 argv. Torej i je manjša od dolžine naših matrika, ki je v tem primeru je matrika znakov, i plus plus. In tako, kot smo videli prejšnji teden, je to idealen če gremo, da strlen zunaj stanja, saj n bo dodajanje strlen of s vsakič, ko gremo skozi zanko, in to je ne bomo spreminjali. Torej ga bomo enak N nad tu nastavite. OK. Torej, zdaj, smo ponavljanjem preko vsak indeks v matriki. In tako, če želimo natisniti vsak lik v tej matriki, odstotnim c je zastava želimo uporabiti Za znakov. In sedaj nosilec i se bo Niz, indeks lik i, tako da, če Niz je bilo zdravo. nato s 0 se bo h, S podstavki 1 bo e, in tako naprej. Torej, zdaj smo želeli združiti ti dve stvari. Želimo natisniti vsak znak vsakega argumenta ukazne vrstice. Torej bomo imeli ugnezdene zanke for. In običajno, prvi števec je i, dostavo se bo j, n bo strlen argv i, i manjša od n, i plus plus. In zdaj namesto tiskanja argv i, zato argv nosilec i se bo indeks - , ki bo v ukazni vrstici i- Trditev, argv i, j se bo je j-narava argument i-th. Znebil se bom tega tukaj zdaj saj smo ga v tem krogu. Torej je enakovredna String s enakopravnimi argv i, nato pa je nosilec j. No, ne rabimo, naj ugotovi ta spremenljivka s. Namesto tega bomo samo združiti ti dva v tisto, kar smo imeli, argv i, j. SPEAKER 1: [neslišno]. ROB BODEN: Dobro klic. Torej je ta pokvarjen. Če bi dejansko drži, bomo so to spoznal. Torej števec mi je mar pri tem predvsem za Zanka je j, iterator. Torej bi naletite na vprašanja, Verjetno neskončno zanko, če bomo ni določen, da. Zato smo tudi govorili O debugging danes. OK. Torej, kaj je zagon tega programa. In kaj je dejansko dodali ločeno printf Tukaj je, da bo samo tiskanje drugo linijo, ker to pomeni, ko smo zagnati program, bo prišlo prazno linija med vsako značaja vsak argument ukazne vrstice. No, bomo videli, kaj to pomeni. Oop. Imam neko napako. Napaka implicitno razglasi Funkcija knjižnica strlen. Torej grem nazaj v naš program, sem Pozabil hash vključujejo string.h. Torej string.h se bo header datoteka, ki izjavlja funkcija strlen. OK, to pripravlja. Zdaj pa jo vodijo. Torej samo to. To se dogaja, da natisnete naše ime programa, zdravo svet. To se dogaja, natisnite vsako stvar, vsak značaj, v svoji vrstici. OK. Torej, kaj je dejansko si to en korak naprej. In namesto da bi uporabili string.h, dajmo razmišljati o tem, kako bi morali izvajati lastne strlen funkcijo. Torej bom takoj dal Funkcija podpis. Torej, recimo v my_strlen, in to je bo trajalo niz kot argument, in pričakujemo, da se vrnete Dolžina tega niza. Torej, kje je ta tip? Da. OK. Torej, se spomnite iz prejšnje prosojnice, ki je bil tudi od prejšnjega tedna, da Niz znakov, no, niz, Torej, recimo, da je to naš niz s. Torej, če je s niz, hello, potem, H-E-L-L-O, v pomnilniku, ki se bo biti, in potem je to Nagibnica 0 značaj. Torej, kako bomo dobili dolžino s? No, trik je videti za to zračnost 0 značaj, to null terminator. Torej, algoritem se dogaja bi bilo kaj takega malo dovolj znakov, da - imejmo to roko predstavljajo nekateri števec, recimo to int dolžino. Torej, od tukaj, mi smo gre za ponovitev čez našo nizu. Torej prvi znak, da je H, in to ni vrnil poševnica 0, tako da dolžina je 1. Ponovil na naslednji znak, E, in to ne Nagibnica 0. Dolžina je 2. L, 3. L, 4. O, 5. In na koncu smo dosegli backslash 0, in tako to pomeni, no, Ta niz je konec. Torej vrnimo 5. Tako dejansko izvajanje, da, prvič, moja n dolžina je enaka 0, moja desna roka. In bomo Ponovil - SPEAKER 1: [neslišno] ROB BODEN: Oh, sranje. Dobra odločitev. Boom. Torej dolžina je n enak 0. Torej, zdaj, ko s Dolžina ne enako in potem backslash 0. Torej, ne pozabite, to poševnico 0, je dejanski značaj, in to pomeni, koncu niza. Tako kot tudi, poševnica nazaj n je dejanska karakter. Backslash 0 se dogaja, da navede Konec našega niza. Ne želim dati, da obstaja. In medtem ko govorite, ki jih indeksira dolžine ni enak nulte terminator, potem smo le, da bo prirastek dolžine. Torej, na koncu našega programa dolžina je na koncu bo je 5 v tem primeru. In bova vrnila dolžino. OK. Torej, zdaj sem dol, jaz ne narediti my_strlen. Naredimo to prevesti, da poskrbite, da vse teče gladko. Sem počel v 2? Ali je bilo to 1? To bi morali storiti. Vse je v redu. Torej je to argv 2. Deluje kot pričakovano, čeprav je bil, da tisti, ki sem jo naredil v? Da. OK. Ta različica stvari, ki niso imeli printf nova linija po tem, vendar pa ne bo nobene razlike. OK. Tako delal kot je bilo pričakovano. Zdaj bomo lahko celo združiti ta korak nadalje, če je obvestilo tukaj, no, Najprej smo oprijemalne strlen argv i, nato pa smo ponavljanjem preko vsak znak v tem nizu. Torej, namesto da delaš to, kaj pa če smo samo združiti ta logika čakanja dokler ne bomo zadeli Nagibnica 0 pravico v to zanko? Torej Ponovil medtem argv i, j ne ni enak 0 backslash. Torej, kaj je to prvi zagon. Vse je v redu. Torej, tukaj, ta pogoj je rekel - kaj je jasno, da. Torej, zdaj, naj bo to naš argv. Torej, ko sem tekel, da program pred, argv je množica nizov. In tako, če sem ga teči z dot poševnica argv 2, zdravo svet, potem argv sama dolžina 3, za argv nič, zdravo in svet. In znotraj vsakega od teh indeksov je, sam niz, kjer je to bo pika, bo to slash, ne vem če bi bila prava smer, sem Ne verjamem, da je. -R-V dash, potrebujejo več prostora. Pojdimo v tem polju. -R-V črtica 0, nato pa nagibnica 0. In nato v neredu bo zdravo. Reciva, H-E poševnico 0. In končno, W-O Nagibnica 0. Torej algoritem, ki smo pravkar napisal, ugnezdena za zank, kaj oni početje je, moramo najprej boj i in nato j. To bi bilo lažje z oznako na zaslon, Vrniva se k temu. OK. Tako opazili, da je i iterator, da je ponavljanjem nad vsakim ukazom argument linijo. In j je iterator ponavljanjem čez vsak znak v tem, da argument ukazne vrstice. Torej, kaj je to notranja printf počne je, da smo printf argv 0 0, printf argv 0 1 printf argv 0 2 0 3 0 4 0 5 0 6, zdaj pa, argv 0 7 se dogaja, da enako backslash 0. Torej imamo izhod, da za zanke, in zdaj sem se ponovi za 1. In zdaj bomo tisk argv 1 0, argv 1 1 - No, saj sem cut zdravo kratko, argv 1 2 spet bo backslash 0. In tako, prirastek i in nadaljuje, in tako naprej, dokler se ne izpiše vse svet, in to so trije ukazni vrstici argumenti, in bomo izhod iz najbolj oddaljenih zanke in dokončati naš program. OK. Torej, kaj je prišel nazaj. Tako boste pridobili nekaj poznavanja argumenti v ukazni vrstici o tem Poseben problem nastaviti. Zdaj, odpravljanje napak. Torej, ste verjetno že moral storiti nekateri debugging z dosedanjim Problem nastavite. In še ena zelo enostaven način za odpravljanje napak, Najprej si oglejmo program Otroški voziček. No, sprehod skozi ta program, bomo od uporabnika zahteva za celo število, zgrabita celo število, in nato, samovoljno, imamo while zanko, ki je le, da bo pojemanje i, dokler ne bo enaka 10. Reciva prevzeti jaz vstopu celo število, večje od 10. Torej pojemanje i, dokler ne bo enaka 10. In potem imamo še eno while zanko da, medtem ko ni enak 0, smo bo pojemanje i s 3. Torej, če ste videli namena bug tukaj, je, da bomo to pojemanje i je 10, in potem je to zanko, medtem ko bo vzroka i od 10, do 7, na 4, 1, negativnega 2, v negativno 5, in tako naprej, negativne neskončnosti, saj bom nikoli dejansko enaka 0. In nato ob koncu tega programa, imamo funkcijo foo ki dogaja tisku, da i. Torej je to kratko in trivialno program in bug je očitno, še posebej po tem, ko sem je povedal, kaj je bug. Ampak namen tukaj je, no, to bi lahko dejansko videti kot nekateri vaši Rešitve iz požrešen od zadnje problem določiti, in morda imate, nekateri neskončne zanke v vašem programu, in nimate pojma kaj ga povzroča. Torej zelo uporabna debugging tehnika je, da samo dodati printfs vsem kodi. Torej, tukaj hočem printf zunaj Prva while zanko. In tukaj želim printf, in bom samo tiskanje i. Bom še storiti najprej, medtem ko zanke, i. Zunaj, drugi while zanko. Še enkrat, tiskati v notranjosti od tu, vrednost i. In kaj je zagon tega. Torej dot slash razhroščevanje. Vnesite celo število. Naredimo 13. In boom. Vidimo, da smo neskončna zanka notranjostjo druge, medtem ko zanke. Torej, zdaj vemo, kaj je bug. Vendar printf debugging je popolnoma super, ampak ko vaši programi dobili več in bolj zapletena, obstajajo bolj sofisticirane rešitve pridobivanje stvari delajo. Torej, kaj je odstraniti vse te printfs. In da poskrbite nisem prekinil ničesar. OK. Torej program, greva uvede se imenuje GDB, za GNU Debugger. No, pravzaprav, kaj je odstraniti razhroščevanje za drugič, in da razhroščevanje znova. No, pravzaprav prvi, dobra lekcija v argumentih ukazni vrstici. Vedite, da je ta Jek ukaz, da je sestavljanje vse, ki se prenaša v ukazni vrstici, ti Argumenti linija poveljevanja. Torej, točno, kako se bodo s pomočjo argumenti v ukazni vrstici, kot smo storila prej, in kot boste v PSET 2, to je, kako Jek je njihovo uporabo. Tako opazili, da je to prva zastava, dash ggdb3, kaj želi povedati, Jek, morate zbrati te datoteke z nameri, da bomo sčasoma morate debug. Tako dolgo, kot ste to zastavo, potem bomo lahko GDB razhroščevanje. In bomo odprli GNU Debugger. Torej obstaja veliko ukazov da boste morali navaditi. Prvi je, da boste verjetno Takoj potrebujemo, Run. Torej, kaj je Run boš naredil? To se dogaja, da začnemo program. Torej teči, začetni program, program nas prosi za celo število, 13. In potem je neskončna zanka kot Pričakuje se, razen da odstranimo printfs, tako da sploh ne vidim. Običajno izstopilo. Oh. Možno je, da je zavit vse obratno, nazaj - ignorirajo to. Predvidevam, da ni izhod normalno. Tam je zapleten odgovor na to. Torej sedaj, da to ni zelo koristno. Tako da samo teče naš program znotraj ta razhroščevalnik nam ne pomaga v katerikoli način, saj smo lahko le narediti dot poševnica razhroščevanje od zunaj GDB. Torej en ukaz, da Verjetno boste - in to bom nehal. Control-d ali zaprete, tako delo. Torej, kaj je to ponovno odprla. Še en ukaz, ki ga boste verjetno takoj želeli navaditi, da je Break. Torej bomo odmor na glavni za zdaj, in potem vam bom razložil, da je. No, tukaj vidimo smo nastaviti odmerka V tej vrstici v debug.c. Torej, kaj odmor pomeni, da ko sem tip tek, program bo tekli naprej, dokler Sem udaril prekinitveno točko. Torej, ko sem udaril teči, se program zažene, in potem se pokvari takoj, ko je to vstopi v glavni funkcijo. Glavni odmor se bo nekaj ste precej pogosto storiti. In zdaj, da vam predstavim za nekaj več ukazov. Opazil sem, da je rekel, da zlomil na liniji 11, ki je printf, vnesite celo število. Torej ukaz Naprej se bo, kako gremo na naslednjo vrstico kode. To se dogaja, da nam omogočajo, da okrepijo s pomočjo naše programske vrsticah. Torej, naslednjič. Zdaj linija 12, greva da bi dobili celo število. Naprej. In če si zadeti nastopiti še enkrat, bo to redo je zadnja stvar si naredil. Tako da mi ni treba vnesti Naslednja vsakič. Torej, vnesite celo število, 13. Torej, zdaj, linija 14, medtem ko i je večja od 10, in jaz bom zraven. In vidimo, da bomo pojemanje i. Torej bomo pojemanje spet. Torej, zdaj, drugo koristno ukaz Print. Torej Print se bo izpisal vrednost spremenljivke. Pripeljimo vrednost spremenljivke i. Oglejmo tiskanje i. To se dogaja, da sem se 11. Zdaj smo spet Naslednja medtem I je večji od 10. Torej, jaz še vedno večji od 10, saj je 11. i minus minus. Oglejmo natisnete spet. Kot je bilo pričakovati, je 10. Torej, zdaj, naslednji. To se bo vrnil v stanju, i večje od 10, vendar sem zdaj 10, tako ni večja od 10, tako da pričakujemo, da bo da pade ven iz while zanko. In zdaj smo pod to vrstico kode. In še en ukaz, Seznam, je le, da bo Za prikaz prejšnjo in naslednjo Nekaj ​​vrstic kode, v primeru, da ste se izgubili. Torej smo pravkar zapustil ta while zanko, in zdaj smo tako začel while zanko, vrstica 18. Torej, medtem ko i ni enak 0. , In nato i je enak i minus 3, mi pa bomo obvestilo, bo to samo nadaljuj. In lahko natisnete i. Vsak ukaz je neke vrste bližnjice. Zato p je okrajšava za tiskanje. Tako da bomo lahko p i. Samo ne drži n, ali vztrajati početje Naprej. Natisni spet. Vidiš, zdaj je negativen 167. Torej, to bo šlo v nedogled, vendar ne res večno, saj si videl, da bo dejansko na koncu na neki točki. Tako da se Začetek GDB. Ampak kaj je naredil eno stvar v GDB. Uh, razhroščevanje. Torej, v tem posebnem primeru neskončna zanka se je zgodilo, da je znotraj Glavna funkcija. In za zdaj, samo sprejemajo, da sem gre za premik neskončno zanko v Funkcija foo. Samo pozabiti, da ob koncu tega Program, no, to je bilo prvotno kliče foo, ki je bil pravkar tiskovine i. Zdaj pa kličeš foo, ki je bo pojemanje i, dokler ne bo 0, in nato natisnete to spremenljivko. OK. Le da. Naredite razhroščevanje. In zdaj, gdb razhroščevanje. OK. Torej, če sem teči, potem jaz ne bom lahko dejansko korak po mojih Program linija-by-line. Torej, kaj je odmor na glavni, in vnesite tek. Torej iti skozi to, printf, vnesite število, dobili celo število, 13. Torej bomo, da decrementing dokler I je večji od 10. Potem bomo padli skozi while zanko, in priti do črte - dajmo jo odprli v ločenem oknu. Tako smo decremented dokler sem bil več večji od 10, in nato smo imenovano funkcijo, foo. Torej, kaj se je zgodilo takoj, ko sem udaril Funkcija foo, dobro, sem poklical foo, in potem nisem več imel nadzora nad GDB. Torej, takoj, ko sem udaril Naprej na tej liniji, Stvari nadaljevati, dokler se je to zgodilo, kjer program izstopilo ko - Predvidevam, da ni obstajala na koncu. Videli ste, da ustavite za nekaj, čeprav. Torej, zakaj sem izgubil nadzor nad Program na tej točki? No, ko sem tipa zraven, da gre za literal naslednjo vrstico kode, ki bodo izvajale. Torej po vrstici 21, naslednjo vrstico kode ki bo izvajal je linija 22, ki je izhod iz glavnega. Torej, ne želim, da pojdi na naslednjo vrstico kode. Rad bi šel v funkcijo, foo, in nato korak tudi skozi teh vrstic kode. Torej za to, da imamo alternativo. Oglejmo nehal, da še enkrat. Glavni odmor. Uh, 1, next, next, 13, naslednji, next, next, previdno, preden smo zadeli postavo foo. OK. Torej sedaj, smo na liniji 21, kjer pravimo foo. Nočemo, da bi naslednji tip, saj to bo le poklicati funkcijo foo, in pojdite na naslednjo vrstico kode. Kaj želimo uporabiti, je korak. Torej je razlika med korakom in Next, kjer korak korake v deluje, in Next gre v funkciji. To samo izvaja celoto funkcijo in gre naprej. Torej korak nam bo prinesla v funkciji, foo. In vidimo tukaj, zdaj smo nazaj na to zanko, medtem ko je to v teoriji, bo nadaljevala večno. In če ste zadeli korak, kadar to ni niti Funkcija za klic, potem je to identična Naprej. Torej je le takrat, ko ste na vrsti, da kliče funkcijo, ki Step se dogaja, da se razlikujejo od Naprej. Torej nam bo korak pripeljal sem. Korak, korak, korak, korak, korak, korak, in Enostavno bomo neskončno zanko za vedno. Tako da boste morda navaditi, da je kot vaš način ugotavljanja neskončne zanke, je Samo držite to tipko ENTER za videli, če se vam zatakne. Obstajajo boljši načini za to, vendar za zdaj, to je povsem zadostuje. In slogovno, da so skladni s stilom 50, naj bi to naredil. OK. Tako je eden zadnji ukaz, da uvedejo. No, pa GDB razhroščevanje prijavite Torej, namesto da bi poškodovali pri glavni, če sem poznati funkcije foo je tudi problem, potem pa sem lahko samo še omenjeno, break na foo, namesto tega. Recimo, da sem prekinil na oba glavna in foo. Tako da lahko nastavite toliko prelomnih točk kakor hočeš. Ko sem tipa teči, da se dogaja ustaviti na - Oh, kaj je prevedem, saj Spremenil sem stvari. Videli boste to vrstico, opozorila vir datoteka je novejša kot izvršljiv. To pomeni, da sem šel v tu in spremenili ti skladni s stilom 50, vendar nisem prevedem Program. Torej GDB me zavedati. Jaz bom nehal, da razhroščevanje spet, hit gdb razhroščevanje. OK. Torej sedaj, nazaj, kaj sem počel. Break glavni odmor, foo. Zdaj, če sem teči program, tako da je bo nadaljevala, dokler ne zadene Prelomne točke. Ta prekinitvena točka se zgodi, da bo prvič na glavni. Zdaj, namesto da delaš zraven, next, next, next, next, dokler nisem udaril foo, I lahko vnesete še naprej, kar se bo nadaljevalo dokler ne zadeti naslednje prelomne točke. Moram najprej vnesti celo število. Še naprej se bo nadaljevalo, dokler nisem zadel Naslednje mejne vrednosti so, to je, da funkcija foo. Tako bodo Run teči, dokler ne zadeti prekinitvena točka, ampak samo pri vožnji, ko ste začeli program, in nato, od takrat naprej, je nadaljeval. Če Pravkar sem prekinil glavni in potem tekel, se bo zlomil na Glavni in nato nadaljujte. Ker nimam break točko, na foo, vnesite celo število, potem pa sem zdaj ne bo prekinil na foo. To je le, da bo neskončno zanka do tega. OK. Tako da je Uvod v GDB. Moral bi začeli uporabljati v svojih problematičnih sklopov. To je lahko zelo koristno prepoznati napake. Če ste dejansko le, linija-by-line, pojdite skozi svojo kodo, in primerjati, kaj je dejansko dogaja s tem, kar ste pričakovali zgodilo, potem je to precej težko zgrešiti svoje napake. OK. Torej, prejšnji teden je David pripeljal do tega skrivni ključ kriptografija stvari za Prvič, kjer ne želimo Gesla se samo shranjeni na našem Računalnik v nekaterih golo besedilno datoteko, kjer lahko nekdo prišel mimo in pravkar jo odprli in jih preberete. V idealnem primeru bi bili šifrirani na nek način. In Problem Set 2, boste morali ukvarjati z eno metodo šifriranja, ali, no, dva načina, vendar niso tako velika. Če boste to storili izdajo hacker, si tudi dogaja, da se ukvarjajo z dešifriranje nekaj stvari. Torej, vprašanje je zdaj, dobro, čeprav imamo najmočnejšo šifriranje algoritem na svetu, če se odločite zlasti slabi geslo, potem vam ne bo pomagalo zelo veliko, saj ljudje bodo še vedno lahko pogruntal. Tudi če vidim šifrirani niz in je videti kot zmešnjava smeti da ne pomeni nič z njimi, če se še vedno potrebujejo samo poskusiti nekaj gesel pogruntati, potem niso zelo varna. Tako gledanje video, ki naredi to točko. [Predvajanje videa] -Helmet, ti fanatik. Kaj se dogaja? Kaj počneš z mojo hčerko? -Dovolite mi, da predstavim briljantno Mlada plastični kirurg, dr Phillip Schlotkin, največji nos posel človek v celotnem vesolje in Beverly Hills. -Vaše veličanstvo. -Nos? Ne razumem. Ona je že imela operacijo nosu. To je bil Sweet Sixteen prisotna. -Ne. To ni tisto, kar misliš. To je veliko, veliko slabše. Če mi ne dajo kombinacijo za zračni ščit, dr Schlotkin bo dal svojo hčer nazaj svoj stari nos. -Ne. Kje si dobil to? -V redu. Jaz bom povedal. Jaz bom povedal. Ne, očka. Ne, ne smeš. -Prav imaš, draga moja. Pogrešal bom svoj novi nos. Ampak jaz mu ne bom povedala kombinacijo, ni važno kaj. -Zelo dobro. Dr Schlotkin, da svoje najhujše. -V veselje mi je. [ORODJA SE izostril] -Ne. Čakati. Čakati. Jaz bom povedal. Jaz bom povedal. -Vedel sem, da bo delovalo. Vse je v redu. Daj mi ga. -Kombinacija je ena. -One. -One. Dva. Dva. Dva. -Tri. -Tri. -Tri. -Four. -Four. -Four. -Five. -Five. -Five. Torej kombinacija je ena, dva, tri, štiri, pet. To je najbolj neumna kombinacija Kar sem jih kdaj slišal v svojem življenju. To je nekaj takega idiot bi imel na svoji prtljagi. Hvala, vaša visokost. -Kaj si naredil? -I izklopljen steno. -Ne nisi. Ste izklopili celoten film. -Verjetno sem pritisnil napačen gumb. No, daj nazaj. Dal film nazaj. -Da, gospod. Da, gospod. Pojdimo, Arnold. Pridi, Gretchen. Seveda, veste, jaz bom še moral zaračunavati za to. [END Predvajanje videa] ROB BODEN: V redu. Torej sedaj, da smo že govorili o Varnost v nekaterih pogledih, lepo Malo movie poster, tako da v zadnjih letih dni, ta vprašanja z NSA spremljanje vsega. To je lahko težko, da se počutijo, kot si ti neke vrste zasebnosti Svetovni splet, čeprav nisem mogel povedati, si večina podrobnosti prizmo. Torej sprave prizmo, ne bomo da bi govoril o tem, zdaj pomisli vaš prenosnik. Torej tukaj, želim, da preklopite na moj dejanski račun, z mojo malo pingvina. Torej imam nastaviti geslo, in da geslo, kar hočem biti. Ampak ne pozabite, da tisto, kar sem se prijavite se z, tako da je ta prijava poziv, je nekaj programa. To je nekaj program, ki je bil napisal neki osebi. In tako, da oseba, če so še posebej škodljivo, bi lahko so rekli, v redu, tako da, če geslo da vnesem enak my Dejanska geslo, ali pa je enaka do neke posebno geslo - David je super, ali kaj podobnega - nato pa jih je spustil noter Torej bi lahko zlonamerno programer imajo Dostop do vseh vaših Mac, ali Okna, ali kaj podobnega. Tako da ni veliko skrb, saj Mislim, da je to program, prijava , ki je priložena OS X, na stotine ali tisoče ljudi ima pregledal to kodo. In tako, če je v kodi nekje, si reči, če je ta niz enak enak David je super, prijavo, nato pa je nekdo bo, kot, počakaj. To ni prav. To ne bi smelo biti tukaj. Torej, to je eden od načinov, smo dobili stvari da bi nekako varen. Ampak pomisli celo programov da ste napisali. Recimo, da ste napisal program za prijavo. Torej, to prijavo program, ki ga je napisal, torej je očitno, da ste dober programer. Saj ne bo dal zlonamerne če je x enak enaka David je super v kodi. Vendar ta program, kaj storiti, uporabite za pripravo tega programa? Nekaj ​​podobnega Jek. Pa kaj, če oseba, ki se je zgodilo napišite Jek special obloženega v Jek nekaj podobnega, če sem zbiranju prijavi se program, potem to kodo v program vpisu, ki pravi, če x je enaka enaka David je super? Torej, še ne čisto, ampak imamo isto izda tu, kjer Jek, dobro, tisoče, če ne na tisoče Ljudje, ki so pogledal Jek, imajo Pogledal svojih vrstic kode in dejal, Vse je v redu, nič ni slabo. Očitno je, da nihče ne počne kaj to zlonamerno. Toda kaj se sama Jek, kot so, Kaj pa, če prevedem Jek? Kaj, če imam nekaj prevajalnik, ki pripravlja Jek da vstavi v Jek to posebno kramp, ki pravi, vse v redu, ko sem zbrati Jek, nato izvršljiv sem se morala posebej pogledati znotraj programa vpisu in vložek To geslo je enaka enaka Dave je super? Torej, ne pozabite, da je vaš sam prevajalnik Treba je sestaviti na neki točki. Torej, če kaj se odločite, da pripravijo Jek s, sam je zlonamerno, potem mogoče priviti celotno Tako po vrsti. Torej, tukaj imamo Ken Thompson Dennis Ritchie. Torej je to ikonično fotografijo. Dennis Ritchie je na desni strani. Bil je velik - precej napisal C. Torej si lahko mu zahvaljujem za ta razred. Ken Thomson je na levi strani. Dva izmed njih v bistvu pisal UNIX. No, oni so najbolj prispevale v UNIX. Tam so bili nekateri drugi. Torej, Ken Thompson, na neki točki, osvoji Turing Award. In Turing nagrado, vedno sem slišal se sklicuje na ta način, da je Nobelova nagrada računalništva. Torej na Turing Award, mora dati zahvalnem govoru. In mu daje to zelo znanem govoru Zdaj, imenovano Razmišljanja o zaupljivi Zaupanje, ki smo povezani da se na spletni strani predmeta. In v tem govoru, pravi, vse v redu, zato sem napisal UNIX, in zdaj vsi ti ljudje uporabljajo UNIX. Zdaj, ne pozabite, danes, da je Linux neposredni potomec UNIX. OS X neposredno uporablja UNIX. Windows ne tako veliko, vendar veliko idej so bili odvzeti iz Unixa. Torej, ko gre gor na oder in reče: V redu je, sem napisal UNIX. In samo zato, da veste, da sem možnost, da se prijavite na vsak niti eden od vaših računalnikov. Ker sem eden od teh posebnega, če x enaka enaka Ken Thomson je super, Nato mi je dovoljeno, da se prijavite. Torej, ljudje so kot dobro, Kako si to naredil? Pogledali smo na programu vpisu in nič ni tam. On je kot, no, sem spremenil prevajalnik za prijavo v program vpisu tako da bo program za prijavo zdaj da je x enak enaka Ken Thompson je super. In pravijo, no, da to ni res. Smo iskali na prevajalnik, in prevajalnik nima linije Šifra tako. On je tako, OK, ampak kaj ste sestavljanje prevajalnik z? In mislijo, in on je, kot, no, Jaz sem tisti, ki ti je dal prevajalnik boste uporabljali za izdelavo prevajalnik, tako ste sestavljanje prevajalnik, ki sam je zlonamerna, in bo prekinil program prijavo. Torej v bistvu, na tej točki, da je noben način si lahko ogledate na viru Koda programa vpisu da vidim, kaj je narobe. Nisi mogel niti pogledati v izvorno kodo prevajalnika da vidim, kaj je narobe. Ti bi morali gledati na stroju Koda, dejanski binarni od zbrati prevajalnik videti, čakaj, ti vrstic kode ne bi smel biti tukaj. Ampak Ken Thompson je to en korak še dlje in rekel, dobro, obstajajo ti posebni programi, ki dejansko vam brati binarno programov, in tako, če nekdo uporablja, da je program za preberite binarno, bi videli te vrstic kode. On je spremenjen teh programov za povedati, vsi V redu, če ste iskali na prevajalnik, ne kažejo, da to zlasti Niz binarno. Torej boste morali sprejeti, da korak naprej in v bistvu, bi lahko, da imajo sprejetih več ravni indirection, in na neki točki, nihče pravzaprav bodo preverjanje. Torej Nauk zgodbe je, da si ne bo treba pisati Zvoka v tem razredu. Boste uporabljali plezanje Jek veliko v tem razredu. Za vse, kar morate vedeti, Jek je zlonamerna Program, ki se sabotira vsak sam program ste kdaj zbrati. In da greš o tem zelo zlovešč Upoštevajte, vidimo v sredo. [APPLAUSE] SPEAKER 2: Na naslednjem CS50. ZVOČNIK 3: Ne drzni si reči, da. To lahko storite. Vi ste to storila prej, lahko to storite Danes, lahko to storite jutri. Ste to počne že vrsto let. Samo pojdi tja in to. To lahko storite. [Predvaja glasba]