[Musikk spilles] ROB BODEN: Greit. Så, første først, av video fra et kjent ansikt. [VIDEOAVSPILLING] -Greit. Dette er CS50, og dette er begynnelsen av uke tre. Jeg beklager at jeg ikke kunne være der med deg i dag, men la meg få presentere CS50 egen Rob Boden. [END VIDEOAVSPILLING] [Applaus og SKÅL] ROB BODEN: The filmografi i at videoen er fantastisk. OK. Så først, det er en annen lunsj. Det er i morgen kl 01:15. Det er ingen lunsj dette fredag. Det er med Quora. Og Tommy er ikke her ennå, men en av menneskene der er tidligere leder CF, Tommy McWilliam. Så han er en morsom fyr. Du bør komme. OK. Så forrige uke, begynte vi å bryte fra hverandre om hva en streng egentlig er. Vi har kjent siden begynnelsen at det er en sekvens av tegn. Men i forrige uke, dykket vi i det faktum at det som virkelig er en sekvens av tegn, vel, vi har nå matriser av tegn. Og vi vet at en streng, er det en rekke tegn, helt på slutten, vi har denne spesielle null byte, dette backslash 0, indikerer at slutten av strengen. Og så en streng er en rekke tegn, men vi kan ha mer enn bare en rekke tegn, vi kan ha et utvalg av hvilken som helst type ting vi ønsker. Så, hvis du husker fra forrige uke, Ages program som David innført veldig raskt. Så det første vi skal gjøre er spør brukeren om et heltall, den antall personer i rommet. Når vi har som heltall, vi erklære en matrise. Legg merke til denne braketten syntaks. Du kommer til å bli vant til det. Så vi erklære en matrise av heltall kalt aldre, og det er n heltall i denne matrisen. Så dette mønsteret her, dette fire int i er lik 0, i er mindre enn n, i plus pluss, som også kommer til å være et mønster at du blir veldig vant til. Fordi det er ganske mye hvor du er alltid kommer til å iterere over arrays. Så huske at n er lengden på array. Og så her er vi gjentatte ganger spør for en alder av personen jeg i rommet. Etter dette, går vi ned, og uansett vilkårlig grunn, vi så skrive ut hvor gamle de kommer å være et år fra nå. Og kjører det programmet, la oss gjøre aldre, dot slash aldre. Så antall personer i rommet, la oss si at det er tre. Og si, den første personen er 13, neste er 26, og den siste er 30 år. Så da vil det iterere over de tre folk, skrive ut 14, 27, og 31.. Så husk at når vi erklære en utvalg av størrelse n, indeksene i at matrise, har matrisen verdier og indeksene 0, 1, 2, hele veien opp til n minus en. Så når vi sa det var tre personer i rommet, og vi satt i her den første iterasjon gjennom dette loop, er jeg kommer til å være 0. Så i indeksen 0. Vi tildeler den første alder brukeren angir. Så i den neste, vi går inn i andre n brukeren angir, og i ved to, den siste n. Så merker at en rekke av størrelse tre har ikke noe i indeksen tre. Dette er ikke gyldig. OK. Så, gå tilbake hit. Så nå som vi har jobbet med matriser, vi har noen kjennskap. Nå kommer vi til å flytte på kommando for å argumenter, som kommer til å være ganske relevant for dette problemet settet. Så frem til nå, når du har erklærte din viktigste funksjon, vi har sa int main ugyldig. Så void betyr bare at vi er ikke passerer noen argumenter til denne funksjonen. Nå kommer vi til å se at hoved kan ta noen argumenter. Her kaller vi dem int argc og streng argv parentes. Brakettene, nok en gang, noe som indikerer at vi har å gjøre med matriser. Så her, streng argv parentes, er vi arbeider med en rekke strenger. Så argc, som kommer til å indikere hvor mange argumenter vi har gått til dette programmet. Og for å se hva det betyr, La oss lukke dette. OK. Så frem til nå, har vi kjørt hver program som dot slash aldre. Vi kan også, på kommandolinjen, forbi passere argumenter, og dermed begrepet, kommando argumentene. Så det første argumentet, hello world. Så her, ville argc være tre. Det er greven av argumentene på kommandolinjen. Argc er alltid minst en, siden dot slash aldre, selv, teller som ett av kommandolinjeargumentene. Så hei er det første. Hvis dot slash aldre er zeroth, deretter hei er den første, og verden er andre kommandolinje argument. Så strengen argv, kommer vi til å se, inneholder strenger, dot slash aldre, hallo, og verden. Og, av David anmodning, skal vi å spille en video innføre det. [VIDEOAVSPILLING] -Frem til nå i programmene vi ve skrevet, har vi erklære Hoved som int main ugyldig. Og hele denne tiden, har det tomrommet rett og slett vært å spesifisere at Programmet tar ikke noe kommandolinjeargumentene. Med andre ord, når en bruker kjører en program, kan han eller hun gi kommandoen argumenter ved å skrive tilleggs ord eller setninger etter programmets navn i ledeteksten. Vel, hvis du tror du vil at programmet skal ta kommandolinje argumenter, ett eller flere slike ord, må vi erstatte ugyldig med et par argumenter. Så la oss gjøre det. Inkluder CS50.h. Inkluder standard io.h. Int main. Og nå, i stedet for ugyldig, jeg kommer til å spesifisere en int kalt argc, og en tabell med strenger som kalles argv. Nå argc og argv er bare konvensjoner. Vi kunne ha kalt disse argumentene de fleste noe vi ønsker. Men det som er viktig er at argc er en int fordi, per definisjon, er det kommer til å inneholde argumentet teller, den antall ord i total at brukeren har skrevet inn på hans eller hennes spørsmål. argv, i mellomtiden, argument vektor, er kommer til å faktisk være en matrise lagring alle ordene som brukeren har skrevet på hans eller hennes spørsmål. La oss fortsette å gjøre noe nå med en eller flere av disse kommandolinjeargumentene. Spesielt la oss gå videre og print hva ordet brukeren taster etter programmets navn ved ledeteksten. Åpen brakett. Lukk brakett. Printf prosent s backslash og komma. Og nå trenger jeg å fortelle printf hvilken verdi å plugge inn som plassholder. Jeg vil ha det første ordet som brukeren har skrevet etter programmets navn, og så kommer jeg til å spesifisere argv brakett 1, tett parentes, semikolon. Nå, hvorfor brakett 1 og ikke brakett 0? Vel, det viser seg, automatisk lagret i argv 0 kommer til å være det Programmet faktiske navn. Så det første ordet som brukeren skriver etter at programmet heter, etter konvensjonen, kommer til å være lagres i argv en. La oss nå samle og kjøre dette programmet. Gjør argv 0, dot slash argv 0. Og nå et ord som hei. Enter. Og der har vi det, hallo. [END VIDEOAVSPILLING] ROB BODEN: Greit. Lukk det. Så ta en titt på det programmet som vi nettopp introdusert til oss, vel, bare å vise, hvis vi skriver ut argv 0, gjøre, nå hva er det, argv 0, dot slash argv 0. Så, som forventet, er det å skrive ut navnet på programmet, siden argv 0 er alltid kommer til å være det navnet på programmet. Men la oss gjøre noe litt mer interessant. Så i problemet sett, vil du være introdusert til denne funksjonen, atoi. Så hva bruker vi atoi for? Det kommer til å konvertere en streng til et helt tall. Så hvis jeg passerer strengen, en to tre, til atoi, som vil konvertere til heltall, en to tre. Så vi kommer til å konvertere den første Argumentet for kommandolinjen til et heltall, og så bare ut som heltall. Så i utgangspunktet, er vi på en måte reimplementing getint, bare heltall inn på kommando linje i stedet for i programmet interaktivt. Så da gjør argv 0, la oss gjøre det her inne, og lukke det. Så kjører argv 0, og la oss gå inn i heltall, en to tre fire én to. Så det vil skrive ut heltall, ett to tre fire én to. Det er noen nyanserikdommen til Atoi at det vil slutte å bry seg om noe utover en gyldig numerisk tegn, men det spiller ingen rolle. Så hva tror du skjer hvis jeg gjør dette? Segmentering feil. Så hvorfor er det? Hvis du ser tilbake på vårt program, er vi konvertering argv 1, det første argumentet etter programnavnet, til et helt tall. Men det er ingen argument etter programnavnet. Så her ser vi at dette er en buggy program, siden, hvis vi prøver å kjøre den uten argumenter, det vil bare krasje. Så en annen vanlig mønster du vil se er noe sånt, hvis argc er mindre enn to, noe som indikerer at det ikke var minst navnet program og en første argument, så får vi gjøre noe som printf, ikke nok kommandolinjeargumentene. Det er nok ikke en god en til å skrive ut, det er nok noe, som du bør legge inn et heltall på kommandolinjen. Jeg vil bare avslutte den der. Og så tilbake 1. Så huske på at ved slutten av vår program, hvis vi går tilbake 0, den slags indikerer suksess. Og hoved også automatisk returnerer 0 hvis du ikke gjør det. Så her er vi retuning 1 for å indikere at det er ikke suksess. Og du kan returnere hva du vil, bare, 0 angir suksess, og noe annet indikerer svikt. Så la oss kjøre denne versjonen av ting. Så nå, hvis vi ikke går inn en kommandolinje argument, vil det riktig fortelle oss, ikke nok kommandolinje. Visste ikke fullføre setningen. Else, hvis vi faktisk passere den ene, det kan fullføre programmet. Så dette er hvordan du ville bruke argc i For å validere antallet kommandolinjeargumentene er faktisk passert. Så la oss gjøre dette programmet litt mer komplisert, og se på det andre gjentakelse av ting. Så nå, er vi ikke bare skrive ut første kommandolinjeargument. Her, vi gjentar fra int i equals 0, er jeg mindre enn argc, jeg pluss pluss, og utskrift argv, indeks jeg. Så dette mønsteret, igjen, er dette det samme mønster som før, bortsett fra i stedet å kalle variabelen n, bruker vi argc. Så dette er itera over hver indeks i matrisen, og utskrift hver element i denne matrisen. Og så, når vi kjører dette programmet, vel, Jeg har ikke skrevet inn noen kommandolinje argumenter, så det bare utskrifter programnavnet. Hvis jeg legger inn en haug med ting, det vil skrive ut én, hver på sin egen linje. OK. Så la oss ta dette ett skritt videre. Og i stedet for å skrive ut hvert argument på en egen linje, la oss skrive ut hver karakter av hvert argument på sin egen linje. Så husk at argv er en rekke strenger. Så hva er en streng, men en rekke tegn? Så det betyr at argv er virkelig en utvalg av en rekke tegn. Så dra nytte av det, la oss ignorere dette for nå. La oss bare vurdere strengen argv 0. Så hvis vi ønsker å bringe hver karakter argv 0 på en egen linje, så jeg vil å gjøre det mønsteret vi er vant til, er jeg mindre enn lengden av rekken, som her, er strlen av, er at ikke hva jeg vil gjøre, streng s lik argv 0. Så i er mindre enn lengden av vår matrise, som i dette tilfelle er en matrise av tegn, jeg pluss pluss. Og så, som vi så i forrige uke, er det ideelt hvis vi flytter at strlen utenfor av tilstanden, vil da n legge den strlen av s hver gang vi går gjennom løkken, og det er ikke kommer til å være i endring. Så får vi sette den lik n over her. OK. Så nå er vi gjentar i løpet hver indeks i matrisen. Og så, hvis vi ønsker å skrive ut hver karakter i denne matrisen, prosent c er flagget vi ønsker å bruke for tegn. Og nå en brakett jeg kommer til å være den streng, indeks karakter i, slik at hvis den strengen var hallo. deretter s 0 kommer til å være h, s brakett 1 vil være e, og så videre. Så nå ønsker vi å kombinere disse to tingene. Vi ønsker å skrive ut hvert tegn av hver kommandolinje argument. Så vi kommer til å ha en nestet for loop. Og konvensjonelt, den første telleren er jeg, den neste kommer til å bli j, n vil være strlen av argv i, i er mindre enn n, jeg pluss pluss. Og nå i stedet for utskrift argv i, så argv brakett jeg kommer til å index - som kommer til å være den i-te kommandolinje argument, argv i, j kommer til å være jth karakter i-te argument. Jeg skal bli kvitt dette opp her nå siden vi sette det inn i den loopen. Så tilsvarer streng s likemenn argv i, og deretter s brakett j. Vel, trenger vi ikke å erklære denne variabelen s. I stedet vil vi bare kombinere disse to i hva vi hadde, ARGV i, j. SPEAKER 1: [uhørbart]. ROB BODEN: Good call. Så dette er brukket. Hvis jeg faktisk kjørte den, ville vi har innsett dette. Så teller jeg bryr meg om i denne spesielle for sløyfe er j, iterator. Så du ville ha kjørt inn i problemer, trolig en uendelig loop, hvis vi ikke hadde fikset det. Det er derfor vi også snakker om debugging i dag. OK. Så la oss kjøre dette programmet. Og la oss faktisk legge en egen printf akkurat her som vil bare skrive en annen linje, siden dette betyr at når vi kjøre programmet, vil det være en blank linjen mellom hvert tegn i hver kommandolinje argument. Vel, vi får se hva det betyr. Oop. Fikk noen bug. Feil implisitt erklære bibliotekfunksjon strlen. Så kommer tilbake til vårt program, jeg glemte å hasj inkluderer string.h. Så string.h kommer til å være den header-fil som erklærer funksjonen strlen. OK, sammenstiller det. Nå, la oss kjøre den. Så akkurat det. Det kommer til å skrive ut våre programnavn, hello world. Det kommer til å skrive ut hver ting, hver karakter, på sin egen linje. OK. Så la oss faktisk ta dette ett skritt videre. Og i stedet for å bruke string.h, la oss tenke på hvordan vi skulle gjennomføre vår egen strlen funksjon. Så jeg skal umiddelbart gi en funksjon signatur. Så la oss kalle i my_strlen, og det er kommer til å ta en streng som argument, og vi regner med å returnere lengden på strengen. Så, hvor er den fyren? Ja. OK. Så husker fra tidligere lysbilde som var også fra forrige uke, som en rekke tegn, vel, en streng, så la oss si at dette er vår strengen s. Så hvis s er strengen, hallo, da, H-E-L-L-O, i minnet, som kommer til å være, og da denne backslash 0 karakter. Så hvordan får vi lengden av s? Vel, er trikset på utkikk etter denne tilbakeslag 0 karakter, dette null terminator. Så algoritmen Kommer å være noe som få nok tegn på at - la oss ha denne hånden representerer noen teller, la oss kalle denne int lengde. Så, fra over her, er vi kommer til å iterere over vår streng. Så det første tegnet, er det H, og det er ikke tilbake slash 0, så lengden er en. Iterere til neste tegn, E, og det er ikke backslash 0. Lengde er to. L, 3. L, fire. O, 5. Og til slutt, når vi backslash 0, og så det betyr, vel, denne strengen er over. Så la oss gå tilbake fem. Så faktisk implementere det, først, min n lengde lik 0, min høyre hånd. Og vi kommer til å reagere - SPEAKER 1: [uhørbart] ROB BODEN: Oh, skyt. God samtale. Boom. Så n lengde lik 0. Så nå, ikke mens s lengde lik og da, backslash 0. Så husk, dette backslash 0, er det en faktiske karakter, og det indikerer slutten av strengen. Akkurat som, også, skråstrek n er et faktisk tegn. Backslash 0 kommer til å indikere slutten av strengen. Jeg ønsker ikke å sette det der. Og mens s indeksert av lengden er ikke lik null terminator, og deretter vi bare kommer til å øke lengden. Så, på slutten av programmet vårt, Lengden er slutt kommer til å være 5 i dette tilfellet. Og vi vil bare returnere lengden. OK. Så nå her nede, det gjør jeg ikke gjøre my_strlen. La oss kompilere den for å være sikker alt går som det skal. Gjorde jeg i to? Eller var det en? Det burde gjøre. OK. Så dette er argv to. Fungerer som forventet, selv om var at den jeg gjorde det i? Ja. OK. Denne versjonen av ting ikke har printf ny linje etter, men det gjør ikke noen forskjell. OK. Så fungerte som forventet. Nå kan vi også kombinere dette ett skritt videre, hvor varsel her, vel, første, vi gripe strlen av argv jeg, og så skal vi itera løpet hvert tegn i strengen. Så i stedet for å gjøre det, hva om vi bare kombinere denne logikken av å vente før vi traff backslash 0 riktig inn i dette for loop? Så iterere mens argv i, j gjør ikke lik backslash 0. Så la oss kjøre det første. OK. Så her, er denne tilstanden mener - La oss fjerne det. Så nå, la dette være vår argv. Så når jeg bare løp det programmet før, argv er en rekke strenger. Og så, hvis jeg kjører det med dot slash argv 2, hallo verden, så argv selv er lengden 3, for argv null, hallo, og verden. Og på innsiden av hver av disse indekser er, selv en matrise, hvor dette vil være prikk, vil dette være skråstrek, vet jeg ikke hvis det var riktig retning, jeg tror ikke det var. A-R-V dash, trenger mer plass. La oss skjære inn i denne matrisen. A-R-V dash 0, og deretter backslash 0. Og så i uorden vil være hallo. La oss si, H-E backslash 0. Og til slutt, W-O backslash 0. Så algoritmen som vi nettopp skrev, den nestet for looper, hva de er gjør er, må vi først ha motvirke i og j. Dette ville bli enklere med koden på skjermen, La oss gå tilbake til dette. OK. Så merker at jeg er den iterator som er itera over hver kommando linjen argument. Og j er iterator itera løpet av hvert tegn i det Argumentet for kommandolinjen. Så hva dette innerste printf gjør er, har vi printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 seks, men nå, argv 0 7 kommer til å lik backslash 0. Så da vi avslutte det for loop, og nå jeg gjentar til en. Og nå skal vi print argv en 0, argv en 1 - vel, nå, siden jeg kuttet hallo kort, argv en to er igjen kommer til å være backslash 0. Og så, øke jeg og fortsette, og så videre, helt til vi skrive ut alle verden, og de er tre kommandolinje argumenter, og vi vil gå ut av den ytterste løkke og føre vårt program. OK. Så la oss komme tilbake hit. Så du vil få noe kjennskap til kommandolinje argumenter på dette spesielt problem satt. Nå, debugging. Så har du sannsynligvis allerede har hatt å gjøre noen debugging med den forrige oppgavesettet. Og en veldig enkel måte å debugging, først, la oss se på en buggy program. Vel, gå gjennom dette programmet, vi kommer til å be brukeren for en heltall, grip som heltall, og deretter, vilkårlig, har vi en stund loop som er bare kommer til å minske jeg før det er lik 10. La oss bare anta jeg inn et helt tall som er større enn 10 år. Så decrement jeg før det er lik 10. Og så har vi en annen mens loop det, mens jeg ikke er lik 0, er vi kommer til å minske jeg ved tre. Så hvis du ser hensikten med bug her, er det at dette vil minske i å være 10, og deretter denne mens loop vilje minking i fra 10 til 7, 4, 1, til minus 2, til minus 5, og så videre; til negative uendelig, siden jeg vil faktisk aldri lik 0. Og deretter ved slutten av dette program, Vi har foo-funksjon som er går på print ut som jeg. Dette er altså en kort og trivielt program og feilen er åpenbar, spesielt etter at jeg bare sa hva feilen var. Men hensikten her er, vel, kanskje dette faktisk ser ut som noen av dine løsninger fra grådig fra den siste oppgavesettet, og kanskje du har noen uendelig loop i programmet, og du har ingen anelse hva som forårsaker det. Så en veldig nyttig debugging teknikk er å bare legge printfs hele koden din. Så her jeg vil ha en printf utenfor første mens loop. Og her jeg vil ha en printf, og jeg skal bare skrive jeg. Jeg skal gjøre enda første mens loop, jeg. Utenfor, andre mens loop. Igjen, skrive ut inni av her, verdien jeg. Og la oss kjøre dette. Så dot slash debug. Skriv inn et heltall. La oss gjøre 13. Og bom. Vi ser at vi er uendelig looping på innsiden av den andre, mens sløyfen. Så nå vet vi hva feilen er. Men printf debugging er helt flott, men når programmene dine får lengre og mer komplisert, er det mer avanserte løsninger til få ting fungerer. Så la oss fjerne alle disse printfs. Og la oss sørge for at jeg ikke gjorde det ødelegge noe. OK. Så programmet vi skal å innføre kalles GDB, for GNU Debugger. Vel, faktisk, la oss fjerne debug for et sekund, og foreta debug nytt. Vel, faktisk første, en god leksjon i kommandolinjeargumenter. Legg merke til at dette Clang kommando som er kompilere alt er gått på kommandolinjen, disse kommandolinjeargumentene. Så nøyaktig hvordan du skal bruke kommandolinjeargumenter, som vi gjorde før, og som du vil i PSett 2, det er hvordan Clang bruker dem. Så merker at dette første flagg, dash ggdb3, hva det er å si er, Clang, du bør kompilere denne filen med hensikt at vi vil til slutt trenger å feilsøke det. Så så lenge du har det flagget, så vi kan GDB debug. Og det vil åpne opp GNU Debugger. Så det er mange kommandoer at du trenger å bli vant til. Først en som du sannsynligvis umiddelbart trenger er Run. Så hva er Kjør kommer til å gjøre? Det kommer til å starte programmet vårt. Så kjøre, starter programmet, vil programmet spør oss for et heltall, 13. Og så er det uendelig looping som forventet, bortsett fra at jeg fjernet printfs, så vi trenger ikke engang se det. Gått ut på vanlig måte. Oh. Det er mulig at det pakket alle veien rundt, tilbake til - ignorerer det. Anta det gjorde ikke gå ut som normalt. Det er et komplisert svar på det. Så nå, det er ikke veldig nyttig. Så bare kjører programmet vårt innsiden av dette debugger hjelper ikke oss på noen måte, siden vi kunne ha gjort dot slash debug fra utenfor GDB. Så den en kommando som Du vil sannsynligvis - og jeg skal avslutte dette. Kontroll-d eller slutte, både arbeid. Så la oss åpne den opp igjen. En annen kommando som du sannsynligvis umiddelbart vil venne seg til er Break. Så vi vil bryte på hoved for nå, og så skal jeg forklare det. Vel, her ser vi at vi satt et stoppunkt på denne linjen i debug.c. Så hva pause betyr er at når jeg skriver løp, er programmet kommer til å fortsetter til Jeg traff et stoppunkt. Så når jeg treffer løp, starter programmet, og da det bryter så snart det kommer inn i hovedfunksjon. Bryt hoved kommer til å være noe du ganske ofte gjør. Og nå, for å introdusere deg til noen flere kommandoer. Legg merke til her, at det er å si vi brakk ved linjen 11, som ligger printf, oppgi et heltall. Så kommandoen Neste kommer til å være hvordan vi går til neste linje med kode. Dette kommer til å tillate oss å gå gjennom vårt program linje for linje. Så neste. Nå linje 12, skal vi for å få den helt tall. Neste. Og hvis du bare trykke Enter igjen, det vil gjenta det siste du gjorde. Så jeg trenger ikke å skrive ved siden av hver gang. Så skriv et heltall, 13. Så nå, mens jeg er større linje 14, enn 10, og jeg skal gjøre videre. Og vi ser at vi kommer til å minske jeg. Så vi kommer til å minske i på nytt. Så nå, en annen nyttig kommandoen Skriv ut. Så Print kommer til å skrive ut verdien av variabelen. La oss få frem verdien av variabelen i. La oss skrive ut jeg. Det kommer til å si at jeg er 11. Nå er vi Neste igjen mens i er større enn 10. Så jeg er fortsatt større enn 10, siden det er 11. Jeg minus minus. La oss skrive i på nytt. Som forventet, er det 10. Så nå, neste. Det kommer tilbake til tilstanden, er jeg større enn 10, men i er nå 10, slik at det er ikke større enn 10, så vi forventer den til å falle ut av, mens sløyfen. Og nå er vi under den linjen med kode. Og en annen kommando, Liste, er bare kommer å vise forrige og neste par linjer med kode, i Hvis du har mistet deg selv. Så vi bare gått ut dette mens loop, og nå har vi inngått dette mens loop, linje 18. Så mens jeg ikke lik 0. Og, neste, jeg er lik i minus 3, og vi vil legge merke til, vil dette bare fortsette. Og vi kan skrive ut jeg. Hver kommando liksom har snarveier. Så p er forkortelse for trykk. Så vi kan p jeg. Bare fortsett å holde n, eller fortsette å gjøre Neste. Skriv ut i på nytt. Du ser nå er det negativ 167. Så dette vil fortsette i det uendelige, men ikke egentlig alltid, siden du nettopp så, det faktisk vil ende på et tidspunkt. Så det er Begynnelsen GDB. Men la oss gjøre en ting i GDB. Uh, feilsøke. Så, i dette spesielle tilfellet, uendelig løkke som skjedde til å være inne i den viktigste funksjonen. Og for nå, bare akseptere at det er jeg kommer til å flytte uendelig løkke inn foo funksjon. Bare husk at ved slutten av denne program, vel, dette var opprinnelig ringer foo, som var bare kommer til å skrive ut jeg. Men nå er vi kaller foo, som er kommer til å minske i før det er 0, og deretter skrive ut den variabelen. OK. Lagre som. Gjør debug. Og nå, gdb debug. OK. Så hvis jeg bare kjøre så jeg ikke kommer til å være i stand til å faktisk gå gjennom min programmet linje for linje. Så la oss bryte på hoved, og deretter skrive inn hus. Så gå gjennom dette, printf, skriv et heltall, får heltall, 13. Så vi kommer til å holde minking inntil i er større enn 10. Så får vi kommer til å falle gjennom mens loop, og få til linjen - La oss åpne den opp i et eget vindu. Så vi dekrementert før jeg var ikke lenger større enn 10, og da vi kalte funksjonen, foo. Så hva skjedde så snart jeg traff funksjon foo, vel, jeg ringte foo, og da jeg ikke lenger hadde kontroll over GDB. Så så snart jeg traff Neste på denne linjen, ting fortsatte frem til dette skjedde, der programmet gått ut når - anta at det eksisterte ikke slutt. Du så det pause for litt skjønt. Så hvorfor gjorde jeg mister kontrollen over programmet på det tidspunktet? Vel, når jeg skriver neste, som går til den bokstave neste linje med kode som vil utføre. Så etter linje 21, den neste linje med kode som vil utføre er linje 22, som er, spennende fra hoved. Så jeg vil ikke bare gå til den neste linje med kode. Jeg ønsker å gå inn i funksjonen, foo, og da også gå gjennom disse linjene med kode. Så for det, har vi et alternativ. La oss avslutte det igjen. Bryt hoved. Uh, 1, neste, neste, 13, neste, neste, neste, nøye, før vi traff linjen foo. OK. Så nå er vi på linje 21, der vi kaller foo. Vi ønsker ikke å skrive neste, siden det vil bare kaller funksjonen foo, og gå til neste linje med kode. Hva vi ønsker å bruke er Step. Så det er en forskjell mellom Step og neste, der trinn går inn i fungere, og neste går over funksjonen. Den utfører bare helheten av funksjon og fortsetter å gå. Så Step kommer til å bringe oss inn i funksjonen, foo. Og vi ser her, nå er vi tilbake på dette mens loop som er, i teorien, kommer til å fortsette for alltid. Og hvis du treffer Step, når det ikke engang en funksjon for å ringe, så er det identisk med Next. Så det er bare når du er på en linje som kaller en funksjon som Step kommer til å avvike fra Next. Så Step vil bringe oss her. Trinn for trinn, trinn for trinn, trinn for trinn, og Vi får bare uendelig loop for alltid. Så du kan venne deg til det som din måte å identifisere uendelige løkker, er bare å holde dette Enter-tasten for å se hvor du står fast. Det finnes bedre måter å gjøre det, men for nå, er at helt tilstrekkelig. Og stilistisk, for å samsvare med stil 50, jeg burde ha gjort dette. OK. Så en siste kommando for å innføre. Vel, la oss GDB debug i. Så i stedet for å bryte på hoved, hvis jeg kjenner foo-funksjonen er også problem, så jeg kunne bare ha sa, bryte på foo, i stedet. La oss si at jeg bryter på både hoved-og foo. Så du kan stille så mange stoppunkter som du ønsker. Når jeg skriver løp, det kommer å stoppe på - ooh, la oss rekompilere, siden Jeg endret ting. Du vil se denne linjen, Advarsel, kilde filen er nyere enn kjørbar. Så det betyr at jeg bare gikk inn her og endret disse til å samsvare med stil 50, men jeg gjorde ikke rekompilere programmet. Så GDB gjør meg oppmerksom på det. Jeg skal slutte, gjør debug igjen, treffe gdb debug. OK. Så nå, tilbake til hva jeg gjorde. Bryt hoved, break foo. Nå hvis jeg kjører programmet, så det er kommer til å fortsette inntil treffer en stoppunkt. At stoppunkt skjer med bli den første til hoved. Nå, i stedet for å gjøre neste, neste, neste, neste, neste, før jeg traff foo, jeg kan skrive fortsette, noe som vil fortsette til du treffer neste stoppunkt. Jeg må gå inn i heltall først. Fortsett vil fortsette helt til jeg traff neste stoppunkt, som er at funksjon av foo. Så Run vil kjøre helt til du treffer en stoppunkt, men du bare skriver løp når du starter programmet, og deretter, fra da av er det fortsette. Hvis jeg bare gjorde bryte hoved og så løp, vil det bryte på viktigste, og deretter fortsette. Siden jeg ikke har et knekkpunkt på foo, angi heltall, så nå er jeg ikke kommer til å bryte på foo. Det er bare kommer til uendelig løkke til det. OK. Så det er Intro til GDB. Du bør begynne å bruke det i problem settene. Det kan være svært nyttig å identifisere feil. Hvis du faktisk bare, linje for linje, gå gjennom koden din, og sammenligne hva som er faktisk skjer med hva du forventer å skje, så det er ganske vanskelig å gå glipp av dine feil. OK. Så forrige uke David brakt opp dette hemmelig-nøkkel kryptografi ting for første gang, der vi ikke ønsker passord bare lagret i vår datamaskin i noen vanlig tekstfil, hvor noen kan komme over og bare åpne den opp og lese dem. Ideelt sett ville de bli kryptert på en eller annen måte. Og i oppgave Set 2, vil du bli håndtere med en metode for kryptering, eller, vel, to metoder, men de er ikke så stor. Hvis du gjør det hacker-utgaven, er du også kommer til å være med å gjøre dekryptering av noen ting. Så spørsmålet er nå, vel, selv om vi har den sterkeste krypteringen algoritmen i verden, hvis du velger en spesielt dårlig passord, så er det vil ikke hjelpe deg veldig mye, siden folk vil fortsatt være i stand til å finne det ut. Selv om å se den krypterte strengen og det ser ut som et rot av søppel som betyr noe for dem, hvis de fortsatt bare trenger å prøve noen passord å finne ut av det, så du er ikke veldig sikker. Så ser en video som gjør det punktet. [VIDEOAVSPILLING] -Hjelm, djevel deg. Hva er det som skjer? Hva gjør du til min datter? -Tillat meg å presentere den briljante ung plastisk kirurg, Dr. Phillip Schlotkin, den største nesen jobb mann i hele univers, og Beverly Hills. -Deres Høyhet. -Nose jobb? Jeg forstår ikke. Hun har allerede hatt en nese jobb. Det var en søt seksten tilstede. -Nei. Det er ikke hva du tror. Det er mye, mye verre. Hvis du ikke gir meg den kombinasjonen til luften skjold, Dr. Schlotkin vil gi din datter tilbake sin gamle nesen. -Nei. Hvor fikk du den? -Greit. Jeg skal fortelle. Jeg skal fortelle. Nei, pappa. Nei, du må ikke. -Du har rett, min kjære. Jeg kommer til å savne den nye nesen. Men jeg vil ikke fortelle ham kombinasjonen, uansett hva. -Veldig godt. Dr. Schlotkin, gjør din verste. -Min glede. [TOOLS skjerpes] -Nei. Vent. Vent. Jeg skal fortelle. Jeg skal fortelle. -Jeg visste at det ville fungere. OK. Gi den til meg. -Kombinasjonen er ett. -One. -One. -Two. -Two. -Two. -Tre. -Tre. -Tre. -Four. -Four. -Four. -Five. -Five. -Five. -Så kombinasjonen er en, to, tre, fire, fem. Det er det dummeste kombinasjonen Jeg noensinne har hørt i mitt liv. Det er den type ting en idiot ville ha på bagasjen sin. -Takk, din Høyhet. -Hva har du gjort? -Jeg slått av veggen. -Nei det gjorde du ikke. Du slått av hele filmen. -Jeg må ha trykket på feil knapp. -Vel, sette den på igjen. Sett filmen tilbake på. -Ja, sir. Ja, sir. -La oss gå, Arnold. Kom, Gretchen. Selvfølgelig, du vet jeg vil likevel nødt til å fakturere deg for dette. [END VIDEOAVSPILLING] ROB BODEN: Greit. Så nå som vi allerede snakker om sikkerhet på noen måter, fin liten film plakat, så i siste dager, disse problemene med NSA overvåke alt. Det kan være vanskelig å føle at du har noen form for personvernet i elektroniske verden, selv om jeg ikke kunne fortelle du mest av detaljene i PRISM. Så beveger seg utover PRISM, skal vi ikke snakke om det, nå tenke på den bærbare datamaskinen. Så her oppe, jeg ønsker å bytte til min faktiske konto, med min lille pingvinen. Så jeg har et passord sett, og at Passordet er hva jeg vil den skal være. Men husk at det jeg logger på med, så dette innlogging teksten, er noen program. Det er noen program som var skrevet av noen person. Og så, som person, hvis de er spesielt skadelig, de kunne har sagt, all right, så hvis passordet at jeg kommer inn er lik min faktiske passordet, eller det er lik til noen spesiell passord - David er kjempebra eller noe - så la dem i. Så en ondsinnet programmerer kunne ha tilgang til alle dine Mac-maskiner, eller Windows, eller noe. Så det er ikke mye av en bekymring, siden, Jeg mener, er dette login-programmet som er levert med OS X, hundrevis eller tusenvis av mennesker har anmeldt denne koden. Og så, hvis, i koden et sted, du si om denne strengen tilsvarer likemenn David er kjempebra, logg, så noen er kommer til å være, som, vent. Dette er ikke riktig. Dette burde ikke være her. Så det er en måte vi få ting å være snill for sikker. Men tenk om enda programmer at du skriver. La oss si at du skrev login programmet. Så dette login program som du skrev, så åpenbart, er du en god programmerer. Du kommer ikke til å sette noen ondsinnet hvis x er lik lik David er kjempebra inn koden din. Men dette programmet, hva gjør du bruker å kompilere dette programmet? Noe som Clang. Så hva om den personen som har skjedd med skrive Clang spesiell rettssak i Clang noe sånt, hvis jeg kompilere logg inn programmet, deretter inn denne koden inn login programmet som sier, hvis x er lik lik David er fantastisk? Så ikke helt ennå, men vi har den samme utstede her, hvor Clang, vel, tusenvis, hvis ikke titusenvis av mennesker, har sett på Clang, har så på sine linjer med kode og sa, all right, det er ikke noe dårlig her. Selvfølgelig er det ingen som gjør noe dette skadelig. Men hva er klang i seg selv, som, hva om jeg kompilere Clang? Hva om jeg har noen kompilator som kompilerer Clang som setter inn Clang denne spesielle hack som sier, all right, når jeg kompilere Clang, deretter kjørbar Jeg får bør spesielt se innsiden av påloggingsprogrammet og insert dette passordet, tilsvarer likemenn Dave er fantastisk? Så husk at kompilatoren selv må kompileres på noen punkt. Så hvis det du velger å kompilere Clang med, er i seg selv skadelig, så du kan være skrudd hele vei ned linjen. Så her har vi Ken Thompson og Dennis Ritchie. Så dette er en ikonisk bilde. Dennis Ritchie er på høyre side. Han er en stor - ganske mye skrev C. Så du kan takke ham for denne klassen. Ken Thomson er på venstre side. De to av dem i utgangspunktet skrev UNIX. Vel, de var store bidragsytere i UNIX. Det var noen andre. Så Ken Thompson, på et tidspunkt, han vinner Turing Award. Og Turing-prisen, jeg har alltid hørt det refereres til på denne måten, er det Nobelprisen i informatikk. Så på Turing Award, må han gi sin takketale. Og han gir dette svært berømte tale nå, heter Reflections on Klarering Trust, som vi har knyttet TIL på kurset hjemmeside. Og i denne talen, sier han, all right, så jeg skrev UNIX, og nå er alle av du folk bruker UNIX. Husk nå i dag at Linux er en direkte etterkommer av UNIX. OS X bruker direkte UNIX. Windows gjør ikke så mye, men mye av ideer ble tatt fra UNIX. Så han går opp på scenen og sier, all right, skrev jeg UNIX. Og bare så dere vet, jeg er stand til å logge inn hver eneste en av datamaskinene. Siden jeg sette en av disse spesielt hvis x lik lik Ken Thomson er kjempebra, så jeg får lov til å logge inn. Så folk er som, vel, Hvordan gjorde du det? Vi så på login-programmet og ingenting er der. Han er som, vel, endret jeg kompilatoren å logge på påloggingsprogrammet slik at login programmet nå vil ha at x er lik lik Ken Thompson er kjempebra. Og de sier, vel, det er ikke sant. Vi ser på kompilatoren, og kompilatoren ikke har noen linjer av kode sånn. Han er liksom, OK, men hva er du kompilering kompilatoren med? Og de tror, ​​og han er, som, vel, Jeg er den som ga deg kompilatoren du bruker å kompilere kompilatoren, så du lage en kompilator, som i seg selv er skadelig, og vil bryte login programmet. Så i utgangspunktet, på det tidspunktet, det er ingen måte du kan se på kilde koden til login-programmet å se hva som er galt. Du kunne ikke engang se på kildekoden til kompilatoren å se hva som er galt. Du ville trenge for å se på maskinen kode, faktisk binær av kompilert kompilatoren å se, vente, disse linjer med kode skal ikke være her. Men Ken Thompson tok det ett skritt videre og sa, vel, det er disse spesielle programmer som faktisk hjelpe deg lese binære av programmer, og så hvis noen har brukt det programmet til lese binære, ville de se disse linjer med kode. Han endret disse programmene til å si, all Greit, hvis du ser på den kompilatoren, ikke vis denne spesielle sett av binær. Så da må du ta det et skritt videre og i utgangspunktet, som kunne ha tatt flere nivåer av indirekte, og på et tidspunkt, er ingen egentlig skal sjekke. Så moralen i historien er, du er ikke kommer til å skrive Klang i denne klassen. Du kommer til å bruke klatre Clang mye i denne klassen. For alt du vet, er Clang en ondsinnet program som er sabotere hver enkelt program du noen gang har satt sammen. Og for å forlate deg på at svært illevarslende oppmerksom, se deg på onsdag. [APPLAUSE] SPEAKER 2: Ved neste CS50. SPEAKER 3: Tror ikke du tør si det. Du kan gjøre dette. Du har gjort dette før, kan du gjøre dette i dag, kan du gjøre dette i morgen. Du har gjort dette i årevis. Bare gå opp der og gjøre dette. Du kan gjøre dette. [Musikk spilles]