[MUSIK SPELA] ROB BODEN: Okej. Så, först sak först, i video från ett bekant ansikte. [VIDEO SPELA] -Okej. Detta är CS50, och detta är början av vecka tre. Jag är ledsen att jag inte kunde vara där med dig idag, men låt mig presentera CS50 egen Rob Boden. [END VIDEOAVSPELNING] [Applåder och jubel] ROB BODEN: Det filmografi in att video är fantastiskt. Okej. Så först, det finns en annan lunch. Det är i morgon klockan 01:15. Det finns ingen lunch på fredag. Det är med Quora. Och Tommy är inte här ännu, men en av människorna där är förre chefen CF, Tommy McWilliam. Så han är en rolig kille. Du borde komma. Okej. Så förra veckan började vi bryta isär om vad en sträng egentligen är. Vi har känt sedan början som det är en sekvens av tecken. Men förra veckan, grävde vi i det faktum att det som verkligen är en sekvens av tecken, ja, nu har vi arrayer av tecken. Och vi vet att en sträng, det är en array tecken, i slutet, Vi har denna speciella null-byte, detta snedstreck 0 indikerar att änden av strängen. Och så en sträng är en matris med tecken, men vi kan ha mer än bara en uppsättning av tecken, Vi kan ha en matris av någon typ av sak som vi vill ha. Så, om du minns från förra veckan, den Ages program som David introducerade riktigt snabbt. Så första vi ska göra är fråga användaren om ett heltal, det Antalet personer i rummet. När vi har det heltal, vi deklarera en array. Lägg märke till detta stativ syntax. Du kommer att vänja sig vid det. Så vi deklarera en array av heltal heter åldrar, och det finns n heltal i denna samling. Så detta mönster just här, detta 4 int i är lika med 0, i är mindre än n, i plus plus, det kommer också att bli ett mönster att du får väldigt van vid. Eftersom det är ganska mycket hur du är alltid att iterera över arrayer. Så kom ihåg att n är längden på vår array. Och så här är vi flera gånger frågar för åldern på personen jag i rummet. Efter detta går vi ner, och av någon godtycklig anledning, vi sedan skriva ut hur gamla de ska att vara ett år från nu. Och kör det programmet, låt oss göra åldrar, dot slash åldrar. Så många människor i rummet, låt oss säga att det finns tre. Och säga, den första personen är 13, Nästa är 26, och den sista är 30. Så då det kommer att iterera över dessa tre folk, skriva ut 14, 27, och 31. Så kom ihåg att när vi deklarerar en matris av storlek n, indexen i det array, har arrayen värden och index 0, 1, 2, hela vägen upp till n minus 1. Så när vi sa att det fanns tre personer i rummet, och vi sätter in här den första iterationen genom denna slinga, är jag kommer att vara 0. Så i index 0. Vi tilldelar den första åldras användaren anger. Sedan i nästa, vi kommer in i andra n användaren anger, och i bredvid två, den sista n. Så märker att en matris med storlek tre inte har något i indexet tre. Det är inte giltigt. Okej. Så, gå tillbaka hit. Så nu när vi har behandlat arrayer, vi har viss erfarenhet. Nu ska vi gå vidare till kommando för det, som kommer att vara ganska relevant till detta problem set. Så fram till nu, när du har deklarerat din huvudsakliga funktion, vi har sade int main tomrum. Så void betyder bara att Vi är inte passerar någon argument till denna funktion. Nu ska vi se att huvud kan ta några argument. Här kallar vi dem int argc och sträng argv parentes. Konsolerna återigen, vilket indikerar att vi har att göra med matriser. Så här, sträng argv parentes, vi är att göra med en array med strängar. Så argc, det kommer att indikera hur många argument som vi har gått till detta program. Och för att se vad det betyder, låt oss avsluta det här. OK. Så fram till nu har vi kör varje program som dot slash åldrar. Vi kan också, på kommandoraden, tidigare skicka argument, därav termen, kommandot line argument. Så det första argumentet, hallå världen. Så här skulle argc vara tre. Det är räkningen av argumenten på kommandoraden. Argc är alltid minst en, sedan dot slash åldrar, i sig, räknas som en av kommandoradsargumenten. Då hej är den första. Om dot slash åldrar är den nollte, då hej är det första, och världen är det andra kommandorad argument. Så strängen argv, vi kommer att se, innehåller strängar, punkt snedstreck åldrar, hej, och världen. Och, av David begäran, vi ska för att spela upp en video att införa det. [VIDEO SPELA] -Hittills i program vi har skrivet, har vi förklarar huvud som int main tomrum. Och hela den här tiden har det tomrum helt enkelt varit anger att Programmet tar inte någon kommandoradsargument. Med andra ord, när en användare kör en program, kan han eller hon ge kommandot line argument genom att skriva ytterligare ord eller fraser efter programmets namnet vid prompten. Tja, om du vill du att ditt program till ta kommandoradsargument, en eller fler sådana ord, måste vi byta ut annullera med ett par argument. Så låt oss göra det. Inkludera CS50.h. Inkludera standard io.h. Int main. Och nu, i stället för tomrum, jag ska ange en int heter argc, och en array med strängar som kallas argv. Nu argc och argv är helt enkelt konventioner. Vi kunde ha kallat dessa argument mest vad vi vill. Men vad som är viktigt är att argc är en int eftersom, per definition, är det kommer att innehålla argumentet räkningen, den antalet ord i totalt att användare har skrivit på sin prompt. argv, under tiden, argument vektor, är kommer att faktiskt vara en array lagrar alla dessa ord som användaren har skrivit på sin prompt. Låt oss fortsätta att göra något nu med en eller flera av dessa kommandoradsargument. Framför allt, låt oss gå vidare och skriva ut oavsett ord som användaren skriver efter programmets namn vid prompten. Öppna konsol. Stäng fästet. Printf procent s backslash och kommatecken. Och nu måste jag berätta printf vilket värde att plugga in det platshållaren. Jag vill att det första ordet som användaren har skrev efter programmets namn, och så jag kommer att ange argv fäste 1, nära parentes, semikolon. Nu, varför fäste 1 och inte konsol 0? Jo, det visar sig, lagras automatiskt i argv 0 kommer att bli det programmets verkliga namn. Så det första ordet som användaren skriver efter programmets namn är, genom konvention, kommer att bli lagras i argv 1. Låt oss nu sammanställa och köra programmet. Gör argv 0, pricka snedstreck argv 0. Och nu ett ord som hej. Enter. Och där har vi det, hej. [END VIDEOAVSPELNING] ROB BODEN: Okej. Stäng det. Så ta en titt på det program som vi bara presenterades för oss, ja, precis att visa, om vi skriver ut argv 0, göra, nu vad är det, argv 0, dot slash argv 0. Så, som väntat, är det att skriva ut namnet på programmet, eftersom argv 0 är alltid kommer att vara den namnet på programmet. Men låt oss göra något lite mer intressant. Så i problemet set, kommer du att introduceras till denna funktion, atoi. Så vad gör vi använder atoi för? Det kommer att konvertera en sträng till ett heltal. Så om jag passerar strängen, ett två tre, till atoi, kommer att omvandla den till heltal, ett två tre. Så vi kommer att konvertera den första kommandoradsargumentet till ett heltal, och sedan bara skriva ut det heltal. Så i grund och botten, vi är typ av reimplementing getInt, bara heltal matas in på kommando linje istället för i programmet interaktivt. Så då gör argv 0, låt oss göra det här, och stäng det. Så kör argv 0, och låt oss gå in i heltal, en två tre fyr en två. Så det kommer att skriva ut heltal, en två tre fyr en två. Det finns vissa nyanser att atoi att det ska sluta bry sig om vad som helst utöver ett giltigt numeriskt tecken, men det spelar ingen roll. Så vad tror du händer om jag gör det? Segmente fel. Så varför är det? Om du ser tillbaka på vårt program, vi är konvertering argv ett, det första argumentet efter programnamnet, till ett heltal. Men det är inget argument passerade efter programnamnet. Så här ser vi att det är en buggy programmet, eftersom, om vi försöker köra den utan några argument, det kommer bara krascha. Så en annan gemensamt mönster ser du är något liknande, om argc är mindre än två, vilket indikerar att det inte var åtminstone programmets namn och en första argumentet, då vi ska göra något som printf, inte tillräckligt kommandoradsargument. Det är nog inte bra att skriva ut, det är nog något, som du ska skriva in ett heltal på kommandoraden. Jag ska bara avsluta det där. Och sedan tillbaka 1. Så kom ihåg att i slutet av vår program, om vi återvänder 0, den sortens indikerar framgång. Och huvud också automatiskt returnerar 0 om du inte gör. Så här ska vi återinställning 1 för att indikera att det inte lyckas. Och du kan gå tillbaka vad du vill, precis, 0 indikerar framgång, och något annat indikerar misslyckande. Så låt oss köra denna version av saker. Så nu, om vi inte anger en kommandorad argument, kommer det på rätt sätt berätta oss, inte tillräckligt kommandorad. Visste inte avsluta meningen. Annars, om vi faktiskt ge det en, det kan avsluta programmet. Så detta är hur du skulle använda argc i För att validera det antal kommandoradsargument som godo. Så låt oss göra det här programmet lite mer komplicerat, och titta på den andra iteration av saker. Så nu, vi är inte bara skriva ut första kommandoraden argument. Här, vi iterera från int i jämlikar 0, är ​​jag mindre än argc, jag plus plus, och tryckning argv, index i. Så detta mönster, återigen, är det samma mönster som tidigare, utom i stället att ringa variabeln n, vi använder argc. Så det här är att iterera över varje index i arrayen, och skriver ut varje elementet i matrisen. Och så, när vi kör det här programmet, ja, Jag har inte fyllt i någon kommandorad argument, så det bara utskrifter programnamnet. Om jag anger en massa saker, det ska skriva ut en, var och en på egen rad. OK. Så låt oss ta detta ett steg längre. Och istället för att skriva ut varje argument på en egen rad, låt oss skriva ut varje karaktär varje argument på en egen rad. Så kom ihåg att argv är en array av strängar. Så vad är en sträng, men en samling av tecken? Så det betyder att argv är verkligen en matris av en matris av tecken. Så att dra nytta av det, Låt oss bortse från detta för nu. Låt oss bara betrakta strängen argv 0. Så om vi vill ta varje tecken i argv 0 på en egen rad, då jag vill ha att göra det mönster som vi är vana vid, är jag mindre än längden av arrayen, som här, är strlen av, det är inte vad jag vill göra, sträng n är lika med argv 0. Så i är mindre än längden av vår matris, som i detta fall är en matris tecken, jag plus plus. Och så, som vi såg i förra veckan, är den idealisk Om vi ​​går att strlen utanför av tillståndet, kommer sedan n att lägga den strlen av s varje gång vi går genom öglan, och det är inte kommer att förändras. Så vi ska sätta den lika med n hit. OK. Så nu, vi iterera över varje index i arrayen. Och så, om vi vill skriva ut varje karaktär i den arrayen, procent c är flagg vi vill använda för tecken. Och nu en konsol jag kommer att bli det sträng, indextecken i, så om det sträng var hej. då är 0 kommer att vara h, s fäste 1 kommer att vara e, och så vidare. Så nu vill vi kombinera dessa två saker. Vi vill skriva ut varje tecken av varje kommandorad argument. Så vi kommer att ha en kapslad för slinga. Och som konventionellt, den första räknaren är jag, nästa kommer att vara j, n kommer att vara den strlen av argv i, i är mindre än n, i plus plus. Och nu i stället för utskrift argv i, så argv fäste jag kommer att index - som kommer att vara den i: te kommandorad argument, argv i, j kommer att vara den j: e tecknet i det i: te argumentet. Jag ska bli av med detta här uppe nu eftersom vi sätta den i den slingan. Så motsvarar sträng s jämlikar argv i, och sedan s fäste j.. Tja, vi behöver inte deklarera denna variabel s. Istället kommer vi bara kombinera dessa två i vad vi hade, argv i, j. HÖGTALARE 1: [OHÖRBAR]. ROB BODEN: Bra samtal. Så det här är bruten. Om jag faktiskt körde det, vi skulle ha insett detta. Så disken jag bryr mig om i detta specifika för loop är j, iterator. Så du skulle ha stött på problem, förmodligen en oändlig slinga, om vi hade inte fast det. Det är därför vi också pratar om felsökning i dag. OK. Så låt oss köra programmet. Och låt oss faktiskt lägga en separat printf just här som bara kommer ut en annan linje, eftersom det innebär när vi kör programmet, kommer det att finnas en tom linje mellan varje tecken i varje kommandorad argument. Nåväl, vi får se vad det betyder. OOP. Fick lite bugg. Fel implicit förklara biblioteksfunktion strlen. Så gå tillbaka in i vårt program, jag glömde att hash inkluderar string.h. Så string.h kommer att bli det header-fil som förklarar funktionen strlen. OK, sammanställer det. Nu ska vi köra det. Så bara det. Det kommer att skriva ut våra programnamn, hallå världen. Det kommer att skrivas ut varje sak, varje karaktär, på en egen rad. OK. Så låt oss verkligen ta detta ett steg längre. Och istället för att använda string.h, låt oss tänka på hur vi skulle genomföra vår egen strlen funktion. Så jag ska genast ge en funktion signatur. Så låt oss kalla i my_strlen, och det är kommer att ta en sträng som argument, och vi räknar med att återlämna längden på den strängen. Så, var är han? Ja. OK. Så kom ihåg från den tidigare bilden som var också från förra veckan, att en samling av tecken, ja, en sträng, så låt oss säga att det är vår sträng s.. Så om s är strängen, hej då, H-E-L-L-O, i minnet, det kommer att vara, och då detta snedstreck 0 tecken. Så hur får vi längden på s? Tja, är tricket söker här motreaktion 0 karaktär, denna null terminator. Så algoritmen kommer vara något som få tillräckligt många tecken som - låt oss ha denna hand utgör några disk, låt oss kalla det här int längd. Så, från över här, vi är kommer att iterera över vår sträng. Så det första tecknet, det är H, och det är inte back slash 0, så längden är 1. Iterera till nästa tecken, E, och det är inte backslash 0. Längd 2. L, 3. L, 4. O, 5. Och slutligen, når vi omvänt snedstreck 0, och så det betyder, ja, denna sträng är avslutad. Så låt oss gå tillbaka 5. Så faktiskt genomföra det, först, mitt n längd är lika med 0, min högra hand. Och vi kommer att iterera - HÖGTALARE 1: [OHÖRBAR] ROB BODEN: Åh, skjuta. Bra samtal. Boom. Så n längd är lika med 0. Så nu, inte när s längd lika och då, snedstreck 0. Så kom ihåg, detta backslash 0, är ​​det en faktiska karaktär, och det visar slutet av strängen. Precis som, också, omvänt snedstreck n är en faktisk karaktär. Omvänt snedstreck 0 kommer att indikera i slutet av vår sträng. Jag vill inte säga det där. Och medan s indexeras av längd inte lika med nollterminatom, då Vi kommer bara att öka längden. Så då, i slutet av vårt program, längd så småningom kommer att vara 5 i detta fall. Och vi ska bara tillbaka längd. OK. Så nu här nere, det gör jag inte do my_strlen. Låt oss sammanställa den för att se allt flyter smidigt. Var jag gör i 2? Eller var det 1? Det borde göra. Okej. Så det här är argv 2. Fungerar som förväntat, även om var att jag gjorde det i? Ja. OK. Denna version av saker som inte hade printf ny rad efter, men det gör ingen skillnad. OK. Så fungerade som förväntat. Nu kan vi även kombinera detta ett steg vidare, där meddelande här, ja, första, vi ta tag i strlen av argv i, och sedan vi iterera över varje tecken på den strängen. Så istället för att göra det, tänk om vi bara kombinera denna logik för att vänta tills vi träffade backslash 0 rätt in i detta för loop? Så iterera medan argv i, j gör icke lika snedstreck 0. Så låt oss köra den första. Okej. Så här, är detta villkor som säger - låt oss klara det. Så nu, låt det vara vår argv. Så när jag körde just det programmet innan, argv är en array av strängar. Och så, om jag kör det med punkt snedstreck argv 2, hallå världen, då den argv själv är längd 3, för argv noll, hej, och världen. Och inne i var och en av dessa index är, själv en matris, där det kommer att bli prick, kommer detta att vara snedstreck, jag vet inte om det var rätt riktning, jag tror inte att det var. A-R-V-streck, behöver mer utrymme. Låt oss klippa in i denna samling. A-R-V streck 0 och sedan omvänt snedstreck 0. Och sedan i oordning blir hej. Låt oss säga, H-E backslash 0. Och slutligen, W-O snedstreck 0. Så den algoritm som vi skrev precis, den kapslade för loopar, vad de är gör är, vi först ha motverka i och sedan j.. Det skulle vara lättare med kod på skärm, Låt oss gå tillbaka till detta. OK. Så märker att jag är den iterator som är iterera över varje kommando line argument. Och J är den iterator iteration över varje tecken i det kommandoradsargumentet. Så vad detta innersta printf gör är har vi printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, men nu, argv 0 7 kommer att lika omvänt snedstreck 0. Så då vi lämnar det för loop, och nu jag itererar till 1. Och nu ska vi skriva ut argv 1 0, argv 1 1 - bra, nu, sedan jag klippa hej kort, argv 1 2 återigen kommer att bli snedstreck 0. Och så, öka i och fortsätta, och så vidare, tills vi skriva ut alla världen, och de är tre kommandorad argument, och vi kommer att gå ut ur den yttersta slinga, och avsluta vårt program. OK. Så låt oss komma tillbaka hit. Så du kommer att få en viss förtrogenhet med kommandoradsargument på detta särskilt problem inställd. Nu, felsökning. Så du förmodligen redan har haft att göra lite felsökning med dina tidigare problem set. Och ett mycket enkelt sätt för felsökning, första, låt oss titta på en buggy program. Tja, gå genom det här programmet, vi kommer att fråga användaren om ett heltal, ta det heltal, och sedan, godtyckligt, har vi en while-slinga som är bara att stega jag tills det är lika med 10. Låt oss bara anta att jag kommer in ett heltal större än 10. Så dekrementera jag tills det är lika med 10. Och då har vi ytterligare en tid loop att, medan jag inte är lika med 0, vi är kommer att minska värdet i med 3. Så om du ser avsikten med bugg här, det är så det kommer att minska värdet i att vara 10, och sedan detta samtidigt loop kommer minskning i från 10 till 7, till 4, till 1, till negativ 2, till den negativa 5, och så vidare, till negativ oändlighet, eftersom jag kommer aldrig lika 0. Och sedan i slutet av det här programmet, vi har foo funktion som är pågår utskrift som jag. Så det här är en kort och trivial program, och felet är uppenbart, särskilt efter att jag bara sa vad felet var. Men avsikten här är, ja, kanske det faktiskt ser ut som en del av din lösningar från girig från den sista problembild, och kanske du har någon oändlig loop i ditt program, och du har ingen aning vad som orsakar det. Så en mycket användbar felsökning teknik är att bara lägga printfs hela din kod. Så här vill jag ha en printf utanför första while-slinga. Och här vill jag ha en printf, och jag ska bara skriva ut i.. Jag ska även göra först while-slinga, jag. Utanför, andra while-slinga. Än en gång, skriva ut inuti härifrån, det värde jag. Och låt oss köra. Så dot slash debug. Ange ett heltal. Låt oss göra 13. Och bom. Vi ser att vi är oändliga slingor insidan av det andra medan loopen. Så nu vet vi vad felet är. Men printf debugging är helt fantastisk, men när dina program får längre och mer komplicerat, det finns mer sofistikerade lösningar på få saker att fungera. Så låt oss ta bort alla dessa printfs. Och låt oss se till att jag inte gjorde det bryta någonting. OK. Så det program vi ska att införa kallas GDB, för GNU Debugger. Jo, faktiskt, låt oss ta bort debug för en andra, och göra debug igen. Jo, faktiskt först, en bra lektion i kommandoradsargument. Lägg märke till att denna Clang kommando som är sammanställa allt förs vidare på kommandoraden, dessa kommandoradsargument. Så exakt hur du ska använda kommandoradsargument, som vi gjorde tidigare, och som du kommer i PSET 2, det är hur Clang använder dem. Så märker att denna första flagga, streck ggdb3, vad det säger är, klang, du bör sammanställa denna fil med uppsåt att vi så småningom kommer behöver felsöka det. Så länge du har den flagga, då kan vi GDB debug. Och det kommer att öppna upp GNU Debugger. Så det finns en hel del kommandon att du måste vänja sig. Först en som du kommer förmodligen omedelbart behöver är Kör. Så vad som Kör göra? Det kommer att starta vårt program. Så kör, starta program, programmet ber oss för ett heltal, 13. Och då är det oändligt looping som väntat, förutom att jag tog bort printfs, så att vi inte ens ser det. Exited normalt. Oh. Det är möjligt att det lindade alla tvärtom, tillbaka till - ignorera det. Antar att det inte avsluta normalt. Det är ett komplicerat svar på det. Så nu, det är inte mycket användbart. Så bara köra vårt program inuti detta debugger hjälper inte oss på något sätt, eftersom vi kunde ha bara gjort dot slash debug utanför GDB. Så den ett kommando att du kommer antagligen - och jag ska avsluta det här. Kontroll-d eller sluta, både arbete. Så låt oss öppna den igen. Ett annat kommando som du kommer antagligen omedelbart vill vänja sig är Break. Så vi ska bryta på huvud för nu, och sedan ska jag förklara det. Tja, här ser vi att vi satt en brytpunkt på denna linje i debug.c. Så vad rast betyder är att när jag typ springa, programmet kommer att fortsätter att gå tills Jag träffade en brytpunkt. Så när jag slog loppet startar programmet, och då det bryts så snart som den går huvudfunktionen. Break kommer att bli något du ganska vanligt att göra. Och nu, för att presentera dig till några fler kommandon. Observera här, att det säger vi bröt vid linjen 11, vilket är printf anger ett heltal. Så kommandot Nästa kommer att bli hur vi går till nästa kodrad. Det här kommer att ge oss möjlighet att gå genom vårt program rad för rad. Så nästa. Nu linje 12, kommer vi för att få heltal. Nästa. Och om du bara trycka Enter igen, kommer det göra om det sista du gjorde. Så jag behöver inte skriva Nästa varje gång. Så skriv in ett heltal, 13. Så nu, när jag är linje 14, större än 10, och jag ska göra härnäst. Och vi ser att vi kommer att minska värdet i.. Så vi kommer att minska värdet i igen. Så nu, en annan användbar kommandot Skriv ut. Så ut kommer att skriva ut värdet på variabeln. Låt oss ta fram det värde av variabeln i. Låt oss skriva ut i.. Det kommer att säga att jag är 11. Nu har vi nästa gång när i är större än 10. Så jag är fortfarande större än 10, eftersom det är 11. i. minus minus. Låt oss skriva ut i igen. Som förväntat, är det 10. Så nu, nästa. Det kommer tillbaka till det tillstånd, är jag större än 10, men i är nu 10, så det är inte större än 10, så vi förväntar det att falla ut ur while-slinga. Och nu är vi under den kodrad. Och ett annat kommando, List, är bara att gå för att visa föregående och nästa några rader kod, i Om du förlorat dig själv. Så vi just lämnat denna while-slinga, och nu har vi angett detta while-slinga, linje 18. Så medan jag inte är lika med 0. Och, nästa, jag är lika i minus 3, och vi kommer märker, kommer detta bara fortsätta. Och vi kan trycka i.. Varje kommando slags har genvägar. Så p står för Print. Så vi kan pi. Bara hålla hålla n, eller fortsätta göra nästa. Skriv i igen. Du ser nu är det negativ 167. Så det här kommer att fortsätta för evigt, men inte verkligen för evigt, eftersom du just såg, det faktiskt kommer att sluta någon gång. Så det börjar GDB. Men låt oss göra en sak i GDB. Uh, felsöka. Så, i detta fall den oändlig loop råkade vara inne i den viktigaste funktionen. Och för nu, bara acceptera det som jag är kommer att flytta oändlig slinga in foo funktion. Kom bara ihåg att det vid slutet av denna program, ja, det var ursprungligen ringer foo, vilket var precis tryckningen i.. Men nu är vi kallar foo, vilket är går att stega jag tills det är 0, och sedan skriva ut den variabeln. OK. Spara det. Gör debug. Och nu, gdb debug. OK. Så om jag bara köra då jag inte kommer att kunna faktiskt gå igenom min Programmet linje-för-linje. Så låt oss bryta på huvud, och skriv sedan kör. Så gå igenom detta, printf, anger ett heltal, få heltal, 13. Så vi kommer att hålla dekrementering tills jag är större än 10. Sen ska vi falla igenom while-slinga, och få till linjen - låt oss öppna den i ett separat fönster. Så vi minskas tills jag inte längre större än 10, och då vi kallas funktionen foo. Så vad hände så fort jag slog funktionen foo, väl, ringde jag foo, och då jag inte längre hade kontroll över GDB. Så fort jag slog Nästa på denna linje, saker fortsatte tills detta hände, där programmet lämnat när - antar att det fanns inte så småningom. Du såg det paus för lite om. Så varför gjorde jag tappar kontrollen över programmet på den punkten? Jo, när jag skriver nästa, går det till den bokstav nästa kodrad som kommer att utföra. Så efter linje 21, nästa kodrad som kommer att utföra är linje 22, vilket är, ut från huvud. Så jag vill inte bara gå till nästa kodrad. Jag vill gå in i funktionen foo, och sedan också gå igenom dessa rader kod. Så för det, har vi ett alternativ. Låt oss avsluta det igen. Break. Uh, 1, nästa, nästa, 13, nästa, nästa, nästa, försiktigt, innan vi slog linje foo. OK. Så nu är vi på rad 21, där vi kallar foo. Vi vill inte skriva nästa, eftersom det kommer bara anropa funktionen foo, och gå till nästa kodrad. Vad vi vill använda är Step. Så det finns en skillnad mellan steg och nästa, där steg kliver in i fungera, och nästa går över funktionen. Det utför just helheten av funktion och håller igång. Så steg kommer att föra oss in i funktionen foo. Och vi ser här, nu är vi tillbaka på denna while-slinga som är, i teorin, kommer att fortsätta för evigt. Och om du träffar steg, när det inte ens en funktion för att ringa, då är det identisk med nästa. Så det är bara när du är på en linje som kallar en funktion som steg kommer att skilja sig från Next. Så steg kommer att föra oss hit. Steg, steg, steg, steg, steg, steg, och vi ska bara oändlig loop för alltid. Så du kan vänja sig vid det som din sätt att identifiera oändliga slingor, är bara hålla detta Enter för att se var du kör fast. Det finns bättre sätt att göra det, men för nu är det fullt tillräckligt. Och stilistiskt, för att överensstämma med Style 50, jag borde ha gjort det. OK. Så en sista kommandot för att införa. Nåväl, låt oss gdb debug i. Så istället för att bryta vid huvud, om jag vet foo funktion är också den problem, så jag kunde bara sade, bryta på foo istället. Låt oss säga att jag bryter på både huvud och foo. Så du kan ställa in så många brytpunkter som du vill. När jag skriver springa, det kommer att stanna vid - ooh, låt oss kompilera, eftersom Jag ändrade saker. Du ser den här linjen, varning, källa filen är nyare än körbar. Så det betyder att jag gick bara in här och bytte dessa att överensstämma med Style 50, men jag ville inte kompilera programmet. Så GDB gör mig medveten om det. Jag ska sluta, gör debug igen, slå gdb debug. OK. Så nu, tillbaka till vad jag gjorde. Break, break foo. Nu om jag kör programmet, så det är kommer att fortsätta tills träffar en brytpunkt. Denna brytpunkt händer vara den första i main. Nu, istället för att göra nästa, nästa, nästa, nästa, nästa, tills jag slog foo, jag kan skriva fortsätta, vilket kommer att fortsätta tills du trycker på nästa brytpunkt. Jag måste komma in i heltal först. Fortsätt fortsätter tills jag träffade nästa brytpunkt, vilket är att funktion foo. Så kör kör tills du träffar en brytpunkten, men du bara skriver sikt när du startar programmet, och sedan, från och med då, det fortsätter. Om jag bara bryta huvud och sedan sprang, det ska gå sönder vid huvud, och sedan fortsätta. Eftersom jag inte har en brytpunkt vid foo, ange heltal, så nu är jag inte kommer att bryta på foo. Det är bara att gå till oändlig slinga tills det. OK. Så det är Introduktion till GDB. Du borde börja använda den i dina problemsamlingar. Det kan vara till stor hjälp att identifiera fel. Om du faktiskt bara, rad för rad, går genom din kod, och jämföra vad som är faktiskt händer med vad du förväntar dig att hända, då är det ganska svårt att missa dina buggar. OK. Så förra veckan David tog upp detta secret key kryptografi grejer för första gången, om vi inte vill lösenord bara lagras på vår dator i någon vanlig textfil, där någon som kan komma och bara öppna den och läsa dem. Helst skulle de vara krypterad på något sätt. Och i Problem Set 2, kommer du att ha att göra med ett förfarande för kryptering, eller, ja, två metoder, men de är inte så stor. Om du gör hacker upplagan, du också kommer att ha att göra med dekryptera vissa saker. Så frågan nu är, väl, även om vi har den starkaste krypteringen algoritmen i världen, om du väljer en särskilt dåliga lösenord, då det kommer inte att hjälpa så mycket, eftersom människor kommer fortfarande att kunna lista ut det. Även om se den krypterade strängen och det ser ut som en enda röra av skräp det betyder ingenting för dem, om de fortfarande bara måste prova några lösenord att lista ut det, då du inte är mycket säker. Så titta på en video som gör den punkten. [VIDEO SPELA] -Hjälm, djävul dig. Vad är det som händer? Vad gör du med min dotter? -Tillåt mig att presentera den lysande ung plastikkirurg, Dr Phillip Schlotkin, störst näsa jobb man i hela universum, och Beverly Hills. -Ers Höghet. -Näsa jobb? Jag förstår inte. Hon har redan haft en näsoperation. Det var en söt sexton närvarande. -Nej. Det är inte vad du tror. Det är mycket, mycket värre. Om du inte ger mig kombinationen till luftskydd, Dr Schlotkin kommer ge din dotter tillbaka sin gamla näsa. -Nej. Var har du fått det? -Okej. Jag ska berätta. Jag ska berätta. Nej, pappa. Nej, du måste inte. -Du har rätt, min kära. Jag kommer att sakna din nya näsa. Men jag kommer inte att berätta för honom kombinationen, oavsett vad. -Mycket bra. Dr Schlotkin, gör din värsta. -Ingen orsak. [VERKTYG skärps] -Nej. Vänta. Vänta. Jag ska berätta. Jag ska berätta. -Jag visste att det skulle fungera. Okej. Ge den till mig. -Kombinationen är en. -One. -One. -Två. -Två. -Två. -Tre. -Tre. -Tre. -Fyra. -Fyra. -Fyra. -Fem. -Fem. -Fem. -So kombinationen är ett, två, tre, fyra, fem. Det är det dummaste kombinationen Jag någonsin hört i hela mitt liv. Det är sånt en idiot skulle ha på sitt bagage. -Tack, din höghet. -Vad gjorde du? -Jag stängde av muren. -Nej det gjorde du inte. Du stängde av hela filmen. -Jag måste ha tryckt på fel knapp. -Tja, lägger tillbaka den. Sätt på filmen igen. -Ja, sir. Ja, sir. -Kom igen, Arnold. Kom, Gretchen. Naturligtvis vet du jag ska fortfarande måste fakturera dig för detta. [END VIDEOAVSPELNING] ROB BODEN: Okej. Så nu när vi redan pratar om säkerhet på vissa sätt, trevlig liten filmaffisch, så på senare dagar, dessa frågor med NSA övervaka allting. Det kan vara svårt att känna att du har någon form av privatlivet online-världen, även om jag inte kunde berätta du de flesta av detaljerna i PRISM. Så rör sig bortom PRISM, vi kommer inte att tala om det, nu tänka på din bärbara dator. Så här uppe, jag vill byta till mitt egentliga konto, med min lilla pingvin. Så jag har ett lösenord set, och att lösenord är vad jag vill att det ska vara. Men kom ihåg att det jag loggar in med, så denna inloggning snabb, är en del program. Det är några program som var skriven av någon person. Och så, den personen, om de är särskilt skadliga, de kunde har sagt, okej, så om lösenordet att jag kommer in är lika med min faktiska lösenord, eller det är lika till någon speciell lösenord - David är fantastisk eller något - låt dem i. Så en illvillig programmerare kan ha tillgång till alla dina Mac-datorer, eller Windows, eller vad som helst. Så det är inte mycket av en oro, eftersom, Jag menar, det här inloggningsprogram som är levereras med OS X, hundratals eller tusentals människor har granskat denna kod. Och så, om det i din kod någonstans, du säga om den här strängen är lika med jämlikar David är fantastisk, inloggning, då någons kommer att bli, typ, vänta. Det här är inte rätt. Detta borde inte vara här. Så det är ett sätt som vi får saker och ting att vara typ av säker. Men tänk om ens program att du skriver. Låt säga att du skrev inloggningsprogram. Så här inloggningsprogram som du skrev, så självklart, du är en bra programmerare. Du kommer inte att lägga någon skadlig om x är lika med lika David är fantastisk i koden. Men det här programmet, vad gör du använder för att sammanställa det här programmet? Något liknande klang. Så vad händer om den som råkade skriva Clang speciell kapslade i Clang något liknande, om jag sammanställa logga in program, sedan in denna kod i inloggningsprogrammet som säger, om x är lika med lika David är fantastisk? Så inte riktigt än, men vi har samma utfärda här, där klang, bra, tusentals, om inte tiotusentals människor, har tittat på klang, har såg på sina rader kod och sade, okej, det finns inget dåligt här. Självklart är det ingen som gör allt detta skadliga. Men det som klang i sig, liksom, tänk om jag sammanställa klang? Vad händer om jag har någon kompilator som samman klang som skär in i klang denna speciella hack som säger, okej, när jag kompilera klang, då körbar Jag får bör speciellt se insidan av inloggningsprogrammet och insats detta lösenord, lika likar Dave är häftigt? Så kom ihåg att din kompilator själv måste sammanställas någon gång. Så om det du väljer att kompilera Clang med, är i sig skadliga, då du skulle kunna skruvas hela vägen fram. Så här har vi Ken Thompson och Dennis Ritchie. Så detta är en ikonisk bild. Dennis Ritchie är till höger. Han är en stor - ganska mycket skrev C. Så du kan tacka honom för denna klass. Ken Thomson är till vänster. De två av dem i princip skrev UNIX. Tja, de var stora bidragsgivare i UNIX. Det fanns några andra. Så Ken Thompson, någon gång, han vinner Turing Award. Och den Turing utmärkelsen, har jag alltid hört det refereras här sättet, det är den Nobelpriset i datavetenskap. Så vid Turing Award, måste han ge sitt tacktal. Och han ger denna mycket berömda tal nu, heter Reflections on Lita Trust, som vi har länkat För att på kursens hemsida. Och i detta tal, säger han, okej, så jag skrev UNIX, och nu alla ni människor använder UNIX. Nu, kom ihåg idag att Linux är en direkt ättling till UNIX. OS X använder direkt UNIX. Windows gör inte så mycket, men en hel del idéer togs från UNIX. Så han går upp på scenen och säger: okej, skrev jag UNIX. Och bara så ni vet, jag är kunna logga in i varje enda av dina datorer. Eftersom jag satte en av dessa speciella om x lika lika Ken Thomson är fantastisk, då jag får logga in. Så folk är som, ja, Hur gjorde du det? Vi tittade på inloggningsprogrammet och ingenting är där. Han är som, ja, ändrade jag kompilatorn att logga in på inloggningsprogrammet så att inloggnings programmet nu kommer att ha att x är lika med lika Ken Thompson är fantastisk. Och de säger, ja, det är inte sant. Vi tittar på kompilatorn, och kompilatorn har inga rader kod så. Han är som, OK, men vad är du sammanställningen av kompilatorn med? Och de tycker, och han är, som, ja, Jag är den som gav dig kompilatorn du använder för att sammanställa kompilatorn, så du kompilerar en kompilator, som i sig är skadligt, och kommer bryta inloggningsprogram. Så i princip, på den punkten, det finns inget sätt du kan titta på käll koden för inloggningsprogram för att se vad som är fel. Du kunde inte ens titta på källkod för kompilatorn för att se vad som är fel. Du skulle behöva titta på maskinen kod, den verkliga binära av sammanställt kompilator för att se, vänta, dessa rader kod borde inte vara här. Men Ken Thompson tog det ett steg vidare och sa, ja, det finns dessa speciella program som faktiskt hjälpa dig att läsa binärt program, och så om någon använt det programmet till läs binär, skulle de se dessa rader kod. Han ändrade dessa program att säga, allt rätt, om du tittar på den kompilator, visar inte detta uppsättning av binära. Så måste du ta det ett steg vidare och i grund och botten, skulle det ha vidtagits flera nivåer av indirekthet, och någon gång, är ingen egentligen kommer att kolla. Så den moraliska av historien är, du är inte kommer att skriva Klang i denna klass. Du kommer att använda klättring Klang mycket i denna klass. För alla ni vet, är Clang en skadlig program som saboterar varje enda program som du någonsin har sammanställt. Och för att lämna dig på det mycket illavarslande notera, se dig på onsdag. [Applåder] TALARE 2: Vid nästa CS50. TALARE 3: Tycker du inte vågar säga det. Du kan göra det här. Du har gjort det här förut, kan du göra det här idag, kan du göra det i morgon. Du har gjort detta i år. Bara gå upp och göra detta. Du kan göra det här. [MUSIK SPELA]