>> [Redare a muzicii]
>> ROB BODEN: În regulă.
Deci, primul lucru pe care în primul rând, de film de la un chip familiar.
>> [VIDEO PLAYBACK]
>> -În regulă.
Aceasta este CS50, iar acest lucru este începutul săptămânii trei.
Îmi pare rău, nu am putut fi acolo cu tine azi, dar permiteți-mi să introducă
CS50 proprii Rob Boden.
>> [END VIDEO PLAYBACK]
>> [Aplauze și urale]
>> ROB BODEN: filmografia în că video este fantastic.
Bine.
Deci, în primul rând, există un alt prânz.
E mâine la 01:15.
Nu există nici un prânz vineri.
Este cu Quora.
Și Tommy nu e aici încă, dar unul dintre oamenii de acolo este fostul CF cap,
Tommy McWilliam.
Deci, el e un tip amuzant.
Ar trebui să vii.
>> Bine.
Deci, săptămâna trecută, am început de rupere în afară cu privire la ceea ce este într-adevăr un șir.
Ne-am cunoscut de la început că este o secvență de caractere.
Dar săptămâna trecută, ne-am afundat în faptul că ceea ce este de fapt o secvență de
personaje, ei bine, acum avem tablouri de caractere.
Și știm că un șir de caractere, este o matrice de caractere, la sfârșitul foarte,
avem acest octet special nul, acest backslash 0, care indică sfârșitul
șir.
>> Și astfel un șir este o matrice de caractere, dar putem avea mai mult
doar o serie de caractere, putem avea o serie de orice
tip de lucru pe care îl dorim.
Deci, dacă vă amintiți de săptămâna trecută, Program de vârstele, care a introdus David
foarte repede.
Deci, primul lucru pe care am de gând să faceți este să cere utilizatorului pentru un întreg,
numărul de persoane în cameră.
După ce vom avea ca întreg, vom declara o matrice.
Observați această sintaxă suport.
Ai de gând să te obișnuiești cu asta.
>> Deci, vom declara o serie de numere întregi numit vârstele, și există n
numere întregi, în această matrice.
Deci, acest model chiar aici, acest 4 int i este egal cu 0, i este mai mic decât n, i plus
plus, care este, de asemenea, va fi un model că te foarte folosit pentru a.
Pentru că e destul de mult cum esti întotdeauna va repeta peste matrice.
Deci, amintiți-vă că n este lungime de matrice noastre.
Și atât de aici, suntem în mod repetat cer de la vârsta de persoane i în cameră.
>> După aceasta, vom merge în jos, și pentru orice motiv arbitrar, noi atunci
imprima cat de vechi au de gand pentru a fi un an de acum.
Și rularea acestui program, să face vârstele, dot vârstele slash.
Deci, numărul de persoane în cameră, să spunem că sunt trei.
Și spune, prima persoană este de 13, următor este de 26, iar ultimul este de 30.
Deci, atunci se va repeta pe cele trei oameni, imprima 14, 27, și 31.
>> Deci, amintiți-vă că, atunci când ne-am declara o matrice de dimensiune n, indicii din care
matrice, matrice a valorilor și Indicii 0, 1, 2, tot drumul
până la n minus 1.
Așa că atunci când am spus că erau trei persoane in camera, și am pus aici
prima iterație prin aceasta buclă, i se va fi 0.
Deci, în index 0.
Suntem atribuirea primul varsta utilizatorul introduce.
Apoi, în cea următoare, vom intra în n doua utilizatorul introduce, și în
alături de două, ultimele n.
>> Deci, observăm că o serie de dimensiuni trei nu are nimic
în index trei.
Acest lucru nu este valabil.
Bine.
Deci, merge înapoi aici.
Deci, acum că ne-am ocupat cu tablouri, avem o familiaritate.
Acum vom trece la comanda argumente de linie, care urmează să fie
destul de relevante pentru acest set de probleme.
>> Deci, până acum, ori de câte ori ai a declarat funcția principală, ne-am
a declarat nule principal Int.
Deci, gol înseamnă doar că noi nu se trece nici o
argumente pentru această funcție.
Acum vom vedea ca principal poate dura câteva argumente.
Aici noi le numim int argc și paranteze argv șir.
Parantezele, încă o dată, indicând că avem de-a face cu tablouri.
Deci, aici, între paranteze șir argv, suntem de-a face cu o serie de siruri de caractere.
Astfel argc, care va indica cât de multe argumente ne-am
trecut la acest program.
Și pentru a vedea ce înseamnă că, Să închidem acest lucru.
>> OK.
Deci, până acum, ne-am alerga în fiecare program ca vârstele slash dot.
Putem, de asemenea, la linia de comandă, pe lângă trece argumente, astfel termen, comanda
argumente în linia.
Deci, primul argument, salut lume.
Deci, aici, argc ar fi trei.
Este numărul de argumentelor la linia de comandă.
Argc este întotdeauna cel puțin 1, din punct slash vârstele, în sine, contează ca una din
argumentele din linia de comandă.
>> Apoi, salut este primul.
Dacă vârstele slash punct este de grad zero, atunci salut este primul, iar lumea este
al doilea argument linie de comandă.
Deci, argv șir, vom vedea, contine siruri de caractere, slash punct
vârstele, salut, și lumea.
Și, la cererea lui David, vom pentru a reda un clip video de introducere asta.
>> [VIDEO PLAYBACK]
>> -Până acum în programe care le-am scris, ne-am declara
principal void main int.
Și în tot acest timp, acest gol a pur și simplu a fost precizând că
program nu se ia nici o argumente în linia de comandă.
Cu alte cuvinte, atunci când un utilizator execută o Programul, el sau ea poate oferi comandă
argumente în linia de scris suplimentare cuvinte sau fraze, după programului
numele la prompt.
>> Ei bine, dacă vrei programul de ia argumente în linia de comandă, unul sau
mai multe astfel de cuvinte, avem nevoie pentru a înlocui anula cu o pereche de argumente.
Deci, haideți să facem asta.
Includeți CS50.h.
Includeți io.h. standard,
Int main.
Și acum, în loc de gol, am de gând să specifica un int numit argc, și o
matrice de siruri de caractere, numite argv.
Acum, argc și argv sunt pur și simplu convenții.
>> Am putea-am numit aceste argumente cele mai multe orice vrem.
Dar ceea ce este important este faptul că argc este un int deoarece, prin definiție, este
O să conțină numărul de argument, numărul de cuvinte în total pe care
utilizator a tastat la promptul lui sau a ei.
argv, între timp, vector argument, este va fi de fapt o matrice de stocare
toate cuvintele pe care utilizatorul are tastat la promptul lui sau a ei.
>> Să continuăm să facem ceva acum cu unul sau mai mulți dintre aceștia
argumente în linia de comandă.
În special, să mergem mai departe și de imprimare indiferent de cuvânt tipurile de utilizatori
după numele programului la prompt.
Deschis suport.
Aproape suport.
Printf la suta s backslash și virgulă.
Și acum am nevoie să spun printf ce valoare să conectați în acel substituent.
Vreau ca primul cuvânt pe care utilizatorul are tastat după numele programului,
și așa am de gând pentru a specifica argv suport 1, aproape
paranteze, punct și virgulă.
>> Acum, de ce suport 1 și nu suport 0?
Ei bine, se pare, stocate automat în argv 0 va fi
Numele real program.
Deci, primul cuvânt care utilizatorul tastează după numele programului este, de
convenție, va fi stocate în argv 1.
Hai acum compila și rula acest program.
>> Face argv 0, punct slash argv 0.
Și acum un cuvânt ca salut.
Enter.
Și acolo l-am avea, salut.
>> [END VIDEO PLAYBACK]
>> ROB BODEN: În regulă.
Închideți asta.
Deci, a lua o privire la acest program care am introdus doar la noi, ei bine, doar
pentru a arăta, dacă vom imprima argv 0, face, acum ceea ce este, argv 0, punct slash argv 0.
Deci, cum era de așteptat, este imprimarea Numele programului, deoarece argv 0 este
întotdeauna o să fie numele programului.
Dar hai sa facem ceva o pic mai interesant.
>> Deci, în setul problemă, veți fi a introdus la această funcție, atoi.
Deci, ce vom folosi pentru atoi?
Asta va converti o șir la un număr întreg.
Deci, dacă am trece șir, unul, doi, trei, pentru atoi, care va converti că
la numărul întreg, unul, doi, trei.
Așa că am de gând pentru a converti primul argument linie de comandă pentru un număr întreg,
și apoi pur și simplu imprimați că întreg.
>> Deci, practic, suntem un fel de reimplementing getint, drepți
întreg este înscris la comanda linie în loc de program
interactiv.
Deci, ceea ce face argv 0, hai sa facem o aici, și închide asta.
Deci, rulează argv 0, și să introduceți întreg, unu, doi, trei patru unu doi.
Asa ca va tipări un număr întreg, un doi, trei, patru unu doi.
Există unele subtilități de atoi că se va opri pese de nimic
dincolo de un caracter numeric valabil, dar asta nu contează.
>> Deci, ce crezi că se întâmplă dacă am face acest lucru?
Eroare de segmentare.
Deci, de ce este asta?
Dacă te uiți înapoi la programul nostru, suntem conversie argv 1, primul argument
după numele programului, la un număr întreg.
Dar nu există nici un argument trecut după numele programului.
Deci, aici, vom vedea că acest lucru este un buggy Programul, din moment ce, în cazul în care vom încerca să-l rulați
fără nici un argument, se va prăbuși pur și simplu.
>> Deci, un alt model comun, veți vedea este ceva de genul, dacă argc este mai puțin
mult de două, indicând că nu a existat cel puțin numele programului și A
primul argument, atunci vom face ceva ca printf, nu suficient
argumente în linia de comandă.
Asta e, probabil, unul bun pentru a imprima, este, probabil, ceva, cum ar fi
ar trebui să introduceți un număr întreg la linia de comandă.
Voi termina acolo.
Și apoi să se întoarcă 1.
Deci, amintim că, la sfârșitul nostru Programul, dacă ne-am întoarce 0, ca un fel de
indică succesul.
Și principal, de asemenea, în mod automat returneaza 0 daca nu.
>> Deci, aici, suntem Revenirea 1 pentru a indica că nu este de succes.
Și puteți reveni tot ce vrei, doar, 0 indică succes, și
orice altceva indică eșec.
Deci, haideți să ruleze această versiune de lucruri.
Deci, acum, dacă nu introduceți o linie de comandă argument, se va spune în mod corect
ne, nu suficient de linie de comandă.
Nu a terminat fraza.
Altfel, dacă am de fapt, trece unul, se poate finaliza programul.
Deci, acesta este modul în care ar trebui să utilizați în argc Pentru a valida numărul de
argumente în linia de comandă care sunt de fapt a trecut.
>> Așa că haideți să facem acest program un pic mai mult complicat, si uita-te la a doua
repetare a lucrurilor.
Deci, acum, suntem nu doar de imprimare Primul argument linie de comandă.
Aici, suntem iterarea de la egal la egal i int 0, i este mai mică de argc, i plus
plus, și de imprimare argv, indicele i.
Deci acest model, din nou, acest lucru este la fel model ca și mai înainte, cu excepția loc
de asteptare variabila n, suntem folosind argc.
>> Deci, acest lucru este iterarea peste fiecare index în matrice, și tipărirea fiecărei
element din acea matrice.
Și astfel, atunci când vom rula acest program, ei bine, Nu am intra nici o linie de comandă
argumente, așa că doar amprentele numele programului.
Dacă intru într-o grămadă de lucruri, voi imprima o, fiecare pe o linie proprie.
>> OK.
Așa că haideți să facem un pas mai departe.
Și în loc de a imprima fiecare argument pe o linie proprie, să imprimați fiecare
caracter de fiecare argument pe o linie proprie.
Deci, amintiți-vă că este argv o matrice de siruri de caractere.
Deci, ce este un șir de caractere, dar o serie de caractere?
Deci asta înseamnă că argv este într-adevăr o serie de o serie de caractere.
Deci, profitând de faptul că, să ignore acest lucru pentru acum.
Să ia în considerare doar șir argv 0.
>> Deci, dacă vrem să aducem fiecare personaj de argv 0 pe o linie proprie, atunci vreau
pentru a face modelul suntem obișnuiți, i este mai mică decât lungimea de matrice,
care aici, este strlen de, care este nu ceea ce vreau să fac, string
e egal cu 0 argv.
Deci, i este mai mică decât lungimea noastre matrice, care în acest caz este o matrice
de caractere, i plus plus.
Și astfel, așa cum am văzut săptămâna trecută, este ideal dacă ne-am muta că strlen afara
afecțiunii, deoarece n va fi adăugarea strlen de s de fiecare dată când mergem
prin bucla, și este nu o să se schimbe.
Deci, vom egal cu n aici set.
>> OK.
Deci, acum, suntem iterarea peste fiecare index în matrice.
Și așa, dacă vrem să imprimați fiecare personaj în acea matrice, suta c este
steagul ne-o dorim pentru a utiliza de caractere.
Și acum un i suport va fi șir, caractere indicele i, astfel încât în ​​cazul în care
șir au fost salut.
apoi s 0 va fi h, s suport 1 va fi e, și așa mai departe.
>> Deci, acum vrem să combine aceste două lucruri.
Vrem să imprimați fiecare personaj de fiecare argument linie de comandă.
Deci, vom avea o imbricate pentru buclă.
Și în mod convențional, primul contor este i, următorul va fi j, n
va fi strlen de argv i, i este mai mică decât n, i plus plus.
Și acum, în loc de imprimare argv i, astfel argv suport i se va indexa -
care va fi linia de comandă i-lea argument, argv i, j se va
fi caracterul j de argumentul i-lea.
Voi scăpa de asta aici, acum din moment ce ne-am pus-o în acea buclă.
Deci, este echivalent cu egali string s argv i, și apoi s suport j.
>> Ei bine, nu avem nevoie să declare aceasta s variabil.
În schimb, vom combina doar acestea două în ceea ce am avut, argv i, j.
>> SPEAKER 1: [inaudibil].
>> ROB BODEN: Good apel.
Deci, acest lucru este rupt.
Dacă am de fapt fugit, ne-ar au realizat acest lucru.
Astfel încât contorul îmi pasă în această special pentru
buclă este j, iterator.
Deci, s-ar fi rula în probleme, probabil o buclă infinită, dacă ne-am
nu au stabilit asta.
De aceea, suntem, de asemenea, vorbim despre depanare ziua de azi.
>> OK.
Deci, haideți să rula acest program.
Și să adăugați de fapt un printf separat chiar aici, care va imprima doar
o altă linie, deoarece acest lucru înseamnă că, atunci când ne-am rula programul, nu va mai fi un gol
linie între fiecare caracter de fiecare argument linie de comandă.
Ei bine, vom vedea ce înseamnă asta.
OOP.
Am unele bug.
Eroare implicit, declararea funcția de bibliotecă strlen.
>> Deci, merge înapoi în programul nostru, am a uitat să includă hash string.h.
Astfel string.h va fi fișier header care declară
funcția strlen.
OK, se compilează.
Acum, hai să-l rulați.
Deci, doar asta.
Se va imprima nostru numele programului, salut lume.
O să imprimați fiecare lucru, fiecare caracter, pe o linie proprie.
OK.
>> Așa că haideți să ia de fapt acest un pas mai departe.
Și în loc de a folosi string.h, să cred despre modul în care ne-ar pune în aplicare propria noastră
Funcția strlen.
Deci, voi da imediat o semnătură funcție.
Așa că haideți să numim în my_strlen, și este de gând să ia un șir ca un argument,
și ne așteptăm să se întoarcă lungime de acel șir.
Deci, unde e tipul ala?
Da.
OK.
Deci, amintiți-vă de la diapozitivul anterior că a fost, de asemenea, de săptămâna trecută, că o
tablou de caractere, ei bine, un șir de caractere, deci haideți să spun acest lucru este șir s nostru.
Deci, dacă s este șirul, salut, apoi, H-E-L-L-O, în memorie, care va
fie, iar apoi acest backslash 0 caracter.
>> Deci, cum putem obține lungimea de s?
Ei bine, truc este în căutarea pentru acest criticilor camuflate 0 caracter, acest nul
terminator.
Deci, algoritmul se întâmplă să fie ceva de genul puțini
suficient de caractere care -
haideți să avem această mână reprezintă unele contra, să numim această lungime int.
Deci, pornind de aici, suntem O să itera peste șir nostru.
>> Deci, primul caracter, este H, și nu este înapoi slash 0, așa
lungimea este 1.
Repeta la caracterul următor, E, și nu este backslash 0.
Lungimea este de 2.
L, 3.
L, 4.
O, 5.
Și, în sfârșit, ajungem la backslash 0, și astfel încât mijloace, ei bine,
acest șir este de peste.
Deci, haideți să se întoarcă 5.
>> Deci, de fapt, de punere în aplicare, care, în primul rând, n lungime mea este egal cu 0, mâna mea dreaptă.
Și vom repeta -
>> SPEAKER 1: [inaudibil]
>> ROB BODEN: Oh, trage.
Bun apel.
Boom.
Deci, n lungime este egal cu 0.
Deci, acum, în timp ce lungimea s nu egal și apoi, backslash 0.
Deci, amintiți-vă, aceasta backslash 0, aceasta este o caracterul real, și se indică
sfârșitul șirului.
La fel ca și, de asemenea, backslash n este un caracter real.
Backslash 0 se va indica sfârșitul șir nostru.
Nu vreau să pui acolo.
Și, în timp ce s indexate de lungime nu este egală cu terminatorul null, atunci
suntem doar de gând să incrementa lungime.
Deci, la sfârșitul programului nostru, Lungimea este în cele din urmă va
fie de 5 în acest caz.
Și lungime vom returna doar.
>> OK.
Deci, acum, aici, eu nu fac face my_strlen.
Să-l compilați pentru a vă asigura totul merge bine.
Fost eu in 2?
Sau a fost o?
Asta ar trebui să facă.
Bine.
Deci, aceasta este argv 2.
Lucrează ca anticipat, deși a fost ca cea pe care am făcut-o în?
Da.
OK.
Această versiune de lucruri nu au avut linia nou printf după, dar
nu se face nici o diferență.
OK.
Astfel lucrat cum era de așteptat.
>> Acum putem combina chiar și acest singur pas în plus, în cazul în care o notificare aici, ei bine,
în primul rând, suntem hapsân strlen de argv i, iar apoi vom iterarea peste
fiecare personaj în șir.
Deci, în loc de a face asta, dacă am combina doar această logică de așteptare
până când ne-am lovit backslash 0 corect în acest timp de buclă?
Deci, în timp ce repeta argv i, j nu nu egal backslash 0.
Deci, haideți să-l ruleze mai întâi.
>> Bine.
Deci, aici, această condiție se spune -
Să clar că.
Deci, acum, lăsați acest lucru să fie argv nostru.
Așa că atunci când am fugit că programul înainte, argv este o matrice de siruri de caractere.
Și așa, dacă am alerga cu punct argv slash 2, salut lume, atunci argv
în sine este de lungime 3, pentru argv la zero, salut, și lumea.
>> Și în interiorul fiecăruia dintre acești indici este, în sine o matrice, în cazul în care acest lucru va fi
punct, acest lucru va fi slash, nu știu în cazul în care a fost direcția cea bună, am
Nu cred că a fost.
A-R-V bord, au nevoie de mai mult spațiu.
Să taie în această matrice.
Liniuță 0, și apoi backslash 0 A-R-V.
Și apoi în dezordine va fi salut.
Să spunem, H-E backslash 0.
Și, în sfârșit, W-O backslash 0.
>> Astfel algoritmul pe care tocmai am scris, imbricate pentru bucle, ce sunt
face este că avem mai întâi contracara i și apoi j.
Acest lucru ar fi mai ușor cu cod de pe ecran, Să ne întoarcem la aceasta.
OK.
Astfel observa că i este iterator care este iterarea peste fiecare comandă
argument linie.
Și j este iterarea iterator peste fiecare personaj în care
argument linie de comandă.
Deci, ceea ce acest printf cel mai intim este de a face este, am printf argv 0 0, printf
argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 6 0, dar acum, argv 0 7 se va
egal backslash 0.
>> Deci ne-am ieși din care pentru bucla, și acum i reiterează la 1.
Și acum am de gând să imprimare argv 1 0, 1 1 argv -
bine, acum, de când am tăiat salut scurt, argv 1 2 este din nou va fi
backslash 0.
Și astfel, incrementa i și continuă, și așa mai departe, până când vom tipări toate
lume, iar acestea sunt de trei linie de comandă argumente, și vom ieși din
bucla exterioară, și termina programul nostru.
OK.
>> Așa că haideți să ne întoarcem aici.
Deci, veți obține unele familiaritate cu argumente în linia de comandă de pe acest
problemă deosebită set.
>> Acum, depanare.
Deci, probabil că au avut deja de a face unele depanare cu anterior dvs.
problemă set.
Și o modalitate foarte usoara de depanare, în primul rând, să ne uităm la un program de buggy.
Ei bine, de mers pe jos prin intermediul acestui program, vom cere utilizatorului pentru o
întreg, apuca ca întreg, și apoi, arbitrar, avem o buclă în timp ce
este doar de gând să decrementa i până când este egal cu 10.
Să presupunem Intru un număr întreg mai mare de 10.
Deci, decrement i până când este egal cu 10.
>> Și atunci avem o altă buclă în timp ce că, în timp ce eu nu este egal cu 0, suntem
O să i decrementa de 3.
Deci, dacă vedeți intenția de bug-ul aici, este că aceasta va decrementa i la
fi de 10, iar apoi acest lucru va în timp ce buclă decrement i de la 10, la 7, la 4, la 1,
la 2 negativ, negativ la 5, și așa mai departe, la infinit negativ, deoarece i se va
nu egal cu 0, de fapt.
Apoi, la sfârșitul acestui program, avem funcția de foo care este
întâmplă de imprimare pe care am.
>> Deci, acesta este un program scurt și banal, și bug-ul este evident,
mai ales după ce am doar a spus ceea ce a fost bug-ul.
Dar intenția de aici este, de asemenea, acest lucru ar putea arata de fapt ca o parte din dvs.
soluții de la lacomi de la ultima problema stabilit, și poate că nu aveți
unele buclă infinită în program, și nu aveți nici o idee
care este cauza.
Deci, o tehnică de depanare foarte util este de a adăuga doar printfs
peste tot codul.
>> Deci, aici vreau un printf afara prima buclă în timp.
Și aici vreau un printf, și voi imprima doar eu.
Voi face chiar în primul rând în timp ce bucla, i.
Exterior, în timp ce al doilea buclă.
Încă o dată, imprimați interior de aici, i valoarea.
Și să ruleze acest lucru.
>> Deci, punct de depanare slash.
Introduceți un număr întreg.
Să facem 13.
Și boom-ul.
Vedem că suntem looping infinit în interiorul celei de a doua buclă în timp.
Deci, acum știm ce bug-ul este.
Dar printf depanare este perfect mare, dar odată ce programele obține
mai lungă și mai complicată, există soluții mai sofisticate pentru
obtinerea lucruri de lucru.
Așa că haideți să elimine toate aceste printfs.
Și să ne asigurăm că nu am făcut- sparge nimic.
OK.
>> Astfel încât programul vom introducerea se numește
GDB, pentru GNU Debugger.
Ei bine, de fapt, să eliminați de depanare pentru un al doilea, și de a face din nou depanare.
Ei bine, de fapt, în primul rând, o lecție bună în argumente în linia de comandă.
Observați că această comandă răsune care este compilarea totul este trecut
la linia de comandă, acestea argumente în linia de comandă.
Deci, exact cum aveți de gând să fie utilizând argumente în linia de comandă, așa cum am
făcut-o înainte, și după cum va fi în PSET 2, așa răsune le utilizează.
>> Astfel observa că acest steag în primul rând, liniuță ggdb3, că ceea ce spune este, răsune,
tu ar trebui să compileze acest fișier cu intenție că vom în cele din urmă
trebuie să-l depanare.
Atâta timp cât aveți acel steag, atunci putem GDB depanare.
Și se va deschide GNU Debugger.
>> Deci, există o mulțime de comenzi de care aveți nevoie să te obișnuiești.
Primul care veți, probabil, imediat nevoie este Run.
Deci, ce se alerga de gând să faci?
Se va porni programul nostru.
Deci rula, programul de pornire, programul ne cere pentru un număr întreg, 13.
Și atunci e looping infinit ca așteptat, cu excepția am scos
printfs, așa că noi nu vedem chiar că.
Ieșit în mod normal.
Oh.
Este posibil ca aceasta înfășurat tot mod special, inapoi la - ignorarea asta.
Să presupunem că nu a ieși în mod normal.
Există un răspuns complicat pentru asta.
>> Deci, acum, că nu e foarte util.
Deci, care rulează doar programul nostru interior de acest depanator nu ne ajuta în orice
Astfel, din moment ce am fi putut face doar punct slash depanare din afara GDB.
Astfel, comanda una care veți probabil -
și voi renunta asta.
-Controlul d sau renunta, ambele de lucru.
Deci, haideți să-l deschidem din nou.
>> O altă comandă pe care le voi probabil doresc imediat să
te obișnuiești este Break.
Deci, vom rupe în principal pentru acum, și apoi să-ți explic asta.
Ei bine, aici vom vedea ne-am stabilit un punct de întrerupere la această linie în debug.c.
Deci, ceea ce înseamnă pauză este că atunci când am tip run, programul se va
continua să ruleze până la Am lovit un punct de întrerupere.
Așa că atunci când am lovit alerga, începe programul, și apoi se rupe de îndată ce se
intră funcția principală.
Break principal va fi ceva tu destul de frecvent face.
>> Și acum, să vă prezint la unele mai multe comenzi.
Observați aici, că se spune noi izbucnit la linia 11, care este
printf, introduceți un număr întreg.
Deci, comanda următoare va fi modul în care vom merge la următoarea linie de cod.
Acest lucru se întâmplă pentru a ne permite să-și intensifice prin linia de programul nostru de linie.
Deci, data viitoare.
>> Acum, linia 12, vom pentru a obține întreg.
Următor.
Și dacă doar te-a lovit Enter din nou, acesta va reface ultimul lucru pe care ai făcut-o.
Așa că nu am nevoie să tastați următor de fiecare dată.
Deci, introduce un număr întreg, 13.
Deci, acum, linia 14, în timp ce i este mai mare decât 10, și voi face în continuare.
Și vom vedea vom i decrementarea.
Așa că am de gând să i decrementa din nou.
>> Deci, acum, un alt util Comanda este Print.
Deci, de imprimare este de gând să imprima valoarea variabilei.
Să aducem la valoarea i de variabile.
Să i imprima.
O să spun că am este 11.
Acum ne-am următoare din nou în timp ce i este mai mare de 10.
Deci, i este încă mai mare decât 10, din moment ce este 11.
i minus minus.
Să i imprima din nou.
Cum era de asteptat, e 10.
>> Deci, acum, următorul.
Se va întoarce la starea, i este mai mare de 10, dar i este acum de 10, așa
nu este mai mare de 10, așa că ne așteptăm l să cadă din bucla în timp ce.
Și acum suntem sub această linie de cod.
Și o altă comandă, lista, este doar de gând pentru a afișa Anterioară și următoare
câteva linii de cod, în cazul în care ți-ai pierdut tu.
Așa că ne-am ieșit din această buclă în timp ce, iar acum ne-am intrat în această
în timp ce bucla, linia 18.
Deci, în timp ce eu nu este egal cu 0.
Și, în continuare, i egal i minus 3, și vom observa, aceasta va continua doar merge.
Și putem imprima.
>> Fiecare comandă are un fel de comenzi rapide.
Deci, p este scurt pentru imprimare.
Deci, putem p i.
Doar ține exploatație n, sau continua să faci următoare.
Imprima i din nou.
Veți vedea acum e negativ 167.
Deci, acest lucru va continua la nesfârșit, dar nu într-adevăr pentru totdeauna, din moment ce tocmai ați văzut, ea
se va termina de fapt, la un moment dat.
>> Astfel că este Începând GDB.
Dar hai sa facem un singur lucru în GDB.
Uh, depanare.
Deci, în acest caz particular, bucla infinita sa întâmplat să fie în interiorul
funcția principală.
Și de acum, să accepte doar că am va muta bucla infinita în
funcția de foo.
Doar amintiți-vă că, la sfârșitul acestei programul, ei bine, aceasta a fost inițial
de asteptare foo, care a fost doar O să i imprima.
Dar acum suntem de asteptare foo, care este O să decrementeze i până când este 0, și
apoi imprimați că variabila.
OK.
Salveze.
Face depanare.
Și acum, gdb depanare.
OK.
>> Deci, dacă am alerga, atunci eu nu am de gând să putea să-și intensifice, de fapt prin intermediul meu
programul linie cu linie.
Deci, haideți să rupă de la principal, și apoi tastați alerga.
Deci, du-te prin aceasta, printf, introduceți un întreg, pentru a primi întreg, 13.
Așa că am de gând să păstreze decrementarea până când am este mai mare de 10.
Apoi, vom cădea prin în timp ce bucla, și ajunge la linia de -
haideți să-l deschide într-o fereastră separată.
Așa că am scădea până când nu mai eram mai mare de 10, iar apoi am
numit funcția, foo.
>> Deci, ceea ce sa întâmplat, de îndată ce l-am lovit funcția de foo, ei bine, am sunat foo, și
atunci nu mai aveam control asupra GDB.
Asa ca imediat ce am lovit următoare la această linie, lucruri a continuat până sa întâmplat acest lucru,
în cazul în care programul Ieșirea -
Presupun că nu exista în cele din urmă.
Ai văzut-o pauză pentru un pic, deși.
Deci, de ce am pierdut controlul asupra programul de la acel moment?
Ei bine, când am tip viitor, care merge la literal următoarea linie de cod care
va executa.
Deci, după linia 21, următoarea linie de cod care va executa este linia 22,
care este, care iese din principal.
Așa că nu vreau să merg doar la următoarea linie de cod.
Vreau să merg în funcție, foo, și apoi pas, de asemenea, prin intermediul
aceste linii de cod.
>> Deci, pentru că, avem o alternativă.
Să renunț din nou.
Break principal.
Uh, 1, urmatoarea, urmatoarea, 13, urmatoarea, next, next, cu grijă,
înainte de a lovi linie foo.
OK.
>> Deci, acum, suntem la linia 21, în cazul în care o numim foo.
Noi nu vrem să tastați următorul, din moment ce va apela doar funcția de foo, și
du-te la următoarea linie de cod.
Ceea ce vrem să îl utilizați este pasul.
Deci, există o diferență între Pasul și Next, unde Pasul pași în
funcționeze, și Next merge peste funcția.
Doar execută totalitatea funcția și păstrează merge.
>> Deci, pas este de gând să ne aducă în funcție, foo.
Și vom vedea aici, acum, ne-am întors la această buclă în timp ce este, în teorie,
va continua pentru totdeauna.
Și dacă te-a lovit pas, atunci când nu este chiar o funcție pentru a apela, atunci este
identic cu Next.
Deci, este doar atunci când sunteți la o linie care este de asteptare o funcție care Pasul
este de gând să difere de la Next.
Deci Pasul ne va aduce aici.
Pas, pas, pas, pas, pas, pas, și Vom doar buclă infinită pentru totdeauna.
>> Deci, s-ar putea obisnui cu asta ca dvs. modalitate de a identifica bucle infinite, este
doar deține această tasta Enter pentru a vezi unde te blochezi.
Există modalități mai bune de a face acest lucru, dar de acum, care este perfect suficient.
Și stilistic, să se conformeze Style 50, ar trebui să fi făcut acest lucru.
OK.
>> Deci, ultima comandă pentru a introduce.
Ei bine, hai sa gdb depanare inch
Deci, în loc de rupere în principal, dacă am cunosc funcția foo este, de asemenea,
problema, atunci am putea avea doar a declarat, la pauza foo, în schimb.
Să spun că am rupe la atât în ​​principal și foo.
Astfel încât să puteți stabili cât mai multe puncte de întrerupere , după cum doriți.
Când am tip alerga, va pentru a opri la -
ooh, să recompilați, deoarece Am schimbat lucrurile.
Veți vedea această linie, de avertizare, sursa fișier este mult mai recent decât executabil.
Asta înseamnă că tocmai m-am dus aici și-a schimbat acestea să fie conforme cu stil
50, dar nu am recompila programului.
Deci, GDB mă face să mă conștient de asta.
Voi renunta, face din nou depanare, lovit gdb depanare.
OK.
>> Deci, acum, înapoi la ceea ce făceam.
Break principal, pauză foo.
Acum, dacă am rula programul, asa ca este va continua până când lovește un
breakpoint.
Ca punct de întrerupere se întâmplă la fi primul la principal.
Acum, în loc de a face viitor, next, next, next, next, până când am lovit foo, I
posibilitatea să tastați continua, care va continua până când te-a lovit punctul de întrerupere următor.
Trebuie să introduceți întreg primul.
Continua va continua până când am lovit breakpoint următor, care este faptul că
funcția de foo.
>> Astfel Run va rula până când a lovit un punct de întrerupere, dar să tastați doar alerga, atunci când
începi programul, și apoi, de atunci, e continua.
Dacă tocmai am făcut-o rupe principal și apoi a fugit, se va sparge la
principal, și apoi continuați.
Din moment ce nu am un punct de pauză la foo, intra pe întreg, atunci acum sunt
nu va rupe la foo.
Este doar merge la infinit buclă până în acel.
OK.
>> Așa că e Intro la GDB.
Tu ar trebui să începeți să utilizați-l în seturi de probleme.
Ea poate fi foarte util pentru a identifica bug-uri.
Dacă aveți de fapt doar, linie cu linie, du-te prin codul, și compara ceea ce este
întâmplă de fapt cu ceea ce vă așteptați să se întâmple, atunci e destul de
greu de dor de bug-uri.
OK.
>> Deci, săptămâna trecută, David a adus acest chestii secrete-cheie de criptare pentru
prima dată, în cazul în care nu vrem parolele doar fi stocate pe noastre
calculator în unele fișier text simplu, în cazul în care cineva poate veni peste și doar
deschideți-l în sus și să le citească.
În mod ideal, ar fi criptate într-un fel.
Și în Problema Set 2, veți fi de-a face cu o metodă de criptare,
sau, de asemenea, două metode, dar ele nu sunt atât de mari.
Daca faci ediția hacker, esti De asemenea, va fi de-a face cu
decriptarea unele lucruri.
>> Deci, problema acum este, ei bine, chiar dacă avem cea mai puternica criptare
algoritm în lume, dacă alegeți un parola deosebit de slab, apoi se
nu te va ajuta foarte mult, deoarece oamenii va fi în continuare în măsură să-l dau seama.
Chiar dacă văzând șirul criptate și se pare ca o mizerie de gunoi
care nu înseamnă nimic pentru ei, în cazul în care încă mai trebuie doar să încercați câteva parole
să-l dau seama, atunci Nu sunt foarte sigur.
Astfel încât vizionarea unui film care face ca punct.
>> [VIDEO PLAYBACK]
>> -Casca, ai demon.
Ce se întâmplă?
Ce faci cu fiica mea?
>> -Permiteți-mi să introducă genial chirurg plastic tineri, Dr. Phillip
Schlotkin, cel mai mare nas om de locuri de muncă în întreaga
univers, și Beverly Hills.
>> -Ta Alteță.
>> -Nas de locuri de muncă?
Nu înțeleg.
A avut deja un loc de muncă nas.
A fost un dulce șaisprezece prezent.
>> -No.
Nu e ceea ce crezi.
Este mult, mult mai rău.
Dacă nu-mi dai o combinație a scutul de aer, Dr. Schlotkin va
da fiica înapoi vechea ei nas.
>> -No.
De unde ai luat asta?
>> -În regulă.
Îi voi spune.
Nu, tati.
Nu, nu trebuie.
>> -Ai dreptate, draga mea.
Voi dor de noul nas.
Dar eu nu-l va spune combinație, indiferent de ce.
>> -Foarte bine.
Dr. Schlotkin, face cel mai rău dumneavoastră.
>> -Cu placere.
>> [TOOLS ascuțit]
>> -No.
Așteaptă.
Îi voi spune.
>> -Știam că va funcționa.
Bine.
Da-mi-o.
>> -Combinația este unul.
>> -One.
>> -Two.
>> -Trei.
>> -Patru.
>> -Cinci.
>> -Deci este: unu, doi, trei, patru, cinci.
Asta e cel mai stupid combinația Am auzit vreodată în viața mea.
Asta e genul de lucru un idiot ar avea asupra bagajele sale.
>> -Mulțumesc, Înălțimea Voastră.
>> -Ce ai făcut?
>> -M-am întors de pe perete.
>> -Nu, nu.
Ai oprit tot filmul.
>> -Cred că am apăsat pe butonul greșit.
>> -Ei bine, pune-l din nou pe.
Pune filmul înapoi.
>> -Da, domnule.
Da, d-le.
>> -Să mergem, Arnold.
Vin, Gretchen.
Desigur, știi că voi încă Trebuie să te factura pentru asta.
>> [END VIDEO PLAYBACK]
>> ROB BODEN: În regulă.
Deci, acum că suntem deja vorbim despre de securitate în unele moduri, frumos
mic film poster, atât în ​​recent zi, aceste probleme cu ANS
monitorizarea totul.
Ea poate fi dificil să se simtă ca tine au un fel de intimitate în
lume on-line, cu toate că nu am putut spune ai cele mai multe dintre detaliile de PRISM.
Deci, se deplasează dincolo de PRISM, nu vom sa vorbim despre asta, acum
cred despre laptop-ul.
Deci, aici, vreau pentru a comuta la contul meu real,
cu micul meu pinguin.
Deci, am un set de parole, și că parola este ceea ce vreau eu să fie.
>> Dar amintiți-vă că ceea ce am de logare cu, astfel încât acest autentificare
promptă, este un alt program.
E un program care a fost scris de către o persoană.
Și astfel, acea persoană, în cazul în care acestea sunt deosebit de malware, acestea ar putea
au spus, în regulă, așa că, dacă parola că am intra este egal cu meu
parola real, sau este egal la unele parolă specială -
David este minunat sau ceva -
apoi lăsați-le inch
Deci, un programator rău intenționat ar putea avea acces la toate Mac-uri, sau
Ferestre, sau orice altceva.
>> Astfel că nu este de mult un motiv de îngrijorare, deoarece, Vreau să spun, acest lucru este un program de autentificare
care este livrat împreună cu OS X, sute sau mii de oameni au
revizuite acest cod.
Și astfel, în cazul în care, în codul de undeva, te spune dacă acest șir este egal la egal la egal
David este minunat, autentificare, atunci cineva va fi, cum ar fi, așteaptă.
Acest lucru nu este corect.
Acest lucru nu ar trebui să fie aici.
Deci, asta e un fel avem lucrurile pentru a fi un fel de sigure.
>> Dar cred că despre programe, chiar pe care le scrie.
Să presupunem că ați scris programul de conectare.
Deci, acest program de autentificare pe care le-ai scris, atât de evident, esti un bun
programator.
Nu sunteți de gând să pună orice malware dacă x este egal cu egal David este minunat
în codul.
Dar acest program, ceea ce nu-i folosi pentru a compila acest program?
Ceva de genul răsune.
Deci, ceea ce în cazul în care persoana care a avut loc la Trimite răsune special casetat în răsune
ceva de genul, dacă eu sunt compilarea Programul de conectare, apoi introduceți codul
în programul de conectare care spune că, în cazul în care x este egal cu egal David este minunat?
Deci, nu destul de încă, dar avem aceeași emite aici, unde răsune, ei bine,
mii, dacă nu zeci de mii de oameni, s-au uitat la răsune, au
sa uitat la liniile sale de cod și a spus, bine, nu e nimic rau aici.
Evident, nimeni nu este de a face nimic acest malware.
>> Dar ceea ce este zăngănit în sine, cum ar fi, ce dacă am compila răsune?
Ce se întâmplă dacă am ceva compilator care compilează răsune care introduce în răsune
acest hack special care spune, bine, atunci când am compila răsune, apoi
executabil I a lua ar trebui să arate special în interiorul a programului de conectare și inserția
această parolă, egal la egal la egal Dave este minunat?
Deci, amintiți-vă că dvs. compilator în sine necesar să se elaboreze la un moment dat.
Deci, dacă ceea ce alegi pentru a compila răsune cu, în sine este rău intenționat, atunci
ar putea fi înșurubată în ansamblu fel pe linie.
>> Deci, aici, avem Ken Thompson și Dennis Ritchie.
Deci aceasta este o fotografie iconic.
Dennis Ritchie este pe dreapta.
El este un mare -
destul de mult scris C. Astfel, puteți îi mulțumesc pentru această clasă.
Ken Thomson este pe stânga.
Doi dintre ei, practic, a scris UNIX.
Ei bine, ei au fost o contributie majora în UNIX.
Au fost altele.
Deci Ken Thompson, la un moment dat, el câștigă Premiul Turing.
Și premiul Turing, am auzit mereu se face referire în acest fel, că este vorba de
Premiul Nobel de informatică.
>> Deci, la Premiul Turing, el trebuie să da discursul său de acceptare.
Și el dă acest discurs foarte celebru acum, numit Reflecții asupra Încrederea
Trust, care ne-au legat la pe site-ul curs.
Și în acest discurs, spune el, bine, așa că am scris UNIX, și acum toate
ce oamenii folosesc UNIX.
Acum, amintiți-vă astăzi că Linux este un descendent direct al UNIX.
OS X foloseste direct UNIX.
Windows nu are atât de mult, dar o mulțime de idei au fost luate de la UNIX.
>> Deci, el merge până la scenă și spune, bine, am scris UNIX.
Și așa voi știți, eu sunt capabil să se conecteze la fiecare
unul singur dintre computere.
Din moment ce am pus una dintre acestea special dacă x egal este egal cu Ken Thomson este minunat,
atunci am dreptul să se autentifice.
Deci, oamenii sunt ca, ei bine, Cum ai făcut asta?
Ne-am uitat la programul de conectare și nu e nimic acolo.
E ca, ei bine, am modificat compilatorul pentru a intra în programul de autentificare
astfel încât programul autentificare acum va avea care x este egal este egal cu Ken Thompson
este minunat.
>> Și spun ei, ei bine, asta nu e adevărat.
Ne uitam la compilator, și compilator nu are linii de
cod de genul asta.
E ca și cum, OK, dar ce ești tu compilarea compilatorul cu?
Și ei cred că, și el e, cum ar fi, ei bine, Eu sunt cel care ți-a dat compilatorul
pe care îl utilizați pentru a compila compilator, așa compilați un compilator, care
în sine este rău intenționat, și va întrerupe programul de conectare.
Deci, practic, la acel moment, nu există nici o modalitate de ai putea privi la sursa
cod a programului de conectare pentru a vedea ceea ce este greșit.
Nici nu putea privi în codul sursă al compilatorului
pentru a vedea ceea ce este greșit.
>> Tu ar trebui să se uite la mașină cod, binar efectivă a
compilator compilate pentru a vedea, așteptați, acestea de linii de cod nu ar trebui să fie aici.
Dar Ken Thompson a luat-o cu un pas mai departe și a zis, bine, există
aceste programe speciale, care de fapt vă ajuta să citiți binar de programe,
și deci, dacă cineva a folosit acest program pentru a citi binar, ei ar vedea aceste
de linii de cod.
El a modificat aceste programe de spus, toate Bine, dacă te uiți la
compilator, nu arată acest lucru special set de binare.
>> Deci, atunci trebuie să luați ca un pas în continuare și, practic, care ar putea avea
nivele multiple luate de indirectare, și la un moment dat, nimeni nu e de fapt
O să fie de verificare.
Deci, morala poveștii este, esti nu va fi scris
Zăngănit în această clasă.
Ai de gând să fie folosind alpinism Zăngănit foarte mult în această clasă.
Pentru toate știți, răsune este un rău intenționat program care este sabotat fiecare
singur program care le-ați compilat vreodată.
Și să te las pe care foarte rău augur nota, veți vedea miercuri.
>> [Aplauze]
>> SPEAKER 2: La CS50 următor.
>> SPEAKER 3: Să nu îndrăznești să spui asta.
Puteți face acest lucru.
Ai mai făcut asta înainte, puteți face acest lucru azi, puteți face acest lucru mâine.
Ați făcut acest lucru de ani de zile.
Du-te acolo și de a face acest lucru.
Puteți face acest lucru.
>> [Redare a muzicii]