>> JASON Hirschhorn: Bine ați venit la A5, toată lumea.
Avem o săptămână interesantă în fața noastră, mai ales pentru că există atât de multe noi
se confruntă în această cameră.
E minunat.
O mulțime dintre voi sunt aici de accident, care este chiar mai bine.
Deci, sperăm că veți continua cu noi.
>> În această săptămână am de gând să-și petreacă cea mai mare parte a secțiunii
pregătirea pentru testul.
Deci, pe agenda noastră, vom vorbi un pic despre resurse pentru clasa,
dar și pentru testul, iar apoi, din nou, petrece cea mai mare parte de clasa a vorbi
despre întrebări.
După ce am terminat răspunde dvs. întrebări, sau în cazul în care întrebările dumneavoastră
în mod natural ne duce la unele de codificare, am au probleme de probă de la examene
pe care le vom cod direct în secțiunea împreună, care, de asemenea, aduce un alt
Subiecte bune pentru a acoperi.
>> Deci, în primul rând, așa cum am trecut prin pentru ultimii doi de săptămâni pentru a vă reaminti
băieți, există o tona de resurse disponibilă pentru acest curs.
Mulți dintre ei vor fi incredibil de util pentru tine, ca veți continua să
studia pentru test 0, deoarece e marți după-amiază.
Deci, tot de ce au fost studia pentru un pic.
>> Există note de curs și sursă cod pe care ar trebui să
verificați cu siguranta.
Uita-te la pantaloni scurți.
Check out study.cs50.net.
Apoi, mai jos, un număr de alte resurse.
>> Din nou, testul 0 este ziua de mâine la ora 01.
Dacă nu ați făcut-o deja, verificați din Despre Quiz 0 documentul privind
pagina curs de a da seama în cazul în care sunteți de a lua testul.
Testul începe la 1:10 și 70 minute mai târziu se termină.
Deci, dacă apari după 01:10, sunteți mergi la a lua mai putine ca mai multe minute
mult de 70 pentru a lua testul.
Deci, asigurați-vă că sunteți acolo la timp.
Dacă sunteți un student de extensie sau să aibă alte considerații de testare, aceasta
nu ar putea fi la 01 mâine.
Dar, din nou, verifica Despre Quiz 0 document pentru a asigurați-vă că știți atunci când
sunteți luați testul.
Am scris 75 minute aici.
Cred că e bine, nu 70.
>> Acesta acoperă toate materialele de la o saptamana 0 la curs de săptămâna trecută, miercuri.
Și din nou, pentru acest test, pe care documentului, veți obține o față-verso și 8
1/2 de 11 foaie de hârtie pe care îl obțineți de a folosi ca notițe în timpul testului.
Mulți oameni, dacă nu cei mai mulți oameni, au a constatat că modul cel mai util singur
pentru a studia pentru testul este de a face o foaie de studiu, o
-unul sider, de-al lor.
Deci, uita-te la cele din trecut, dacă le-ați văzut cele din trecut.
Ajunge la prieteni pentru a vedea ce ei pun pe ale lor.
>> Dar mâinile în jos, cel mai bun mod posibil de studiu este de a merge prin tot ceea ce și
Whittle-l în jos la ceea ce ar trebui sau ar trebui să nu aparțin pe foaia de
hârtie, pentru că asta e doar o foarte mod util pentru tine să vă asigurați
te duci prin tot ceea ce și au unele familiaritate cu ea.
Cei mai mulți oameni, vom găsi, chiar dacă ele au foaia de hârtie așezat corect
alături de ei pe testul, nu se transforma la aceasta, pentru că, din nou, că foarte
Procesul de a merge prin intermediul informațiilor a ajutat să-l învețe.
>> Are cineva intrebari despre test 0?
Are toată lumea -
Eu nu am de gând să fac un spectacol de mâini.
Nu face nimic.
Am fost de gând să întreb cine a inceput sa studieze.
Dar nu vreau să-ți facă tot nu ridica mainile.
Așa cum am spus - da, Avi, dă-i drumul.
>> AVI: Ce ar fi un lucru util pentru a pune pe un singur-pager?
>> STUDENT: Asta depinde de tine.
>> JASON Hirschhorn: Ai de a folosi judecata.
Lucruri utile pentru a pune pe un singur-pager, Dacă sunteți confuz despre Big O
rulare de diferite tipuri de căutări și soiuri, a pus că pe acolo într-o
diagramă dandy la îndemână.
În acest fel, în cazul în care vi se va cere ca pe test, nu aveți nevoie pentru a încerca și figura
l sau motiv prin runtime.
Puteți pur și simplu copia jos.
Dacă te uiți la chestionare trecut, o mulțime de ori, nu rulează întrebări de timp.
Astfel că ar fi un exemplu de un bun lucru pentru a pune pe dvs. o-pager.
>> Alte lucruri bune pentru a pune pe, dacă ești confuz cu privire la modul de a declara o
Funcția sau ce diferitele părți ale declarația funcției sunt, scrie
că pe acolo, o versiune generic și apoi, poate, un exemplu.
Dacă sunteți confuz despre indicii, o diagramă de modul în care indicii de lucru este
probabil foarte util.
Dacă sunteți confuz despre recursivitate, un gusta funcție recursive pe acolo
ar putea, de asemenea, se dovedesc a fi foarte util.
Nu ca să vă dau câteva idei?
>> AVI: Ai nevoie pentru a înțelege întregul proces de compilare, cum ar fi
cum că toate lucrările?
>> JASON Hirschhorn: totul care a fost acoperit putea
apar pe testul.
Întrebări -
dar din nou, unele lucruri vor fi ponderate puternic decât altele.
Unele lucruri au venit din nou și din nou în clasă, în
prelegere, și secțiunea.
Alte lucruri care nu au venit care de multe ori.
>> Am vorbit mult despre # include și -L ceva și ceea ce înseamnă, în cele
procesul de compilare.
Am vorbit mult despre GDB, se agață, aceste diferite drapele pe care le folosim atunci când
am compila ceva, și ce make15, de exemplu, într-adevăr
înseamnă și într-adevăr nu.
Noi nu am vorbi la fel de mult despre fiecare pas unic în
procesul de compilare.
Am vorbit încă despre asta.
Deci, este încă ceva care vă ar trebui să fie familiarizat cu.
Dar, din nou, nu vom fi -
lucruri care vin mai des în clasă sunt mult mai susceptibile de a veni mai mult
de multe ori și să fie mai puternic ponderate la testul.
>> Rece.
Orice alte întrebări cu privire la test 0?
>> OK, așa că am pus o listă de subiecte de pe bord.
Am trecut prin programa.
M-am dus prin intermediul sectiunii de revizuire de la noaptea trecută și aceste slide-uri pentru a veni
cu o listă neexhaustivă de subiecte pe care le-am acoperit până acum în CS50
și lucruri care s-ar putea apar pe testul.
Deci, eu nu am de gând să treacă prin fiecare in parte dintre acestea.
Care ar lua mult mai mult timp decât avem acum.
Dar am pus asta aici pentru a sperăm jog memorie ca la lucruri care pot
sau nu poate fi la fel de familiar cu tine.
>> Și mi-ar plăcea să-și petreacă cea mai mare parte a secțiune răspunde la întrebările dumneavoastră despre
aceste subiecte, subiecte care nu sunt acoperite aici.
Putem scrie cod pseudo.
Putem scrie cod reale pentru a vă asigura că -
Nu pot răspunde la întrebarea dumneavoastră și de a ajuta toată lumea să înțeleagă în mod fundamental un
Multe dintre aceste subiecte, astfel încât veți simți pregătite și confortabilă a intra în
testul de mâine.
Deci, citiți pe lista.
Ai sperăm că ați venit la secțiunea cu câteva întrebări la fel de bine.
Când sunteți gata, să ridice mâna și vom începe.
>> Păstrați în minte, întrebările pe care le au, nu există întrebări stupide.
Am auzit că o mulțime.
Și întrebările pe care le au, eu sunt dispus pentru a paria, multe alte persoane, atât
stau aici și vizionarea online, la fel de bine.
Astfel încât să puteți ajuta doar oameni punând întrebări.
Marcus.
>> MARCUS: Între stivă și morman, există o pre-alocate
procentul de memorie care este definit ca acest lucru este pentru stiva sau pentru grămada?
Sau cum funcționează asta, mai exact?
>> JASON Hirschhorn: Marea întrebare.
Am de gând să urmări înapoi un pic.
Are toată lumea -
vă rugăm să fie cinstit aici.
Știu că vă cer să ridice dvs. mână în fața colegii dumneavoastră.
Dar sunt acolo oameni care se simt inconfortabil cu stiva si heap
și-ar dori pentru a trece peste asta și ceea ce înseamnă acestea?
Ridică mâna dacă -
OK.
Mulțumesc.
Așa că am de gând să meargă peste stiva și heap foarte repede și apoi
se mute în a răspunde la întrebarea dumneavoastră.
>> Deci, dacă am scoate-o cutie pentru a reprezenta memorie de pe computerul dumneavoastră, ce sunt unele
lucruri care merg în această casetă?
Principal.
O funcție principală.
În cazul în care se merge principal?
>> STUDENT: [inaudibil].
>> JASON Hirschhorn: Deci, vom pune principal aici.
Ce altceva merge în cutia asta?
>> STUDENT: Funcțiile pe care le numesc.
>> JASON Hirschhorn: Funcțiile pe care o numim.
Și unde se duc?
>> STUDENT: In stiva.
>> JASON Hirschhorn: Ei du-te în stivă.
Așa că am de gând să numim această lucru aici stivei.
Și până sus, avem grămadă.
Deci, memoria nu este o cutie ca asta.
Dar este de fapt destul de similare.
O să fie o mulțime de cutii de peste și peste, în funcție de cât de mare dvs.
calculator este sau cât de mare de memorie este.
>> La citat-citatul "de jos" este stiva.
Și acolo sunt multe lucruri care merge pe stiva.
Și cei care depind de funcțiile aveți în codul dumneavoastră.
Veți avea întotdeauna o funcție în ta cod numit principal, astfel încât există întotdeauna o
secțiune aici în stiva dedicat principal.
>> Aceste secțiuni din stivă sunt numite cadre stiva.
Atunci când apelați o altă funcție, spune principal solicită o funcție de căutare binară,
am pus un alt cadru pe stiva.
Mai exact, vom dona o parte din memorie pe noastre
calculator pentru a stoca binar de căutare a lui locală variabile și pentru a rula binar
cod căutare.
>> Deci, noi numim binar de căutare.
În această bucată de memorie, vom pentru a stoca variabilele sale locale.
Vom stoca apelurile sale printf.
Indiferent ce se întâmplă, că funcția este vor fi stocate acolo.
Binar de căutare se va executa.
Se va finaliza execuție.
Ce este cuvântul în C, care semnifică că o funcție ar trebui să
finalizeze executarea ei?
>> STUDENT: Return.
>> JASON Hirschhorn: Înapoi.
Deci, ori de câte ori veți vedea o declarație de întoarcere, capetele funcționale
atunci când hit-uri ca.
De căutare, astfel binar va lovi returnarea acestuia.
Această parte din memorie va fi, în esență, să fie eliberat.
Și principal va reveni la execuție.
Astfel principal va întrerupe ori de câte ori a fost, de apel binar de căutare, pentru a primi o valoare de retur,
și continua execuția.
Acest cadru stivă va merge departe.
>> Dacă numim o functie recursiv, care este o funcție care se numește peste
și peste, am putea ajunge - spune noi a făcut căutare binar recursiv.
S-ar putea obține binar de căutare versiune unul, binar de căutare doi, căutare binară
trei, patru de căutare binară, căutare binar cinci.
Și apoi această căutare binară finală cinci va lovi cazul de bază, și stiva
rame va merge înapoi și să păstreze închidere până când vom ajunge înapoi la principal.
Putem trece peste recursivitate într-un pic.
Dar toate acestea este de a spune, daca esti de asteptare mai multe funcții la un moment dat,
nu va mai fi stiva multiple cadre pe stivă.
>> Heap, pe de altă parte, până aici, nu este pentru funcții,
nu pentru variabile locale.
Este pentru alocate dinamic variabile.
Deci acestea sunt variabile care pot fi inițializată fie principal sau un
funcționeze că apelurile principale.
Oriunde în codul dvs., ele poate fi inițializat.
Și pentru a inițializa o dinamic variabilă alocate.
Ce funcție în C nu folosim?
>> STUDENT: malloc.
>> JASON Hirschhorn: malloc.
Ai sunat malloc.
Ai un spațiu de memorie.
Și ca spațiu de memorie este pe heap.
Și ca spațiu de memorie rămâne acolo până te sun gratuit.
>> Variabile astfel alocate dinamic în heap va exista atâta timp cât
ca ei să existe, iar ei nu vor du-te departe, până când în mod explicit
spune-le să plece.
Aveți posibilitatea să le creați într-o singură funcție.
Stiva ca funcția de cadru se va merge departe.
Dar care variabila va exista în continuare în grămada până când este eliberat,
potențial de funcția pe care o numește binar de căutare sau orice altceva.
>> Deci, acele variabile morman sta acolo pentru atâta timp cât doriți
le să rămână acolo.
Și ei se pune aici.
Și apoi următorul este pus acolo.
Ei păstrează obtinerea completat, și-au stai acolo până te sun gratuit.
>> Și, în esență, heap si stiva, obtinerea de la întrebarea lui Marcus,
crește față de celălalt.
Și dacă se execută într-un altul, care le-ați folosit toate memoria dvs.
calculator, iar programul va renunta pentru că nu aveți nici mai mult de memorie
lăsat să utilizeze.
Intre ele, există eventual alte lucruri.
Dar pentru domeniul de aplicare al acestui curs, tu nu trebuie să vă faceți griji despre asta.
>> Astfel că a fost răspunsul la întrebarea dumneavoastră.
Nu vă faceți griji.
Dar asta a fost raspunsul lung.
Tot ce trebuie să știți este heap si stiva va fi -
se pornește de la partea de jos.
Stiva face.
Heap e acolo.
Ei vor crește mai aproape unul de altul.
>> Și dacă ei atinge, care este o problemă.
Ai fugit din memorie.
Dar, de asemenea, în plus față de a ști unde ele sunt, ceea ce este stocat în ambele
stivă și grămadă.
Curtis.
>> CURTIS: Când se ciocnesc, este că un stack overflow?
>> JASON Hirschhorn: Când se ciocnesc, asta nu e un stack overflow.
Un stack overflow este un domeniu diferit că putem trece peste, dacă doriți să.
OK, ne vom întoarce la care într-un pic.
>> STUDENT: Care e cuvântul numit atunci când au lovit reciproc,
stiva si heap?
>> JASON Hirschhorn: Pentru moment, nu vă faceți griji cu privire la.
Doar știu -
Voi răspunde la această întrebare după clasă.
În cazul în care rula în fiecare altele, ai fugit afară de memorie, pentru că nu există mai mult
spațiu acolo.
>> STUDENT: Îmi pare rău, ceea ce este un defect SEG?
>> JASON Hirschhorn: Un segment vina poate fi numit pentru -
aceasta depinde de ce numit vina SEG lui.
Uneori, overflow stack-ul, acesta va spune vina seg ca eroarea.
>> STUDENT: Ce despre dereferencing o variabilă nul?
Este că un defect SEG?
>> JASON Hirschhorn: dereferencing un pointer nul -
OK, deci, dacă aveți un pointer care vă egală cu null, indicii, rechemare,
adrese de memorie magazin ca valorile lor.
Și un pointer nul este, în esență, stocarea 0, 0-lea
aborda în care variabila.
Deci 0x, 0, 0, 0, 0, etc.
Că adresa 0-lea în memorie care nu este în imaginea noastră, că e acolo sus
undeva, care este rezervat pentru calculator.
Nu avem voie să-l atingă.
>> Deci, atunci când programul este de executare, în cazul în care ceva este încercarea de a merge la memorie
adresa 0, se știe că care este o valoare goală.
Acesta nu știe nimic ar trebui să fie acolo.
Deci, dacă încercați și de a folosi ceva acolo și trata ceva de genul acolo sau
încercarea de a merge la acea locație, ai gând pentru a obține un defect segmentul sau o eroare.
Asta răspunde la întrebarea dvs.?
>> Și acum ne întoarcem de a stiva de preaplin.
Lucruri în stivă, ca voi avea văzut mai înainte, în - să elaboreze o strânsă
dintr-un cadru de stivă.
Se poate vedea că toată lumea?
Deci avem cadru nostru stivă.
Suntem economisire o matrice într-un local, variabilă în această funcție.
Deci, spune gama noastră are cinci puncte.
Toate cele cinci dintre acestea vor fi stocate în acest cadru stivă.
>> Dacă vom începe scris dincolo de limitele de această matrice -
așa că, dacă vom începe să scrie în, să spunem că este 0.
Acestea sunt cele cinci indicii din gama noastră.
Dacă vom începe scris în index 5, care nu avem atunci când avem o
matrice de dimensiune 5, vom începe să scrie în index 6, 7, 8, 9, putem obține o stiva
Eroare de depășire.
>> În general, nu este -
vei primi, probabil, în necazuri dacă te duci pe de o.
Dar, în general, va intra în cele mai multe probleme dacă te duci pe de o mult
și te duci până în prezent peste pe care le scrie pe adresa de returnare de care
funcție, care se află la partea de jos a cadrului stivă.
>> Pentru că, nu?
Vă - în - Îmi pare rău.
Nu ", pentru că trebuie."
>> În cadrul stivă, aveți variabile locale.
Chiar la baza stivei cadru este adresa expeditorului.
Asta în cazul în funcția merge, atunci când sa terminat.
Și dacă suprascrie că întoarcerea adresa, atunci când acest cadru stivă,
atunci când te duci prin stivă cadru și executarea fiecare linie, esti
de gând să meargă la noua adresă de retur că este scris acolo în loc de
unul real.
Și asta este modul în care ne-am văzut unor breșe de securitate
se poate întâmpla cu calculatoare.
>> Overflow atât de stack, în scurt, este atunci când vă suprascrie partea din stivă
ce ar trebui să utilizați, la nivel local variabile ce ar trebui să utilizați, și
în special atunci când începe suprascrierea lucruri importante cum ar fi
reveni adresa.
Și asta e în cazul în care veți obține o eroare.
Sau poate chiar ai putea începe chiar și în scris -
spune binar de căutare a fost chiar deasupra principal.
Dacă ați suprascris mult, te ar putea scrie în principal.
Dar, în general, veți obține o eroare înainte apoi, deoarece computerul știe
faci ceva ce nu ar trebui să facă.
Da.
>> STUDENT: Care este diferența între un stack overflow
și un buffer overflow?
>> JASON Hirschhorn: Buffer overflow este un tip mai general de
ceea ce tocmai am descris.
>> STUDENT: Deci un stack overflow este un exemplu de buffer overflow.
>> JASON Hirschhorn: Exact.
Aceasta este o matrice ne putem gândi ca un tampon, un spațiu de lucruri pentru a merge inch
Acesta este un buffer overflow stack.
Am putea avea un buffer overflow grămadă.
Dacă a existat un tampon, care au adesea este o matrice heap, și ne-am
suprascris aceste limite, atunci ne-ar au un buffer overflow grămadă.
>> Și dincolo de sfera de aplicare a acestui curs, acestea sunt detectate un pic diferit.
Compilatorul are special mijloacele de detectare fiecare.
Dar un buffer overflow este o mai generic tip de ceea ce am descris,
care a fost un buffer overflow stack.
Ai că răspunde la întrebarea dvs.?
Dulce.
>> Au fost acolo orice alte întrebări legate de la stiva sau grămada?
Da.
>> STUDENT: Știu că trebuie să siruri de caractere libere deoarece acestea sunt în grămada
și nu doriți să scurgeri de memorie.
Dar nu trebuie să elibereze variabile globale și chestii de genul asta?
Sau sunt eliberați în mod automat?
>> JASON Hirschhorn: Bună întrebare.
Deci, în CS50.H, vom crea acest lucru pentru ai sunat un șir.
Un șir este într-adevăr ceea ce?
>> STUDENT: Char stele.
>> JASON Hirschhorn: O stea char, un pointer la un personaj, un pointer la
o serie de caractere.
Asta e ceea ce șirul este.
Deci, avem nevoie să-l elibereze, pentru că getstring, pe care am folosit-o foarte mult -
Numele string egal getstring -
care mallocs pentru noi, unele de memorie de pe morman și apoi returnează un pointer la
primul caracter de care șir, o stea char.
>> Deci, aparent, dacă nu au fost scris gratuit pe oricare dintre siruri de caractere
pe care le-ați chemat până acum, aveți a fost scurgeri de unele de memorie.
Desigur, nu am vorbit despre ea, așa că nimeni nu a ajuns în
probleme pentru a face aceasta.
Dar merge mai departe, da.
Când apelați getstring, esti mallocing spațiu pe heap.
Și dacă nu suna gratuit mai târziu că șir, aveți o scurgere de memorie.
Care răspunde la întrebarea dvs.?
>> Da
>> STUDENT: Deci, pentru a face acest lucru, nu vom folosi dreptul de liberă înainte de revenirea?
Ca, în domeniul de aplicare a, cred că în cazul în care spunem, cum ar fi, int principal, în cadrul
domeniul de aplicare a codului care este în cele acolade, chiar înainte de a -
stii unde te-ai de obicei, pune întoarcere.
Nu te pune gratuit înainte de asta?
>> JASON Hirschhorn: Deci, vă puteți pune gratuit ori de câte ori doriți să puneți gratuit.
Deoarece acestea sunt alocate dinamic variabile, deoarece acestea pot
trăi dincolo de sfera de aplicare a unei anumite funcție, dacă te sun malloc într-un
funcție separată, de exemplu, getstring, puteți apela gratuit în principal.
Nu aveți nevoie să-l numim în funcție specifică
unde malloc este numit.
Dar tu nu trebuie să-i spunem înainte de a se întoarce principale.
>> Și într-adevăr depinde.
Aceasta depinde de ce malloced că spațiu în primul rând.
Unii oameni vor apela elibera destul de repede.
Unii oameni nu vor suna gratuit până sfârșitul programului lor.
Și ei vor merge prin și gratuit totul.
Aceasta depinde de ce ai sunat malloc.
>> STUDENT: Și ce-ai spune dacă te-a sunat utilizare getstring?
Ai spune liber ce?
>> JASON Hirschhorn: Deci, sintaxa pentru gratuit este pur și simplu gratuit, paren deschise, aproape
paren, și numele de indicatorul.
Deci, dacă ați scrie șir de la egal la egal nume getstring, ai pus nume aici.
Acesta este numele de indicatorul.
Și se știe că pentru a elibera memorie.
>> STUDENT: Deci, atunci când se eliberează că memorie, indicatorul încă mai arată în acel loc
în memorie?
Sau este indicatorul de asemenea, golit de adresa pe care o indică.
>> JASON Hirschhorn: Ar trebui să încercăm asta.
Ar trebui să cod care.
Să vină înapoi, atunci când vom ajunge la codificare, și să cod care.
Și dacă doriți să dau seama de răspunsul pentru că, puteți, de asemenea, cod care
între timp.
Dar asta este o întrebare mare.
>> STUDENT: Este posibil să se ceva gratuit prea repede?
Deci, ai nevoie de el pentru programul dvs., și te-a eliberat ca spațiu de memorie?
>> JASON Hirschhorn: Da.
Este posibil, dacă aveți ceva liber și apoi să-l utilizați din nou, veți
a alerga într-o eroare.
Dar asta e pe tine, pentru că te-a eliberat ceva și apoi a numit-o mai târziu.
Astfel că a fost greșeală un programator.
Dar da.
Ai putea scrie asta.
>> Orice mai multe întrebări cu privire la -
Da.
>> STUDENT: Deci, dacă ar trebui să doar liber se, în general, înainte de
Programul se termină, nu înseamnă că, dacă Programul se termină și nu-l elibereze,
care de memorie este încă alocată?
>> JASON Hirschhorn: Dacă programul dvs. se termină și uitați pentru a elibera ceva, atunci
care de memorie a fost alocată de-a lungul durata de viață a programului dumneavoastră.
Când programul se închide complet, care de memorie nu se întâmplă
să rămână acolo pentru totdeauna.
Calculatorul este destul de inteligent să știe că atunci când programul se închide, se
ar trebui să scape de toate de memorie care a fost asociat cu acest program.
>> Cu toate acestea, există instrumente pe care le puteți rula pe un program pentru a detecta dacă, atunci când
programul terminat, ai uitat pentru a elibera memorie.
Și pentru următoarea problemă setat în cazul în care veți fi utilizați malloc și utilizarea
indicii, veți fi difuzate acest programul de program pentru a vedea dacă,
atunci când se întoarce principale, ai avut ceva lucruri care au rămas unfreed.
>> Deci, ei nu sunt de gând să rămână malloced pentru totdeauna în calculatorul dumneavoastră.
Asta ar fi o risipă, deoarece foarte repede, calculatoare
ar alerga afară de memorie.
Dar dacă se execută până la sfârșitul anului dvs. programa și ei nu sunt eliberat și dumneavoastră
Programul iese, asta e încă o problemă că acest instrument va ajuta să le abordeze.
>> STUDENT: E Valgrind?
>> JASON Hirschhorn: E numit Valgrind.
Și veți fi -
>> STUDENT: Dar noi nu trebuie să știe că pentru testul, deși?
Adică, a fost vorbit despre un pic în curs.
>> JASON Hirschhorn: Deci Valgrind este numele de acest instrument.
Știind ceea ce face este suficient pentru testul.
Dar tu nu l-au folosit încă pe dumneavoastră problema stabilit că nu am avut o
set de probleme care sa ocupat în mod explicit cu malloc sau utilizați malloc.
Deci, nu s-au folosit Valgrind încă.
Dar va folosi mai devreme mai degrabă decât mai târziu.
>> STUDENT: Poți să repeți ce Valgrind este?
>> JASON Hirschhorn: Îmi pare rău?
>> STUDENT: Poți să repeți ceea ce scopul Valgring este?
>> JASON Hirschhorn: Valgrind este numele -
ca GDB vă ajută să depanare programul tău, Valgrind ajută să îți dai seama dacă
lucrurile nu au fost eliberați atunci când programul se închide.
Deci, veți rula pe program.
Și programul iese, și-l voi spune program numit malloc această multe
ori pentru această multe bytes, și tu numai numit liber asta de multe ori.
Și așa a lăsat aceste multe bytes fără a fi eliberat.
Sau se va spune care le-ați eliberat totul.
Bună treabă.
>> STUDENT: OK.
Și se numește Valgring?
>> JASON Hirschhorn: V-A-L-G-R-I-N-D.
>> STUDENT: O întrebare despre indicii.
Deci, spune n ați stea x este egal cu ceva.
Care este egală, indiferent de ce pui acolo, este că ceea ce se pune în interiorul
ceea ce x este îndreptat la, sau indicatorul de x?
>> JASON Hirschhorn: Poți repet întrebarea?
Putem să-l trage în timp ce o spui?
>> STUDENT: În testul, de fapt, una pe care ne-a trimis, a fost ca, char
adevăr stele este egal cu pietre CS50, corect?
Asta înseamnă că că roci CS50 este ceea ce adevărul este îndreptat la?
>> JASON Hirschhorn: Deci vorbești despre o stea char într-un șir, cum
care funcționează?
Da.
OK.
Să trage această aici.
>> [SIDE CONVERSAȚII]
>> JASON Hirschhorn: Deci, această variabilă va fi de tip char stele.
Cât de mare este o variabilă de stele de tip char?
Cât de multe bytes?
>> STUDENȚII: Patru.
>> JASON Hirschhorn: E patru bytes.
Cât de multe drepturi este o variabilă de stele de tip int?
>> STUDENȚII: Patru.
>> JASON Hirschhorn: Patru bytes.
Dacă este un pointer, atunci este întotdeauna patru bytes, deoarece indicii, lor
Valoarea este o adresă de memorie.
Și adrese de memorie pe CS50 aparat sunt patru bytes.
Așa că atunci când ne numim getstring, sau atunci când să zicem, stringname egal, și apoi în
ghilimele duble pus un șir de caractere, punem -
bine, că este un pic diferit.
Vom face getString ca exemplu.
Sau ceva stea char este egal cu șirul.
Ne pare rău, da-mi un exemplu că ai citit?
>> STUDENT: adevărul stea char egal "roci CS50" în ghilimele.
>> JASON Hirschhorn: Deci această stea, această vom numi această variabilă x de nostru
scopuri generice.
Am creat o variabilă numită x.
Este de tip char stele.
Acesta este un pointer la o serie de caractere.
Deci, aici -
>> Deci, acesta este modul în care aceasta ar fi lucrează în memorie.
Acest lucru ar stoca o adresă de memorie.
S-ar stoca adresa de memorie a primul caracter din matrice.
Și atunci când te-a urmărit indicatorul, v-ar
obține primul caracter.
>> Și dacă sunteți de lectură acest lucru ca un șir, computerul este inteligent
suficient să se știe, citi toată chestia asta până când se ajunge la o reacție 0.
Dar dacă sunteți de lectură un caracter la un timp, așa că te iterarea prin
acest șir, atunci veti citi doar o caracter la un moment dat până când veți ajunge la
backslash 0.
Că nu s-ar putea răspunde la dumneavoastră întrebare, totuși.
>> STUDENT: Da, dar nu ai malloced acel spațiu
dar pentru că pointer.
>> JASON Hirschhorn: Deci, eu nu sunt destul de sigur exact ceea ce căutați la,
pentru că nu am face acest test.
Care trebuia să fie un ajutor resurse de la un alt TF.
Dacă creați un șir pe stiva sau ca o variabilă locală, va
fi la fel de matrice de taxe, mai degrabă decât în general, o stea caracter ce indică spre
un alt șir.
Dar eu nu știu.
Asta ar putea fi un pointer la un alt șir pe stiva, de asemenea.
Da.
>> STUDENT: Știu că aveți nevoie pentru a aloca memorie în cazul în care indicatorul este
obtinerea declarat în interiorul unei alte funcții.
Ai nevoie pentru a face același lucru în cazul în care este fiind declarat în interiorul principal,
îl utilizați în interiorul principal?
>> JASON Hirschhorn: Deci, da.
Puteți declara un pointer la orice adresă de memorie în memorie.
Acesta poate fi adresa de memorie a unei locală variabilă, deși cele mai multe ori,
oamenii nu declară adrese de memorie pentru variabile locale, deoarece ei merg
departe odată ce funcție returnează, care De aceea, ne-am malloc în general lucrurile.
Dar, da, ai putea declara un pointer într-o altă variabilă locală.
Este pur și simplu, în general, nu se face.
Dar pot arunca o privire la care lucru specific după clasă.
Da.
>> STUDENT: Cred că acest lucru este un fel de ceea ce se cere.
Se pare ciudat să fie inițializarea un pointer nu ca un
adresa, dar ca ceea ce se pare ca o valoare.
Se pare ca CS50 este ceea ce este în interior lucru fiind subliniat și
nu adresa reală, nu?
>> JASON Hirschhorn: Deci asta e nu este cazul, totuși.
Asta nu e ceea ce se întâmplă.
Când declara o stea char, este o adresă de memorie.
Indicii sunt toate adresele de memorie arătând spre altceva.
Că altceva ar putea fi pe stack, dar aproape întotdeauna este pe
morman în modul în care vom vedea folosit.
Dar stringname este egal cu dublu-citat "GetString," putem vedea că și noi
pot uita prin care și codul de asta.
string getString nu este salvat în că variabila, sau oricare ar fi șirul
Numele nu este salvat în care variabilă, nu pentru că așa
indicii de lucru.
Asta face sens?
>> STUDENT: Da.
>> JASON Hirschhorn: OK.
Sperăm, că nu a fost confuz pentru oricine.
Dar dacă ar fi fost, ne putem uita la ea din nou într-un pic, pentru că suntem de fapt merge
pentru a coda ceva care va sperăm de lucru cu siruri de caractere și de a ajuta sa te simti
mai confortabil cu ei.
>> Orice alte întrebări legate de aceste subiecte sau alte subiecte care
Voi pune înapoi?
Și -
chiar acum.
Da, Alden.
>> ALDEN: Deci, acest lucru este complet independent, dar putem pleca peste
foarte repede ceea ce avem nevoie să știm despre diferenta dintre un 32 și
64-bit mașină?
>> JASON Hirschhorn: Da.
Deci, 32 de biți este cât de multe bytes?
>> ALDEN: E patru bytes.
>> JASON Hirschhorn: E patru bytes.
Și 64 de biți este cât de multe bytes?
>> STUDENT: Opt.
>> JASON Hirschhorn: Opt bytes.
Deci, din nou, opt biți este un octet.
Aparatul CS50 este o mașină de 32 de biți.
Deci, adrese de memorie sunt patru bytes.
Există 2 la 32 adrese de memorie.
0 la 2 la 32 minus 1.
Și eu nu sunt pozitive, dar asta e probabil, domeniul de aplicare a ceea ce aveți nevoie pentru a
știu pentru o mașină pe 32 de biți, care memorie adresele sunt, din nou, patru bytes lung,
și care este suma maximă de adrese de memorie.
>> De asemenea, tipuri de date -
acest lucru ar putea fi ceva la fel de bine că e demn de remarcat.
Dimensiunea de un tip de date depinde de aparatul cu care lucrați.
Deci, un caracter, un singur caracter, este modul în care mulți bytes de pe aparat nostru CS50?
Un octet.
Și este de fapt un octet ca bine pe o mașină de 64 de biți.
>> Și cele mai multe tipuri de date sunt același număr de bytes pe ambele masini.
Dar unele tipuri de date vor fi diferite pe ambele masini.
Astfel că ar putea fi, eventual, Singurul lucru pe care trebuie să știți.
>> Dar chiar și asta, cred, este dincolo de limitele -
Sunt aproape sigur, dacă te uiți înapoi la teste vechi, se spune, își asumă pentru
codificare probleme pe care îl utilizați o mașină de 32 de biți.
Dar există, pentru a merge împreună cu faptul că, în cazul în care sunteți interesat, există
tipuri de date, care sunt la fel dimensiune pe toate mașinile.
>> Dacă ați văzut ceva de genul uint32_t, s-ar putea sau ar putea
nu s-au văzut asta.
Acesta este un tip de date.
Care este de a spune, de 32 de biți, indiferent ceea ce mașină este asta.
Deci, atunci când oamenii scriu portabil cod, ei, probabil, nu se va folosi int.
Vor folosi în schimb alte date tipuri pe care le cunosc vor fi la fel
Dimensiunea pe fiecare mașină.
Madhu.
>> MADHU: Am avut o întrebare despre procesul de compilare.
Deci, dacă sunteți scris un program care utilizează o bibliotecă ca CS50 sau ceva
așa, eu știu că biblioteca trebuie sa, la un moment dat, fie
compilat și legat inch
Dar cât de mult de ce se întâmplă în timpul elaborarea programului dumneavoastră?
Ce parte a acestui proces de bibliotecă apare atunci când sunteți
compilarea propriul program?
>> JASON Hirschhorn: Deci, hai sa trecem peste în general, etapele acestui proces.
Scrii fișierul c...
În fișierul c., Tu # include dvs. biblioteci antet, de exemplu, cs50.h.
Ce înseamnă că includ ascuțit linie face pentru programul tău?
Akchar.
>> AKCHAR: Se adaugă prototipurile de funcțiile din antetul
fișierele din bibliotecile.
>> JASON Hirschhorn: Exact.
Se adaugă aceste prototipuri funcționale la codul.
Deci, atunci când codul este compilat în stadii incipiente, compilatorul stie
că există într-adevăr aceste funcții, și că undeva, ele au fost definite.
Fișierele. H nu includ definiții pentru aceste funcții sau cum
ele lucrează efectiv.
Cs50.h include doar ceva care spune că getstring este un lucru real care
se poate întâmpla.
Și standardio.h spune printf este un lucru real, care se poate întâmpla.
>> Header astfel limba c cu asta. fisier este transformat într-o anumită
Codul poate fi citit de mașină, care în cele din urmă devine transformat în binar
cod, 0 și 1 a lui.
Și asta e codul care în cele din urmă este executat.
-L Linia CS50 - de exemplu, atunci când scrii răsune -
și apoi să includeți-l CS50, tastați că inch
Și veți vedea că.
Când scrieți face, veți vedea că linia de sus aici.
Și vom vedea că într-o secundă, atunci când am cod sau mai târziu, când ne-am cod.
>> Dar care-l linie CS50 face ceva un pic diferit decât
# include cs50.h.
Ce înseamnă linie care-l CS50 fac?
Avi?
>> AVI: Vreau să spun că-l leagă biblioteca la funcția
apel, cum ar fi. o fișierele.
>> JASON Hirschhorn: Deci, foarte aproape, dacă nu spot-on.
-L CS50 ia fișierul binar și fuzionează cu fișier binar.
Deci cs50.h, nu exista nici un punct de cotitură în cs50.h de la limbajul C binar fiecare
timp singur este folosit.
Asta ar fi o prostie, pentru că ar deșeuri o mulțime de timp.
Deci, acesta a fost deja întocmit și transformat într-un executabil.
Iar acum urmează să fie îmbinate cu fișierul dvs. de la sfârșitul anului.
Deci, acele de 1 și 0 sunt de gând să fuzioneze cu cei
și 0 de la sfârșitul.
Deci, acum vei avea de fapt real 1 si 0, care definesc modul în care getstring,
de exemplu, de lucrări, sau cum printf, de exemplu, funcționează.
>> Și pentru mai multe informații, există o compilatoare scurte care Nate oferă că
ar trebui să verificați că merge prin acești pași.
Dar -
Da.
>> STUDENT: Sunt mereu la o fișiere. atunci când acestea sunt sub formă de bibliotecă,
gata pentru a fi îmbinate, legate - cum ar fi acestea sunt în codul binar?
>> JASON Hirschhorn: OK.
Ce -
>> STUDENT: Este că întotdeauna cazul pentru bibliotecile când le link-ul?
>> JASON Hirschhorn: Da.
Deci nu e. E fișiere, care vor fi cod mașină, care va fi, de asemenea,
criptic pentru tine.
Nu aveți nevoie să vă faceți griji cu privire la acestea.
Dar, în general, da, ei vor fie în. o fișiere gata de plecare.
>> STUDENT: Deci, atunci când nava a o bibliotecă, te navă doar
. h și o..?
Tu nu sunt livrate c sau. S...
>> JASON Hirschhorn: Deci -
și acest lucru este în acest scurt, precum și, dacă aceste informații pare să vină un
puțin repede.
Dar pe termen scurt pe compilatoare vorbește despre acest lucru, de asemenea.
Când nava o bibliotecă, dacă nava h., fișierul header, cele
prototipuri funcționale, precum și 1 și 0 lui, asta-i tot ce ai nevoie pentru a da.
Nu aveți nevoie pentru a da cum funcție de lucrări, dosarul c...
Deoarece punctul de abstractizare, sau punctul API, punctul în această SPL,
biblioteca portabil Stanford, este pentru tine, nu să vă faceți griji cu privire la modul în care noile
GRect de lucrări, sau cum se misca de lucrări, sau cum se adaugă lucrări.
Tot ce trebuie să știți este că add este o funcție care vă puteți
utiliza, și-l face acest lucru.
Deci, tu chiar nu au nevoie să știe cum este scris în C. Trebuie doar să
stiu, aici sunt funcțiile, ceea ce face, și aici sunt anii 1 și 0
atunci când într-adevăr doriți să le utilizați.
>> Rece.
Orice mai multe întrebări cu privire la compilatoare sau alte subiecte de pe bord?
>> STUDENT: Am o întrebare de punerea în aplicare a funcțiilor recursive.
O întrebare despre recursivitate.
Am avut un sentiment care ar veni.
Deci, haideți să mergem rapid prin recursivitate cu o anumită
exemplu, o funcție factorial.
Pentru ca acest lucru este un exemplu care de multe ori vine sau se utilizează
pentru a ilustra recursivitate.
>> Deci, "4!" este citit ca 4 factorial.
Și ce înseamnă 4 factorial?
Ce face asta?
Cum se calculează 4 factorial?
4 ori de 3 ori de 2 ori 1.
>> Deci, un alt mod de a scrie 4 factorial este de a scrie acest lucru.
4 ori 3 factorial.
Deoarece 3 factorial este 3 ori 2 ori 1.
Deci, de 4 ori 3 factorial este 4 ori de 3 ori de 2 ori 1.
De aceea, este o mare factorial candidat pentru recursivitate, pentru că este
clar că există ceva care se intampla de peste si peste si peste pe o
număr mai mic de lucruri până vă ajunge la final.
Când ajunge la 1, 1 factorial este 1.
Nu puteți merge mult mai departe.
0 factorial este de asemenea definit ca 1.
Deci, atunci când ajunge la 1 sau 0, esti la sfârșitul anului, și puteți
începe să mergi înapoi în sus.
Deci, dacă am vrut să scrie o recursive funcție de calculare a factorială,
am de gând să scrie unele pseudocod pentru asta acum.
Înainte de a ne scrie că pseudocod -
Voi da voi o pereche de minute pentru a scrie codul de pseudo-sau pur și simplu cred
despre ea - sunt două lucruri la fiecare funcției recursive are nevoie.
Care sunt cele două lucruri?
>> JACK: Trebuie să se numească.
>> JASON Hirschhorn: Noah?
Oh, Jack.
Dă-i drumul.
>> JACK: Trebuie să se numească.
>> JASON Hirschhorn: Deci un recursiv Funcția are nevoie de un apel recursiv, o
apel la sine.
Asta-i una.
Și ceea ce este un alt lucru?
>> JACK: Un caz de bază.
>> JASON Hirschhorn: Un caz de bază.
Un caz de bază este, aici, atunci ne oprim.
Deci, funcția este chemat.
Scenariul de bază este pe primul loc.
Vrei să știi dacă ești la sfârșitul anului.
Și dacă nu ești la final, face apel recursiv.
Și te duci prin această funcție din nou, verificați din nou cazul dumneavoastră de bază.
Dacă nu sunteți la sfârșit, voi face un alt apel recursiv,
et cetera, et cetera.
>> De aceea, funcții recursive mereu nevoie de aceste cazuri de bază și cele
apeluri recursive.
Dacă nu aveți un apel recursiv, se nu ar fi o funcție recursivă.
Dacă nu ați avea un caz de bază, v-ar merge pentru totdeauna și
nu ar fi nici sfârșit.
Și cazul de bază vine întotdeauna în primul rând, pentru că veți dori întotdeauna să verificați
daca esti la sfârșitul primei.
Deci, înainte de a face ceva pseudocod, de ce Nu vă luați un minut să se gândească la
cum o funcție recursivă factorial ar fi scris?
>> De asemenea, la fel de multe ca tine fac, scris l pe o foaie de hârtie este
ceea ce ai de gând să trebuie să face pe testul de mâine.
Deci, probabil, o bună practică pentru a face sigur codul scrii
jos de pe foaia de hârtie -
sau poti sa faci asta.
Știi unde sunt punct și virgulă.
Vă amintiți sintaxa.
Pentru că tu nu te fi capabil de a avea o compilator spune că a făcut o eroare.
>> De asemenea, de-a lungul acestor linii, mâine, atunci când ai probleme de codificare, dacă
sunt s-au grabit de timp, sau daca esti foarte confuz cu privire la modul în care ar trebui să
scrie lucru special în c, ea v-ar fi de datoria cuiva să scrie pseudo-cod
sau scrie comentarii in la fel de bine.
Pentru că nu există credit parțial pentru o mulțime de întrebări cu privire la testul.
Deci, s-ar putea să fie grăbit, sau ar putea fi la fel de confuz.
Scrierea în comentarii sau pseudo-cod sunt de multe ori moduri în care
pot obține credit parțial.
>> Deci, nu lăsa ceva gol pe testul.
Nu există sancțiuni pentru a pune lucrurile inch
De fapt, punerea în pseudo-cod sau comentarii va ajuta grederul
dau seama dacă știu de fapt ce vorbești, și poate acorda
te unele de credit parțial pentru asta.
>> De asemenea, de-a lungul acestor linii, scrie clar.
Dacă nu putem într-adevăr ceea ce scrii, noi nu o să te sun
la miezul nopții de mâine pentru a cifră ce ai scris.
Mergem să decoleze de puncte.
Scrie clar astfel încât să putem auzi, sau, mai degrabă, putem citi ceea ce ai scris.
>> Și dacă se spune două propoziții, Nu scrie un paragraf.
Urmați instrucțiunile.
Scrie clar.
Și scrie în aceste comentarii sau pseudocod pentru întrebări care ar putea
premiu credit parțial.
>> OK, hai să mergem la factoriale.
Deci, avem un factorial funcție.
Daca as fi fost să scrie de fapt acest lucru în C, ceea ce am nevoie pentru a pune în fața numelui
a funcției?
Tipul de retur, care, în acest caz, vom da o int.
Și apoi în interiorul acolade, este ceea ce se întâmplă în interiorul acolade pentru
o funcție?
>> STUDENȚI: tip Argument.
>> JASON Hirschhorn: argumentele sale.
Deci, factorial va fi, probabil, ia un argument.
Se va lua, probabil, doar un singur argument.
Și vom spune că va lua un număr întreg numit x.
Și din nou, atunci când scrie prototipul de o funcție sau scrie funcția
în codul dvs. înainte de a defini el, scrie tipul de date și numele de
ca variabilă de numai această funcție.
Astfel încât să puteți trece unele număr în acest funcție, acesta va fi mentionat ca x
pe plan intern.
>> Avem funcția noastră factorial.
Avem nevoie de doua lucruri, un caz de bază și un apel recursiv.
Care este scenariul de bază pentru factorial?
Cineva care a scris-o afară și care nu are vorbit încă, ceea ce este baza
caz pentru factorial?
>> STUDENT: Dacă n este mai puțin decât 2, se întoarcă 1.
>> JASON Hirschhorn: Dacă n este mai puțin de 2, întoarce 1.
Îmi place, pentru că are grijă de 0 și 1.
Deci, vom face x <2, se întoarcă 1.
Dacă vom fi trecut de 0, dacă vom obține a trecut 1, această funcție va
reveni imediat 1.
Dacă vom fi trecut de un numar mai mare mare sau egal cu 2, vom
au apelul nostru recursiv.
>> Și astfel cum este faptul că va merge?
Poate cineva care a lucrat la acest care nu a vorbit încă mi-a dat
apel recursiv pentru această funcție în pseudocod?
Dacă vom fi trecut într-un număr de x și este mai mare de 2, ceea ce
vrem sa facem?
De asemenea, am un exemplu scris pe partea care le-ar putea da un indiciu.
>> STUDENT: Apel de x ori factorial de x minus 1?
>> JASON Hirschhorn: Exact dreapta.
Vom reveni x ori factorialul x minus 1.
Și că, chiar dacă am scris sus, de fapt, ceea ce ați spus în limba engleză,
această funcție factorial vor fi numit din nou.
Se va executa pe x minus 1.
Se va reveni cu unele întreg, și atunci acesta va multiplica aceste două
împreună, iar această valoare va fi a revenit la ceea ce a numit aceasta
funcția factorial, care s-ar putea fi un alt exemplu de
această funcție factorial.
>> Deci, care este un exemplu de recursive funcție, o foarte
funcția recursiv simplu.
Dar cele mai multe dintre ele vor fi ca aceasta.
Dacă doriți un recursiv bun provocare pentru testul, încercați de codificare
căutare binar recursiv.
Pentru că dacă ai făcut-o căutare binară pentru problema stabilit trei, probabil că a făcut-o
iterativ într-o buclă în timp.
>> Dar poate fi, de asemenea, scris recursiv.
Ai de gând să nevoie pentru a scrie propria funcție separată care are unele
diferite argumente în linia de comandă - sau nu argumente în linia de comandă, unele
diferite argumente doar regulate.
Dar ai putea scrie binar de căutare recursiv, de asemenea.
>> STUDENT: Deci, ai putea fi scris, de asemenea, în loc de x minus 1, vă
ar fi scris, de asemenea, x minus minus, sau ai putea avea
scris x minus minus.
Poți să explici foarte repede de ce acestea ar fi lucruri diferite,
ca ceea ce este diferența dintre x minus minus și minus minus x?
>> JASON Hirschhorn: Nu, eu nu sunt de gând să meargă în asta.
Dar voi vorbi cu tine despre asta după clasă. x minus minus, minus minus x
decrement x cu 1.
Dar ei o fac un pic diferit.
Dar nu vreau să intru în asta.
Alte întrebări despre recursivitate sau această funcție?
Asta nu e chiar pseudocod.
Asta e de fapt codul în C-ar scrie pentru acest lucru.
>> OK, orice alte intrebari despre subiecte aici?
Da.
>> STUDENT: Eu am o consultare rapidă a punct și precizie plutitoare.
>> JASON Hirschhorn: Floating punct și precizie.
Poate cineva foarte repede da-mi o trecere in revista a
virgulă mobilă și precizie?
Ai toate au avut de a face acest lucru pentru dvs. problema stabilit, astfel încât ești
familiarizat cu ea.
Sau poate că nu toți.
Oricine?
Dă-mi un loc de început.
Virgulă mobilă și precizie.
Care este problema?
Da.
Victoria?
>> VANESSA: Vanessa.
>> JASON Hirschhorn: Vanessa.
Scuze.
>> VANESSA: Există doar un număr finit de numere care pot fi reprezentate
pentru că sunteți pe un, în nostru caz, un sistem de 32 de biți.
Deci, un fel de trebuie să face niște numere.
>> JASON Hirschhorn: Deci asta e exact dreapta.
Există doar o anumită cantitate de numere care pot fi reprezentate.
Dacă vă înmulțiți două numere foarte mari, s-ar putea îneca suma
spațiilor trebuie să reprezinte un număr întreg.
De aceea, uneori, vom folosi un lung lung în loc de un int.
Care are mai multe spații.
Care poate deține un număr mai mare.
>> Virgulă mobilă de precizie are de a face cu , dar, de asemenea, are de a face cu
fapt ce numere zecimale sunt nu întotdeauna reprezentat.
Scuze.
Lasă-mă să pun asta înapoi.
Numărul zecimal 1.0 nu este întotdeauna reprezentat ca și cum v-ați aștepta,
1.000000000.
Uneori este reprezentat ca 1.000000001 0.999999999 sau.
Ar putea fi chiar 89 aruncat acolo undeva.
Deci, aceste numere zecimale nu sunt reprezentat exact ca tine ar fi
aștepta ca ele să fie reprezentate.
>> Deci, în problema set -
a fost doi? -
problema set de două, în cazul în care ne-am ocupat cu numere în virgulă mobilă, atunci când ne-am dorit
i să reprezinte exact ceea ce ne-am dorit să reprezinte, numărul
de bani, sau numărul de cenți, le multiplica cu 100.
Le-am rotunjit.
Și apoi ne-am tăiat tot în spatele punctul zecimal.
Asta a fost pentru a se asigura că acestea ar fi de fapt, egal exact ceea ce ne-am dorit
le la egal.
>> Pentru că, atunci când ia ceva care este un float și de al transforma într-un int, te
tăiat tot la dreapta din punctul zecimal.
Pentru că există unele în virgulă mobilă imprecizie, 100.000 s-ar putea fi
reprezentat ca 99.999999999.
Și dacă tocmai ați tăiat totul pentru a dreapta imediat, ai de gând să
a obține un număr greșit.
Da.
>> STUDENT: Am avut o întrebare de turnare.
Ce ordine se produce in?
Dacă ai face float, între paranteze, 1 împărțit de 10, nu-l face un împărțit la 10,
apoi obține 0,1, apoi porniți l într-un flotor?
>> JASON Hirschhorn: Dacă nu float 1 împărțit la 10 -
>> STUDENT: Da, si apoi este egal -
bine, aceasta ar fi în mod normal l-au egal în -
Da.
Vrei să-l un flotor face, nu?
>> JASON Hirschhorn: OK, deci vom folosi pentru a segue în imaginind
răspunsurile la aceste întrebări prin codificare.
Pentru că veți avea, probabil, o mulțime de aceste întrebări minute, și o modalitate buna
pentru a le rezolva este prin codificare.
Așa că am de gând să codul de asta acum, și apoi ne vom întoarce și
cod întrebarea ai avut.
>> Deci, prima linie -
N-ar fi trebuit să-l scris - ceea ce este primul lucru pe care vrem să facem atunci când ne-am
deschide un nou dosar în gedit?
>> STUDENT: Includeți.
>> JASON Hirschhorn: Includeți ce?
>> STUDENT: bibliotecă CS50.
>> JASON Hirschhorn: OK.
Ce altceva ar trebui să includă?
Mergem pentru a verifica ceea ce se întâmplă atunci când aruncat ceva la un float.
Dar de ce avem nevoie pentru a include, dacă suntem de gând să scrie un program C?
>> STUDENT: Standard I / O.
>> JASON Hirschhorn: stdio.h.
Noi de fapt nu au nevoie, pentru acest Programul, cs50.h, chiar dacă e
întotdeauna util să-l includă.
Dar avem nevoie mereu stdio.h.
>> STUDENT: Când codificare în C?
>> JASON Hirschhorn: Când codificare în C.
>> Așa că am salvați-l ca acest fișier c...
Am obține unele sintaxa iluminată frumos.
I-am scris gol în interior principal.
Ce înseamnă gol?
>> STUDENT: Nu e nevoie de nici o argumente în linia de comandă.
>> JASON Hirschhorn: mijloace nu apare, în acest caz, principal nu ia nici o
argumente în linia de comandă.
In alte cazuri, aceasta înseamnă funcția nu ia argumente în linia de comandă.
Sau funcția, dacă ar fi să scriu nule main (void), care s-ar spune lui principale
Nu se întoarce nimic.
Astfel nule înseamnă pur și simplu nimic.
Ce scriu, dacă ar fi să ia argumente în linia de comandă?
>> STUDENT: int arc c string arc v.
>> JASON Hirschhorn: int argc șir argv.
Este corect?
>> STUDENT: Este char paranteze argv stele.
>> JASON Hirschhorn: Deci, ai putea scrie paranteze șir argv sau argv stea char
paranteze, dar ai nevoie de paranteze.
Deoarece argv este o matrice de siruri de caractere, amintiți-vă.
Nu este doar un șir.
Deci, string argv este, aici e un șir numit argv.
Paranteze șir argv este, aici e o matrice de siruri de caractere.
Paranteze argc șir argv astfel int ar fi ceva ce am
probabil va scrie.
>> Deci, ai vrut pentru a salva într-un întreg?
>> STUDENT: Da, întreg.
Sau într-un flotor.
>> JASON Hirschhorn: Într-un flotor?
Cum ar fi, float x este egal cu 1 împărțit la 10.
>> JASON Hirschhorn: OK.
Cum pot imprima o pluti în printf?
Ce?
>> STUDENT:% F.
>> JASON Hirschhorn:% F.
Ce este un număr întreg?
d sau i.
Ce este un șir de caractere?
>> STUDENT: s.
>> JASON Hirschhorn: s..
Cum pot obține o nouă linie?
>> STUDENT: Backslash n.
>> JASON Hirschhorn: Ce-mi întoarce în cazul în care principalele rulează corect?
>> STUDENT: 0.
Nu am nevoie pentru a scrie această linie, deși?
>> STUDENT: Nu.
OK, nu se va scrie, apoi.
Poate toata lumea citit asta?
Se pare un pic mic.
Se poate vedea toata lumea, sau ar trebui să Eu fac mai mare?
Cred că pentru aparatul de fotografiat, vom face un pic mai mare, totuși.
>> JASON Hirschhorn: Dacă vreau să transforme acest . C depune într-un executabil, ceea ce
scriu?
>> STUDENT: face testul.
>> JASON Hirschhorn: Îmi pare rău?
>> STUDENT: face testul.
>> JASON Hirschhorn: face testul.
Vorbeam despre această linie mai devreme.
Răsune.
Ce-i zăngănit?
Numele compilatorului.
Ce este această linie?
>> STUDENT: Setează-l pentru a fi utilizate de GDB.
>> JASON Hirschhorn: Seturi -l pentru utilizare de GDB.
Această linie, ce e asta?
>> STUDENT: Codul sursă.
>> JASON Hirschhorn: Asta e fișierul sursă, fișierul c...
Ce fac aceste două linii?
Sau aceste două nu linii.
>> STUDENT: nume îl testeze.
>> JASON Hirschhorn: Deci O liniuță spune, nume ceva diferit.
Și aici tu numindu-l de testare.
Dacă nu am avea asta în, ceea ce ar numi asta?
>> STUDENT: a.out.
>> JASON Hirschhorn: a.out.
Ce face asta?
>> STUDENT: Link-uri biblioteca matematica.
>> JASON Hirschhorn: Este link-uri în biblioteca matematica.
Nu am inclus biblioteca matematica, dar din moment ce este atât de comună, le-am
face în scris pentru a include întotdeauna biblioteca matematica.
Și, de asemenea, aceasta include biblioteca CS50.
>> OK, așa că, dacă am lista, avem acum un executabil numit de testare.
Pentru a se executa, eu scriu de testare.
Văd că punctul meu de plutitor, cum era de așteptat, este egal cu 0.
Asta -
așa -
>> STUDENT: Atunci, dacă ai pus plutesc acum, ca și cum l-ați aruncat la fel de float -
>> JASON Hirschhorn: Distribuție 1 la un flotor?
>> STUDENT: Nu, a aruncat lucru full -
Da.
Dacă tocmai ați făcut-o, ar fi care face 0.1?
>> JASON Hirschhorn: OK, deci foarte repede, 1 împărțit la 10, acestea sunt
numere întregi divizată.
Deci, atunci când împărți numere întregi, ele sunt 0, și sunteți de economisire că 0 într-un
float, pentru că slash este doar divizie întreg.
Deci, acum suntem de cotitură ceva într-un float.
>> Să vedem ce se întâmplă.
Vom face testul.
Deci, acum vedem că slash nu a fost divizare întreg, a fost plutitoare
Punct de divizare.
Deoarece unul dintre argumentele sale a fost aruncat la un float.
Deci, acum se spunea, trata această divizie ca avem de a face cu
puncte plutitoare, nu cu numere întregi.
Și astfel vom obține răspunsul ne așteptăm.
>> Să vedem ce se întâmplă -
oops.
Dacă aș fi vrut să imprimați mai zecimal pete, cum aș putea face asta?
>> STUDENT: Punctul punct F, sau cât mai multe zecimale, după cum doriți.
>> JASON Hirschhorn: Deci, eu imprima 10 locuri zecimale.
Și acum vedem ne apropiem niște chestii ciudate.
Și care merge înapoi la întrebarea dvs. despre virgulă mobilă imprecizie.
Sunt lucruri ciudate stocate aici.
>> OK, nu ca răspuns la întrebarea dvs.?
Ce altceva ai vrea la codul repede?
>> STUDENT: Am vrut doar să văd dacă sau nu, dacă te-a eliberat unele pointer,
dacă acest pointer încă au stocat în o adresa a ceea ce a fost
arătând spre anterior.
>> JASON Hirschhorn: OK, așa că hai să facem asta.
Ptr Char stele, acest lucru creează o variabilă numit ptr de tip char stele.
Cum scriu malloc?
Alden?
>> ALDEN: Doar malloc.
Dar apoi trebuie să fie dimensiunea și în acest caz, cred că te-ai
să fie îndreptată la char.
Deci, ar fi char.
>> JASON Hirschhorn: OK, deci mai mult generic, Inside -
să editați.
În interiorul malloc, vrei numărul de bytes pe heap.
În general, ceea ce am văzut că suntem facem este vom malloc
corzi, de exemplu, sau matrice de numere întregi.
Deci, dacă vrem 10 întregi, sau 10 caractere, 10 ne va da 10.
Și apoi dimensiunea de caractere ar da ne că dimensiunea de caractere, care în
acest caz este de 1 octet.
Avem 10 bytes.
Dacă ar fi să scrie dimensiune de Int, care ne-ar da 40 de bytes.
>> Cu atât mai mult generic, în interiorul de malloc este numarul de bytes pe care doriți.
În acest caz, ne apropiem de 1 octet.
Ceea ce pare a fi o utilizare ciudat de malloc, dar pentru noi
scopuri are sens.
Deci nu e asta.
>> Vom apela gratuit.
Scăpăm de ea și vom folosi din nou ptr.
Și ce-ai vrea să verificați?
>> STUDENT: Am vrut doar pentru a verifica dacă sau nu a existat nimic
în interiorul de ea.
>> JASON Hirschhorn: Deci, dacă ea a subliniat ceva?
>> STUDENT: Da, exact, dacă a avut încă o adresă de memorie.
>> JASON Hirschhorn: Deci, vrei pentru a verifica valoarea PTR?
>> STUDENT: Da, exact.
>> JASON Hirschhorn: Ce scriu aici dacă vreau pentru a verifica valoarea a
punct - ceea ce este, Iordania a declarat, valoarea?
Sau ceea ce este stocat în interiorul ptr?
>> STUDENT: O adresa de memorie.
>> JASON Hirschhorn: O adresa de memorie.
Deci, dacă am scrie doar acest lucru, acesta va da-mi valoarea ptr.
Și cum pot imprima o adresă de memorie?
Care este șirul de format pentru o adresă de memorie?
>> STUDENT: p%.
>> JASON Hirschhorn: p%.
% S este un șir.
% P pentru pointer.
Este corect?
Acesta este dreptul.
Deci ptr egal -
încă mai are ceva în ea.
Aceasta este, probabil, o mai întrebare interesantă.
Ce are asta de linie face?
>> STUDENT: defecte Seg.
>> JASON Hirschhorn: Ce?
>> STUDENT: Cred că SEG defecte.
>> JASON Hirschhorn: Hm?
>> STUDENT: Cred că va SEG vina.
>> JASON Hirschhorn: Deci, această linie de ptr cod, stele, ceea ce
inseamna steaua?
>> STUDENT: Conținutul.
>> JASON Hirschhorn: Da.
Du-te pentru a obține conținutul.
Deci, acest lucru este de gând să meargă în memoria aborda acolo și dă-mi asta.
Am folosit% c chiar aici, pentru că acolo sunt caractere stocate acolo.
Așa că am de gând să merg la care ne-am adresa tocmai am văzut - sau va fi, probabil, un
pic diferit acest timp vom rula programul.
Dar vom merge la acea adresă care știm că încă mai există
și să vedem ce e acolo.
>> Deci, nu a SEG vina.
Pur si simplu nu ne-a dat nimic.
S-ar putea ne-au dat de fapt, ceva, ne-am nu-l vedea.
Și care merge înapoi la această idee -
și noi nu mergi la a lua prea mult în acest lucru, pentru că asta e dincolo de
domeniul de aplicare al acestui curs.
Dar am vorbit despre aici, dacă ne-am a mers dincolo de limitele matricei de
1, nu am putea avea probleme.
>> Uneori, atunci când te duci în afara de 1, faci ceva greșit, și tu
ar putea avea probleme.
Dar nu întotdeauna probleme.
Depinde cât de mult un lucru rău te Nu, ai de gând pentru a obține în necazuri.
Care nu este de a spune, fie desfundat cu codul.
Dar aceasta este de a spune, programul nu va renuntat întotdeauna, chiar dacă te duci undeva
tu nu ar trebui să meargă.
>> Un bun exemplu de care este, o mulțime de oameni în problema lor set 3, care
a fost de 15, nu a verificat limitele de bord.
Deci, te-ai uitat în stânga, sa uitat la dreapta, sa uitat la partea de sus, sa uitat
la partea de jos.
Dar nu ai verifica pentru a vedea dacă în partea de sus a fost de fapt de gând să fie la bord.
Și o mulțime de oameni care au făcut ca și dovedit că în, programul lor a lucrat
perfect, pentru că în cazul în care placa a fost stocate în memorie, dacă te-ai dus-o
de mai sus, sau verificat că memoria adresa, nu a fost nimic
în special oribil despre asta, deci programul nu a fost
O să țip la tine.
>> Dar ne-ar lua tot de pe puncte dacă nu ai verifica că, pentru că
s-au a face ceva ce nu au fost ar trebui să facă, și ai putea avea
ajuns în necaz.
Cote sunt, totuși, probabil că nu.
Deci, acest lucru este de a arăta că, da, putem merge în continuare la ea.
Și nu ne stea în probleme în acest caz.
Dacă am încercat să facem a citi următorii 100 de caractere, ne-am
probabil avea probleme.
Și tu poți cod lectură următoarea 100 caractere, dacă doriți de a face ceva
un fel de pentru buclă.
Da.
>> STUDENT: Din moment ce ne-au fost atribuite care spațiu de o valoare reală, nu ar fi
fi de fapt posibilitatea de a vedea nimic.
Ar trebui să-l încercați cu setarea care egală place c sau ceva?
>> JASON Hirschhorn: Marea întrebare.
Cum pot seta ca valoare -
ce linie de cod scriu pe linie șapte de a face ceea ce ai spus?
>> STUDENT: stele ptr egal singur citat c termina singur citat.
>> JASON Hirschhorn: Deci, care este punerea un personaj, c, la acea locație,
pentru că, din nou, că stele înseamnă du-te la acolo.
Iar atunci când sunt utilizate pe partea stângă a un operator de atribuire, care este egală cu
semn, noi nu vom obține că valoare atât de mult ca și stabilește valoarea.
Acum, să vedem ce se întâmplă.
>> Am pus ceva acolo și a fost acolo.
Am sunat gratuit.
Unele lucruri, probabil, sa întâmplat pe heap.
Deci, nu mai e acolo.
Dar, din nou, nu vei primi probleme pentru a merge acolo.
>> Fac asta în cod pentru a ilustra că o mulțime de aceste
întrebări pe care le au, sunt foarte interesant
răspunde la o mulțime de timp.
Și acestea sunt întrebări foarte bune.
Și le puteți da seama pe cont propriu, dacă, de exemplu,
nu suntem în secțiune.
Da.
>> STUDENT: Pentru că nu trimiteți pointer oriunde, aveți nevoie pentru a
folosi malloc?
>> JASON Hirschhorn: Deci asta merge înapoi la întrebarea inițială.
[? ?]
Este doar o variabilă locală?
Malloc aici nu este convingătoare.
Utilizarea malloc aici nu este că convingătoare pentru că este
doar o variabilă locală.
>> STUDENT: Deci, ai putea face char ptr stele este egal salut?
>> JASON Hirschhorn: Oh.
Așa că am de gând să obțineți acum înapoi la întrebarea inițială.
Cred că nu au fost îndeplinite cu răspunsul meu.
OK?
Ca asta?
>> STUDENT: Da.
Așteaptă.
>> JASON Hirschhorn: Și unde vrei să imprimați?
Deci, vom imprima un șir de genul asta?
>> STUDENT: Interesant.
>> JASON Hirschhorn: Deci, aceasta spune că acest lucru argument are tipul de caracter.
Deci, acest lucru ar trebui să fie un personaj.
>> STUDENT: ia doar primul.
>> JASON Hirschhorn: Deci asta este ceea ce am spus mai înainte.
Cum am spus, nu e stocarea șir în interiorul pointer variabilă.
Este de stocare -
>> STUDENT: Prima valoare șirului.
>> JASON Hirschhorn: Adresa de prima valoare din șir.
Dacă ar fi să imprima aceasta, suntem obtinerea de valoare în interiorul pointer.
Și vom vedea, este, într-adevăr, o adresă de memorie.
>> Asta face sens?
Scuze.
Așteaptă, nu că răspunde dvs. întrebare, deși?
>> STUDENT: Da.
>> JASON Hirschhorn: Această linie de cod este crearea unui șir și apoi un alt
pointer variabilă care este îndreptat pentru că șir, ca matrice.
Da.
>> STUDENT: Deci, dacă ne-am dus-o memorie abordeze în continuare, ne-ar ajunge h?
Le-a fost depozitată ca un șir de caractere?
>> JASON Hirschhorn: Cum ar fi, am făcut -
astfel încât acesta este valoros pentru a face.
Acesta este punctul de aritmetică, pe care voi s-au văzut înainte și ar trebui să fie
relativ confortabil cu.
Acest lucru este asemănător cu scris -
dacă ar fi să scriu această linie de cod, am văzut notație matrice înainte.
Acest lucru ar trebui să ne dea de-a doua valoare în această matrice, h.
>> Dacă am făcut acest lucru, acest lucru ar trebui, de asemenea, da ne-a doua valoare în matrice.
Pentru că nu este de gând să memoria Adresa de primul lucru, dar
adresă de memorie de lucru de un peste.
Și apoi dereferences operatorului stele care pointer.
Și din nou, să vedem.
Ajungem din nou ore.
>> STUDENT: Ce înseamnă exact dereference înseamnă?
>> JASON Hirschhorn: dereference este un cuvânt fantezist pentru a merge la.
Du-te la asta și de a obține ceea ce-i acolo este de a dereference un pointer.
E doar un cuvânt fantezist pentru asta.
>> STUDENT: Dacă ne-am dorit să imprimare întregul șir, am putea
face pointer ampersand?
>> JASON Hirschhorn: OK, suntem O să oprim aici.
Am de gând să se încheie aici.
Ampersand vă oferă adresa unui Locul de amplasare, astfel încât atunci când faci ampersand de
o variabilă, ea vă oferă adresa în cazul în care variabila este stocat.
Pointer ampersand vă va da adresa ptr unde ptr este în memorie.
>> Noi nu vom merge mai departe cu acest exemplu.
Vă puteți da seama aceste lucruri pe cont propriu.
Dar, din nou, acest lucru ar putea fi chiar apropiindu-o bit dincolo de ceea ce trebuie să știți pentru
domeniul de aplicare al acestui termen mediu -
sau acest test, mai degrabă.
Scuze.
>> Am de gând să se mute pe, pentru că mi-ar vrea să facă o problemă de codificare
înainte de ora este de până.
Și vom cod ce cred este mai convingătoare dintre acestea
exemple, atoi.
Deci, aceasta a fost o întrebare pe un test de acum doi ani.
Și l-am avea pe placa aici.
>> Oamenii au fost întrebați cu privire la testul -
ei s-au dat un pic mai mult în tesxt problema, dar am eliminat
text, pentru că nu era necesar pentru scopurile noastre acum.
A fost doar unele de fundal în ceea ce atoi făcut.
Dar știți cu toții și sunt foarte familiarizat cu atoi.
>> Vă sugerez să codul această pe o foaie de hârtie.
De asemenea, vă sugerez să utilizați strategia că am trecut peste
o mulțime în secțiunea noastră.
În primul rând, asigurați-vă că ați înțeles ce atoi lui face.
Desenați o imagine sau a veni cu unele imagine mentală de ea în cap.
Apoi, scrie pseudocod pentru aceasta.
Pe testul, dacă tot ce obține este pseudocod, cel puțin te
pune ceva jos.
Și apoi harta că pseudocod pe C. Dacă aveți un cec în ta
pseudocod, ca verifica dacă ceva este 1, care hărți pe o dacă
starea și așa mai departe.
Și, în sfârșit, cod program în C.
>> Deci, du-te înapoi la atoi și ia cinci minute la codul de acest lucru pe o foaie de
hârtie, care este, probabil, despre cantitatea de timp le-ar lua pe o
test pentru atoi cod.
Cinci până la 15 minute, de cinci până la 12, cinci la 10 minute, este cu privire la suma de
timp ai cheltui pe acest întrebare în testul.
Deci, ia cinci minute acum, te rog.
Și dacă aveți întrebări, ridica mâna și voi veni în jur.
>> [Conversații ADVERSE]
>> JASON Hirschhorn: OK, deci care a fost de cinci minute.
Asta a fost, probabil, cu privire la suma de timp ai cheltui pe care la un test,
poate la sfârșitul scăzut de acel timp.
Vom recapitula într-un pic.
Să ne începe de codificare acest lucru.
Și dacă nu primim tot drumul prin, răspunsurile la aceasta și aceasta
întrebare test sunt disponibile, din nou, Fall 2011 este atunci cand aceasta intrebare
a apărut pe testul.
>> Și a fost în valoare de opt puncte pe testul atunci.
Opt puncte este la limita superioară a în sumă de puncte ceva este în valoare.
Cele mai multe întrebări sunt în intervalul unul până la șase puncte.
Deci, aceasta este o provocare mai întrebare, pentru sigur.
Poate cineva mi-a început?
>> În general, ce-o să vrei să faci cu acest
funcționeze atoi, în mod logic?
Ce vrem să facem?
Așa că am de gând să scrie unele pseudocod.
>> STUDENT: Conversia caractere în numere întregi.
>> JASON Hirschhorn: Conversia caractere în numere întregi.
OK.
Deci, cum de multe caractere suntem Va trebui să treacă prin?
>> STUDENT: Toate acestea.
>> STUDENT: Toate personajele în șir.
>> JASON Hirschhorn: Toate cele de mai caractere în șir.
Deci, dacă am vrut să treacă prin fiecare caracter dintr-un șir de caractere, ceea ce este un lucru
în C, am văzut că a permis ne pentru a trece prin fiecare
caracter dintr-un șir?
>> STUDENȚI: A pentru buclă.
>> JASON Hirschhorn: A pentru buclă.
Așa că am de gând să buclă prin fiecare personaj în s..
>> Atunci ce vom vrei să faci atunci când vom ajunge la un anumit caracter?
Spune-ne obtinerea trecut de 90.
Ne-am 9.
Este un personaj.
Ceea ce vrem să facem cu că personajul 9?
>> STUDENT: Scădeți-o din caracter 0?
>> STUDENT: Adauga 0?
>> JASON Hirschhorn: Scădere se de la caracter 0?
>> STUDENT: Da.
>> JASON Hirschhorn: De ce vrei sa faci asta?
>> STUDENT: [inaudibil]
valoare.
Valoarea sa Int.
>> JASON Hirschhorn: OK, deci vom lua caracter 9, aceasta scade de la
caracter 0 pentru a obține o număr întreg real 9.
Dulce.
Și de unde știi că personajul 9 minus 0 personaj este de 9?
Ce diagramă te-ai uita la?
>> STUDENT: Există logic nouă locuri între 9 și 0.
Sau ai putea uita-te la masa ASCII.
>> JASON Hirschhorn: masă ASCII.
Dar, da, ai dreptate, de asemenea.
Așa că am scade 0.
Deci, acum avem întreg 9.
Și ce vrei să faci cu asta?
Dacă avem 90, este primul număr întreg am, ceea ce vrem să facem?
>> STUDENT: Mi-ar pune într-un întreg temporar matrice, apoi face matematica pentru a
mai târziu să-l facă într-un final.
>> JASON Hirschhorn: OK.
>> STUDENT: Puteți începe de la sfârșitul anului matrice și apoi merge mai departe așa
că de fiecare dată când merge mai departe, îl înmulțește cu 10.
>> JASON Hirschhorn: OK.
Asta sună ca o destul de idee convingătoare.
Putem începe la sfârșitul matrice noastre, și putem folosi strleng.
Putem folosi strleng aici.
Vom lua lungimea șirului noastre.
Pornim de la sfârșitul anului.
Și + primul, ne-am lua ca întreg, și, poate, vom crea ca un
nouă variabilă întreg până sus, unde suntem stocarea totul.
Așa că am bucla prin fiecare caracter în s de la înapoi la față, ne scade 0, și
apoi l-am lua, și în funcție de unde este, l-am multiplica
cu o putere de 10.
Deoarece primul, ceea ce face noi multiplica personajul din dreapta de?
>> STUDENT: 10 la 0.
>> JASON Hirschhorn: 10 la 0.
Ce ne multiplica de-al doilea dreapta caracter de?
>> STUDENT: [inaudibil].
>> JASON Hirschhorn: Ce?
>> STUDENT: 10 la 1.
>> JASON Hirschhorn: 10 la 1.
Caracterul treia din dreapta?
>> STUDENT: 10 la 2.
>> JASON Hirschhorn: 10 la 2.
>> STUDENT: Îmi pare rău, eu nu înțeleg ceea ce facem noi aici.
>> JASON Hirschhorn: OK, Să mergem înapoi, atunci.
Așa că am de gând să obțineți a trecut într-un șir.
Pentru că suntem scris atoi.
Deci, vom fi trecut într-un șir.
Spune-ne obtinerea trecut în șirul 90.
>> Primul lucru pe care am de gând să faceți este să stabiliți o nouă variabilă întreagă care suntem
doar de gând să creeze ca noul nostru întreg.
Asta e ceea ce vom pentru a reveni la final.
Avem nevoie pentru a merge prin fiecare personaj în șirul pentru că ne-am stabilit
de care avem nevoie pentru a atinge fiecare în parte și apoi adăugați-l la noul nostru întreg.
>> Dar nu putem doar să adăugați ca un număr.
Noi nu putem lua doar 9 și se adaugă 9 la întreg nostru.
Aceasta depinde de ceea ce loc ea este în șirul.
Vom avea nevoie pentru a se multiplica acesta de o putere de 10.
Pentru că așa de bază de 10 de lucrări.
>> Așa că am de gând pentru a obține reale caracter, sau întreg real
număr, prin scăderea caracter 0 din caracterul 9 așa cum am făcut cu
scăderea de capital de caractere de la A indiferent de caracterul am avut într-una din
aceste probleme.
Asa ca vom lua de fapt, un număr de la 0 la 9 salvat ca un număr real, și vom
înmulțiți-l cu o putere de 10, în funcție pe unde suntem în șir.
Și apoi vom adauga înapoi în noul nostru variabil întreg.
>> Deci, ceea ce ar arata ca ar fi fi - vom trage aici.
Dacă vom fi trecut în șirul de 90 -
>> STUDENT: [inaudibil].
>> JASON Hirschhorn: Dar atoi ia un șir de caractere.
Așa că am de gând să treacă prin exploatației.
Vom fi trecut la 90.
Noi mergem de la spate în față.
Ne ia 0.
>> STUDENT: Îmi pare rău.
Poate că acest lucru este o prostie.
Dacă suntem obtinerea trecut într-un șir, de ce este de 90 ceea ce suntem
obtinerea trecut în?
Deoarece 90 este un număr întreg.
>> JASON Hirschhorn: Pentru ca atoi ia o șir și îl transformă în întreg
reprezentare de care șir.
Dar șirul 90 nu este numărul întreg 90 sau numărul 90.
Șirul 90 este o serie de două, sau trei personaje, mai degrabă, 9
caracter, 0 caracterul, și backslash 0 personajul.
>> Și suntem scris atoi, deoarece, pentru exemplu, atunci când ia comanda
argument linie, și este salvat în argv, acesta este salvat ca un șir de caractere.
Dar dacă doriți să-l trateze ca pe un număr, aveți nevoie să-l convertească la un
întreg actual.
Pe care am făcut-o unul din seturile noastre de probleme.
Pe care am făcut-o într-un număr de seturi noastre probleme.
Toată lumea care a avut un număr întreg ca un argument în linia de comandă.
Deci, de aceea funcția noastră atoi ia un șir.
>> Deci, din nou, în exemplul nostru aici, suntem de gând să ia ultima.
Vom scădea caracterul 0 de la ea, pentru că personajele 0
scade de caracterul 0 vă oferă numărul real 0, conform
matematica ASCII pe care o facem.
>> Deoarece caracterele sunt reprezentate ca diferit de cel real lor -
caracter o, de exemplu, minuscule o este de 97.
Nu e - Oops!
Nu e ceea ce te-ai aștepta aceasta să fie, 0, de exemplu.
Deci, va trebui pentru a scădea caracter o pentru a obține 0.
>> Așa că am de gând să faci asta aici pentru a obține numărul real.
Și apoi vom inmulteste cu o putere de 10 în funcție de locul
este în șir, și apoi să ia că si adauga la titular locul nostru
variabile astfel încât să putem veni cu nostru întreg nou final.
Are care are sens pentru toată lumea?
>> Deci, noi nu vom codul această chiar acum, pentru că suntem
obtinerea pe scurt timp.
Îmi cer scuze pentru momentul de care.
Dar asta este ceea ce, sperăm, v-ar putea face pe testul - la
foarte puțin, pentru a primi acest pseudocod scrise.
>> Și apoi, dacă ar fi să scrie pseudocod, de fapt, am putea face acest lucru
destul de repede.
Fiecare linie de comentarii noi am scris aici se traduce la aproximativ
o linie de cod C.
Declararea unui nou variabil, scris o buclă, unele scădere, unele
multiplicare, și unele atribuire.
Ne-am, probabil, de asemenea, doresc să scrie o linie de retur.
S-ar putea dori, de asemenea, să pună unele verificări de aici.
Da.
>> STUDENT: Deci, putem trata e ca șirul real?
Pentru că știu că e doar o adresă.
Cum ar fi, cum ar fi să obțineți lungimea șirul fiind trecut prin?
>> JASON Hirschhorn: Deci, cum a făcut lungimea unui șir?
Strlen.
>> STUDENT: strlen, da.
Dar puteți pune e ca argument pentru asta?
>> JASON Hirschhorn: Deci strlen are o stea char.
Și rezultă că stele char, și-l ține de numărare până când se ajunge la o
backslash 0. strlen a fost de fapt unul dintre celelalte programe noi
au de gând să cod.
Acesta este un alt unul bun pentru cod.
Asta e un pic mai ușor, pentru că în cazul în care ai de gând să te gândești că
conceptual -
Tocmai l-am spus cu voce tare - strlen urmează un pointer și păstrează merge și
numărarea și urmărirea până când ajunge la un backslash 0.
>> STUDENT: OK, am înțeles.
>> JASON Hirschhorn: Deci, cel mai bun de noroc la testul 0 mâine.
Dacă aveți orice întrebări, voi fie în afara dupa acest lucru.
Simțiți-vă liber să-mi e-mail.
Ajunge la propria TF daca esti nu în secțiunea mea, sau a lua meu
e-mail dacă doriți.
>> Daca vrei sa sperii și doar trimite mi un e-mail, un e-mail freakout, voi
te trimite înapoi, cum ar fi, o fata zambitoare, sau, cum ar fi, o glumă sau ceva.
Deci, nu ezitați să facă la fel de bine.
Mult noroc din nou, și eu voi veți vedea toată săptămâna viitoare.