[MUZIKO Ludanta] ROB Boden: Bone. Do, unua afero unue, de video el familiara vizaĝo. [VIDEO reprodukto] -Bone. Ĉi tio estas CS50, kaj ĉi tiu estas la komencon de semajno tri. Mi bedaŭras, mi ne povis esti tie kun vi hodiaŭ, sed permesu al mi prezenti CS50 propra Rob Boden. [FINO VIDEO reprodukto] [Aplaŭdo kaj gaja] ROB Boden: La filmografía en ke la video estas fantazia. Ĉiuj pravas. Do unue, estas alia tagmanĝo. Ĝi estas morgaŭ je 1:15. Mankas tagmanĝo tiun vendredon. Estas kun Quora. Kaj Tommy ne ĉi tie ankoraŭ, sed unu el la homoj estas eksa estro CF, Tommy McWilliam. Li do estas amuza ulo. Vi venu. Ĉiuj pravas. Do la lasta semajno, ni komencis rompi aparte pri kio ŝnuro vere estas. Ni sciis ekde la komenco, ke ĝi estas vico de signoj. Sed lastan semajnon, ni enprofundiĝis en la fakto ke kio vere estas vico de karakterojn, bone, ni nun havas arrays de karakteroj. Kaj ni scias, ke kordoj, ĝi estas tabelo de karakteroj, ke je la fino, ni havas tiun specialan nulan bajto, tio backslash 0, kiu indikas la finon de la kordo. Kaj tia ĉeno estas tabelo de karakterojn, sed ni povas havi pli ol nur tabelo de signoj, ni povas havi tabelon de iu ajn tipo de afero, kiun ni volas. Do, se vi memoras de lasta semajno, la Epokoj programo kiun David enkondukis vere rapide. Do unue ni tuj faros estas demandu al la uzanto por entjero, la nombro de homoj en la ĉambro. Iam ni havi tiun entjero, ni deklari tabelon. Rimarku ĉi krampo sintakso. Vi tuj kutimiĝi al tio. Do ni deklari tabelon de entjeroj nomas aĝoj, kaj tie estas n entjeroj en tiu tabelo. Do tiu modelo, ĝuste ĉi tie, ĉi 4 int i egalas 0, i estas malpli ol n, i pli alpago, kiu estas ankaŭ tuj estos mastron ke vi akiras tre uzata por. Ĉar tio estas sufiĉe multe kiel vi estas irante ĉiam persisti super arrays. Do memoru, ke n estas la longeco de nia tabelo. Kaj do tie, ni ree demandas cxar la aĝon de persono i en la ĉambron. Post ĉi tiu, ni iru malsupren, kaj por kio ajn arbitran kialo, ni do presi Kian aĝon ili iras esti jaro de nun. Kaj kurinte tiu programo, ni fari aĝoj, dot oblikvo aĝoj. Do nombro de homoj en la ĉambron, diru tie estas tri. Kaj diru, la unua persono estas 13, sekvanta estas 26, kaj la lasta estas 30. Tial do tio devos persisti super tiuj tri homoj, presi 14, 27, kaj 31. Do memoru, ke kiam ni deklaru tabelo de amplekso n, la indeksoj en tiu tabelo, la tabelo havas valorojn kaj indeksoj 0, 1, 2, la tuta vojo ĝis n minus 1. Do kiam ni diris tie estis tri personoj en la ĉambro, kaj ni metu tien la unua ripeto tra tiu buklo, i tuj esti 0. Do en indekso 0. Ni atribuante la unua kadukiĝi la uzanto eniras. Tiam en la sekva, ni eniras la dua n la uzanto eniras, kaj en apud du, la lasta n. Do rimarkos ke tabelo de grandeco tri havas nenion en la indekso la tri. Tiu ne estas valida. Ĉiuj pravas. Do, irante reen tie. Do nun, ke ni jam pritraktis sensilo, Ni havas kelkajn familiareco. Nun ni tuj pluiri al komando linio argumentoj, kiuj estas tuj estos bela rilatajn al tiu problemo aro. Do ĝis nun, kiam vi havas deklaris via ĉefa funkcio, ni diris int ĉefa malplenon. Do malplenon simple signifas, ke ni ne pasante ajna argumentojn por tiu funkcio. Nun ni iras, por vidi ke la ĉefaj povas preni kelkajn argumentojn. Jen ni nomas ilin int argc kaj ŝnuro argv krampoj. La krampoj, refoje, indikante kiuj ni estas kontraktanta kun arrays. Do jen, kordo argv krampoj, ni estas kontraktanta kun tabelo de kordoj. Do argc, ke tuj indikos kiom da argumentoj ni pasis al tiu programo. Kaj vidi kion tio signifas, ni fermu. OK. Do ĝis nun, ni kuros ĉiu programo kiel skalara oblikvo aĝoj. Ni povas ankaux, en la komandlinio, preter pasi argumentoj, tial la termino, ordono linio argumentoj. Do la unua argumento, saluton mondo. Do jen, argc estus tri. Ĝi estas la grafo de la argumentoj ĉe la komandlinio. Argc estas ĉiam almenaŭ 1, ekde punkto oblikvo aĝoj, mem, rakontas kiel unu el la komandlinio argumentoj. Tiam saluton estas la unua. Se skalara oblikvo aĝoj estas la nula, tiam saluton estas la unua, kaj la mondo estas la dua komandlinia argumento. Do la kordo argv, ni tuj vidos, Enhavas la kordoj, skalara oblikvo aĝoj, saluton, kaj la mondo. Kaj, per Davido peto, ni iras ludi video enkonduki tion. [VIDEO reprodukto] -Ĝis nun en programoj ni skribita, ni deklarus ĉefa, kiel int ĉefa malplenon. Kaj cxi tiu tuta tempo, tiu malplena havas simple estis preciziganta ke la programo ne preni ajnan komandlinia argumentoj. En aliaj vortoj, kiam uzanto kuras programon, li aŭ ŝi povas havigi komando linio argumentoj por skribi aldonan vortoj aŭ frazoj post la programo nomumi ĉe la prompto. Nu, se vi ĉu vi volas, ke via programo por preni komandlinia argumentojn, unu aŭ pli tiaj vortoj, ni devas anstataŭi vanigas kun paro da argumentoj. Do ni faru tion. Inkluzivi CS50.h. Inkluzivi normo io.h. Int main. Kaj nun, anstataŭ malplenon, mi tuj specifi int nomata argc, kaj tabelo de kordoj nomata argv. Nun, argc kaj argv estas simple konvencioj. Ni povis esti nomata tiuj argumentoj plej ion ni volas. Sed kio gravas estas ke argc estas an int ĉar, laŭ difino, ĝi estas tuj enhavos la argumento grafo, la nombro de vortoj en entute, ke la uzanto tajpita en lia aŭ ŝia prompto. argv, dume, argumento vektoro, estas tuj reale esti tabelo stokante ĉiuj vortoj, kiujn la uzanto havas tajpitaj en lia aŭ ŝia prompto. Ni plue agos ion nun kun unu aŭ pli el tiuj komandlinia argumentoj. En aparta, ni iru antaŭen kaj printi kion ajn vorto la uzanto tajpas post la programon La nomo ĉe la prompto. Malferma krampo. Fermu krampo. Printf procento s backslash kaj komo. Kaj nun mi bezonas rakonti al printf kio valoro ŝtopi en tiun lokokupilo. Mi volas la unua vorto, ke la uzanto havas tajpitaj post la programo la nomo kaj do mi tuj specifi argv krampo 1, proksime parentezo, punktokomo. Nu, kial krampo 1 kaj ne krampo 0? Nu, tio rezultas, aŭtomate stokitaj en argv 0 tuj estos la programo realan nomon. Do la unua vorto, ke la uzanto tajpas post la programon La nomo estas, por kongreso, tuj estos stokita en argv 1. Ni nun kompili kaj kuros ĉi programo. Faru argv 0, skalara oblikvo argv 0. Kaj nun unu vorton kiel saluton. Eniru. Kaj tie ni havas ĝin, saluton. [FINO VIDEO reprodukto] ROB Boden: Bone. Fermu tio. Do prenante rigardon al tiu programo kiu ni ĵus enkondukis nin, bone, nur por montri, se ni presi argv 0, fari, nun kio ĝi estas, argv 0, skalara oblikvo argv 0. Do, kiel atendita, ĝi estas la impreso el la nomo de la programo, ĉar argv 0 estas ĉiam tuj estos la nomo de la programo. Sed ni faru ion pli mordis pli interesa. Do la problemo aro, vi estos prezentis al tiu funkcio, atoi. Do kion ni uzas atoi por? Tio okazas por konverti ŝnuro al entjero. Do se mi pasas la kordoj, unu du tri, al atoi, kiuj devos konverti ke al la entjero, unu du tri. Do ni tuj konverti la unua komandlinia argumento por entjero, kaj tiam ĝuste presi ke entjero. Do esence, ni estas speco de reimplementing getint, nur la entjero estas eniris en la komando linio anstataŭ en la programo interage. Tial do, farante argv 0, ni faru ĝin en ĉi tie, kaj fermos, ke. Do kurante argv 0, kaj ni eniros en la entjero, unu du tri kvar unu du. Do tio devos presi la entjero, unu du tri kvar unu du. Estas iuj subtilaĵoj al atoi ke ĝi ĉesos zorgi pri io preter valida numera karaktero, sed tio ne gravas. Do, kion vi opinias okazas se mi faras tion? Segmentación kulpo. Do kial estas tio? Se vi retrorigardas al nia programo, ni estas konvertanta argv 1, la unua argumento post la programon nomon, por entjero. Sed ne estas argumento pasis post la programo nomo. Do jen, ni vidas, ke tiu estas kalesxo programo, ekde, se ni provas ruli ĝin sen ajna argumentoj, tio estos nur frakasi. Do alia komuna modelo, vi vidos Estas io kiel, se argc estas malpli ol du, indikante ke ne estis almenaŭ la programo nomon kaj unua argumento, tiam ni faros ion kiel printf, ne sufiĉas komandlinia argumentoj. Tio verŝajne ne estas bona por presi, ĝi estas probable io, kiel vi devus entajpi entjeron ĉe la komandlinio. Mi nur finos ĝin tie. Kaj tiam revenu 1. Do memoru, ke je la fino de nia programon, se ni revenos 0, ke ia indikas sukceson. Kaj ĉefa ankaŭ aŭtomate Revenas 0 se vi ne faras. Do jen, ni retuning 1 indiki ke tio ne estas sukceso. Kaj vi povas reveni, kion ajn vi volas, ĝuste, 0 indikas sukceson, kaj io alia indikas fiaskon. Do ni kuros ĉi versio de la aferoj. Do nun, se ni ne enigi komandlinion argumento, gxi devos korekte diri ni, ne sufiĉas komandlinio. Ne finis la frazon. Alie, se ni vere pasi ĝin unu, ĝi povas kompletigi la programon. Do jen kiel vi uzus argc en Por validigi la nombro de komandlinia argumentojn ke efektive pasis. Do ni faru ĉi programo iom pli komplika, kaj rigardu la duan ripeto de la aferoj. Do nun, ni ne nur presi la unua komandlinia argumento. Tie, ni ripetanta de int i egaluloj 0, i estas malpli ol argc, i pli plus, kaj impreso argv, indekso i. Do ĉi tiu ŝablono, denove, ĉi tiu estas la sama mastro kiel antaŭe, escepte anstataŭ nomi la variablo n, ni uzas argc. Do tiu estas ripetanta super ĉiu indekso en la tabelo, kaj presi ĉiu elemento en tiu tabelo. Kaj cxiufoje, kiam ni kuros ĉi programo, bone, Mi ne eniris ajnan komandlinia argumentoj, do ĝi apenaŭ printaĵoj la programo nomo. Se mi eniras faskon da aferoj, tio timige presi, ĉiu sur ĝia propra linio. OK. Do ni prenu plupaŝi. Kaj anstataŭ presi ĉiun argumenton sur ĝia propra linio, ni presas ĉiu karakteron de ĉiu argumento sur ĝia propra linio. Do memoru, ke argv estas tabelo de kordoj. Do kio estas ĉeno, sed tabelo de signoj? Do tio signifas ke argv estas vere tabelo de tabelo de signoj. Do utiligante ke, ni ignoras tion por nun. Ni nur konsideri la kordo argv 0. Do, se ni volas alporti ĉiu karaktero de argv 0 sur ĝia propra linio, tiam mi deziras fari la ŝablono ni kutimis, i estas malpli ol la longo de la tabelo, kiun ĉi tie, estas strlen de, tio estas ne estas kion mi volas fari, kordo s egalas argv 0. Do i estas malpli ol la longo de nia tabelo, kiu en ĉi tiu kazo estas tabelo de karakteroj, i plus plus. Kaj tiel, kiel ni vidis, pasintsemajne, estas idealo se ni movas ke strlen ekstere de la kondiĉo, ekde n estos esti aldono la strlen de s ĉiu tempo ni iru tra la ciklo, kaj ĝi estas ne tuj estos ŝanĝanta. Do ni starigis ĝin egala al n ĉi tie. OK. Do nun, ni ripetanta super ĉiu indekso en la tabelo. Kaj do, se ni deziras presi ĉiu karakteron en tiu tabelo, procento c estas la flago oni volas uzi por gravuloj. Kaj nun harpinglo i tuj estos la kordo, indekso karaktero i, do se la kordo estis saluton. Tiam S 0 tuj estos h, s krampo 1 estos e, kaj tiel plu. Do nun ni volas kombini ĉi tiuj du aferoj. Ni volas presi ĉiu karaktero de ĉiu komandlinia argumento. Do ni tuj havos a nestitaj por buklo. Kaj konvencie, la unua nombrilo Estas mi, la sekvanta tuj estos j, n Estos la strlen de argv i, i estas malpli ol n, i plus plus. Kaj nun, anstataŭ presi argv i, tiel argv krampo i tuj indekso - ke tuj estos la i-a komandlinia argumento, argv i, j tuj esti la jth karakteron de la i-a argumento. Mi liveras de ĉi tien nun ĉar ni metis ĝin en tiun cirklon. Do estas ekvivalento al kordo s egaluloj argv i, kaj tiam s krampo j. Nu, ni ne bezonas por deklari ĉi variablo s. Anstataŭe, ni nur kombini tiujn du en kio ni havis, argv i, j. SPEAKER 1: [inaudibles]. ROB Boden: Bonan alvokon. Do tiu estas rompita. Se mi efektive kuris, ni farus rimarkis tion. Do la nombrilo mi zorgas pri en tiu aparta por buklo estas J, la iterator. Do vi estus kolizii temoj, verŝajne malfinia ciklo, se ni ne estis fiksita, ke. Tial ni ankaux parolas pri elpurigi hodiaŭ. OK. Do ni kuros ĉi programo. Kaj ni efektive aldonu apartan printf ĝuste ĉi tie, ke estos ĝuste presi alia linio, ĉar tio signifas, kiam ni ruli la programon, tie estos malplenan linio inter ĉiu karaktero de ĉiu komandlinia argumento. Nu, ni vidos kion tio signifas. OOP. Got iun cimon. Eraro implice deklarante biblioteko funkcio strlen. Do reiri al nia programo, mi forgesis hash inkluzivi string.h. Do string.h tuj estos la kaplinio dosiero kiu deklaras la funkcio strlen. OK, kompilas. Nun, ni ruli ĝin. Do ĝuste tion. Ĝi tuj presi nian programo nomo, saluton mondo. Ĝi tuj presi ĉiu aĵo, ĉiu karaktero, en lia propra linio. OK. Do ni reale preni ĉi unu paŝon plu. Kaj anstataŭ uzi string.h, ni pensu pri kiel ni volus realigi nian propran strlen funkcio. Do mi devos tuj donu funkcio subskribon. Do ni nomas en my_strlen, kaj ĝi estas tuj prenos kordo kiel argumento, kaj ni atendas por reveni al la longeco de tiu ĉeno. Do, kie estas tiu knabo? Jes. OK. Do memoras el la pli frua slide ke Estis ankaŭ el pasintsemajne, ke tabelo de signoj, bone, ŝnuro, do ni diru cxi tiu estas nia kordo s. Do, se s estas la kordo, saluton, tiam, H-E-L-L-ho, en la memoro, ke tuj esti, kaj tiam ĉi backslash 0 karaktero. Do kiel ni ricevas la longeco de s? Nu, la truko serĉas ĉi reagon 0 karaktero, tiu nula finilo. Do la algoritmo tuj esti io kiel malmultaj sufiĉe karakteroj ke - ni havas ĉi mano reprezenti iun nombrilo, ni nomas tiun int longeco. Do, ekde super cxi tie, ni estas irante persisti super niaj kordo. Do la unua signo, estas H, kaj ĝi ne estas reen oblikvo 0, tiel la longo estas 1. Persisti ĝis la venonta signo, E, kaj ĝi ne estas backslash 0. Daŭro estas 2. L, 3. L, 4. Ho, 5. Kaj fine, ni atingas backslash 0, kaj tial, ke rimedoj, bone, tiu cxeno estas finita. Do ni revenu 5. Do efektive apliki ke, unue, mia n longo egalas 0, mia dekstra mano. Kaj ni iras persisti - SPEAKER 1: [inaudibles] ROB Boden: Ho, pafi. Bonan alvokon. Eksplodo. Do n longo egalas 0. Do nun, dum s longo ne egalaj kaj tiam, backslash 0. Do memoru, ĉi backslash 0, ĝi estas efektiva karaktero, kaj gxi indikas la finon de la ŝnuro. Same kiel, ankaŭ, backslash n estas reala karaktero. Backslash 0 tuj indikos la finon de nia kordo. Mi ne volas meti tiun tie. Kaj dum s indeksita per longo estas egala al la nula finilo, tiam ni nur iri al pliigo longa. Tial do, je la fino de nia programo, longeco estas eventuale tuj estu 5 en tiu kazo. Kaj ni vidos ĝuste redoni longa. OK. Do nun cxi tie, mi ne faras fari my_strlen. Ni kompili gxin por certigi ĉio funkcias glate. Ĉu mi faras en 2? Aux estis, ke 1? Tio devus fari. Ĉiuj pravas. Do tiu estas argv 2. Laboras kiel anticipis, kvankam estis, ke la unu mi tion faris en? Jes. OK. Ĉi tiu versio de aĵoj ne havas la printf novan linion post, sed ne fari ian diferencon. OK. Do laboris kiel atendita. Nun ni povas eĉ kombini ĉi tiu paŝo plui, kie avizo tie, bone, unue, ni kaptante la strlen de argv i, kaj tiam ni ripetanta super ĉiun karakteron en tiu kordo. Do anstataŭ fari tion, kion, se ni nur kombini tiun logikon de atendis gxis ni batis backslash 0 dekstra en ĉi tiun por buklo? Do ankaŭ persisti dum argv i, j faras Ne egala backslash 0. Do ni ruli ĝin unue. Ĉiuj pravas. Do ĉi tie, ĉi tiu kondiĉo estas jene - ni purigi tion. Do nun, cxi tio estu nia argv. Do, kiam mi simple kuris tiu programo antaŭ, argv estas tabelo de kordoj. Kaj tial, se mi kuras kun skalara oblikvo argv 2, saluton mondo, tiam la argv sin estas longo 3, por argv nulo, saluton, kaj la mondo. Kaj ene de ĉiu el tiuj indeksoj estas, mem tabelo, kie tio estos streketo ĉi estos oblikvo, mi ne scias se tiu estis la ĝustan direkton, mi ne pensu estis. A-R-V haltostreko, bezonas pli da spaco. Ni tranĉis en tiun tabelo. A-R-V haltostreko 0, kaj tiam backslash 0. Kaj tiam en malordo estos saluton. Ni diru, H-E backslash 0. Kaj fine, W-Ho backslash 0. Do la algoritmo, ke ni nur skribis, la neston por masxojn, kio ili estas fari estas, ni devas unue la kontraŭi i kaj tiam j. Ĉi tiu estus pli facile kun kodo en la ekrano, Ni revenu al tio. OK. Do rimarkos ke mi estas la iterator tio ripetanta super ĉiu komando linio argumento. Kaj j estas la iterator ripetanta super ĉiu signo en tiu komandlinia argumento. Do kio estas tiu interna printf faras estas ni printf argv 0 0, printf argv 0 1 printf argv 0 2, 0 3 0 4 0 5, 0 6, sed nun, argv 0 7 tuj egala backslash 0. Do tiam ni eliros ke por buklo, Kaj nun mi ripetas al 1. Kaj nun ni iras al print argv 1 0, argv 1 1 - nu, nun, kiam mi tranĉis saluton mallonga, argv 1 2 estas denove tuj estos backslash 0. Kaj do, pliigo i kaj daŭrigi, kaj tiel plu, ĝis ni presi ĉiuj mondo, kaj tiuj estas tri komandlinia argumentoj, kaj ni devos eliri el la plej ekstera iteracio, kaj fini nian programon. OK. Do ni revenu ĉi tien. Do vi devos gajni iun familiareco kun komandlinia argumentojn sur tiu apartan problemon agordi. Nun, debugging. Do vi probable jam devis fari iuj debugging kun via antaŭa problemo metita. Kaj unu tre facila vojo de debugging, unue, ni rigardu a buggy programo. Nu, promenante tra tiu programo, ni iras, por demandi al la uzanto por entjera, grab ke entjero, kaj tiam, arbitre, ni havas tempon buklo ke estas ĝuste tuj dekremento i ĝis ĝi estas egala al 10. Ni simple supozi ke mi eniri entjero pli granda ol 10. Do dekremento i ĝis ĝi estas egala al 10. Kaj tiam ni havos alian dum buklo ke, dum i ne egalas 0, ni estas tuj dekremento i per 3. Do, se vi vidos la intenco de la bug ĉi tie, estas ke tiu povos dekremento i al estos 10, kaj tiam ĉi tio dum buklo volo dekremento i el 10, 7, 4, 1, al negativa 2, al negativa 5, kaj tiel plu, al negativa malfinio, kiam mi volas, neniam vere egalus 0. Kaj poste, je la fino de tiu programo, ni havas la foo funkcio kiu estas irante sur print ke i. Do tiu estas mallonga kaj bagatela programo, kaj la eraro estas evidenta, speciale post mi simple diris kion la cimon estis. Sed la intenco ĉi tie estas, nu, tio eble efektive aspektas kiel kelkaj el viaj solvojn de avidaj de la lasta problemo starigis, kaj eble vi ne havos iuj senfina iteracio en vian programon, kaj vi ne havas ideon kio kaŭzis ĝin. Do tre utila debugging tekniko estas nur aldonu printfs ĉie en via kodo. Do ĉi tie mi deziras printf ekstere unue dum buklo. Kaj tie mi volas printf, kaj mi nur presi i. Mi eĉ fari unue dum buklo, i. Ekstere, dua dum buklo. Denove, presi interne el tie, la valoro i. Kaj ni kuros ĉi. Do dot oblikvo erarserĉilo. Entajpu entjero. Ni do 13. Kaj eksplodo. Ni vidas, ke ni estas senfinaj looping ene de la dua dum buklo. Do nun ni scias kio estas la eraro estas. Sed printf debugging estas perfekte granduloj, sed unufoje viaj programoj akiri pli kaj pli komplikaj, esas pli kompleksajn solvojn al getting aferoj laborante. Do ni forigos ĉiujn tiujn printfs. Kaj ni certigu mi ne rompi nenion. OK. Do la programo ni iras enkonduki nomiĝas GDB, por GNU Debugger. Nu, fakte, ni forigi erarserĉilo por duan, kaj fari elpurigi denove. Nu, efektive la unua, bonan lecionon en komandlinio argumentoj. Rimarku ke ĉi tin komando kiu estas kompili ĉio estas aprobotaj ĉe la komandlinio, tiuj komandlinia argumentoj. Do ĝuste kiel vi tuj uzos komandlinia argumentoj, kiel ni faris antaŭe, kaj tiel vi havos en PSET 2, tiel estas kiel tin uzas ilin. Do rimarki ke tiu unua flago, haltostreko ggdb3, kio tio estas diro, tin, vi devas kompili tiun dosieron kun la intenco, ke ni volas eventuale bezonas elpurigi ĝin. Do tiel longe, kiel vi havas tiun flagon, tiam ni povas GDB erarserĉilo. Kaj gxi donos malfermi la GNU Debugger. Do tie estas multe da ordonoj ke vi devas alkutimiĝi al. Unue oni ke vi probable Tuj bezonas estas Kuru. Do kio estas Kuru tuj faros? Ĝi tuj komencu nian programon. Do kuru, komencante programo, la programo demandas nin por entjero, 13. Kaj tiam estas malfinia looping kiel atendis, krom mi forigis la printfs, do ni ne eĉ vidi tion. Ĝi eliris normale. Oh. Estas ebla, ke ĝi envolvis la tutan vojo ĉirkaŭ, reen al - ignorante tion. Alpreni ne eliri normale. Tie estas komplika respondo al tiu. Do nun, tio ne estas tre utila. Do nur kurante nian programon ene de ĉi debugger ne helpas al ni en iu maniero, ĉar ni povis jxus faris dot oblikvo elpurigi de ekstere GDB. Do la ordono, ke Vi verŝajne - kaj mi rezignis tion. Kontrolo-d aŭ rezigni, ambaŭ laboras. Do ni malfermu ĝin denove. Alia komando kiu vi probable tuj volas alkutimiĝi al estas Break. Do ni rompos la ĉefa por nun, kaj tiam Mi klarigos tion. Nu, jen ni vidas ni aperigos Haltpunkto en ĉi tiu linio en debug.c. Do kio ripozon rimedoj estas ke kiam mi tajpi run, la programo tuj daŭrigi kuri ĝis Mi trafi Haltpunkto. Do kiam mi batis run, la programo komencas, kaj tiam ĝi rompas tuj kiam Eniras la ĉefa funkcio. Break ĉefa tuj estos io vi belan komune fari. Kaj nun, por enkonduki vin iuj pli komandoj. Rimarku ĉi tie, ke ĝi estas jene ni rompis ĉe linio 11, kiu estas printf, eniru entjero. Do la komando Sekva tuj estos kiel ni iru al la sekvanta linio de kodo. Tiu tuj permesos ke ni tretas tra nia programo linio por linio. Do sekvanta. Nun la linio 12, ni iras por ricevi la entjero. Sekva. Kaj se vi ĵus batis Enskribu denove, ĝi malebligos refari la lastan aferon vi faris. Do mi ne bezonas tajpi sekvanta ĉiufoje. Do eniri entjero, 13. Do nun, linio 14, dum i estas granda ol 10, kaj mi devos fari. Kaj ni vidos ni tuj dekremento i. Do ni tuj dekremento i denove. Do nun, alia utila komando estas Print. Do Presi tuj presi La valoro de la variablo. Ni elirigi la valoro de variablo i. Ni presas i. Ĝi estas dironta i estas 11. Nun ni Sekva denove dum i estas pli granda ol 10. Do i estas ankoraŭ pli granda ol 10, ĉar ĝi estas 11. i minus minus. Ni presas i denove. Kiel atendita, ĝi estas 10. Do nun, proksima. Ĝi okazas reen al la kondiĉo, i estas pli granda ol 10, sed i estas nun 10, tiel ĝi ne estas pli granda ol 10, do ni atendas ĝin fali el la tempo buklo. Kaj nun ni estas sub tiu linio de kodo. Kaj alia ordono, Listo, estas nur irante por montri la antaŭa kaj sekva paro de linioj de kodo, en kazo vi perdis vin. Do ni simple ĝi eliris ĉi dum buklo, kaj nun ni jam eniris tiun dum buklo, linio 18. Do, dum mi ne egalas 0. Kaj, tuj poste, i egalas i minus 3, kaj ni rimarki, ĉi devos nur plu iri. Kaj ni povas presi i. Ĉiu komando ia havas rektajn alirojn. Do p estas mallonga por Print. Do ni povas p i. Nur gardu tenante n, aŭ daŭre fari Sekva. Presi i denove. Vi vidas nun ĝi estas negativa 167. Do tio devos daŭrigi eterne, sed ne vere eterne, ĉar vi ĵus vidis, ke efektive finos je iu punkto. Do kiu estas Komencante GDB. Sed ni faru pli aferon en GDB. Uh, erarserĉilo. Do, en tiu aparta kazo, la senfina iteracio okazis esti interne de la ĉefa funkcio. Kaj nuntempe, simple akcepti ke tio mi estas tuj movu la senfina iteracio en la foo funkcio. Nur memoru ke, ĉe la fino de tiu programo, nu, tiu estis originale nomante foo, kiu estis nur tuj presi i. Sed nun ni petas foo, kiu estas tuj dekremento i ĝis ĝi estas 0, kaj tiam presi tiu variablo. OK. Savi. Faru erarserĉilo. Kaj nun, gdb erarserĉilo. OK. Do, se mi ĝuste Kuru do mi ne tuj povos reale step per mia programo linio-per-linio. Do ni rompos ĉe ĉefa, kaj tiam tajpi run. Do iri tra ĉi tiu, printf, eniri entjera, akiru la entjero, 13. Do ni tuj teni decrementing ĝis mi estas pli granda ol 10. Tiam ni iras por fali tra la dum buklo, kaj instigi al la linio - ni malfermas gxin en apartan fenestron. Do ni decremented ĝis mi ne plu pli granda ol 10, kaj poste ni vokis la funkcio, foo. Do, kio okazis kiam mi trafis funkcio foo, bone, mi alvokis foo, kaj tiam mi ne plu havis kontrolon super GDB. Tuj, kiam mi batis Sekva ĉe ĉi tiu linio, tion sekvis ĝis tiu okazis, kie la programo ĝi eliris, kiam - supozi ne ekzistis iam. Vi vidis lin paŭzi por iom kvankam. Do, kial mi perdos la kontrolon super la programo je tiu punkto? Nu, kiam mi tajpas proksima, kiu iras al la laŭvorta sekva linio de kodo ke Mi faros. Do post linio 21, la sekvanta linio de kodo ke estos ekzekuti estas linio 22, kio estas, elirante el ĉefaj. Do mi ne volas ĝuste iri al la sekvanta linio de kodo. Mi volas iri en la funkcio, foo, kaj tiam ankaŭ treti tra tiuj linioj de kodo. Do pro tio, ni havas alternativon. Ni lasis tion denove. Break ĉefa. Uh, 1, proksima, sekva, 13, proksima, proksima, sekvanta, zorgeme, antaŭ ol ni batis linio foo. OK. Do nun, ni estas ĉe linio 21, kie ni nomas foo. Ni ne volas tajpi proksima, char tio Mi simple vokas la funkcion foo, kaj iri al la sekvanta linio de kodo. Kion ni volas uzi estas Ŝtupo. Do tie estas diferenco inter Ŝtupo kaj Venonta, kie Ŝtupo paŝas en la funkcii, kaj Sekva iras super la funkcio. Ĝi simple ekzekutu la tuteco de la funkcio kaj konservas iras. Do Ŝtupo tuj venigi nin en la funkcio, foo. Kaj ni vidas tie, nun, ni estas denove en tiu dum buklo tio, en teorio, daŭros ĉiam. Kaj se vi batis Ŝtupo, kiam tio estas eĉ ne funkcio por voki, ĉar ĝi estas identa al Next. Do estas nur kiam vi estas en linion kiu vokas funkcio kiu Ŝtupo tuj diferencigas Sekva. Do Ŝtupo venigos nin tien. Paŝo, step, ŝtupo, paŝo, step, ŝtupo, kaj Ni simple senfina iteracio ĉiam. Do vi povus alkutimiĝi al tio, kiel via manieron de identigo senfina masxojn, estas nur tenante ĉi Eniga klavo por rigardu, kie vi akiras ŝtopita. Esas bona manieroj por fari tion, sed cxar nun, tio estas perfekte sufiĉa. Kaj stile, konformi Stilo 50, mi devus esti farinta tion. OK. Do unu lastan komandon enkonduki. Nu, ni GDB elpurigi in Do anstataux rompi en ĉefa, se mi konas la foo funkcio estas ankaŭ la problemo, tiam mi povus havi nur diris, rompi ĉe foo, anstataŭe. Diru Mi rompos cxe ambaŭ ĉefaj kaj foo. Do vi povas difini kiel multaj breakpoints kiel vi volas. Kiam mi tajpas kuri, tio okazas halti ĉe la - ooh, ni rekompili, ekde Mi ŝanĝis tion. Vi vidos ĉi linion, Warning, fonto dosiero estas pli freŝa ol plenumebla. Do tio signifas ke mi nur envenis ĉi tien kaj sxangxis tiujn konformi Stilo 50, sed mi ne rekompili la programo. Do GDB igas min konscias pri tio. Mi rezignis, fari elpurigi denove, batis gdb erarserĉilo. OK. Do nun, reen al kion mi faras. Break ĉefa, rompo foo. Nun, se mi kuros al la programo, tiel ĝi estas tuj pluiri ĝis kolizias kun Haltpunkto. Tio Haltpunkto okazas al esti la unua en ĉefa. Nun, anstataŭ fari proksima, sekvanta, sekva, proksima, sekvanta, ĝis mi trafis foo, mi povas tajpi daŭrigi, kio sekvos ĝis vi batis la sekvanta Haltpunkto. Mi devas eniri la entjera unue. Daŭrigu daŭrigos ĝis mi trafis la sekvanta Haltpunkto, kio estas tio funkcio de foo. Do Run kuros, ĝis vi trafi Haltpunkto, sed vi nur tajpi run kiam vi komenci la programon, kaj poste, de tiam, ĝi estas daŭrigi. Se mi ĝuste faris rompi ĉefa kaj tiam kuris gxi rompos cxe ĉefa, kaj tiam daŭrigu. Ĉar mi ne havas ripozon punkto je foo, eniri la entjero, tiam nun mi estas Ne tuj rompos ĉe foo. Ĝi estas ĝuste tuj infinito buklo ĝis tiu. OK. Do jen Intro al GDB. Vi devus ekuzi gxin en via problemo aroj. Ĝi povas esti tre utila identigi cimojn. Se vi fakte ĝuste, linio-per-linio, iru tra via kodo, kaj kompari kio estas efektive okazas kun kion vi atendas okazi, tiam estas sufiĉe malfacile perdi vian cimojn. OK. Do pasintsemajne David alportis tiun sekretajn-ŝlosila ĉifriko ajxojn la unua fojo, kie ni ne volas pasvortojn nur esti stokita en nia komputilo en iu simpla teksto-dosiero, kie iu povas veni kaj justa malfermu ĝin supren kaj legi ilin. Ideale, oni devus esti ĉifrita iel. Kaj en Problemo Ara 2, vi estos kontraktanta kun unu metodo de ĉifrado, aŭ, bone, du metodoj, sed ili ne estas tiom granda. Se vi faras la hacker eldono, vi estas ankaŭ tuj estos kontraktanta kun decrypting kelkaj aĵoj. Do la demando nun estas, nu, eĉ se ni havas la plej fortan ĉifradon algoritmo en la mondo, se vi elektos aparte malriĉaj pasvorton, tiam ne helpos vin tre multe, ĉar la homo plu povos ekkompreni gxin. Eĉ se vidante la ĉifrita kordo kaj ĝi aspektas kiel salato de rubo tio signifas nenion al ili, se ili ankoraŭ devas nur provu kelkaj pasvortoj ekkompreni gxin, tiam vi ne estas tre sekura. Do rigardante video kiu faras tiun punkton. [VIDEO reprodukto] -Kasko, vi Fiend. Kio okazas? Kion vi faras kun mia filino? -Permesu al mi prezenti la genian juna plasto kirurgo, D-ro Phillip Schlotkin, la plej granda nazo job viro en la tuta universo, kaj Beverly Hills. -Via Moŝto. -Nazo job? Mi ne komprenas. Ŝi jam havis nazon laboron. Estis dolĉa dekses ĉeestas. -No. Ĝi ne estas kion vi pensas. Ĝi estas multe, multe pli malbonaj. Se vi ne donos al mi la kombino de la aero ŝildo, Dr Schlotkin volo donu vian filinon reen sian malnovan nazo. -No. Kie vi trovis tion? -Bone. Mi diros. Mi diros. Ne, paĉjo. Ne, vi ne devas. -Vi pravas, mia kara. Mi mankos via nova nazo. Sed mi ne diros al li la ĉifro, negrave kion. -Tre bone. Dr Schlotkin, faru vian malbonan. -Mia plezuro. [Iloj Estulo akrigita] -No. Atendu. Atendu. Mi diros. Mi diros. -Mi sciis, ke tio funkcios. Ĉiuj pravas. Donu ĝin al mi. -La kombinaĵo estas unu. -Unu. -Unu. -Du. -Du. -Du. -Tri. -Tri. -Tri. -Kvar. -Kvar. -Kvar. -Kvin. -Kvin. -Kvin. -Do la kombino estas unu, du, tri, kvar, kvin. Tio estas la stupidest kombinaĵo Mi iam aŭdis en mia vivo. Tio estas la speco de afero idioto havus sur lian pakaĵon. -Dankon, via Moŝto. -Kion vi faras? -Mi elŝaltis la muro. -Ne vi ne faris tion. Vi elŝaltis la tuta filmo. -Mi devas premis malĝustan butonon. -Nu, remetis ĝin sur. Metu la filmon dorson. -Jes, sinjoro. Jes, sinjoro. -Ni iru, Arnold. Venu, Gretchen. Kompreneble, vi konas min timige ankoraŭ devas fakturojn vi pro tio. [FINO VIDEO reprodukto] ROB Boden: Bone. Do nun, ke ni jam parolas pri sekureco en kelkaj manieroj, agrablaj iom movie poster, do en la lastaj tagoj, tiuj temoj kun la NSA vigladon ĉion. Ĝi povas esti malfacile sentas kiel vi havas ian intimecon en la interreta mondo, kvankam mi ne povus diri vi plejparto de la detaloj de PRISM. Do moviĝas preter PRISM, ni ne tuj por paroli pri tio, nun pensas pri via tekkomputilo. Do ĝis ĉi tie, mi volas ŝanĝi al mia aktuala konto, kun mia eta pingveno. Do mi havas pasvorton aro, kaj tiu pasvorto estas kion mi volas esti. Sed memoru, ke kion mi ensalutante kun tiel ĉi ensaluto prompto, estas iu programo. Estas iuj programo kiu estis skribita de iu persono. Kaj tiel, ke persono, se ili estas aparte malica, ili povis ili diris: Tute bone, do se la pasvorto ke mi eniras estas egala al mia reala pasvorton, aŭ ĝi estas egala iuj specialaj pasvorto - David estas timinda aŭ io - tiam tiuj, in Do malica programisto povus havi aliro al cxio de via Mac, aŭ Fenestroj, aŭ nenion. Por ke ne estas multa de maltrankvilo, ekde, Mi volas diri, ĉi tiu estas ensaluto programo tio estas senditaj kun OS X, centoj aŭ miloj da homoj havas recenzis tiun kodon. Kaj do, se, en via kodo ie, vi diri, se tiu linio egalas egaluloj David estas timinda, ensalutu, tiam iu estas tuj estos, kiel, atendu. Ĉi tio ne estas prava. Tio ne devus esti tie. Do jen unu maniero ni preni aĵojn esti speco de sekura. Sed pensi eĉ programoj ke vi skribas. Imagu ke vi verkis la ensaluto programo. Do tiu ensaluto programo kiun vi skribis, do evidente, vi estas bona programisto. Vi ne tuj metu ajnan malica se x egalas egalas David estas timinda en via kodo. Sed tiu programo, kion fari vin uzi kompili tiun programon? Io kiel tin. Do kio okazos se la persono kiu okazis skribi tin specialaj cased en tin io kiel, se mi estas kompili la ensaluti programon, do eniri ĉi kodo en la saluta programo kiu diras, se x egalas egalas David estas timinda? Do ne tute ankoraŭ, sed ni havas la saman ekspedi ĉi tie, kie tin bone, milojn, se ne dekojn da miloj de homoj, kiuj rigardis tin havas rigardis liajn liniojn de kodo kaj diris: ĉiuj pravas, nenio estas malbona ĉi tie. Evidente, neniu estas faranta ion ĉi malica. Sed kio estas tin mem, kiel, kio se mi kompilos tin? Kio, se mi havas iun tradukilon ke kompilanto tin kiuj enmetas en tin tiu speciala hack kiu diras, ĉiuj pravas, kiam mi kompilas tin, tiam la plenumebla mi get devus speciale rigardu interne de la ensaluto programo kaj insert tiun pasvorton, egalas egaluloj Dave estas timinda? Do memoru, ke via tradukilo mem tio devas esti kompilita je iu punkto. Do, se kion vi elektas por kompili tin kun, mem estas malica, tiam vi povus esti ŝraŭbitaj la tuta lauxlonge de la linio. Do jen, ni havas Ken Thompson kaj Dennis Ritchie. Do tiu estas ikono foto. Dennis Ritchie estas dekstre. Li estas grava - bela multe skribis C. Do vi povas danki lin por ĉi tiu klaso. Ken Thomson estas maldekstre. La du el ili esence skribis Unikso. Nu, ili estis grandaj kontribuantoj en Unikso. Tie estis iuj aliaj. Do Ken Thompson, en iu punkto, li gajnas la Turing Award. Kaj la Turing-premio, mi ĉiam aŭdis ĝi referencita tiamaniere, ĝi estas la Nobel-Premio pri komputiko. Do, je la Premio Turing, li devas donu lian paroladon. Kaj ĝi donas ĉi tre fama parolado Nun, alvokis Reflections on Konfidante Fidu, kion ni kunligis To je la kurso retejo. Kaj en ĉi tiu parolado, li diras, ĉiuj pravas, do mi skribis UNIX, kaj nun ĉiuj vi personoj uzas UNIX. Nun, memoru nun, ke Linukso estas rekta posteulo de Unikso. OS X rekte uzas UNIX. Vindozo ne tiom multe, sed multe de ideoj estis prenitaj de Unikso. Do li iros sur la scenejo kaj diras: Enorde, mi skribis Unikso. Kaj ĝuste tial vi uloj scias, mi estas povos ensaluti en ĉiun sola unu de viaj komputiloj. Ekde mi metis unu el tiuj specialaj se x egalas egalas Ken Thomson estas timinda, tiam mi rajtas ensaluti. Do homoj estas kiel, tiel, Kiel vi faras tion? Ni rigardis la ensaluto programo kaj nenio estas tie. Li estas kiel, bone, mi modifis la tradukilo por ensaluti en la saluta programo tiel ke la ensaluto programo nun havos ke x egalas egalas Ken Thompson estas timinda. Kaj oni diras, nu, tio ne estas vera. Ni rigardis la tradukilo kaj la tradukilo ne havas ajnan liniojn de kodo ŝatas tion. Li estas kiel, nu bone, sed kio estas vi kompili la tradukilo per? Kaj ili pensas, kaj li estas, kiel, tiel, Mi estas tiu, kiu donis al vi la tradukilo vi uzas por kompili la tradukilo, tiel vi estas kompilante tradukilon, ke sin estas malicaj, kaj volo rompi la ensaluto programo. Do esence, je tiu punkto, estas neniel vi povus rigardi la fonto kodo de la ensaluto programo por vidi, kio estas malbone. Vi ecx ne povis rigardi en la fonta kodo de la tradukilo por vidi, kio estas malbone. Vi bezonus rigardi la maŝino kodo, la efektiva duuma de la kompilita tradukilo por vidi, atendu, tiuj linioj de kodo ne devus esti tie. Sed Ken Thompson prenis unu paŝo tie kaj diris: Bone, estas tiujn specialajn programojn kiuj reale helpi vin legi la duuma de programoj, kaj do se iu uzas tiun programon al legi la duuma, ili vidus tiujn linioj de kodo. Li modifita tiujn programojn diri, ĉiuj Bone, se vi rigardas la tradukilo, mi ne montras tiun apartan aro de duuma. Do tiam vi bezonos preni tiun ŝtupon pli kaj esence, kiu povis havi prenitaj multaj niveloj de indirección, kaj en iu momento, neniu estas vere tuj estos checking. Do la moralo de la rakonto estas, vi estas Ne tuj skribos Tin en ĉi tiu kategorio. Vi tuj povas uzi grimpadon Tin multon en tiu klaso. Por ĉiuj vi scias, tin estas malica programo kiu saboteando ĉiu sola programo vi iam kompilitaj. Kaj lasos vin sur tiu tre malbonaŭgura rimarku, vidi vin je merkredo. [Aplaŭdo] SPEAKER 2: En la sekvanta CS50. SPEAKER 3: Ĉu vi ne kuraĝas diri, ke. Vi povas fari ĉi tion. Vi jam faris tion antaŭe, vi povas fari tion hodiaŭ, vi povas fari tion morgaŭ. Ke vi estis faranta tion por jaroj. Nur iru tie kaj fari tion. Vi povas fari ĉi tion. [MUZIKO Ludanta]