>> [Predvaja glasba]
>> ROB BODEN: V redu.
Torej, prva stvar, prvič, video od znanega obraza.
>> [Predvajanje videa]
>> -V redu.
To je CS50, in to začetek tritedenskega.
Žal mi je, ne morem biti z vami danes, vendar mi dovolite, da se predstavim
CS50 lastne Rob Boden.
>> [END Predvajanje videa]
>> [Aplauza in CHEERS]
>> ROB BODEN: filmografija v da video je fantastičen.
Vse je v redu.
Torej, najprej pa obstaja še en kosilo.
To je jutri ob 1:15.
Ni kosilo v petek.
To je z Quora.
Tommy ni tukaj še, ampak eden od ljudje tam je nekdanji CF glavo,
Tommy McWilliam.
Torej je zabaven fant.
Moral bi priti.
>> Vse je v redu.
Torej, prejšnji teden smo začeli razbiti kaj niz je res.
Poznala sva se že od začetka, da je zaporedje znakov.
Toda prejšnji teden smo posegel v resnici da je tisto, kar v resnici zaporedje
znaki, no, sedaj imamo nizi znakov.
In vemo, da je niz, je niz znakov, na samem koncu,
imamo to posebno null bajt, to backslash 0, ki označuje konec
niz.
>> In tako niz je niz znaki, vendar smo lahko več kot
le niz znakov, imamo lahko niz kateremkoli
vrsta stvari želimo.
Torej, če se spomnite iz prejšnjega tedna, Vek program, David uvedla
res hitro.
Torej prva stvar, ki jo boš naredil, je od uporabnika zahteva za celo število,
število oseb v sobi.
Ko smo to celo, smo razglasitvi niz.
Opazili ta nosilec sintakso.
Boš navaditi na to.
>> Torej smo razglasitvi niz števil imenovano starosti, in tam so n
cela števila v tej matriki.
Torej ta vzorec tukaj, ta 4 int i je enak 0, I, nižje od n, i plus
plus, da je tudi, da bo vzorec da boste dobili zelo navajeni.
Ker to je precej, kako ste Vedno gre za ponovitev nad nizi.
Torej, ne pozabite, da je n Dolžina naše matrike.
In tako sem, smo se večkrat sprašuje, na starost človeka, ki ga v prostoru.
>> Po tem, gremo dol, in ne glede na samovoljno razlog, potem smo
izpisal koliko je star gredo da bo leto dni.
In teče ta program, dajva da starost, dot Slash starosti.
Tako število ljudi v prostoru, recimo, da obstajajo tri.
In pravijo, prva oseba, ki je 13, Naslednja je 26, in nazadnje je 30.
Torej bo to ponovitev čez tiste tri ljudje, natisnite 14, 27, in 31.
>> Torej, ne pozabite, da ko izjavljamo matrika velikosti n, indeksi v navedenem
matrika, matrika ima vrednote in indeksi 0, 1, 2, vse
do n minus 1.
Torej, ko smo rekli, da so bili trije ljudje v sobi, in mi dal notri
Prva ponovitev skozi to zanke, i se bo 0.
Torej, v indeksu 0..
Mi smo dodeljevanje prvi S staranjem uporabnik vnese.
Nato pa v naslednjem, smo vstopajo Drugi n uporabnik vnese, in
poleg dveh, zadnji n.
>> Tako opazili, da matrika velikosti tri nima ničesar
v indeksu tri.
To ni veljavna.
Vse je v redu.
Torej, grem nazaj.
Torej sedaj, ko smo se ukvarjali z nizi, imamo nekaj poznam.
Zdaj bomo prešli na ukaz Argumenti line, ki se bodo
zelo pomembno, da ta problem nizu.
>> Torej, do sedaj, kadar koli ste razglasila svojo glavno funkcijo, ki smo jih
je dejal int main neveljavne.
Zato nična samo pomeni, da ne bomo mimo koli
Argumenti za to funkcijo.
Zdaj bomo videli, da je glavna lahko traja nekaj argumentov.
Tu jim pravimo int argc in niza argv nosilci.
Polnila, še enkrat, kar pomeni, da imamo opravka z nizi.
Torej, tukaj, niz argv nosilci, smo , ki se ukvarjajo z vrsto nizov.
Torej argc, da se dogaja, da se navede koliko argumenti ki smo jih
opravili s tem programom.
In videti, kaj to pomeni, dajmo zapreti to.
>> OK.
Torej, do sedaj smo teči vsak Program kot pika poševnicama starosti.
Mi lahko tudi v ukazni vrstici, mimo mimo argumente, torej izraz, ukaz
Argumenti linijo.
Torej prva trditev, zdravo svet.
Torej, tukaj bi argc trije.
To je število argumentov v ukazni vrstici.
Argc je vedno vsaj 1, saj pika slash starosti, sama, šteje kot ena od
argumenti v ukazni vrstici.
>> Potem zdravo je prvi.
Če dot poševnica starosti je Ničti, nato Zdravo je prvi, in svet je
Drugi argument ukazne vrstice.
Torej niz argv, smo videli, vsebuje nize, pika poševnica
starosti, zdravo in svet.
In z zahtevo Davida, greva predvajati video posnetek, ki uvaja.
>> [Predvajanje videa]
>> -Do sedaj v programih, ki smo jih napisal, da smo razglasi
Glavni kot int main neveljavne.
In ves ta čas, da je nična enostavno se navede, da
Program ne odgovarja za kakršnokoli Argumenti linija poveljevanja.
Z drugimi besedami, ko uporabnik zažene Program, on ali ona lahko zagotovi ukaz
Argumenti vrstice s pisanjem dodatna besede ali besedne zveze po programu je
ime na poziv.
>> No, če ne želite, da vaš program na sprejme argumente ukazni vrstici, eno ali
več takih besed, smo morali zamenjati izničijo z nekaj argumentov.
Torej, kaj je to.
Vključi CS50.h.
Vključujejo standardno io.h.
Int main.
In zdaj, namesto neveljavne, bom Določite int imenovano argc, in
Array strun imenovanih argv.
Zdaj, argc in argv so preprosto konvencij.
>> Lahko bi poklical te trditve Najbolj karkoli hočemo.
Toda, kaj je pomembno je, da je argc int saj po definiciji, je
dogaja, da vsebuje štetje argument, število besed skupaj, da
Uporabnik je tipkal na njegovo ali njeno poziv.
argv, medtem, argument vektor, je bo dejansko niz shranjevanje
vse besede, ki jih ima uporabnik tipkal na njegovo ali njeno poziv.
>> Kaj je nadaljevati nekaj storiti zdaj z enim ali več izmed njih
Argumenti linija poveljevanja.
Še posebej, gremo naprej in print ne glede beseda uporabnik vnese
po imenu programa Ob pozivu.
Oklepaj.
Zaklepaj.
Printf odstotkov s backslash in vejico.
In zdaj moram povedati printf kakšno vrednost priključite na to ogrado.
Želim prvo besedo, ki je uporabnik tipkal po imenu programa,
in tako bom, da določite argv nosilec 1, blizu
oklepaj, podpičje.
>> Zakaj nosilec 1 in ne nosilec 0?
No, izkazalo se je, se samodejno shranijo v argv 0 se bo
Dejansko ime programa.
Torej, prva beseda, da uporabnik vnese ko ime programa, je po
Konvencija, bo shranjeni v argv 1.
Pojdimo zdaj zbira in zagon tega programa.
>> Naredite argv 0, pika slash argv 0.
In sedaj beseda kot zdravo.
Enter.
In tam jo imamo, pozdravljena.
>> [END Predvajanje videa]
>> ROB BODEN: V redu.
Zaprite to.
Torej ob pogled na ta program, ki smo pravkar uvedla za nas, dobro, samo
pokazati, če želimo natisniti argv 0, poskrbite, zdaj kaj je to, argv 0, pika slash argv 0.
Tako, kot je bilo pričakovano, da se tiskanje ime programa, saj argv je 0
vedno bo ime programa.
Ampak kaj je naredil nekaj, kar bit bolj zanimivo.
>> Torej, problem nizu, boste uveden s to funkcijo, atoi.
Torej, kaj bomo uporabili za atoi?
To bo za pretvorbo niz na celo število.
Torej, če sem mimo niz, ena dva tri, za atoi, da boste spremeniti, da
k celo število, ena, dva, tri.
Torej bomo za pretvorbo prvi ukazni vrstici argument celo število,
in potem samo natisnete to celo število.
>> Torej v bistvu sva nekako reimplementing getint, samo
število je vpisana na ukaz linija namesto v programu
interaktivno.
Torej, zaradi česar argv 0, naredimo je tukaj, in zapreti to.
Torej teče argv 0, in naj začne celo, ena dva tri, štiri ena dva.
Tako da bomo natisnili celo število, eno dva tri, štiri ena dva.
Obstaja nekaj razlik, da atoi, da da bomo prenehali skrbeti o ničemer
presegajo veljavne numeričnega znaka, ampak to ni važno.
>> Torej, kaj misliš, da se zgodi če to storim?
Segmentacije krivda.
Torej, zakaj je to?
Če se ozremo na naš program, smo pretvorbo argv 1, prvi argument
za imenom programa, na celo število.
Ampak ni argument za imenom programa.
Torej, tukaj vidimo, da je ta buggy Program, saj, če se trudimo, da bi sistem deloval
brez kakršnih koli argumentov, to bo samo crash.
>> Torej še en pogost vzorec boste videli je nekaj takega, kot če je argc manj
razen dveh, kar kaže, da ni bilo vsaj ime programa in
Prvi argument, potem bomo nekaj storiti kot printf, ni dovolj
Argumenti linija poveljevanja.
To verjetno ni dobra za tiskanje, to je verjetno nekaj, kot so
morate vnesti celo v ukazni vrstici.
Jaz bom samo to konča.
In se nato vrne 1.
Torej, ne pozabite, da je na koncu našega Program, če se vrnemo 0, da nekako
označuje uspeh.
In glavni samodejno vrne 0, če ne boš.
>> Torej, tukaj, smo retuning 1, ki označuje da to ni uspeh.
In da se lahko vrnete, kar hočeš, samo, 0 označuje uspeh, in
kaj kaže na neuspeh.
Torej, kaj je teči ta različica stvari.
Torej, zdaj, če ne bomo vnesite ukazno vrstico Trditev, da bomo pravilno povedal
nas, ni dovolj v ukazni vrstici.
Ni končal stavek.
Else, če bi dejansko šlo skozi eno, je mogoče zaključiti program.
Torej, to je, kako bi lahko uporabite v argc Za potrditev število
argumenti v ukazni vrstici, da so dejansko opravili.
>> Torej, kaj je, da ta program nekoliko bolj zapletena, in pogled na sekundo
ponovitev stvari.
Torej, zdaj, bomo ne le tiskanje Argument linija prva zapoved.
Tukaj smo ponavljanjem iz int i je enak 0, i manj kot argc, i plus
plus, in tiskanje argv, indeks i.
Torej ta vzorec, spet, da je to isti vzorec kot prej, razen namesto
kliče spremenljivko n, smo s pomočjo argc.
>> Torej je ta ponavljanjem nad vsako indeksa v matriki in tiskanje vsakega
element v tej matriki.
In tako, ko smo zagon tega programa, dobro, Nisem vstopijo v vse ukazno vrstico
argumenti, zato je le odtisi ime programa.
Če vpišem kup stvari, da bomo natisniti eno, vsak na svoji vrstici.
>> OK.
Torej, vzemimo to en korak naprej.
In namesto tiskanje vsako trditev v svoji vrstici, dajmo natisnite vsako
značaj vsakega argumenta na svojo linijo.
Torej, ne pozabite, da je argv matrika nizov.
Torej, kaj je niz, vendar nabor znakov?
To pomeni, da je res argv array array znakov.
Tako izkoriščajo, da dajmo prezreti to za zdaj.
Reciva, menijo niz argv 0.
>> Torej, če želimo, da bi vsak značaj argv 0 v svoji vrstici, nato pa hočem
narediti vzorec smo uporabili za, i manjša od dolžine matrike,
ki je tu, je strlen v, to je ni tisto, kar želim storiti, niz
i enaka 0 argv.
Torej i je manjša od dolžine naših matrika, ki je v tem primeru je matrika
znakov, i plus plus.
In tako, kot smo videli prejšnji teden, je to idealen če gremo, da strlen zunaj
stanja, saj n bo dodajanje strlen of s vsakič, ko gremo
skozi zanko, in to je ne bomo spreminjali.
Torej ga bomo enak N nad tu nastavite.
>> OK.
Torej, zdaj, smo ponavljanjem preko vsak indeks v matriki.
In tako, če želimo natisniti vsak lik v tej matriki, odstotnim c je
zastava želimo uporabiti Za znakov.
In sedaj nosilec i se bo Niz, indeks lik i, tako da, če
Niz je bilo zdravo.
nato s 0 se bo h, S podstavki 1 bo e, in tako naprej.
>> Torej, zdaj smo želeli združiti ti dve stvari.
Želimo natisniti vsak znak vsakega argumenta ukazne vrstice.
Torej bomo imeli ugnezdene zanke for.
In običajno, prvi števec je i, dostavo se bo j, n
bo strlen argv i, i manjša od n, i plus plus.
In zdaj namesto tiskanja argv i, zato argv nosilec i se bo indeks -
, ki bo v ukazni vrstici i- Trditev, argv i, j se bo
je j-narava argument i-th.
Znebil se bom tega tukaj zdaj saj smo ga v tem krogu.
Torej je enakovredna String s enakopravnimi argv i, nato pa je nosilec j.
>> No, ne rabimo, naj ugotovi ta spremenljivka s.
Namesto tega bomo samo združiti ti dva v tisto, kar smo imeli, argv i, j.
>> SPEAKER 1: [neslišno].
>> ROB BODEN: Dobro klic.
Torej je ta pokvarjen.
Če bi dejansko drži, bomo so to spoznal.
Torej števec mi je mar pri tem predvsem za
Zanka je j, iterator.
Torej bi naletite na vprašanja, Verjetno neskončno zanko, če bomo
ni določen, da.
Zato smo tudi govorili O debugging danes.
>> OK.
Torej, kaj je zagon tega programa.
In kaj je dejansko dodali ločeno printf Tukaj je, da bo samo tiskanje
drugo linijo, ker to pomeni, ko smo zagnati program, bo prišlo prazno
linija med vsako značaja vsak argument ukazne vrstice.
No, bomo videli, kaj to pomeni.
Oop.
Imam neko napako.
Napaka implicitno razglasi Funkcija knjižnica strlen.
>> Torej grem nazaj v naš program, sem Pozabil hash vključujejo string.h.
Torej string.h se bo header datoteka, ki izjavlja
funkcija strlen.
OK, to pripravlja.
Zdaj pa jo vodijo.
Torej samo to.
To se dogaja, da natisnete naše ime programa, zdravo svet.
To se dogaja, natisnite vsako stvar, vsak značaj, v svoji vrstici.
OK.
>> Torej, kaj je dejansko si to en korak naprej.
In namesto da bi uporabili string.h, dajmo razmišljati o tem, kako bi morali izvajati lastne
strlen funkcijo.
Torej bom takoj dal Funkcija podpis.
Torej, recimo v my_strlen, in to je bo trajalo niz kot argument,
in pričakujemo, da se vrnete Dolžina tega niza.
Torej, kje je ta tip?
Da.
OK.
Torej, se spomnite iz prejšnje prosojnice, ki je bil tudi od prejšnjega tedna, da
Niz znakov, no, niz, Torej, recimo, da je to naš niz s.
Torej, če je s niz, hello, potem, H-E-L-L-O, v pomnilniku, ki se bo
biti, in potem je to Nagibnica 0 značaj.
>> Torej, kako bomo dobili dolžino s?
No, trik je videti za to zračnost 0 značaj, to null
terminator.
Torej, algoritem se dogaja bi bilo kaj takega malo
dovolj znakov, da -
imejmo to roko predstavljajo nekateri števec, recimo to int dolžino.
Torej, od tukaj, mi smo gre za ponovitev čez našo nizu.
>> Torej prvi znak, da je H, in to ni vrnil poševnica 0, tako da
dolžina je 1.
Ponovil na naslednji znak, E, in to ne Nagibnica 0.
Dolžina je 2.
L, 3.
L, 4.
O, 5.
In na koncu smo dosegli backslash 0, in tako to pomeni, no,
Ta niz je konec.
Torej vrnimo 5.
>> Tako dejansko izvajanje, da, prvič, moja n dolžina je enaka 0, moja desna roka.
In bomo Ponovil -
>> SPEAKER 1: [neslišno]
>> ROB BODEN: Oh, sranje.
Dobra odločitev.
Boom.
Torej dolžina je n enak 0.
Torej, zdaj, ko s Dolžina ne enako in potem backslash 0.
Torej, ne pozabite, to poševnico 0, je dejanski značaj, in to pomeni,
koncu niza.
Tako kot tudi, poševnica nazaj n je dejanska karakter.
Backslash 0 se dogaja, da navede Konec našega niza.
Ne želim dati, da obstaja.
In medtem ko govorite, ki jih indeksira dolžine ni enak nulte terminator, potem
smo le, da bo prirastek dolžine.
Torej, na koncu našega programa dolžina je na koncu bo
je 5 v tem primeru.
In bova vrnila dolžino.
>> OK.
Torej, zdaj sem dol, jaz ne narediti my_strlen.
Naredimo to prevesti, da poskrbite, da vse teče gladko.
Sem počel v 2?
Ali je bilo to 1?
To bi morali storiti.
Vse je v redu.
Torej je to argv 2.
Deluje kot pričakovano, čeprav je bil, da tisti, ki sem jo naredil v?
Da.
OK.
Ta različica stvari, ki niso imeli printf nova linija po tem, vendar pa
ne bo nobene razlike.
OK.
Tako delal kot je bilo pričakovano.
>> Zdaj bomo lahko celo združiti ta korak nadalje, če je obvestilo tukaj, no,
Najprej smo oprijemalne strlen argv i, nato pa smo ponavljanjem preko
vsak znak v tem nizu.
Torej, namesto da delaš to, kaj pa če smo samo združiti ta logika čakanja
dokler ne bomo zadeli Nagibnica 0 pravico v to zanko?
Torej Ponovil medtem argv i, j ne ni enak 0 backslash.
Torej, kaj je to prvi zagon.
>> Vse je v redu.
Torej, tukaj, ta pogoj je rekel -
kaj je jasno, da.
Torej, zdaj, naj bo to naš argv.
Torej, ko sem tekel, da program pred, argv je množica nizov.
In tako, če sem ga teči z dot poševnica argv 2, zdravo svet, potem argv
sama dolžina 3, za argv nič, zdravo in svet.
>> In znotraj vsakega od teh indeksov je, sam niz, kjer je to bo
pika, bo to slash, ne vem če bi bila prava smer, sem
Ne verjamem, da je.
-R-V dash, potrebujejo več prostora.
Pojdimo v tem polju.
-R-V črtica 0, nato pa nagibnica 0.
In nato v neredu bo zdravo.
Reciva, H-E poševnico 0.
In končno, W-O Nagibnica 0.
>> Torej algoritem, ki smo pravkar napisal, ugnezdena za zank, kaj oni
početje je, moramo najprej boj i in nato j.
To bi bilo lažje z oznako na zaslon, Vrniva se k temu.
OK.
Tako opazili, da je i iterator, da je ponavljanjem nad vsakim ukazom
argument linijo.
In j je iterator ponavljanjem čez vsak znak v tem, da
argument ukazne vrstice.
Torej, kaj je to notranja printf počne je, da smo printf argv 0 0, printf
argv 0 1 printf argv 0 2 0 3 0 4 0 5 0 6, zdaj pa, argv 0 7 se dogaja, da
enako backslash 0.
>> Torej imamo izhod, da za zanke, in zdaj sem se ponovi za 1.
In zdaj bomo tisk argv 1 0, argv 1 1 -
No, saj sem cut zdravo kratko, argv 1 2 spet bo
backslash 0.
In tako, prirastek i in nadaljuje, in tako naprej, dokler se ne izpiše vse
svet, in to so trije ukazni vrstici argumenti, in bomo izhod iz
najbolj oddaljenih zanke in dokončati naš program.
OK.
>> Torej, kaj je prišel nazaj.
Tako boste pridobili nekaj poznavanja argumenti v ukazni vrstici o tem
Poseben problem nastaviti.
>> Zdaj, odpravljanje napak.
Torej, ste verjetno že moral storiti nekateri debugging z dosedanjim
Problem nastavite.
In še ena zelo enostaven način za odpravljanje napak, Najprej si oglejmo program Otroški voziček.
No, sprehod skozi ta program, bomo od uporabnika zahteva za
celo število, zgrabita celo število, in nato, samovoljno, imamo while zanko, ki
je le, da bo pojemanje i, dokler ne bo enaka 10.
Reciva prevzeti jaz vstopu celo število, večje od 10.
Torej pojemanje i, dokler ne bo enaka 10.
>> In potem imamo še eno while zanko da, medtem ko ni enak 0, smo
bo pojemanje i s 3.
Torej, če ste videli namena bug tukaj, je, da bomo to pojemanje i
je 10, in potem je to zanko, medtem ko bo vzroka i od 10, do 7, na 4, 1,
negativnega 2, v negativno 5, in tako naprej, negativne neskončnosti, saj bom
nikoli dejansko enaka 0.
In nato ob koncu tega programa, imamo funkcijo foo ki
dogaja tisku, da i.
>> Torej je to kratko in trivialno program in bug je očitno,
še posebej po tem, ko sem je povedal, kaj je bug.
Ampak namen tukaj je, no, to bi lahko dejansko videti kot nekateri vaši
Rešitve iz požrešen od zadnje problem določiti, in morda imate,
nekateri neskončne zanke v vašem programu, in nimate pojma
kaj ga povzroča.
Torej zelo uporabna debugging tehnika je, da samo dodati printfs
vsem kodi.
>> Torej, tukaj hočem printf zunaj Prva while zanko.
In tukaj želim printf, in bom samo tiskanje i.
Bom še storiti najprej, medtem ko zanke, i.
Zunaj, drugi while zanko.
Še enkrat, tiskati v notranjosti od tu, vrednost i.
In kaj je zagon tega.
>> Torej dot slash razhroščevanje.
Vnesite celo število.
Naredimo 13.
In boom.
Vidimo, da smo neskončna zanka notranjostjo druge, medtem ko zanke.
Torej, zdaj vemo, kaj je bug.
Vendar printf debugging je popolnoma super, ampak ko vaši programi dobili
več in bolj zapletena, obstajajo bolj sofisticirane rešitve
pridobivanje stvari delajo.
Torej, kaj je odstraniti vse te printfs.
In da poskrbite nisem prekinil ničesar.
OK.
>> Torej program, greva uvede se imenuje
GDB, za GNU Debugger.
No, pravzaprav, kaj je odstraniti razhroščevanje za drugič, in da razhroščevanje znova.
No, pravzaprav prvi, dobra lekcija v argumentih ukazni vrstici.
Vedite, da je ta Jek ukaz, da je sestavljanje vse, ki se prenaša
v ukazni vrstici, ti Argumenti linija poveljevanja.
Torej, točno, kako se bodo s pomočjo argumenti v ukazni vrstici, kot smo
storila prej, in kot boste v PSET 2, to je, kako Jek je njihovo uporabo.
>> Tako opazili, da je to prva zastava, dash ggdb3, kaj želi povedati, Jek,
morate zbrati te datoteke z nameri, da bomo sčasoma
morate debug.
Tako dolgo, kot ste to zastavo, potem bomo lahko GDB razhroščevanje.
In bomo odprli GNU Debugger.
>> Torej obstaja veliko ukazov da boste morali navaditi.
Prvi je, da boste verjetno Takoj potrebujemo, Run.
Torej, kaj je Run boš naredil?
To se dogaja, da začnemo program.
Torej teči, začetni program, program nas prosi za celo število, 13.
In potem je neskončna zanka kot Pričakuje se, razen da odstranimo
printfs, tako da sploh ne vidim.
Običajno izstopilo.
Oh.
Možno je, da je zavit vse obratno, nazaj - ignorirajo to.
Predvidevam, da ni izhod normalno.
Tam je zapleten odgovor na to.
>> Torej sedaj, da to ni zelo koristno.
Tako da samo teče naš program znotraj ta razhroščevalnik nam ne pomaga v katerikoli
način, saj smo lahko le narediti dot poševnica razhroščevanje od zunaj GDB.
Torej en ukaz, da Verjetno boste -
in to bom nehal.
Control-d ali zaprete, tako delo.
Torej, kaj je to ponovno odprla.
>> Še en ukaz, ki ga boste verjetno takoj želeli
navaditi, da je Break.
Torej bomo odmor na glavni za zdaj, in potem vam bom razložil, da je.
No, tukaj vidimo smo nastaviti odmerka V tej vrstici v debug.c.
Torej, kaj odmor pomeni, da ko sem tip tek, program bo
tekli naprej, dokler Sem udaril prekinitveno točko.
Torej, ko sem udaril teči, se program zažene, in potem se pokvari takoj, ko je to
vstopi v glavni funkcijo.
Glavni odmor se bo nekaj ste precej pogosto storiti.
>> In zdaj, da vam predstavim za nekaj več ukazov.
Opazil sem, da je rekel, da zlomil na liniji 11, ki je
printf, vnesite celo število.
Torej ukaz Naprej se bo, kako gremo na naslednjo vrstico kode.
To se dogaja, da nam omogočajo, da okrepijo s pomočjo naše programske vrsticah.
Torej, naslednjič.
>> Zdaj linija 12, greva da bi dobili celo število.
Naprej.
In če si zadeti nastopiti še enkrat, bo to redo je zadnja stvar si naredil.
Tako da mi ni treba vnesti Naslednja vsakič.
Torej, vnesite celo število, 13.
Torej, zdaj, linija 14, medtem ko i je večja od 10, in jaz bom zraven.
In vidimo, da bomo pojemanje i.
Torej bomo pojemanje spet.
>> Torej, zdaj, drugo koristno ukaz Print.
Torej Print se bo izpisal vrednost spremenljivke.
Pripeljimo vrednost spremenljivke i.
Oglejmo tiskanje i.
To se dogaja, da sem se 11.
Zdaj smo spet Naslednja medtem I je večji od 10.
Torej, jaz še vedno večji od 10, saj je 11.
i minus minus.
Oglejmo natisnete spet.
Kot je bilo pričakovati, je 10.
>> Torej, zdaj, naslednji.
To se bo vrnil v stanju, i večje od 10, vendar sem zdaj 10, tako
ni večja od 10, tako da pričakujemo, da bo da pade ven iz while zanko.
In zdaj smo pod to vrstico kode.
In še en ukaz, Seznam, je le, da bo Za prikaz prejšnjo in naslednjo
Nekaj ​​vrstic kode, v primeru, da ste se izgubili.
Torej smo pravkar zapustil ta while zanko, in zdaj smo tako začel
while zanko, vrstica 18.
Torej, medtem ko i ni enak 0.
, In nato i je enak i minus 3, mi pa bomo obvestilo, bo to samo nadaljuj.
In lahko natisnete i.
>> Vsak ukaz je neke vrste bližnjice.
Zato p je okrajšava za tiskanje.
Tako da bomo lahko p i.
Samo ne drži n, ali vztrajati početje Naprej.
Natisni spet.
Vidiš, zdaj je negativen 167.
Torej, to bo šlo v nedogled, vendar ne res večno, saj si videl, da
bo dejansko na koncu na neki točki.
>> Tako da se Začetek GDB.
Ampak kaj je naredil eno stvar v GDB.
Uh, razhroščevanje.
Torej, v tem posebnem primeru neskončna zanka se je zgodilo, da je znotraj
Glavna funkcija.
In za zdaj, samo sprejemajo, da sem gre za premik neskončno zanko v
Funkcija foo.
Samo pozabiti, da ob koncu tega Program, no, to je bilo prvotno
kliče foo, ki je bil pravkar tiskovine i.
Zdaj pa kličeš foo, ki je bo pojemanje i, dokler ne bo 0, in
nato natisnete to spremenljivko.
OK.
Le da.
Naredite razhroščevanje.
In zdaj, gdb razhroščevanje.
OK.
>> Torej, če sem teči, potem jaz ne bom lahko dejansko korak po mojih
Program linija-by-line.
Torej, kaj je odmor na glavni, in vnesite tek.
Torej iti skozi to, printf, vnesite število, dobili celo število, 13.
Torej bomo, da decrementing dokler I je večji od 10.
Potem bomo padli skozi while zanko, in priti do črte -
dajmo jo odprli v ločenem oknu.
Tako smo decremented dokler sem bil več večji od 10, in nato smo
imenovano funkcijo, foo.
>> Torej, kaj se je zgodilo takoj, ko sem udaril Funkcija foo, dobro, sem poklical foo, in
potem nisem več imel nadzora nad GDB.
Torej, takoj, ko sem udaril Naprej na tej liniji, Stvari nadaljevati, dokler se je to zgodilo,
kjer program izstopilo ko -
Predvidevam, da ni obstajala na koncu.
Videli ste, da ustavite za nekaj, čeprav.
Torej, zakaj sem izgubil nadzor nad Program na tej točki?
No, ko sem tipa zraven, da gre za literal naslednjo vrstico kode, ki
bodo izvajale.
Torej po vrstici 21, naslednjo vrstico kode ki bo izvajal je linija 22,
ki je izhod iz glavnega.
Torej, ne želim, da pojdi na naslednjo vrstico kode.
Rad bi šel v funkcijo, foo, in nato korak tudi skozi
teh vrstic kode.
>> Torej za to, da imamo alternativo.
Oglejmo nehal, da še enkrat.
Glavni odmor.
Uh, 1, next, next, 13, naslednji, next, next, previdno,
preden smo zadeli postavo foo.
OK.
>> Torej sedaj, smo na liniji 21, kjer pravimo foo.
Nočemo, da bi naslednji tip, saj to bo le poklicati funkcijo foo, in
pojdite na naslednjo vrstico kode.
Kaj želimo uporabiti, je korak.
Torej je razlika med korakom in Next, kjer korak korake v
deluje, in Next gre v funkciji.
To samo izvaja celoto funkcijo in gre naprej.
>> Torej korak nam bo prinesla v funkciji, foo.
In vidimo tukaj, zdaj smo nazaj na to zanko, medtem ko je to v teoriji,
bo nadaljevala večno.
In če ste zadeli korak, kadar to ni niti Funkcija za klic, potem je to
identična Naprej.
Torej je le takrat, ko ste na vrsti, da kliče funkcijo, ki Step
se dogaja, da se razlikujejo od Naprej.
Torej nam bo korak pripeljal sem.
Korak, korak, korak, korak, korak, korak, in Enostavno bomo neskončno zanko za vedno.
>> Tako da boste morda navaditi, da je kot vaš način ugotavljanja neskončne zanke, je
Samo držite to tipko ENTER za videli, če se vam zatakne.
Obstajajo boljši načini za to, vendar za zdaj, to je povsem zadostuje.
In slogovno, da so skladni s stilom 50, naj bi to naredil.
OK.
>> Tako je eden zadnji ukaz, da uvedejo.
No, pa GDB razhroščevanje prijavite
Torej, namesto da bi poškodovali pri glavni, če sem poznati funkcije foo je tudi
problem, potem pa sem lahko samo še omenjeno, break na foo, namesto tega.
Recimo, da sem prekinil na oba glavna in foo.
Tako da lahko nastavite toliko prelomnih točk kakor hočeš.
Ko sem tipa teči, da se dogaja ustaviti na -
Oh, kaj je prevedem, saj Spremenil sem stvari.
Videli boste to vrstico, opozorila vir datoteka je novejša kot izvršljiv.
To pomeni, da sem šel v tu in spremenili ti skladni s stilom
50, vendar nisem prevedem Program.
Torej GDB me zavedati.
Jaz bom nehal, da razhroščevanje spet, hit gdb razhroščevanje.
OK.
>> Torej sedaj, nazaj, kaj sem počel.
Break glavni odmor, foo.
Zdaj, če sem teči program, tako da je bo nadaljevala, dokler ne zadene
Prelomne točke.
Ta prekinitvena točka se zgodi, da bo prvič na glavni.
Zdaj, namesto da delaš zraven, next, next, next, next, dokler nisem udaril foo, I
lahko vnesete še naprej, kar se bo nadaljevalo dokler ne zadeti naslednje prelomne točke.
Moram najprej vnesti celo število.
Še naprej se bo nadaljevalo, dokler nisem zadel Naslednje mejne vrednosti so, to je, da
funkcija foo.
>> Tako bodo Run teči, dokler ne zadeti prekinitvena točka, ampak samo pri vožnji, ko
ste začeli program, in nato, od takrat naprej, je nadaljeval.
Če Pravkar sem prekinil glavni in potem tekel, se bo zlomil na
Glavni in nato nadaljujte.
Ker nimam break točko, na foo, vnesite celo število, potem pa sem zdaj
ne bo prekinil na foo.
To je le, da bo neskončno zanka do tega.
OK.
>> Tako da je Uvod v GDB.
Moral bi začeli uporabljati v svojih problematičnih sklopov.
To je lahko zelo koristno prepoznati napake.
Če ste dejansko le, linija-by-line, pojdite skozi svojo kodo, in primerjati, kaj je
dejansko dogaja s tem, kar ste pričakovali zgodilo, potem je to precej
težko zgrešiti svoje napake.
OK.
>> Torej, prejšnji teden je David pripeljal do tega skrivni ključ kriptografija stvari za
Prvič, kjer ne želimo Gesla se samo shranjeni na našem
Računalnik v nekaterih golo besedilno datoteko, kjer lahko nekdo prišel mimo in pravkar
jo odprli in jih preberete.
V idealnem primeru bi bili šifrirani na nek način.
In Problem Set 2, boste morali ukvarjati z eno metodo šifriranja,
ali, no, dva načina, vendar niso tako velika.
Če boste to storili izdajo hacker, si tudi dogaja, da se ukvarjajo z
dešifriranje nekaj stvari.
>> Torej, vprašanje je zdaj, dobro, čeprav imamo najmočnejšo šifriranje
algoritem na svetu, če se odločite zlasti slabi geslo, potem
vam ne bo pomagalo zelo veliko, saj ljudje bodo še vedno lahko pogruntal.
Tudi če vidim šifrirani niz in je videti kot zmešnjava smeti
da ne pomeni nič z njimi, če se še vedno potrebujejo samo poskusiti nekaj gesel
pogruntati, potem niso zelo varna.
Tako gledanje video, ki naredi to točko.
>> [Predvajanje videa]
>> -Helmet, ti fanatik.
Kaj se dogaja?
Kaj počneš z mojo hčerko?
>> -Dovolite mi, da predstavim briljantno Mlada plastični kirurg, dr Phillip
Schlotkin, največji nos posel človek v celotnem
vesolje in Beverly Hills.
>> -Vaše veličanstvo.
>> -Nos?
Ne razumem.
Ona je že imela operacijo nosu.
To je bil Sweet Sixteen prisotna.
>> -Ne.
To ni tisto, kar misliš.
To je veliko, veliko slabše.
Če mi ne dajo kombinacijo za zračni ščit, dr Schlotkin bo
dal svojo hčer nazaj svoj stari nos.
>> -Ne.
Kje si dobil to?
>> -V redu.
Jaz bom povedal.
Ne, očka.
Ne, ne smeš.
>> -Prav imaš, draga moja.
Pogrešal bom svoj novi nos.
Ampak jaz mu ne bom povedala kombinacijo, ni važno kaj.
>> -Zelo dobro.
Dr Schlotkin, da svoje najhujše.
>> -V veselje mi je.
>> [ORODJA SE izostril]
>> -Ne.
Čakati.
Jaz bom povedal.
>> -Vedel sem, da bo delovalo.
Vse je v redu.
Daj mi ga.
>> -Kombinacija je ena.
>> -One.
>> Dva.
>> -Tri.
>> -Four.
>> -Five.
>> Torej kombinacija je ena, dva, tri, štiri, pet.
To je najbolj neumna kombinacija Kar sem jih kdaj slišal v svojem življenju.
To je nekaj takega idiot bi imel na svoji prtljagi.
>> Hvala, vaša visokost.
>> -Kaj si naredil?
>> -I izklopljen steno.
>> -Ne nisi.
Ste izklopili celoten film.
>> -Verjetno sem pritisnil napačen gumb.
>> No, daj nazaj.
Dal film nazaj.
>> -Da, gospod.
Da, gospod.
>> Pojdimo, Arnold.
Pridi, Gretchen.
Seveda, veste, jaz bom še moral zaračunavati za to.
>> [END Predvajanje videa]
>> ROB BODEN: V redu.
Torej sedaj, da smo že govorili o Varnost v nekaterih pogledih, lepo
Malo movie poster, tako da v zadnjih letih dni, ta vprašanja z NSA
spremljanje vsega.
To je lahko težko, da se počutijo, kot si ti neke vrste zasebnosti
Svetovni splet, čeprav nisem mogel povedati, si večina podrobnosti prizmo.
Torej sprave prizmo, ne bomo da bi govoril o tem, zdaj
pomisli vaš prenosnik.
Torej tukaj, želim, da preklopite na moj dejanski račun,
z mojo malo pingvina.
Torej imam nastaviti geslo, in da geslo, kar hočem biti.
>> Ampak ne pozabite, da tisto, kar sem se prijavite se z, tako da je ta prijava
poziv, je nekaj programa.
To je nekaj program, ki je bil napisal neki osebi.
In tako, da oseba, če so še posebej škodljivo, bi lahko
so rekli, v redu, tako da, če geslo da vnesem enak my
Dejanska geslo, ali pa je enaka do neke posebno geslo -
David je super, ali kaj podobnega -
nato pa jih je spustil noter
Torej bi lahko zlonamerno programer imajo Dostop do vseh vaših Mac, ali
Okna, ali kaj podobnega.
>> Tako da ni veliko skrb, saj Mislim, da je to program, prijava
, ki je priložena OS X, na stotine ali tisoče ljudi ima
pregledal to kodo.
In tako, če je v kodi nekje, si reči, če je ta niz enak enak
David je super, prijavo, nato pa je nekdo bo, kot, počakaj.
To ni prav.
To ne bi smelo biti tukaj.
Torej, to je eden od načinov, smo dobili stvari da bi nekako varen.
>> Ampak pomisli celo programov da ste napisali.
Recimo, da ste napisal program za prijavo.
Torej, to prijavo program, ki ga je napisal, torej je očitno, da ste dober
programer.
Saj ne bo dal zlonamerne če je x enak enaka David je super
v kodi.
Vendar ta program, kaj storiti, uporabite za pripravo tega programa?
Nekaj ​​podobnega Jek.
Pa kaj, če oseba, ki se je zgodilo napišite Jek special obloženega v Jek
nekaj podobnega, če sem zbiranju prijavi se program, potem to kodo
v program vpisu, ki pravi, če x je enaka enaka David je super?
Torej, še ne čisto, ampak imamo isto izda tu, kjer Jek, dobro,
tisoče, če ne na tisoče Ljudje, ki so pogledal Jek, imajo
Pogledal svojih vrstic kode in dejal, Vse je v redu, nič ni slabo.
Očitno je, da nihče ne počne kaj to zlonamerno.
>> Toda kaj se sama Jek, kot so, Kaj pa, če prevedem Jek?
Kaj, če imam nekaj prevajalnik, ki pripravlja Jek da vstavi v Jek
to posebno kramp, ki pravi, vse v redu, ko sem zbrati Jek, nato
izvršljiv sem se morala posebej pogledati znotraj programa vpisu in vložek
To geslo je enaka enaka Dave je super?
Torej, ne pozabite, da je vaš sam prevajalnik Treba je sestaviti na neki točki.
Torej, če kaj se odločite, da pripravijo Jek s, sam je zlonamerno, potem
mogoče priviti celotno Tako po vrsti.
>> Torej, tukaj imamo Ken Thompson Dennis Ritchie.
Torej je to ikonično fotografijo.
Dennis Ritchie je na desni strani.
Bil je velik -
precej napisal C. Torej si lahko mu zahvaljujem za ta razred.
Ken Thomson je na levi strani.
Dva izmed njih v bistvu pisal UNIX.
No, oni so najbolj prispevale v UNIX.
Tam so bili nekateri drugi.
Torej, Ken Thompson, na neki točki, osvoji Turing Award.
In Turing nagrado, vedno sem slišal se sklicuje na ta način, da je
Nobelova nagrada računalništva.
>> Torej na Turing Award, mora dati zahvalnem govoru.
In mu daje to zelo znanem govoru Zdaj, imenovano Razmišljanja o zaupljivi
Zaupanje, ki smo povezani da se na spletni strani predmeta.
In v tem govoru, pravi, vse v redu, zato sem napisal UNIX, in zdaj vsi
ti ljudje uporabljajo UNIX.
Zdaj, ne pozabite, danes, da je Linux neposredni potomec UNIX.
OS X neposredno uporablja UNIX.
Windows ne tako veliko, vendar veliko idej so bili odvzeti iz Unixa.
>> Torej, ko gre gor na oder in reče: V redu je, sem napisal UNIX.
In samo zato, da veste, da sem možnost, da se prijavite na vsak
niti eden od vaših računalnikov.
Ker sem eden od teh posebnega, če x enaka enaka Ken Thomson je super,
Nato mi je dovoljeno, da se prijavite.
Torej, ljudje so kot dobro, Kako si to naredil?
Pogledali smo na programu vpisu in nič ni tam.
On je kot, no, sem spremenil prevajalnik za prijavo v program vpisu
tako da bo program za prijavo zdaj da je x enak enaka Ken Thompson
je super.
>> In pravijo, no, da to ni res.
Smo iskali na prevajalnik, in prevajalnik nima linije
Šifra tako.
On je tako, OK, ampak kaj ste sestavljanje prevajalnik z?
In mislijo, in on je, kot, no, Jaz sem tisti, ki ti je dal prevajalnik
boste uporabljali za izdelavo prevajalnik, tako ste sestavljanje prevajalnik, ki
sam je zlonamerna, in bo prekinil program prijavo.
Torej v bistvu, na tej točki, da je noben način si lahko ogledate na viru
Koda programa vpisu da vidim, kaj je narobe.
Nisi mogel niti pogledati v izvorno kodo prevajalnika
da vidim, kaj je narobe.
>> Ti bi morali gledati na stroju Koda, dejanski binarni od
zbrati prevajalnik videti, čakaj, ti vrstic kode ne bi smel biti tukaj.
Ampak Ken Thompson je to en korak še dlje in rekel, dobro, obstajajo
ti posebni programi, ki dejansko vam brati binarno programov,
in tako, če nekdo uporablja, da je program za preberite binarno, bi videli te
vrstic kode.
On je spremenjen teh programov za povedati, vsi V redu, če ste iskali na
prevajalnik, ne kažejo, da to zlasti Niz binarno.
>> Torej boste morali sprejeti, da korak naprej in v bistvu, bi lahko, da imajo
sprejetih več ravni indirection, in na neki točki, nihče pravzaprav
bodo preverjanje.
Torej Nauk zgodbe je, da si ne bo treba pisati
Zvoka v tem razredu.
Boste uporabljali plezanje Jek veliko v tem razredu.
Za vse, kar morate vedeti, Jek je zlonamerna Program, ki se sabotira vsak
sam program ste kdaj zbrati.
In da greš o tem zelo zlovešč Upoštevajte, vidimo v sredo.
>> [APPLAUSE]
>> SPEAKER 2: Na naslednjem CS50.
>> ZVOČNIK 3: Ne drzni si reči, da.
To lahko storite.
Vi ste to storila prej, lahko to storite Danes, lahko to storite jutri.
Ste to počne že vrsto let.
Samo pojdi tja in to.
To lahko storite.
>> [Predvaja glasba]