>> [Musikgengivelse]
>> ROB BODEN: Okay.
Så første første video fra et velkendt ansigt.
>> [VIDEOAFSPILNING]
>> -Okay.
Dette er CS50, og det er begyndelsen af ​​uge tre.
Jeg er ked af jeg ikke kunne være der med dig i dag, men tillad mig at introducere
CS50 egen Rob Boden.
>> [END VIDEOAFSPILNING]
>> [Applaus og cheers]
>> ROB BODEN: Den filmografi i at videoen er fantastisk.
Ok.
Så det første, der er en anden frokost.
Det er i morgen kl 1:15.
Der er ingen frokost denne fredag.
Det er med Quora.
Og Tommy er ikke kommet endnu, men en af de mennesker, der er tidligere leder CF
Tommy McWilliam.
Så han er en sjov fyr.
Du skulle komme.
>> Ok.
Så i sidste uge, begyndte vi at bryde fra hinanden om, hvad en streng egentlig er.
Vi har kendt siden begyndelsen, at Det er en sekvens af tegn.
Men i sidste uge, vi dykket ned i faktum at det virkelig er en sekvens af
tegn, godt, vi nu har arrays af tegn.
Og vi ved, at en streng, det er et array tegn, til allersidst,
vi har denne specielle null byte, dette backslash 0, der angiver slutningen af
strengen.
>> Og så en streng er en vifte af tegn, men vi kan have mere end
bare en vifte af figurer, vi kan få en bred vifte af enhver
type ting, vi ønsker.
Så hvis du husker fra sidste uge, Ages program, David introduceret
virkelig hurtigt.
Så første ting, vi kommer til at gøre, er bede brugeren om et heltal, den
Antallet af mennesker i lokalet.
Når vi har at heltal, vi erklære et array.
Bemærk dette beslag syntaks.
Du kommer til at vænne sig til det.
>> Så vi erklære et array af heltal kaldet aldre, og der er n
heltal i dette array.
Så dette mønster lige her, er dette 4 int Jeg er lig 0, jeg er mindre end n, jeg plus
plus, er der også kommer til at være et mønster at du meget vænne sig til.
Fordi det er temmelig meget, hvordan du er altid kommer til at gentage over arrays.
Så husk, at n er længden af ​​vores array.
Og så her er vi gentagne gange anmodet for en alder af person, jeg i rummet.
>> Efter dette, går vi ned, og uanset vilkårlig grund, vi så
udskrive hvor gamle de skal hen at være et år fra nu.
Og kører dette program, så lad os lave aldre, dot slash aldre.
Så antallet af personer i rummet, lad os sige, at der er tre.
Og sige, den første person er 13, næste er 26, og den sidste er 30..
Så det vil gentage over disse tre folk, udskrive 14, 27, og 31.
>> Så husk, at når vi erklærer en vifte af størrelse n, indeksene i denne
array, array har værdier, og indeks 0, 1, 2, hele vejen
op til n minus 1.
Så når vi sagde, at der var tre mennesker i rummet, og vi sætter ind her
den første iteration gennem denne loop, er jeg kommer til at være 0.
Så i indeks 0.
Vi tildeler den første ældes brugeren indtaster.
Derefter i den næste, vi kommer ind i sekund n brugeren indtaster, og i
siden af ​​to, den sidste n.
>> Så bemærke, at en bred vifte af størrelse tre ikke har noget
i indekset tre.
Dette er ikke gyldigt.
Ok.
Så gå tilbage her.
Så nu, at vi har behandlet arrays, vi har et vist kendskab.
Nu vil vi gå videre til kommando line argumenter, som der vil være
temmelig relevant for dette problem sæt.
>> Så indtil nu, når du har erklæret din vigtigste funktion, vi har
sagde int main tomrum.
Så tomrum betyder blot, at vi er ikke passerer nogen
argumenter denne funktion.
Nu vil vi se, at hoved kan tage nogle argumenter.
Her kalder vi dem int argc og streng argv parentes.
Beslagene igen angivelse at vi har at gøre med arrays.
Så her, snor argv parentes, er vi beskæftiger sig med en bred vifte af strenge.
Så argc, er, at kommer til at angive hvor mange argumenter, vi har
videregives til dette program.
Og for at se, hvad det betyder, lad os lukke dette.
>> OK.
Så indtil nu, har vi køre hver program som dot slash aldre.
Vi kan også, på kommandolinjen, forbi overfører argumenter, således udtrykket, kommando
line argumenter.
Så det første argument, hej verden.
Så her ville argc være tre.
Det er optællingen af ​​de argumenter, på kommandolinjen.
Argc er altid mindst 1, da dot slash aldre, selv tæller som ét af
kommandolinje-argumenter.
>> Så hej er den første.
Hvis dot slash aldre er nulte, så hej er den første, og verden er
anden kommandolinje argument.
Så strengen argv, vi kommer til at se, indeholder strenge, dot skråstreg
aldre, hej, og verden.
Og ved Davids anmodning, vil vi at afspille en video indføre det.
>> [VIDEOAFSPILNING]
>> -Indtil nu i programmer, vi har holdt skrevet, har vi erklære
main som int main tomrum.
Og al den tid, det tomrum har simpelthen været det fremgår, at
Programmet tager ikke kommandolinjeargumenter.
Med andre ord, når en bruger kører et program, kan han eller hun giver kommando
line argumenter ved at skrive ekstra ord eller sætninger efter programmets
navn ved prompten.
>> Tja, hvis du ønsker du dit program til tage kommandolinjeargumenter, en eller
flere sådanne ord har vi brug for at erstatte ugyldig med et par argumenter.
Så lad os gøre det.
Medtag CS50.h.
Medtag standard io.h.
Int main.
Og nu, i stedet for tomrum, jeg har tænkt mig at specificere en int kaldet argc, og en
vifte af strenge kaldes argv.
Nu argc og argv er simpelthen konventioner.
>> Vi kunne have kaldt disse argumenter de fleste noget, vi ønsker.
Men hvad der er vigtigt, er, at argc er en int fordi, per definition, er det
kommer til at indeholde argumentet feltet den antallet af ord i alt at
brugeren har indtastet på hans eller hendes prompt.
argv, i mellemtiden, vektor argument er vil faktisk være et array opbevaring
alle de ord, som brugeren har skrevet på hans eller hendes prompt.
>> Lad os gå videre til at gøre noget nu med en eller flere af disse
kommandolinjeargumenter.
I særdeleshed, lad os gå videre og udskrive uanset ord brugeren typer
efter programmets navn ved prompten.
Åbneparentes.
Luk beslag.
Printf procent s omvendt skråstreg og komma.
Og nu har jeg brug for at fortælle printf hvilken værdi til at sætte i denne pladsholder.
Jeg vil have det første ord, som brugeren har skrevet efter programmets navn,
og så jeg har tænkt mig at specificere argv beslag 1 tæt
parentes, semikolon.
>> Nu, hvorfor beslag 1 og ikke beslag 0?
Tja, det viser sig, gemmes automatisk i argv 0 kommer til at være den
programmets faktiske navn.
Så det første ord, brugeren skriver efter programmets navn er, ved
konvention, kommer til at være lagret i argv 1.
Lad os nu kompilere og køre dette program.
>> Gør argv 0, dot skråstreg argv 0.
Og nu et ord som hej.
Enter.
Og der har vi det, hej.
>> [END VIDEOAFSPILNING]
>> ROB BODEN: Okay.
Luk det.
Så tage et kig på det program, der vi bare introduceret til os, ja, bare
for at vise, hvis vi udskriver argv 0, gøre, nu hvad er det, argv 0, dot skråstreg argv 0.
Så, som forventet, er det at udskrive navnet på det program, da argv 0 er
altid vil være den navn på programmet.
Men lad os gøre noget bit mere interessant.
>> Så i problemet sæt, vil du blive introduceret til denne funktion, atoi.
Så hvad bruger vi atoi efter?
Det kommer til at konvertere en streng til et heltal.
Så hvis jeg passerer strengen, en to tre, til atoi, vil der konverterer, at
til heltal, en to tre.
Så vi kommer til at konvertere den første kommandolinjeargument til et heltal,
og så bare udskrive denne heltal.
>> Så dybest set er vi slags omimplementere getint, bare
heltal indtastes på kommando linje i stedet for i programmet
interaktivt.
Så gør argv 0, lad os gøre det her, og luk det.
Så kører argv 0, og lad os komme ind i heltal, en to tre fire ene to.
Så det vil udskrive heltal, en to tre fire ene to.
Der er nogle finesser at atoi at det vil stoppe bekymre sig om noget
ud over en gyldig numerisk tegn, men det betyder ikke noget.
>> Så hvad tror du der sker hvis jeg gør dette?
Segmenteringsfejl.
Så hvorfor er det?
Hvis man ser tilbage på vores program, er vi konvertering argv 1, første argument
efter navnet programmet til et heltal.
Men der er noget argument passeret efter programmets navn.
Så her ser vi, at dette er en buggy programmet, da, hvis vi forsøger at køre det
uden nogen argumenter, vil det bare gå ned.
>> Så en anden fælles mønster, du vil se er noget lignende, hvis argc er mindre
end to, indikerer, at der ikke var mindst navnet og et program
første argument, så vil vi gøre noget ligesom printf, ikke nok
kommandolinjeargumenter.
Det er formentlig ikke en god en til at udskrive, det er nok noget, som
skal du indtaste et heltal på kommandolinjen.
Jeg vil bare ende det der.
Og derefter vende tilbage 1..
Så husk, at ved udgangen af ​​vores program, hvis vi vende tilbage 0, den slags
angiver succes.
Og vigtigste også automatisk returnerer 0 hvis du ikke gør.
>> Så her er vi retuning 1 for at angive at det ikke er succes.
Og du kan vende tilbage, hvad du vil, bare, 0 angiver succes, og
andet indikerer fejl.
Så lad os køre denne version af tingene.
Så nu, hvis vi ikke indtaste en kommando linje argument, vil det rigtigt fortælle
os, ikke nok kommandolinje.
Fandt du ikke afslutte sætningen.
Else, hvis vi rent faktisk give det en, det kan gennemføre programmet.
Så dette er, hvordan du ville bruge argc i For at validere antallet af
kommandolinjeargumenter, faktisk bestået.
>> Så lad os gøre dette program en smule mere kompliceret, og se på det andet
iteration af tingene.
Så nu, at vi ikke bare udskrive første kommandolinje argument.
Her er vi iteration fra int i ligemænd 0, i er mindre end argc, jeg plus
plus, og trykning argv, indeks i.
Så dette mønster, igen, er det samme mønster som før, undtagen i stedet
kalde variablen n bruger vi argc.
>> Så dette er iteration over hver indeks i arrayet, og udskrivning af hver
element i denne matrix.
Og så, når vi kører dette program, ja, Jeg gik ikke ind nogen kommandolinie
argumenter, så det bare prints programmets navn.
Hvis jeg indtaster en masse ting, det vil udskrive én, hver på sin egen linje.
>> OK.
Så lad os tage et skridt videre.
Og i stedet for at udskrive hvert argument på sin egen linje, lad os udskrive hver
karakter af hvert argument på sin egen linje.
Så husk at argv er en vifte af strenge.
Så hvad er en streng, men et array af tegn?
Så det betyder, at argv er virkelig en matrix af et array af tegn.
Så drage fordel af det, lad os ignorere dette for nu.
Lad os lige overveje strengen argv 0.
>> Så hvis vi ønsker at bringe hver karakter argv 0 på sin egen linje, så vil jeg
at gøre det mønster, vi er vant til, jeg er mindre end længden af ​​array,
som her er strlen af, det er ikke, hvad jeg ønsker at gøre, snor
s lig argv 0.
Så jeg er mindre end længden af ​​vores array, som i dette tilfælde er en matrix
tegn, jeg plus plus.
Og så, som vi så i sidste uge, er det ideelt hvis vi flytter at strlen udenfor
Den tilstand, vil da n tilføje den strlen af ​​s hver gang vi gå
gennem løkken, og det er ikke kommer til at ændre sig.
Så vi vil sætte det lig med n herovre.
>> OK.
Så nu er vi iteration i hvert indeks i array'et.
Og så, hvis vi ønsker at udskrive hver karakter i den pågældende matrix, procent c er
flaget vi ønsker at bruge for tegn.
Og nu et beslag jeg kommer til at være den streng, indeks karakter i, så hvis
snor var hej.
så s 0 vil være h, s beslag 1 vil være e, og så videre.
>> Så nu er vi ønsker at kombinere disse to ting.
Vi ønsker at udskrive hver karakter af hver kommandolinje argument.
Så vi bliver nødt til en indlejret for løkke.
Og konventionelt, den første tæller er mig, det næste bliver j, n
vil være strlen af ​​argv i, i er mindre end n, jeg plus plus.
Og nu i stedet for trykning argv i, så argv beslag Jeg kommer til at indeksere -
der kommer til at være det i'te kommandolinje argument argv i, j vil
være den j'te karakter det i'te argument.
Jeg vil slippe af med dette op her nu da vi sætter det ind i denne løkke.
Så svarer til strengen s ligemænd argv i, og derefter s beslag j.
>> Nå, behøver vi ikke at erklære denne variabel s.
I stedet vil vi bare kombinere disse to i, hvad vi havde, argv i, j.
>> SPEAKER 1: [uhørligt].
>> ROB BODEN: God opkald.
Så dette er brudt.
Hvis jeg kørte faktisk det, vi ville har indset dette.
Så tæller jeg ligeglad i dette til
løkke er j, iterator.
Så du ville have kørt ind i problemer, sandsynligvis en uendelig løkke, hvis vi
ikke havde fastsat det.
Det er derfor, vi også taler om debugging dag.
>> OK.
Så lad os køre dette program.
Og lad os faktisk tilføje en særskilt printf lige her, der vil bare udskrive
en anden linje, da dette betyder, at når vi køre programmet, vil der være en tom
linje mellem hver karakter hver kommandolinje argument.
Nå, vil vi se, hvad det betyder.
PK.
Fik nogle fejl.
Fejl implicit erklære biblioteksfunktionen strlen.
>> Så gå tilbage ind i vores program, jeg glemte at hash omfatte string.h.
Så string.h kommer til at være den header fil, der erklærer
funktionen strlen.
OK, det kompilerer.
Nu, lad os køre den.
Så netop det.
Det kommer til at udskrive vores program navn, hej verden.
Det kommer til at udskrive hver ting, hver karakter, på sin egen linje.
OK.
>> Så lad os faktisk tage dette et skridt videre.
Og i stedet for at bruge string.h, lad os tænke over, hvordan vi ville gennemføre vores egen
strlen funktion.
Så jeg vil straks giver en funktion signatur.
Så lad os kalde i my_strlen, og det er kommer til at tage en streng som argument,
og vi forventer at vende tilbage Længden af ​​denne streng.
Så hvor er den fyr?
Ja.
OK.
Så husker fra tidligere dias, var også fra i sidste uge, at en
vifte af tegn, ja, en streng, så lad os sige det er vores streng s.
Så hvis s er den streng, goddag, så H-E-L-L-O, i hukommelsen, der kommer til at
være, og så er denne omvendt skråstreg 0 tegn.
>> Så hvordan får vi længden af ​​s?
Nå, er det trick på udkig efter dette tilbageslag 0 karakter denne null
terminatoren.
Så algoritmen går at være noget som kun få
nok tegn, -
lad os få denne hånd repræsenterer nogle tæller, lad os kalde denne int længde.
Så starter fra herovre, er vi kommer til at gentage over vores streng.
>> Så det første tegn, det er H, og det er ikke tilbage slash 0, så
længden er 1..
Gentage til næste tegn, E og det er ikke backslash 0.
Længden er 2.
L 3.
L 4.
O 5.
Og endelig kommer vi til backslash 0, og så betyder, ja,
denne streng er overstået.
Så lad os vende tilbage 5.
>> Så rent faktisk gennemfører det første, min n længde er lig 0, min højre hånd.
Og vi kommer til at gentage -
>> SPEAKER 1: [uhørligt]
>> ROB BODEN: Åh, skyde.
God opkald.
Boom.
Så n længde er lig 0.
Så nu, mens s længde ikke lige og derefter omvendt skråstreg 0.
Så husk, dette omvendt skråstreg 0, er det en faktiske karakter, og det indikerer
enden af ​​strengen.
Ligesom også, backslash n er et virkeligt karakter.
Backslash 0 kommer til at indikere slutningen af ​​vores streng.
Jeg ønsker ikke at sætte det der.
Og mens s indekseret af længde ikke lig med nul terminator derefter
vi bare at forøge længden.
Så i slutningen af ​​vores program, Længden er i sidste ende kommer til at
være 5 i dette tilfælde.
Og vi bare returnere længde.
>> OK.
Så nu hernede, det gør jeg ikke gøre my_strlen.
Lad os kompilere det for at sikre alt kører problemfrit.
Var jeg gør i 2?
Eller var at 1?
Det skulle gøre.
Ok.
Så dette er argv 2.
Fungerer som forventet, selv om var, at jeg gjorde det i?
Ja.
OK.
Denne version af ting afse printf ny linje efter, men det
ikke gøre nogen forskel.
OK.
Så arbejdede som forventet.
>> Nu kan vi endda kombinere et skridt videre, hvor varsel her, ja,
første, vi snuppe strlen af ​​argv i, og så er vi iteration i
hver karakter i denne streng.
Så i stedet for at gøre det, hvad nu hvis vi bare kombinere denne logik for at vente
indtil vi ramte backslash 0 højre ind i denne for-løkke?
Så gentage mens argv i, j gør ikke lig backslash 0.
Så lad os køre det først.
>> Ok.
Så her er denne betingelse siger -
lad os klare det.
Så nu, lad dette være vores argv.
Så da jeg løb bare at programmet før, argv er en vifte af strenge.
Og så, hvis jeg kører det med prik skråstreg argv 2, hej verden, så argv
selv er længde 3 til argv nul, hallo, og verden.
>> Og inden for hver af disse indeks er selv et array, hvor det vil være
prik, vil dette være skråstreg, ved jeg ikke hvis det var den rigtige retning, jeg
tror ikke, det var.
A-R-V streg, har brug for mere plads.
Lad os skæres i dette array.
A-R-V dash 0 og derefter omvendt skråstreg 0.
Og så i uorden vil være hej.
Lad os sige, H-E backslash 0.
Og endelig, W-O omvendt skråstreg 0.
>> Så den algoritme, som vi lige har skrevet, den indlejret efter sløjfer, hvad de er
gør er, at vi først har imødegå i og derefter j.
Dette ville være lettere med kode på skærm, lad os gå tilbage til dette.
OK.
Så bemærke, at jeg er den iterator, der er iteration over hver kommando
line argument.
Og j er iterator iteration over hver karakter, idet
kommandolinje argument.
Så hvad det inderste printf gør er, 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 til at
lige backslash 0.
>> Så vi afslutte det for-løkken, og nu jeg gentager til 1..
Og nu vil vi udskrive argv 1 0, argv 1 1 -
Nå, nu, da jeg skar hej kort, argv 1 2 igen kommer til at være
backslash 0.
Og så øg jeg og fortsætter, og så videre, indtil vi udskrive alle
verden, og dem er tre kommandolinje argumenter, og vi vil afslutte ud af
den yderste sløjfe, og afslutte vores program.
OK.
>> Så lad os komme tilbage her.
Så du vil få et vist kendskab til kommandolinje argumenter på dette
særligt problem indstillet.
>> Nu, debugging.
Så har du sikkert allerede har haft at gøre nogle debugging med din tidligere
problem indstillet.
Og en meget nem måde debugging, første, lad os se på et fejlbehæftet program.
Nå, gå gennem dette program, vi kommer til at bede brugeren om et
heltal, grab, at tal, og derefter, vilkårligt, har vi en while-løkke, der
er bare at formindske Jeg indtil det er lig med 10.
Lad os bare antage jeg ind et helt tal større end 10.
Så formindske jeg indtil det er lig med 10.
>> Og så har vi en anden, mens løkken at, mens jeg ikke er lig 0, er vi
kommer til at formindske jeg med 3.
Så hvis du ser hensigten med den bug her, det er, at dette vil formindske i for at
være 10, og derefter dette, mens sløjfen decrement i fra 10 til 7, til 4, til 1,
negativ 2 til negativ 5, og så videre, til negativ uendelig, da jeg vil
faktisk aldrig lig med 0.
Og så i slutningen af ​​dette program, vi har foo funktion, som er
foregår på print ud, at jeg.
>> Så dette er en kort og triviel program, og fejlen er indlysende,
især efter jeg bare sagde hvad fejlen var.
Men hensigten her er, ja, det kan faktisk ligner nogle af dine
løsninger fra grådige fra den sidste problem indstillet, og måske du har
nogle uendelig løkke i dit program, og du har ingen idé
hvad der forårsager det.
Så en meget nyttig debugging teknik er bare at tilføje printfs
hele din kode.
>> Så her jeg vil have en printf udenfor første while-løkke.
Og her vil jeg en printf, og jeg vil bare udskrive jeg.
Jeg vil endda gøre først, mens loop, jeg.
Udenfor sekund, mens løkken.
Igen, udskrive inde af her, den værdi, jeg.
Og lad os køre dette.
>> Så dot skråstreg debug.
Indtast et heltal.
Lad os gøre 13.
Og boom.
Vi ser, at vi er uendelig looping inde i den anden, mens løkken.
Så nu ved vi, hvad fejlen er.
Men printf debugging er helt fantastisk, men når dine programmer får
længere og mere kompliceret, er der mere avancerede løsninger
få tingene fungerer.
Så lad os fjerne alle disse printfs.
Og lad os sørge for jeg ikke gjorde bryde noget.
OK.
>> Så det program, vi vil at indføre kaldes
GDB, til GNU Debugger.
Tja, faktisk, lad os fjerne debug for et sekund, og at debug igen.
Tja, faktisk først, en god lektion i kommandolinjeargumenter.
Bemærk, at denne Clang kommando, der er kompilering alt bliver passeret
på kommandolinjen, disse kommandolinjeargumenter.
Så præcis, hvordan du skal bruge kommandolinjeargumenter, som vi
gjorde før, og som du vil i PSET 2, det er hvordan Clang bruger dem.
>> Så bemærke, at denne første flag, bindestreg ggdb3, hvad det er at sige er, Dunk,
bør du kompilere denne fil med hensigt, at vi i sidste ende vil
nødt til at debug det.
Så så længe du har det flag, så vi kan GDB debug.
Og det vil åbne op for GNU Debugger.
>> Så der er en masse kommandoer at du har brug for at vænne sig til.
Først den ene, som du sandsynligvis vil straks behøver køres.
Så hvad er Run gøre?
Det kommer til at starte vores program.
Så køre, startende, programmet beder os for et heltal, 13..
Og så er det uendelig looping som forventet, bortset fra at jeg fjernede
printfs, så vi ikke engang se det.
Forladt normalt.
Oh.
Det er muligt, at det pakket alle de vej rundt, tilbage til - at ignorere det.
Antag det ikke afslutter normalt.
Der er et kompliceret svar på det.
>> Så nu, det er ikke meget nyttig.
Så bare kører vores program inde i denne debugger hjælper os ikke på nogen
måde, da vi kunne bare have gjort dot skråstreg debug udefra GDB.
Så en kommando, der Du vil sikkert -
og jeg vil afslutte dette.
Ctrl-d eller holde op, både arbejde.
Så lad os åbne den op igen.
>> En anden kommando, som du sandsynligvis vil straks ønsker at
vænne sig til, er Break.
Så vi vil bryde den vigtigste for nu, og så vil jeg forklare det.
Nå, her ser vi, at vi sat et breakpoint på denne linie i debug.c.
Så hvad pause betyder er, at når jeg skriv køre, er programmet kommer til at
fortsætte med at køre, indtil Jeg ramte et breakpoint.
Så når jeg ramte løb, starter programmet, og derefter det bryder så snart det
ind i hovedfunktion.
Break vigtigste vil være noget du temmelig almindeligt gøre.
>> Og nu, til at introducere dig nogle flere kommandoer.
Bemærk her, at det siger vi brød på linje 11, der er
printf indtaste et heltal.
Så kommandoen Næste kommer til at være, hvordan vi gå til næste linje kode.
Dette vil give os mulighed for at træde gennem vores program linje for linje.
Så næste.
>> Nu linje 12, vi vil at få heltal.
Næste.
Og hvis du bare trykke Enter igen, vil det redo den sidste ting du gjorde.
Så jeg behøver ikke at skrive næste hver gang.
Så indtaste et heltal, 13..
Så nu, linje 14, mens jeg er større end 10, og jeg vil gøre næste.
Og vi ser, vi kommer til at formindske jeg.
Så vi kommer til at formindske jeg igen.
>> Så nu, en anden nyttig Kommandoen er Udskriv.
Så Print kommer til at udskrive værdien af ​​variablen.
Lad os bringe ud af værdien variabel i.
Lad os printe jeg.
Det kommer til at sige, at jeg er 11..
Nu er vi Næste igen, mens i er større end 10.
Så jeg er stadig større end 10, da det er 11.
Jeg minus minus.
Lad os udskrive i igen.
Som forventet, er det 10..
>> Så nu, næste.
Det kommer tilbage til den tilstand, jeg er større end 10, men jeg er nu 10, så
det er ikke større end 10, så vi forventer det til at falde ud af, mens løkken.
Og nu er vi under denne linje kode.
Og en anden kommando, Liste er bare at vise det forrige og næste
par linjer kode, i Skulle du miste dig selv.
Så vi bare forladt dette, mens loop, og nu har vi indgået dette
mens loop, linie 18.
Så mens jeg ikke er lig 0.
Og næste, jeg lig i minus 3, og vi vil bemærke, vil dette bare holde i gang.
Og vi kan printe jeg.
>> Hver kommando har slags genveje.
Så p er en forkortelse for Print.
Så vi kan p jeg.
Bare holde holde n, eller holde gør Næste.
Udskriv jeg igen.
Du ser nu er det negativ 167.
Så dette vil fortsætte i al evighed, men ikke virkelig evigt, da du lige har set, er det
rent faktisk vil ende på et tidspunkt.
>> Så det er begyndt GDB.
Men lad os gøre én ting mere i GDB.
Uh, debug.
Så i dette særlige tilfælde uendelig løkke sket for at være inde i
hovedfunktion.
Og for nu, bare acceptere, at at jeg er kommer til at bevæge den uendelig løkke i
foo funktionen.
Bare husk, at ved udgangen af ​​dette program, ja, det var oprindelig
ringer foo, der var bare kommer til at udskrive jeg.
Men nu vi kalder foo, der er kommer til at formindske jeg indtil det er 0, og
derefter udskrive denne variabel.
OK.
Gem det.
Foretag debug.
Og nu, gdb debug.
OK.
>> Så hvis jeg bare køre så jeg ikke kommer til at være i stand til rent faktisk at gå gennem min
program line-by-line.
Så lad os bryde på main, og skriv derefter løb.
Så gå igennem dette, printf, indtast et heltal, får heltal, 13..
Så vi vil holde decrementing indtil jeg er større end 10.
Så vi kommer til at falde igennem mens løkken, og komme til den linje -
Lad os åbne det op i et separat vindue.
Så vi dekrementeret indtil jeg ikke længere var større end 10, og så vi
kaldte funktionen foo.
>> Så hvad skete der så snart jeg ramte funktion foo, ja, jeg hedder foo, og
så jeg ikke længere havde kontrol over GDB.
Så så snart jeg ramt på Næste på denne linje, tingene fortsatte indtil dette skete,
hvor programmet forlades, når -
antage at det eksisterede ikke sidst.
Du så det pause for lidt selv.
Så hvorfor har jeg miste kontrollen over programmet på dette punkt?
Tja, når jeg skriver næste, der går til den bogstavelige næste linje kode,
vil udføre.
Så efter linie 21, den næste linje kode der skal udføre er linie 22,
der er, spændende fra vigtigste.
Så jeg vil ikke bare gå til den næste linje kode.
Jeg ønsker at gå ind i den funktion, foo, og derefter også gå gennem
disse linjer kode.
>> Så for at vi har et alternativ.
Lad os afslutte det igen.
Break main.
Uh, 1, næste, næste, 13, næste, næste dernæst forsigtigt
før vi ramt linie foo.
OK.
>> Så nu er vi på linje 21, hvor vi kalder foo.
Vi ønsker ikke at skrive næste, da det vil bare kalde funktionen foo, og
gå til næste linje kode.
Hvad vi ønsker at bruge, er Step.
Så der er en forskel mellem trin og Next, hvor Step træder ind i
fungere, og Next går over funktionen.
Det bare udfører helhed funktionen og holder vil.
>> Så Step kommer til at bringe os ind i den funktion, foo.
Og vi ser her, nu er vi tilbage på dette, mens løkke, der er i teorien
vil fortsætte for evigt.
Og hvis du rammer Step, når det ikke engang en funktion til at kalde, så er det
identisk med Næste.
Så det er kun, når du er på en linje, kalder en funktion, Trin
kommer til at afvige fra Next.
Så Step vil bringe os her.
Step, step, step, step, step, step, og vi bare uendelig løkke evigt.
>> Så du måske vænne sig til det som din måde at identificere uendelige løkker, er
bare holde dette tasten Enter for at se, hvor du går i stå.
Der er bedre måder at gøre det, men for nu, det er helt tilstrækkeligt.
Og stilistisk, at opfylde Style 50, jeg skulle have gjort dette.
OK.
>> Så en sidste kommando at indføre.
Nå, lad os gdb debug i.
Så i stedet for at bryde ved main, hvis jeg kender foo funktion er også den
problem, så kunne jeg lige har sagde, pause på foo stedet.
Lad os sige, jeg bryder på både hoved-og foo.
Så du kan sætte lige så mange breakpoints som du ønsker.
Når jeg skriver køre, går det at stoppe ved -
ooh, lad os rekompilere, eftersom Jeg ændret tingene.
Du vil se denne linje, Advarsel kilde filen er nyere end eksekverbare.
Så det betyder, at jeg bare gik i her og ændret disse i overensstemmelse med stil
50, men jeg havde ikke genkompilere programmet.
Så GDB gør mig opmærksom på dette.
Jeg vil holde op, gør debug igen, hit gdb debug.
OK.
>> Så nu tilbage til det, jeg lavede.
Break main, bryde foo.
Nu, hvis jeg kører programmet, så det er vil fortsætte indtil rammer en
breakpoint.
At breakpoint sker være den første til main.
Nu, i stedet for at gøre næste, næste, næste, næste, næste, indtil jeg ramte foo, jeg
kan skrive fortsætte, hvilket vil fortsætte indtil du trykker på næste breakpoint.
Jeg er nødt til at indtaste heltal først.
Fortsæt vil fortsætte, indtil jeg ramte næste breakpoint, nemlig at
funktion af foo.
>> Så Run kører indtil du rammer en breakpoint, men du kun skriver kører, når
du starter programmet og derefter fra da af er det fortsætte.
Hvis jeg vidste bare bryde hoved-og derefter løb, vil det bryde på
main, og derefter fortsætte.
Da jeg ikke har en pause punkt foo, indtaste heltal, så nu er jeg
ikke kommer til at knække ved foo.
Det er bare at uendelig løkke, indtil det.
OK.
>> Så det er Intro til GDB.
Du bør begynde at bruge det i dit problem sæt.
Det kan være meget nyttigt at identificere fejl.
Hvis du rent faktisk bare, linje for linje, gå gennem din kode, og sammenligne, hvad er
faktisk sker med hvad du forventer til at ske, så er det temmelig
svært at gå glip af dine fejl.
OK.
>> Så i sidste uge David bragt op på denne hemmelige nøgle-kryptering stuff til
første gang, hvor vi ikke ønsker passwords bare gemmes på vores
computer i nogle almindelig tekstfil, hvor nogen kan komme over og bare
åbne det op og læse dem.
Ideelt set, ville de være krypteret på anden måde.
Og i Problem Set 2, vil du blive beskæftiger sig med én metode til kryptering,
eller, ja, to metoder, men de er ikke så stor.
Hvis du gør hackeren udgave, er du også kommer til at beskæftige sig med
dekryptere nogle ting.
>> Så spørgsmålet er nu, ja, selv om vi har den stærkeste kryptering
algoritme i verden, hvis du vælger en specielt dårlig password, så er det
vil ikke hjælpe dig meget, da folk vil stadig være i stand til at regne det ud.
Selvom se krypterede streng og det ligner en rod af skrald
det betyder intet for dem, hvis de stadig bare nødt til at prøve et par passwords
at regne det ud, så du ikke meget sikker.
Så ser video, der gør dette punkt.
>> [VIDEOAFSPILNING]
>> -Hjelm, du djævel.
Hvad sker der?
Hvad laver du med min datter?
>> -Tillad mig at introducere den geniale ung plastikkirurg, Dr. Phillip
Schlotkin den største næse job mand i hele
universet, og Beverly Hills.
>> -Deres Højhed.
>> -Næse job?
Jeg forstår det ikke.
Hun har allerede haft en næse job.
Det var en sød seksten stede.
>> -Nr.
Det er ikke hvad du tror.
Det er meget, meget værre.
Hvis du ikke giver mig kombinationen til luftskjoldet Dr. Schlotkin vil
give din datter tilbage sit gamle næse.
>> -Nr.
Hvor fik du den?
>> -Okay.
Jeg vil fortælle.
Nej, far.
Nej, du skal ikke.
>> -Du er ret, min kære.
Jeg vil savne din nye næse.
Men jeg vil ikke fortælle ham kombinationen, uanset hvad.
>> -Meget godt.
Dr. Schlotkin, gør dit værste.
>> -Min fornøjelse.
>> [TOOLS skærpes]
>> -Nr.
Vent.
Jeg vil fortælle.
>> -Jeg vidste, at det ville fungere.
Ok.
Giv den til mig.
>> -Kombinationen er én.
>> -One.
>> -Two.
>> -Tre.
>> -Four.
>> -Five.
>> -Så en kombination er én, to, tre, fire, fem.
Det er det dummeste kombination Jeg nogensinde har hørt i mit liv.
Det er den slags ting, en idiot ville have på hans bagage.
>> -Tak, Deres Højhed.
>> -Hvad gjorde du?
>> -Jeg slukkede for væggen.
>> -Nej, du ikke gjorde.
Du slukkede hele filmen.
>> -Jeg må have trykket på den forkerte knap.
>> -Nå, sætte det på igen.
Sæt filmen igen.
>> -Ja, sir.
Ja, sir.
>> -Lad os gå, Arnold.
Kom, Gretchen.
Selvfølgelig, du ved, jeg vil stadig nødt til at fakturere dig for dette.
>> [END VIDEOAFSPILNING]
>> ROB BODEN: Okay.
Så nu, at vi allerede taler om sikkerhed på nogle måder, nice
lille film plakat, så i de seneste dage, disse spørgsmål med NSA
overvågning alt.
Det kan være svært at føle, at du har en form for privatlivets fred i den
online-verden, selv om jeg ikke kunne fortælle du de fleste af detaljerne i PRISM.
Så bevæger sig over prisme, vi kommer ikke til at være tale om, at nu
tænke på din bærbare computer.
Så op her, jeg ønsker at skifte til mit egentlige konto,
med min lille pingvin.
Så jeg har sat et password, og at password er hvad jeg ønsker, det skal være.
>> Men husk, at hvad jeg logge i med, så dette login
hurtig, er nogle program.
Det er nogle program, der var skrevet af nogle person.
Og ja, denne person, hvis de er særligt ondsindede, de kunne
har sagt, okay, så hvis adgangskoden at jeg indtaster er lig med min
faktiske adgangskode, eller det er lig til nogle særlige adgangskode -
David er awesome eller noget -
så lad dem i.
Så en ondsindet programmør kunne have adgang til alle dine Mac-computere, eller
Vinduer, eller noget.
>> Så det er ikke meget af en bekymring, da der Jeg mener, det er login program
der er leveret med OS X, hundreder eller tusindvis af mennesker har
revideret denne kode.
Og så, hvis, i din kode eller andet sted, du sige, hvis denne streng lig ligemænd
David er awesome, login, så nogen er kommer til at være, ligesom, vent.
Det er ikke rigtigt.
Dette bør ikke være her.
Så det er en måde, vi får tingene at være slags sikker.
>> Men tænk over endda programmer som du skriver.
Lad os sige, du skrev login-programmet.
Så dette login program, du skrev, så selvfølgelig, du er en god
programmør.
Du kommer ikke til at sætte nogen skadelig hvis x er lig lig David er awesome
ind i din kode.
Men dette program, hvad gør du bruge til at kompilere dette program?
Noget lignende Dunk.
Så hvad hvis den person, som tilfældigvis skrive Clang særlig hylstre i Clang
noget lignende, hvis jeg samle den login program, og indtast derefter koden
ind i login-program, der siger, hvis x lig lig David er awesome?
Så ikke helt endnu, men vi har det samme problem her, hvor Dunk, ja,
tusinder, hvis ikke titusinder af mennesker, har kigget på Dunk, har
kiggede på sine linjer kode og sagde, okay, der er ikke noget dårligt her.
Naturligvis er der ingen gør noget denne ondsindede.
>> Men hvad der er klang i sig selv, ligesom, hvad hvis jeg kompilere Dunk?
Hvad hvis jeg har nogle compiler, kompilerer Dunk, som indsætter i Clang
denne særlige hack, der siger, okay, når jeg kompilere Dunk, så
eksekverbar Jeg får bør specielt se indersiden af ​​login-program og Indsæt
denne adgangskode, er lig med ligemænd Dave er awesome?
Så husk, at din compiler selv skal udarbejdes på et tidspunkt.
Så hvis det, du vælger at kompilere Clang med, er i sig selv skadeligt, så du
kunne skrues hele vejen ned linjen.
>> Så her har vi Ken Thompson og Dennis Ritchie.
Så dette er et ikonisk foto.
Dennis Ritchie er til højre.
Han er en stor -
temmelig meget skrev C. Så du kan takke ham for denne klasse.
Ken Thomson er til venstre.
De to af dem dybest set skrev UNIX.
Nå, var de største bidragydere i UNIX.
Der var nogle andre.
Så Ken Thompson, på et tidspunkt, Han vinder Turing Award.
Og Turingprisen, har jeg altid hørt Det refereres på denne måde, er det den
Nobelpris datalogi.
>> Så i Turing Award, han har til at give sin takketale.
Og han giver denne meget berømte tale nu kaldet Overvejelser om Trusting
Trust, som vi har knyttet til på kursets hjemmeside.
Og i denne tale, siger han, okay, så jeg skrev UNIX, og nu alle
du folk bruger UNIX.
Husk nu, i dag, at Linux er en direkte efterkommer af UNIX.
OS X direkte bruger UNIX.
Windows gør ikke så meget, men en masse af ideer blev taget fra UNIX.
>> Så han går op på scenen og siger, okay, jeg skrev UNIX.
Og bare så du fyre ved, jeg er stand til at logge ind i hver
eneste af dine computere.
Da jeg sætter en af ​​disse særlige, hvis x lig lig Ken Thomson er awesome,
så jeg får lov til at logge ind.
Så folk er ligesom, ja, Hvordan har du det?
Vi kiggede på login-programmet og intet er der.
Han er ligesom, ja, jeg ændrede compiler at logge ind på login-program
så login-programmet nu vil have at x er lig med lig Ken Thompson
er awesome.
>> Og de siger, ja, det er ikke sandt.
Vi kigger på compiler, og compiler ikke har nogen linjer
kode som.
Han er ligesom, OK, men hvad er du udarbejdelsen af ​​compiler med?
Og de tænker, og han er ligesom, ja, Jeg er den ene, der gav dig compileren
du bruger til at kompilere compiler, så du kompilere en compiler, der
selv er ondskabsfuld og vil bryde login programmet.
Så dybest set, på det tidspunkt, der er ingen måde du kunne se på kilden
kode af login-programmet at se, hvad der er galt.
Du kunne ikke engang kigge i kildekode compiler
at se, hvad der er galt.
>> Du vil skulle se på maskinen , der faktisk binære af
kompileret compiler til at se, vent, disse linjer kode bør ikke være her.
Men Ken Thompson tog det et skridt videre og sagde, ja, der er
disse særlige programmer, der faktisk hjælpe dig med at læse den binære af programmer,
og så hvis en person har brugt dette program til læse den binære, ville de se disse
linjer kode.
Han ændrede disse programmer til at sige, alle højre, hvis du søger på det
compiler, vis ikke denne særlige sæt af binære.
>> Så er du nødt til at tage det et skridt videre og dybest set, der kunne have
taget flere niveauer af indirektion, og på et tidspunkt, ingen er faktisk
kommer til at være kontrol.
Så den moralske af historien er, at du er ikke kommer til at skrive
Klang i denne klasse.
Du skal bruge klatring Klang en masse i denne klasse.
For alle du kender, Dunk er en ondsindet program, der saboterer hver
enkelt program, du nogensinde har kompileret.
Og for at forlade dig på det meget ildevarslende Bemærk, se dig på onsdag.
>> [Applaus]
>> SPEAKER 2: På det næste CS50.
>> SPEAKER 3: Kan du ikke tør sige det.
Du kan gøre dette.
Du har gjort det før, kan du gøre dette i dag, kan du gøre det i morgen.
Du har gjort det i årevis.
Bare gå derop og gøre dette.
Du kan gøre dette.
>> [Musikgengivelse]