>> [Glazba svira]
>> ROB Boden: U redu.
Dakle, prva stvar prvi, video iz poznato lice.
>> [VIDEO PLAYBACK]
>> -U redu.
Ovo je CS50, a to je Početak trećeg tjedna.
Žao mi je što ne mogu biti s vama i danas, ali dopustite mi da vas upoznam
CS50 vlastiti Rob Boden.
>> [END video reprodukciju]
>> [Pljesak i klicanje]
>> ROB Boden: filmografija u taj video je fantastičan.
U redu.
Dakle, prvo, postoji još jedan ručak.
To je sutra u 1:15.
Nema Ručak ovog petka.
To je s Quora.
I Tommy nije ovdje, ali jedan od ljudi tamo je bivši šef CF,
Tommy McWilliam.
Dakle, on je zabavan tip.
Trebao bi doći.
>> U redu.
Tako je prošlog tjedna, počeli smo raspada o tome što je zapravo niz.
Znali smo od početka da to je niz znakova.
No, prošli tjedan, zaronili smo u stvari da je ono što je stvarno slijed
likovi, dobro, sada imamo nizovi znakova.
A mi znamo da vrpca, to je niz znakova, na samom kraju,
imamo posebnu null bajt, to kosih crta 0, koji pokazuje kraj
string.
>> I tako niz je niz likovi, ali možemo imati više od
Samo niz likova, možemo imati niz bilo
tip što želimo.
Dakle, ako se prisjetimo od prošlog tjedna, Vijek program koji David uveo
jako brzo.
Dakle, prvo što ćemo učiniti je pitati korisnik za cijeli broj,
broj ljudi u sobi.
Nakon što smo taj cijeli broj, mi smo progla niz.
Obavijest ovaj nosač sintaksu.
Ti ćeš se naviknuti na to.
>> Tako smo progla niz brojeva zove dobi, a tu su n
cijeli brojevi u ovom polju.
Tako je ovaj uzorak upravo ovdje, ovo 4 int i jednaka je 0, i manji je od nje, i plus
plus, koje se također će biti uzorak da ste vrlo priviknuti.
Jer to je uglavnom kako ste Uvijek ću ponoviti preko polja.
Dakle, ne zaboravite da je n duljina naše polje.
I evo, mi opetovano traže za uzrast od osoba koju sam u sobi.
>> Nakon toga ćemo ići prema dolje, a za sve što proizvoljna razlog, onda bismo
ispisati koliko su stari idete biti za godinu dana.
I cijeli taj program, neka je bi dobi, dot Slash dobi.
Dakle, broj ljudi u sobi, recimo da postoje tri.
I kažu, prva osoba koja je 13, Sljedeći je 26, a posljednja je 30.
Pa onda ću ponoviti je u tri ljudi, ispisati 14., 27. i 31..
>> Dakle, ne zaboravite da kada izjavljujemo Niz veličine n, indeksi u koje
polje, polje ima vrijednosti i indeksi 0, 1, 2, sve
do nje minus 1.
Dakle, kada smo rekli bilo je troje ljudi u sobi, a mi smo stavili ovdje
prva iteracija kroz to petlje, i što će biti 0.
Tako je u indeksu 0.
Mi se dodjeljuje prvi dobi korisnik unese.
Tada se u sljedeću, ulazimo Drugi n korisnik unese, au
uz dva, posljednji n.
>> Dakle, primijetite da je niz veličini tri nema ništa
u indeksu tri.
To ne vrijedi.
U redu.
Dakle, ide natrag ovdje.
Dakle, sada kada smo se bavila polja, imamo neke upoznatost.
Sada ćemo prijeći na naredbu argumente, koji će biti
prilično relevantni za ovaj problem skupa.
>> Tako je do sada, kad god sam proglasila svoju glavnu funkciju, mi smo
rekao int main void.
Dakle void samo znači da mi ne prolaze bilo
Argumenti za tu funkciju.
Sada ćemo vidjeti da je glavna možete poduzeti neke argumente.
Ovdje ćemo ih zvati int argc i gudački argv nosači.
Nosači, opet, ukazuje da smo se bave polja.
Pa evo, niz argv zagrade, mi smo koja se bavi nizom nizova.
Dakle argc, koji će ukazati koliko argumenata imamo
prošao na ovom programu.
A kako bi vidjeli što to znači, neka se zatvori to.
>> OK.
Dakle, do sada smo se izvoditi svaki Program poput dot kosih dobi.
Možemo također, na zapovjednoj liniji, pokraj pass argumente, dakle termin, naredba
linija argumenata.
Dakle, prvi argument, hello world.
Pa evo, argc će biti tri.
To je broj od argumenata na zapovjednoj liniji.
Argc uvijek najmanje 1 od točke slash dobi, sama, broji kao jedan od
Argumenti naredbenog retka.
>> Zatim pozdraviti je na prvom mjestu.
Ako dot slash dobi je nultoga, a zatim Zdravo je prvi, a svijet je
Drugi argument naredbenog retka.
Tako niz argv, idemo vidjeti, sadrži konce, dot crtu
dobi, hello, i svijet.
I, prema Davidovom zahtjev, idemo igrati video uvođenja toga.
>> [VIDEO PLAYBACK]
>> -Do sada u programima koje smo napisao, mi smo proglasiti
Glavni kao int main void.
A sve ovo vrijeme, da je nevažeće ima jednostavno je navodeći da
Program ne odgovara argumente naredbenog retka.
Drugim riječima, kada korisnik pokrene Program, on ili ona može dati naredbu
argumente pisanjem dodatnog riječi ili fraze nakon što je Program
ime na upit.
>> Pa, ako želite da vaš program uzeti argumente naredbenog retka, jedan ili
više takvih riječi, moramo zamijeniti poništiti s nekoliko argumenata.
Tako ćemo učiniti.
Uključi CS50.h.
Uključuju standardnu ​​io.h.
Int main.
I sada, umjesto void, idem navesti int argc zove, i
Niz žice pod nazivom argv.
Sada, argc i argv su jednostavno konvencije.
>> Mogli smo pozvani ovi argumenti najviše što god želimo.
No, ono što je važno jest da je argc int jer je, po definiciji, ona je
će sadržavati računati argument, broj riječi u ukupnom da
Korisnik je upisali na njegovu ili njezinu redak.
argv, u međuvremenu, argument vektor, je će zapravo biti niz spremanje
sve riječi koje je korisnik upisali na njegovu ili njezinu redak.
>> Idemo nastaviti raditi nešto danas s jednim ili više od tih
argumente naredbenog retka.
Konkretno, idemo naprijed i print god riječ korisnik upiše
Nakon imena programa na upitu.
Otvorena zagrada.
Zatvori nosač.
Printf posto s kosih crta i zarez.
I sad moram reći printf što vrijednost priključiti u tom rezervirano mjesto.
Želim prve riječi koje korisnik ima upisali po imenu programa,
pa ću navesti argv bracket 1, u neposrednoj blizini
zagrada, zarez.
>> Sada, zašto nosač 1, a ne bracket 0?
Pa, što se ispostavilo, automatski pohraniti u argv 0 će biti
Stvarni ime programa.
Dakle, prva riječ da korisnik upiše nakon što je ime programa je, prema
konvencija, će biti pohranjene u argv 1.
Idemo sada sastaviti i pokrenuti ovaj program.
>> Provjerite argv 0, dot kose crte argv 0.
A sada riječ poput 'bok.
Upišite.
I tamo smo ga, pozdravi.
>> [END video reprodukciju]
>> ROB Boden: U redu.
Zatvorite to.
Dakle, uzimanje pogledati taj program koji samo smo upoznati s nama, dobro, samo
pokazati, ako želimo ispisati argv 0, da, sada što je to, argv 0, dot slash argv 0.
Dakle, kao što se očekuje, to je ispis naziv programa, budući argv 0 je
Uvijek će biti naziv programa.
Ali neka je učiniti nešto malo više zanimljiv.
>> Tako je u problemu setu, vi ćete biti upoznati s ovom funkcije, atoi.
Dakle, ono što mi koristimo atoi za?
To će se pretvoriti string u cijeli broj.
Dakle, ako sam proći niz, jedan, dva, tri, da atoi, koji će se pretvoriti da
na cijeli broj, jedan, dva, tri.
Tako ćemo pretvoriti prva naredbenog retka argument u cijeli broj,
i onda samo ispisati taj prirodni broj.
>> Tako je u osnovi, mi smo vrsta reimplementing getint, samo
cijeli je ušao na zapovijed linije, umjesto u programu
interaktivno.
Dakle, što argv 0, neka je učiniti je ovdje, i zatvoriti to.
Dakle radi argv 0, i neka je ući cijeli broj, jedan, dva, tri i četiri jedan dva.
Dakle, to će ispisati prirodni broj, jedan dva tri četiri jedan dva.
Postoje neke nijanse na atoi da to će prestati brinuti o bilo čemu
izvan valjanog numeričkog karaktera, , ali to nije važno.
>> Dakle, što mislite dogodi ako sam to učiniti?
Segmentacija kriv.
Pa zašto je to tako?
Ako se osvrnemo na naš program, mi smo pretvaranje argv 1, prvi argument
nakon ime programa, na cijeli broj.
No, ne postoji argument prošao nakon što je naziv programa.
Pa evo, vidimo da je to buggy Program, jer, ako ćemo pokušati pokrenuti
bez ikakvih argumenata, samo će se srušiti.
>> Tako je još jedan zajednički uzorak vidjet ćete je nešto slično, ako argc je manje
od dvije, što pokazuje da nije bilo barem naziv programa i
Prvi argument, onda ćemo nešto učiniti kao i printf, nije dovoljno
argumente naredbenog retka.
To je vjerojatno nije dobar za ispis, to je vjerojatno nešto poput
trebali unijeti cijeli broj na zapovjednoj liniji.
Samo ću ga završiti tamo.
A onda se vratiti jednoga.
Dakle, ne zaboravite da je na kraju našeg Program, ako ćemo se vratiti 0, koja vrsta
pokazuje uspjeh.
A glavna je također automatski vraća 0 ako to ne učinite.
>> Pa evo, mi smo retuning 1 za označavanje da to nije uspjeh.
A možete se vratiti što god želite, Samo, 0 označava uspjeh, a
sve drugo pokazuje neuspjeh.
Tako ćemo pokrenuti ovu verziju stvari.
Pa sad, ako mi ne unesete naredbenog retka argument, to će točno reći
nas, nije dovoljno naredbenog retka.
Nije dovršio rečenicu.
Inače, ako mi zapravo to prođe jedan, to može završiti program.
Dakle, ovo je način na koji će koristiti argc u Kako bi provjerili broj
argumente naredbenog retka koji zapravo prošlo.
>> Tako ćemo napraviti ovaj program malo više komplicirano, i pogled na sekundu
iteracija stvari.
Tako sada, mi smo ne samo ispis Prvi argument naredbenog retka.
Evo, mi smo iterating od int i jednakima 0, i manji od argc, i plus
plus, a tisak argv, indeks i.
Tako je ovaj uzorak, opet, to je ista uzorak kao ranije, osim što je umjesto
pozivanja varijablu n, mi koristimo argc.
>> Dakle, ovo je iterating preko svake indeksa u nizu, a ispis svaka
element u tom polju.
I tako, kad smo pokrenuti ovaj program, dobro, Nisam unijeti bilo naredbenog retka
argumenti, tako da samo ispisuje naziv programa.
Ako uđem hrpu stvari, to ću ispisati jednu, svaki na svom liniji.
>> OK.
Tako ćemo uzeti ovaj korak dalje.
I umjesto ispisa svaki argument na vlastitu liniju, neka je ispisati svaki
karakter svakog argumenta na vlastitu liniju.
Dakle, ne zaboravite da je argv Niz od žice.
Dakle, ono što je string, ali niz znakova?
Dakle, to znači da argv stvarno Niz od niza znakova.
Dakle iskorištavanjem da, neka je ignorirati to za sada.
Ajmo uzeti u obzir niz argv 0.
>> Dakle, ako želimo dovesti svaki karakter argv 0 na svojoj liniji, onda želim
učiniti uzorak smo navikli, i je manje od duljine polja,
koja je ovdje, je strlen od, kako je nije ono što želim učiniti, string
s jednako argv 0.
Tako sam je manji od duljine od naših polje, koji je u ovom slučaju niz
znakova, i plus plus.
I tako, kao što smo vidjeli prošlog tjedna, što je idealno ako se krećemo da strlen izvan
stanja, od nje se dodavanjem strlen od s. svaki put idemo
kroz petlju, a to je neće biti promjena.
Dakle, mi ćemo ga jednako n nad ovdje postaviti.
>> OK.
Tako sada, mi smo iterating tijekom svaki indeks u polju.
I tako, ako želimo ispisati svaki lik u toj polja, posto je c
zastava želimo koristiti za likove.
I sada sam nosač će biti string, indeks znak i, pa ako
Niz bili bok.
onda je 0 će biti H, s nosača 1 će biti E, i tako dalje.
>> Dakle, sada želimo kombinirati ove dvije stvari.
Želimo ispisati svaki lik svakog naredbenog retka argument.
Tako ćemo imati ugniježđeni for petlje.
I konvencionalno, prvi brojač Ja se, pored će biti j, n
će biti strlen od argv sam, manji od nje, i plus plus.
I sad umjesto da tiska argv I, tako argv nosač i ide na indeksu -
da će biti i-ti naredbenog retka argument, argv i, j će
biti j karakter i-ti argument.
Ja ću se riješiti ovog ovdje sada budući da smo ga stavili u tu petlju.
Tako je ekvivalent String s jednakima argv ja, a onda je nosač j.
>> Pa, mi ne trebamo da se proglasi ova varijabla je.
Umjesto toga, samo ćemo iskombiniramo dva u ono što smo imali, argv I, J.
>> ZVUČNIK 1: [nečujan].
>> ROB Boden: Dobra odluka.
Dakle, ovo je slomljen.
Ako sam zapravo ga je vodio, mi bi Shvatili su to.
Dakle, brojač mi je stalo u ovom za
petlja je j, iterator.
Tako da bi upasti u probleme, Vjerojatno beskonačnu petlju, ako smo
nije fiksna to.
Zato smo i pričamo O ispravljanje pogrešaka i danas.
>> OK.
Tako ćemo pokrenuti ovaj program.
I neka je zapravo dodati zasebnu printf Ovdje koja će samo ispisati
druga linija, jer to znači kad smo pokrenuti program, bit će prazna
linija između svakog karaktera svaki argument komandne linije.
Pa, vidjet ćemo što to znači.
Oop.
Imam neki bug.
Pogreška implicitno proglašenje biblioteka funkcija strlen.
>> Dakle, ide natrag u naš program, mi zaboravio hash uključuju string.h.
Dakle string.h će biti header file koji izjavljuje
funkcija strlen.
OK, ona prikuplja.
Sada, neka je na njoj.
Pa upravo to.
To će se ispisati na našim naziv programa, hello world.
To će ispisati svaku stvar, svaki karakter, na vlastitu liniju.
OK.
>> Pa neka je zapravo uzeti jedan korak dalje.
I umjesto da koristi string.h, neka je razmišljati o tome kako ćemo provesti sami
strlen funkcija.
Dakle, ja ću odmah dati Funkcija potpis.
Tako ćemo nazvati my_strlen, i to je će poduzeti niz kao argument,
i očekujemo da će se vratiti Dužina tog niza.
Dakle, gdje je taj tip?
Da.
OK.
Pa sjećate iz ranijoj slici koja je također bio od prošlog tjedna, da
Niz likova, dobro, string, pa recimo da je ovo naš niz e.
Dakle, ako je je string, 'bok, a zatim, H-E-L-L-O, u znak sjećanja, koja će se
biti, a onda je to znak obrnute kose 0 znakova.
>> Pa kako ćemo dobiti duljinu s?
Pa, trik je u potrazi za to zazor 0 karakter, ovaj null
terminator.
Dakle, algoritam je idući biti nešto poput neke
dovoljno znakova da -
popijmo ova ruka predstavljaju neke brojač, nazovimo ovu dužinu int.
Dakle, počevši od ovdje, da smo će se ponoviti preko našeg niza.
>> Dakle, prvi znak, to je H, i nije vratio udarac 0, pa
Duljina je 1.
Ponoviti na sljedeći znak, E, a to nije obrnute kose crte 0.
Duljina je 2.
L, 3.
L, 4.
O, 5.
I na kraju, dolazimo do obrnute kose crte 0, i tako to znači, dobro,
ovaj niz je gotova.
Tako ćemo se vratiti pet.
>> Tako zapravo provedbi da, prvo, moja dužina je n = 0, moja desna ruka.
A mi ćemo ponoviti -
>> ZVUČNIK 1: [nečujan]
>> ROB Boden: Oh, pucati.
Dobra odluka.
Boom.
Dakle duljinom n = 0.
Tako sada, dok je dužina ne jednaka, a zatim, kosih crta 0.
Dakle, ne zaboravite, ovo kosu crtu 0, to je stvarni lik, a to ukazuje
kraj niza.
Baš kao što je, također, backslash n je stvarni lik.
Backslash 0 će se naznačiti Kraj našeg niza.
Ne želim staviti da postoji.
I dok s valutnom klauzulom po duljini nije jednaka je null terminator, a zatim
Samo ćemo povećavati dužinu.
Dakle, na kraju našeg programa, Duljina na kraju će
biti 5 u ovom slučaju.
A mi ćemo se vratiti duljinu.
>> OK.
Tako sada ovdje, ne znam učiniti my_strlen.
Idemo ga sastaviti kako bi bili sigurni sve teče glatko.
Radila sam u 2?
Ili je to bio 1?
To bi trebalo učiniti.
U redu.
Dakle, ovo je argv 2.
Radovi prema planu, iako je da je jedan sam to učinio u?
Da.
OK.
Ova verzija stvari nisu imali printf nova linija nakon, ali to
ne čini nikakvu razliku.
OK.
Tako je radio kako treba.
>> Sada možemo čak kombinirati ovaj jedan korak dalje, gdje je obavijest ovdje, dobro,
Prvo, mi smo grabbing strlen od argv ja, a onda smo iterating više
svaki lik u tom nizu.
Dakle, umjesto da radi, što ako smo Samo kombinirati ovu logiku čeka
sve dok se ostvario obrnute kose crte 0 pravo u ovaj za petlje?
Tako ponoviti dok argv i, j ne nije jednako backslash 0.
Tako ćemo ga pokrenuti prvi.
>> U redu.
Dakle, ovdje, to stanje je rekao -
neka je jasno da je.
Tako sada, neka to bude naša argv.
Pa kad sam samo uletio taj program prije, argv je niz žice.
I tako, ako sam ga pokrenuti s dot slash argv 2, hello world, onda argv
Sama je dužina 3, za argv nula, hello, i svijet.
>> A unutar svake od ovih indeksa je, Sama polje, gdje će ovo biti
dot, to će biti udarac, ne znam je li to pravi smjer, ja
ne mislim da je to bio.
-R-V crtica, treba više prostora.
Prestanimo se u ovom polju.
-R-V crtica 0, a zatim backslash 0.
A onda je u rasulu će pozdraviti.
Recimo, H-E kosu crtu 0.
I na kraju, W-O backslash 0.
>> Dakle, algoritam koji smo upravo napisao, uklopljeni za petlje, što oni
događaj je, prvo moramo suprotstavio sam se i zatim j.
To će biti lakše s kodom na screen, Vratimo se to.
OK.
Dakle, primijetite da sam je iteratora da je iterating preko svake naredbe
linija argument.
A j iteratora Ponavljanje tijekom svakog lika u koji
naredbenog retka argument.
Pa što je to unutarnja printf radi je, mi smo printf argv 0 0, printf
argv 0 1, printf argv 0 2, 0 3, 4 0, 0 5, 6 0, ali sada, argv 0 7 ide
jednaka backslash 0.
>> Onda smo izašli da za petlje, i sad ja iterates na 1.
A sada idemo u tisku argv 1 0, argv 1 1 -
dobro, sad, budući da sam rezati bok kratko, argv 1 2 ponovno će biti
backslash 0.
I tako, povećajte ja i nastaviti, te tako dalje, sve dok ne ispišete sve
svijet, a to su tri naredbenog retka argumente, a mi ćemo izlaz iz
Najudaljeniji petlje, a završiti naš program.
OK.
>> Tako ćemo se vratiti ovdje.
Tako ćete dobiti neke upoznatost s argumente naredbenog retka na to
Poseban je problem postaviti.
>> Sada, ispravljanje pogrešaka.
Tako ste vjerojatno već su morali učiniti Neki ispravljanje pogrešaka s prethodnim
Problem postaviti.
I jedan vrlo jednostavan način za ispravljanje pogrešaka, Prvo, pogledajmo buggy programa.
Pa, šetnji kroz ovaj program, ćemo pitati korisnik za
cijeli broj, zgrabite cijeli broj, a zatim, proizvoljno, imamo while petlja koja
se samo ide na opadanje I dok je jednako 10.
Neka samo Pretpostavimo Ulazim broj veći od 10.
Dakle dekrementirati i dok je jednako 10.
>> I onda imamo još jedan while petlja da, a ja ne jednaka 0, mi smo
ide ja dekrementirati po tri.
Dakle, ako vidite namjeru buga ovdje, to je da će ovo dekrementirati sam
biti 10, a onda je to dok petlja će opadanje I, od 10 do 7, do 4, na 1,
za negativne 2, na negativni 5, i tako dalje, na negativne beskonačnosti, jer ja ću
Nikad zapravo jednaka 0..
I onda na kraju ovog programa, imamo Foo funkciju koja je
ide na ispis iz koje ja.
>> Dakle, ovo je kratak i beznačajan programa, i bug je očito,
pogotovo nakon što sam upravo rekao je ono što je bug.
No namjera ovdje je, dobro, to bi moglo zapravo izgledaju neke od vaših
rješenja iz pohlepni od prošle Problem set, a možda nemate
Neki klapa u svom programu, a vi nemate pojma
što je uzrok.
Dakle, vrlo korisno za ispravljanje pogrešaka tehnika je samo dodati printfs
cijelom kodu.
>> Dakle, ovdje želim printf izvan Prvi while petlja.
I ovdje želim printf, a ja ću samo ispisati i.
Čak ću učiniti prvi while petlja, ja.
Vani, druga while petlja.
Još jednom, ispisati unutar odavde, vrijednost i..
I neka je pokrenuti ovo.
>> Dakle dot slash debug.
Unesite cijeli broj.
Učinimo 13.
I bum.
Vidimo da su beskonačne petlje unutar drugog, dok petlja.
Dakle, sada znamo što je bug.
Ali printf ispravljanje pogrešaka je savršeno super, ali jednom vaši programi dobiti
duži i složeniji, postoje više sofisticirana rješenja za
uzimajući stvari rade.
Tako ćemo ukloniti sve ove printfs.
I pobrinite se da nisam razbiti ništa.
OK.
>> Dakle Program idemo upoznati se zove
GDB, za GNU Debugger.
Pa, zapravo, neka je ukloniti debug za Drugi, i napraviti ispravljanje opet.
Pa, zapravo je prvi, dobra lekcija u argumente naredbenog retka.
Uočite da je ovo Dong naredba koja je sastavljanju sve se prošli
na zapovjednoj liniji, to argumente naredbenog retka.
Dakle, točno kako ćete se pomoću argumente naredbenog retka, kao što smo
i prije, i kao što će u pset 2, to je kako Dong se njima koristi.
>> Dakle, primijetite da je ova prva zastava, crtica ggdb3, što to govori jest, Dong,
trebali sastaviti ovu datoteku s Namjera da ćemo s vremenom
treba ga debug.
Dakle, dok god imate tu zastavu, Tada možemo GDB ispravljanje.
I to će otvoriti GNU Debugger.
>> Dakle, postoji mnogo naredbi što vam je potrebno da se navikne.
Prvo jedan koji vjerojatno ćete odmah trebate je Run.
Dakle, ono što je vožnja će učiniti?
Bit će to početak našeg programa.
Dakle trčanje, počevši program, program nas pita za broj, 13 godina.
A onda je beskonačna petlje kao Očekuje se, osim što sam uklonio
printfs, tako da ni ne vidi.
Izašao normalno.
Oh.
Moguće je da je omotana obrnuto, natrag - ignoriranje toga.
Pretpostavimo da nisu izašli normalno.
Tu je komplicirano odgovor na to.
>> Pa sad, to nije vrlo korisno.
Dakle, samo trčanje naš program unutar to debugger ne nam pomoći u bilo
način, jer smo mogli samo učinio dot slash ispravljanje izvana GDB.
Dakle, jedna naredba da vjerojatno ćete -
i ja ću prestati to.
Kontrola-d ili prestati, oba posla.
Tako ćemo ga ponovno otvoriti.
>> Druga naredba da ćete vjerojatno odmah žele
Naviknut je Break.
Tako ćemo razbiti na glavni za sada, a onda ću objasniti.
Pa, ovdje smo vidjeli smo postavili prijelomna točka na toj liniji u debug.c.
Pa što pauza znači da kada sam tipa trčanje, program će
nastaviti prikazivati ​​sve dok Udario sam prijelomna točka.
Dakle, kada sam pogodio trčanje, program počinje, , a zatim se lomi čim to
ulazi u glavnu funkciju.
Break glavni će biti nešto što prilično obično učiniti.
>> I sada, da vas upoznam na neke više naredbi.
Obavijest ovdje, da govori mi razlomi na liniju 11, koja je
printf, unesite cijeli broj.
Tako će naredba Sljedeća će biti kako idemo u sljedeći redak koda.
To će nam omogućiti da korak Kroz naš program redak po redak.
Zato sljedeći.
>> Sada linije 12, idemo dobiti cijeli broj.
Next.
A ako samo pritisnite Enter opet, to ću Ponovi posljednju stvar si učinio.
Tako da ne trebate upisati Sljedeći svaki put.
Dakle, unesite cijeli broj, 13.
Tako sada, linije 14, dok sam veći od 10, a ja ću učiniti.
A vidimo da ćemo ja opadanje.
Tako ćemo opet opadanje.
>> Tako sada, još jedan koristan naredba ispisa.
Dakle Ispis će ispisati vrijednost u varijable.
Idemo izvedem vrijednost promjenjivog ja.
Idemo ja ispisati.
To će reći da je 11.
Sada smo opet Next, dok I je veći od 10.
Dakle, ja je još uvijek veći od 10, jer je 11.
Ja minus minus.
Idemo opet ispisati.
Kao što se očekivalo, što je 10.
>> Pa sad, iduće.
To ide natrag u stanje, i je veći od 10, ali ja je sada 10, pa
to nije veći od 10, tako da očekujemo to bi ispasti iz while petlje.
I sad smo ispod te linije koda.
I još jedna naredba, popis, samo ide prikazati natrag i naprijed
nekoliko linija koda, u slučaju da se izgubio.
Tako smo upravo izašli ovu while petlja, i sada smo ušli u ovaj
while petlja, linija 18.
Dakle, dok sam nije jednak 0.
I, pored, i jednako ja minus tri, a mi ćemo primijetiti, to ću zadržati ide.
I možemo ispisati i.
>> Svaka naredba vrsta ima prečace.
Dakle, p je kratica za Print.
Tako možemo P Ja.
Samo imajte drži n, ili zadržati radi Next.
Ponovno ispisati i.
Vidite sada je negativna 167.
Dakle, to će trajati vječno, ali ne stvarno zauvijek, jer ste upravo vidjeli, to
zapravo će završiti u nekom trenutku.
>> Dakle, koja je na početku GDB.
No, idemo napraviti još jednu stvar u GDB.
Uh, debug.
Dakle, u ovom konkretnom slučaju, klapa dogodilo da se unutar
Glavna funkcija.
A za sada, samo prihvatiti da je to sam useliti beskonačnu petlju u
Funkcija foo.
Dovoljno se sjetiti da je, na kraju to Program, dobro, ovo je izvorno
nazivajući Foo, koji je bio pravedan će se ispisati.
Ali sada smo pozivom Foo, što je će dekrementirati sam dok je 0, a
zatim ispisati tu varijablu.
OK.
Spremi to.
Napravite ispravljanje.
I sada, gdb debug.
OK.
>> Dakle, ako sam samo pokrenuti onda ja ne idem biti u mogućnosti da se zapravo korak kroz moje
Program linije-by-line.
Tako ćemo razbiti na glavni, a zatim upisati trčanje.
Dakle, proći kroz to, printf, unesite cijeli broj, dobiti cijeli broj, 13.
Tako ćemo zadržati decrementing I dok je veći od 10.
Onda ćemo pasti kroz while petlja, i doći na liniju -
idemo ga otvoriti u zasebnom prozoru.
Tako smo se smanjuju dok sam bio više nema veći od 10, a zatim ćemo
zove funkciju, Foo.
>> Dakle, ono što se dogodilo čim sam pogodio Funkcija Foo, dobro, nazvao sam foo, te
tada više nisam imala kontrolu nad GDB.
Dakle, čim sam pogodio Dalje na ovoj liniji, stvari i dalje dok se to dogodilo,
gdje je program izašao kada -
Pretpostavljam da nije postojao na kraju.
Vidjeli ste ga stanka za malo ipak.
Pa zašto sam izgubila kontrolu nad Program u tom trenutku?
Pa, kad sam upisati sljedeći, koji ide na Doslovni sljedeća linija koda koji
će izvršiti.
Dakle, nakon što je linija 21, pored linija koda koji će izvršavati je linija 22,
koji je, izlazeći iz glavna.
Dakle, ja ne želim da se samo ići u sljedeći redak koda.
Želim ići na funkcije, Foo, , a zatim i korak kroz
ta linija koda.
>> Pa za to, imamo alternativu.
Idemo opet prestati da.
Break glavna.
Uh, 1, pored, pokraj, 13, sljedeći, next, next, pažljivo,
Prije nego što smo pogodak linije foo.
OK.
>> Tako sada, mi smo na liniji 21, gdje smo pozvati foo.
Mi ne želimo upisati sljedeći, budući da je samo će pozvati funkciju foo, te
idi na sljedeću liniju koda.
Ono što želimo je iskoristiti korak.
Dakle, postoji razlika između koraka i Next, gdje Korak uđe
funkcionirati, i ide Sljedeća preko funkcije.
To samo izvršava u cijelosti funkcija i ide dalje.
>> Dakle korak će nam donijeti u funkciji, Foo.
I ovdje vidimo, sad, vratili smo se na to dok petlja koja je, u teoriji,
će trajati vječno.
A ako hit korak, kada to nije ni Funkcija nazvati, onda je
identičan Next.
Dakle, to je samo kada ste na liniji koja poziva funkciju koja Korak
će se razlikovati od iduće.
Dakle korak će nas dovesti ovdje.
Korak, korak, korak, korak, korak, korak i Samo ćemo klapa zauvijek.
>> Dakle, možda ćete se naviknuti na to kao svoj način utvrđivanja beskonačne petlje, je
samo drži ovu Enter za vidjeti gdje zapnete.
Ima boljih načina kako to učiniti, ali za sada, to je savršeno dovoljna.
I stilski, u skladu s stilom 50, trebala sam to učinio.
OK.
>> Tako posljednji naredba uvesti.
Pa, neka je GDB ispravljanje u.
Dakle, umjesto razbijanje na glavni, ako sam Znam funkciju foo je također
Problem, onda sam mogao imati samo rekao je, slomiti na foo, umjesto.
Recimo da sam razbiti na glavni i Foo.
Na taj način možete postaviti onoliko prijelomnih točaka kao što želite.
Kad sam tipa trčanje, to se događa da se zaustavi na -
ooo, neka je kompilirati, budući Promijenio sam stvari.
Vidjet ćete ovu liniju, upozorenje izvor datoteka je novija od izvršne.
Dakle, to znači da sam se upravo ovdje i promijenio to u skladu s stilom
50, ali nisam kompilirati Program.
Dakle GDB čini mi svjesni toga.
Prestat ću, napraviti ispravljanje opet, pogodio gdb ispravljanje.
OK.
>> Pa sad, natrag na ono što radim.
Break glavnu, prijelom foo.
Sada, ako sam pokrenuti program, pa je će se nastaviti dok se ne pogodi
prijelomna točka.
To prijelomna točka se događa biti prvi na glavni.
Sada, umjesto da radi naprijed, naprijed, naprijed, next, next, dok sam pogodio Foo, ja
može upisati nastavak, koji će se nastaviti dok ne pogoditi sljedeći prijelomna točka.
Moram ući u cijeli broj prvi.
Nastaviti će se nastaviti sve dok ne pogodim sljedeća točka prekida, što je to
funkcija foo.
>> Dakle Run će se izvoditi do te pogodak prijelomna točka, ali samo upisati vožnji kada
ti si pokretanja programa, a zatim, od tada, to je i dalje.
Ako sam upravo učinio razbiti glavni i tada vodio, to će razbiti na
Glavni, a zatim nastaviti.
Budući da sam ne imati break na foo, unesite cijeli broj, onda sada sam
Ne ide razbiti na foo.
To samo ide do beskonačno petlje do toga.
OK.
>> Dakle, to je Uvod u GDB.
Trebali bi početi koristiti u tvoj problem setovima.
To može biti vrlo korisno identificirati bugova.
Ako vam je zapravo samo, liniju-po-line, idite kroz svoj kod, i usporedite ono što je
zapravo događa s tim što očekujete da se dogodi, onda je prilično
teško propustiti svoje greške.
OK.
>> Tako je prošlog tjedna David odrastao to Tajna-key kriptografiju stvari za
Prvi put, u kojem ne želimo Lozinke samo biti pohranjeni na našim
Računalo na neki običan tekst datoteke, gdje je netko može doći i samo
otvorite ga i pročitati ih.
U idealnom slučaju, oni će biti kodiran na neki način.
I u problem Skupine 2, vi ćete se bave s jedne metode enkripcije,
ili, dobro, dvije metode, ali oni nisu tako velike.
Ako to ne učinite haker izdanje, ti si također će se baviti
dešifriranja neke stvari.
>> Dakle, pitanje je sad, dobro, čak i ako imamo najjaču šifriranje
algoritam u svijetu, ako se odlučite Posebno loša password, onda
neće ti puno pomoći, jer ljudi će i dalje biti u mogućnosti to shvatiti.
Čak i ako vidim šifrirani niz i to izgleda kao nered smeća
to ne znači ništa za njih, ako oni još samo treba isprobati nekoliko lozinke
to shvatiti, onda nisu baš siguran.
Tako gledajući video koji čini tu točku.
>> [VIDEO PLAYBACK]
>> -Helmet, što đavo.
Što se dešava?
Što radiš s mojom kćerkom?
>> -Dopustite mi da predstaviti briljantni Mladi plastični kirurg, dr. Phillip
Schlotkin, najveći nos posao čovjek u cjelokupnom
svemir, i Beverly Hills.
>> -Vaša Visosti.
>> -Nos posao?
Ne razumijem.
Već je imao operaciju nosa.
Bilo je slatko šesnaest prisutna.
>> -Br.
To nije ono što mislite.
To je puno, puno gore.
Ako ne daj mi kombinacija za zračni štit, Dr. Schlotkin će
dati svoju kćer natrag svoju staru nos.
>> -Br.
Odakle vam to?
>> -U redu.
Ja ću reći.
Ne, tata.
Ne, ne moraš.
>> -Ti si u pravu, draga moja.
Ja ću propustiti svoj novi nos.
No, neću mu reći kombinaciju, bez obzira na sve.
>> -Vrlo dobro.
Dr. Schlotkin, učiniti vaš najgori.
>> -Moje zadovoljstvo.
>> [Alati su izoštriti]
>> -Br.
Čekaj.
Ja ću reći.
>> -Znao sam da će to raditi.
U redu.
Daj mi to.
>> -Kombinacija je jedna.
>> -Jedan.
>> -Dvije.
>> -Tri.
>> -Four.
>> -Pet.
>> -Dakle, kombinacija je jedan, dva, tri, četiri, pet.
To je najgluplja kombinacija Sam ikada čuo u životu.
To je nešto što je idiot će imati na svojoj prtljazi.
>> -Hvala vam, vaša visosti.
>> -Što si učinio?
>> -Ja okrenuo se od zida.
>> -Ne, nisi.
Vi isključen cijeli film.
>> -Mora da sam pritisnuo krivi gumb.
>> -Pa, stavio ga na leđa.
Stavite film na leđa.
>> -Da, gospodine.
Da, gospodine.
>> -Idemo, Arnold.
Dođite, Gretchen.
Naravno, znam da ću i dalje moram vam naplatiti za to.
>> [END video reprodukciju]
>> ROB Boden: U redu.
Dakle, sad kad smo već govorimo o sigurnost, na neki način, lijepo
Malo movie poster, tako da u posljednjih dana, ovi problemi s NSA
praćenje sve.
To može biti teško da se osjećaju kao ti imaju nekakvu privatnost u
Online svijet, iako sam nije mogao reći što većina pojedinosti prizmi.
Dakle, kreće izvan prizme, nećemo da se govori o tome, sada
misle o svom prijenosnom računalu.
Tako se ovdje, želim prebaciti na moj stvarni račun,
s mojim malim pingvina.
Dakle imam lozinka postavljena, a to lozinka je sve što želim da bude.
>> No, imajte na umu da ono što sam prijavom u sa, tako da je ovo za prijavu
brz, je neki program.
To je neki program koji je napisao neke osobe.
I tako, ta osoba, ako su Posebno zlonamjerni, što su mogli
su rekli, u redu, tako da ako je lozinka da uđem jednak mom
Stvarni password, ili je jednaka na neku posebnu lozinku -
David je strašan ili nešto -
onda ih pustiti unutra
Dakle zlonamjerni programer mogao imati pristup svim svojim Macovima, ili
Windows, ili bilo što.
>> Dakle, to nije mnogo briga, jer, Mislim, ovo je za prijavu programa
koji je isporučen s OS X, stotine ili tisuće ljudi imaju
pregledao ovaj kod.
I tako, ako je, u kodu negdje, reci, ako ovaj niz jednako dosegne
David je strašan, prijava, onda je netko će biti, kao što je, čekati.
To nije u redu.
To ne bi trebao biti ovdje.
Dakle, to je jedan od načina da se stvari biti vrsta siguran.
>> No, razmišljam o čak programa da ste napisali.
Recimo da je napisao program za prijavu.
Dakle, ovo za prijavu programa koje je napisao, tako očito, da ste dobri
programer.
Vi ne ide staviti bilo zlonamjernih ako je x jednako jednako David je strašan
u kodu.
No ovaj program, što učiniti koristiti sastaviti ovaj program?
Nešto kao jeka.
Pa što ako je osoba koja se dogodilo pisati Zveket specijalnu proučavao u Dong
nešto slično, ako sam sastavljanju programa, prijavite se, a zatim unesite ovaj kod
u prijavu programa koji kaže, ako x jednaka jednaka David je strašan?
Dakle, nije baš još, ali mi imamo isti izdati ovdje, gdje je Dong, dobro,
tisuće, ako ne i više desetaka tisuća ljudi, znanstvenici su promatrali Dong, imaju
pogledala svojim linija koda i rekao, sve u redu, nema ništa loše ovdje.
Očito, nitko ne radi ništa ovaj zlonamjerni.
>> No, ono što je sama Dong, kao što su, što ako sam sastaviti Dong?
Što ako imam neki prevodilac da sastavlja zveket koji se umeće u Dong
ovaj posebni hack da kaže, sve u redu, kad sam sastaviti Dong, a zatim
izvršnu sam se posebno trebali gledati unutar prijavu programa i umetkom
ovu lozinku, jednako dosegne Dave je strašan?
Dakle, ne zaboravite da je i sam sastavljač treba biti sastavljen u nekom trenutku.
Dakle, ako je ono što se odlučite za sastaviti Zveket sa, sama je zlonamjeran, onda
mogla biti pijan cijelo način niz liniju.
>> Pa evo, imamo Ken Thompson i Dennis Ritchie.
Dakle, ovo je kultni fotografiju.
Dennis Ritchie je na desnoj strani.
On je veliki -
prilično je napisao C. Tako možete mu zahvaliti za ovu klasu.
Ken Thompson je na lijevoj strani.
Njih dvojica su u osnovi je napisao UNIX.
Pa, oni su bili glavni suradnici u UNIX.
Tu su bili neki drugi.
Dakle Ken Thompson, u nekom trenutku, osvaja Turingov nagradu.
I Turing nagrade, uvijek sam čuo to upućuje na ovaj način, to je
Nobelova nagrada za računalne znanosti.
>> Tako je Turing Award, on mora dati svom govoru.
A on daje ovaj vrlo poznati govor Sada, pod nazivom Razmišljanja o uzdajući se
Povjerenje koje smo povezani Da bi se na web stranici kolegija.
I u ovom govoru, on je, kaže, sve u redu, pa sam pisao UNIX, a sada sve
ti ljudi koriste UNIX.
Sada, ne zaboravite danas da je Linux izravni potomak UNIX.
OS X izravno koristi UNIX.
Windows ne toliko, ali puno ideje su uzeti iz UNIX.
>> Dakle, što se popne na pozornicu i kaže: sve u redu, napisao sam UNIX.
I samo da vi momci znate, ja sam mogućnosti prijaviti se na svaki
do jednog od svojih računala.
Budući da sam stavio jedan od tih posebnih ako x jednako jednako Ken Thomson je strašan,
onda sam dopustio da se prijavite.
Dakle, ljudi su kao, dobro, Kako si to učinio?
Mi smo gledali na programu prijavu i ništa ne postoji.
On je kao, dobro, modificirani sam prevodilac prijaviti u program za prijavu
, tako da je program za prijavu danas će imati da je x jednako jednako Ken Thompson
je strašan.
>> A oni kažu, dobro, to nije istina.
Gledamo u prevodilac, i prevodilac nema linije
Kod tako.
On je kao, u redu, ali što si ti sastavljanju prevodilac sa?
I oni misle, a on je, kao, dobro, Ja sam onaj koji ti je dao prevodilac
koju koristite sastaviti prevodilac, pa što su sastavljanje prevodilac, koji
Sama je zlonamjeran, te će razbiti program za prijavu.
Tako je u osnovi, u tom trenutku, postoji ni na koji način biste mogli pogledati izvor
kod programa za prijavu vidjeti što nije u redu.
Ne mogu ni pogledati u izvorni kod prevodilac
vidjeti što nije u redu.
>> Ti bi trebao gledati na stroju code, binarnom od
sastavio prevodilac vidjeti, čekati, to linija koda ne bi trebao biti ovdje.
No, Ken Thompson je trebalo jedan korak dalje i rekao, dobro, postoje
ovi posebni programi koji zapravo će vam pomoći da pročitate binarni programa,
pa ako netko koristi taj program pročitati binarni, oni će ih vidjeti
linija koda.
On mijenjati one programe za reći, sve Dobro, ako ste u potrazi na
prevodilac, ne pokazuju to posebno Skup binarno.
>> Pa onda morate uzeti korak dalje iu osnovi, koji bi mogli imati
uzeti više razina zaobilazak, te u nekom trenutku, nitko je zapravo
će biti ček.
Dakle pouka ove priče je, ti si neće biti pisanja
Zveket u ovoj klasi.
Ti si idući u biti koristeći penjanje Zveket puno u ovoj klasi.
Za sve što znate, Dong je zlonamjeran Program koji je sabotira svaki
jedan program ste ikada sastavio.
I da vas ostaviti na tome vrlo zloslutna umu, vidimo se u srijedu.
>> [PLJESAK]
>> ZVUČNIK 2: Na sljedećem CS50.
>> Zvučnik 3: Da se nisi usudio to reći.
To možete učiniti.
Vi ste to učinili prije, to možete učiniti Danas, možete to učiniti sutra.
Vi ste to radili godinama.
Dovoljno je otići tamo i to učiniti.
To možete učiniti.
>> [Glazba svira]