[Powered by Google Translate] [Săptămâna 5]
[David J. Malan - Universitatea Harvard]
[Acest lucru este CS50. - CS50.TV]
>> Acest lucru este CS50, Săptămâna 5.
Astăzi și în această săptămână, vom introduce un pic de lumea de criminalistica
în contextul problemei Set 4.
Astazi va fi o prelegere prescurtată, deoarece exista un eveniment special aici după aceea.
Deci, vom lua o privire si tachineze atât studenților, cât și părinților deopotrivă azi
cu unele din lucrurile care sunt pe orizont.
>> Printre ei, începând de luni, va avea o colegii ceva mai multe.
EDX, Harvard si MIT noua inițiativă de on-line pentru OpenCourseWare și mai mult,
se lanseaza pe campusul Harvard pe luni, ceea ce înseamnă vin luni
va avea, ca de ultima numaratoare, 86000 colegii suplimentare
care vor urma, împreună cu prelegeri CS50 și secțiuni
și walkthroughs și seturi de probleme.
Și ca parte a acest lucru, vor deveni membri ai clasei inaugurala a CS50, iar acum CS50x.
Ca parte a acestui acum, dau seama că vor exista unele upsides, de asemenea.
Pentru a obține gata pentru asta, pentru numărul masiv de studenți,
este suficient să spunem că, deși avem 108 TFS și CAS,
nu e destul de bun elev-profesor raportului odată ce ne-am lovit 80.000 dintre elevi.
Noi nu vom fi triat problemă atât de multe seturi manual,
astfel introdus în această săptămână în setul problema va fi CS50 Cec,
care va fi un utilitar de linie de comandă în cadrul aparatului
că veți obține odată ce ați fi actualizat în cursul acestui week-end.
Veți fi capabil de a rula o comandă, check50, pe PSET ta,
și veți primi feedback imediat cu privire la faptul program este corectă sau incorectă
în conformitate cu caietul de sarcini diferite de design care le-am furnizat.
Mai mult pe faptul că în caietul de sarcini set de probleme.
Cele colegii CS50x vor folosi aceasta, de asemenea.
>> Set problema 4 este totul despre criminalistica,
și acest lucru a fost foarte inspirat PSET de unele lucruri in viata reala
care atunci când am fost în facultate, am internat pentru o vreme
cu biroul lui Middlesex County District Attorney de a face locul de muncă medico-legale
cu lor investigator medico-legale de plumb.
Ceea ce acest constituit, așa cum cred că am menționat câteva săptămâni trecut,
este poliția în masă de stat sau de alte persoane ar putea veni în,
le-ar drop off lucruri, cum ar fi hard disk-uri și CD-uri și dischete și cum ar fi,
și apoi obiectivul de birou criminalistica a fost de a stabili
dacă a existat sau nu a fost o dovadă de un anumit fel.
Acest lucru a fost de Investigații Speciale Unitatea, asa ca a fost alb-guler a criminalității.
A fost un fel mult mai ingrijoratoare de crime, ceva care implică un fel de mass-media digitale.
Se pare că nu, că multe persoane a scrie un e-mail spunând: "Am făcut-o."
Deci destul de des, aceste căutări medico-legale nu sa prezentat tot ceea ce mult rod,
dar, uneori, oamenii ar scrie e-mailuri astfel.
Asa ca, uneori, eforturile au fost răsplătite.
>> Dar, pentru a duce până la această PSET medico-legale, vom fi introducerea în pset4 un pic de grafică.
Luați, probabil, aceste lucruri de la sine - JPEG, GIF, și cum ar fi - în aceste zile.
Dar, dacă într-adevăr crezi despre asta, o imagine, la fel ca fata lui Rob,
ar putea fi modelată ca o succesiune de puncte sau pixeli.
În cazul de fata lui Rob, există tot felul de culori,
și am început să vedem de puncte individuale, altfel cunoscut sub numele de pixeli,
odată ce am început pentru a mări inch
Dar dacă ne simplifica lumea un pic și spun doar că acest lucru aici este Rob în alb și negru,
pentru a reprezenta alb-negru, putem folosi doar binar.
Și dacă vom folosi binar, 1 sau 0, putem exprima această imagine același
din față zâmbitoare lui Rob cu acest model de biți.
11000011 reprezintă alb, alb, negru, negru, negru, negru, alb, alb.
Și așa nu e un salt imens, apoi să începem să discutăm despre fotografii pline de culoare,
lucruri pe care le-ați vedea pe Facebook sau de a lua cu un aparat de fotografiat digital.
Dar cu siguranță atunci când vine vorba de culori, ai nevoie de mai mulți biți.
Și destul de comună în lumea de fotografii este de a utiliza, nu 1-bit color,
deoarece acest lucru sugerează, dar 24-bit color, în cazul în care veți obține de fapt, milioane de culori.
Deci, ca în cazul în care am mărită pe ochi lui Rob,
că a fost orice număr de milioane de posibilități diferite colorate.
Deci vom introduce acest set de probleme, în 4, precum și în walkthrough,
care va avea loc azi la ora 3:30 în loc de 2:30 de obicei, din cauza curs de vineri aici.
Dar video va fi online, ca de obicei mâine.
>> Vom introduce, de asemenea, vă într-un alt format de fișier.
Acest lucru este în mod deliberat menit să se uite intimidant la început,
dar aceasta este doar o documentație pentru o struct C.
Se pare că de ani în urmă Microsoft a ajutat la popularizarea acest format
numit formatul de fișier bitmap, bmp, iar acest lucru a fost un super format simplu, colorat fișier grafic
care a fost folosit de ceva timp și, uneori, încă de wallpapere pe desktop.
Dacă credeți că inapoi la Windows XP și dealurile și cerul albastru,
care a fost de obicei o imagine BMP sau bitmap.
Bitmap sunt distractive pentru noi, deoarece acestea au complexitate un pic mai mult.
Nu e chiar așa de simplu ca această grilă de 0s și 1s.
În schimb, aveți lucruri, cum ar fi un antet la începutul unui fișier.
Deci, cu alte cuvinte, în interiorul unui fișier. BMP este o grămadă de 0s și 1s,
dar există unele 0s suplimentare și 1s acolo.
Și se pare că ceea ce am, probabil, luat de la sine de ani de zile -
formate de fișiere, cum ar fi doc sau.. xls sau MP3,. mp4,. indiferent de formate de fișier
că sunteți familiarizați cu - ceea ce înseamnă chiar și pentru a fi un format de fișier,
pentru că la sfârșitul zilei, toate aceste dosare putem folosi avem doar 0s și 1s.
Și poate cei 0s și 1s reprezintă ABC prin ASCII sau similare,
dar la sfarsitul zilei, este încă doar 0s și 1s.
Deci, oamenii pur și simplu să decidă ocazional pentru a inventa un nou format de fișier
în cazul în care acestea standardiza ce modele de biți va însemna, de fapt.
Și în acest caz aici, oameni buni care a proiectat formatul de fișier de tip bitmap
a declarat că, la prima octet într-un fișier bitmap, cum noteaza cu 0 compensare acolo,
acolo va fi un nume criptic bfType variabilă numită,
care tocmai vine de tip de fișier bitmap, ce tip de fișier bitmap este aceasta.
Puteți deduce, probabil, din al doilea rând că diferența 2, numărul de octet 2,
are un model de 0s și 1s care reprezintă ceea ce? Dimensiunea de ceva.
Și merge mai departe de acolo.
Deci, în set de probleme 4, veți fi umblat prin unele dintre aceste lucruri.
Noi nu se va termina pese de toate acestea.
Dar observați că începe să se interesant în jurul valorii de 54 byte: rgbtBlue, verde și roșu.
Dacă ați auzit vreodată acronimul RGB - rosu, verde, albastru - aceasta este o referire la faptul că
deoarece se pare că vă puteți picta toate culorile curcubeului
cu o combinatie de rosu si albastru si verde.
Și, de fapt, părinții din sală s-ar putea aminti unele dintre cele mai vechi proiectoare.
Aceste zile, veți vedea doar o lumină strălucitoare care vine dintr-un obiectiv,
dar înapoi în ziua în care ați avut lentila roșie, lentile albastre, iar lentila verde,
și împreună au ca scop un ecran și a format o imagine colorată.
Și destul de des, școli medii și licee ar avea aceste lentile
vreodată atât de ușor Askew, asa ca au fost un fel de a vedea imagini duble sau triple.
Dar asta a fost ideea. Ai avut lumină roșie și verde și albastru pictura o imagine.
Și că același principiu este folosit în calculatoare.
>> Deci, printre provocările atunci pentru tine, în problema Set 4 sunt mergi la a fi câteva lucruri.
Una este de a redimensiona o imagine, de fapt, să ia într-un model de 0s și 1s,
dau seama care bucăți de 0s și 1s reprezintă ceea ce într-o structură de acest fel,
și dau apoi cum să reproducă pixeli - cele roșii, de blues, Grupul Verzilor -
în interiorul, astfel că, atunci când o imagine arata ca acest lucru inițial,
s-ar putea arata ca acest loc după aceea.
Printre alte provocări prea va fi ca vei fi pronunțată o imagine medico-legale
a unui fișier real de la un aparat de fotografiat digital.
Și cu privire la acest aparat de fotografiat, o dată la un moment dat, erau o grămadă de fotografii.
Problema este că accidental șterse sau au avut imaginea corupt cumva.
Se întâmplă lucruri rele cu camere digitale.
Și așa am copiat rapid toate off 0s și 1s de acel card pentru tine,
salvat-le pe toate într-un singur fișier mare, iar apoi le vom preda la tine în Problemă Set 4
astfel încât să puteți scrie un program în C, cu care să recupereze toate aceste JPEG-urile, în mod ideal.
Și se pare că JPEG, chiar dacă ele sunt un fel de format de fișier complexă -
ei sunt mult mai complexe decât acest chip zâmbitor aici -
se dovedește că fiecare JPEG începe cu aceleași modele de 0s și 1s.
Deci, folosind, în cele din urmă, o buclă în timp ce pentru o buclă sau sau similare,
puteți itera peste tot 0s și 1s în această imagine medico-legale,
și de fiecare dată când vezi modelul specială care este definită în caietul de sarcini set de probleme,
puteți presupune aici este, cu o probabilitate foarte mare, începutul unei JPEG.
Și, de îndată ce veți găsi același model un numar de bytes
sau kilobytes sau megaocteți mai târziu, puteți presupune aici este un al doilea JPEG,
fotografie am luat dupa prima.
Permiteți-mi să vă opriți din citit ca primul dosar, începe să scrie acest nou unul,
și de ieșire a programului tau pentru pset4 va fi la fel de multe ca 50 JPEG.
Și dacă nu e 50 JPEG, aveti un pic de o buclă.
Dacă aveți un număr infinit de imagini JPEG, aveți o buclă infinită.
Așa că prea va fi destul de un caz comun.
Deci, asta e ceea ce e la orizont.
>> Quiz 0 în spatele nostru, pe seama mea de e-mail care în mod invariabil există oameni care sunt atât fericiți,
un fel de neutru, și trist în jurul valorii de 0 Timp Quiz.
Și vă rugăm să nu ajungă la mine, capul TF Zamyla, TF ta,
sau unul dintre AC pe care știi, dacă doriți, pentru a discuta modul în care au decurs lucrurile.
>> Deci, pentru a impresiona părinții aici, în sală, ceea ce este biblioteca CS50?
[Râsete] Bine de locuri de muncă.
Care e biblioteca CS50? Da. >> [Elev] E un set de pre-scris de cod [neauzit]
Bine, bine.
Este un set de pre-scris de cod pe care am scris personal, care vi le oferim,
care oferă unele funcționalități comune,
chestii ca adu-mi un șir de caractere, adu-mi un int - toate funcțiile care sunt listate aici.
>> Începând de acum, vom începe să ia într-adevăr aceste roți de formare oprit.
Vom începe să ia un șir de la tine,
care amintesc a fost doar un sinonim pentru ceea ce efectiv tip de date? [Mai multe >> studenții] Char *.
Char *. Pentru părinți, că a fost, probabil, [face un sunet whooshing]. Asta e bine.
* Char vom începe pentru a vedea pe ecran toate mai mult cu cât vom elimina string din vocabularul nostru,
cel puțin atunci când vine vorba de a scrie, de fapt cod.
În mod similar, ne vom opri folosind unele dintre aceste funcții la fel de mult
deoarece programele noastre sunt mergi la a lua mai sofisticate.
, Mai degrabă decât să scrieți programe care stau acolo cu o clipește prompt,
de așteptare pentru utilizator să tastați ceva, veți primi intrări dvs. de altă parte.
De exemplu, veți le obține dintr-o serie de biți de pe hard disc.
Vei primi în schimb ei în viitor de la o conexiune de rețea,
unele site-ul undeva.
>> Așa că haideți să coaja înapoi acest strat pentru prima dată și trageți în sus Aparatura CS50
și acest fișier numit cs50.h, care ai fost #, inclusiv de săptămâni,
dar hai sa vedem de fapt ce e înăuntru de acest lucru.
În partea de sus a fișierului în albastru este doar o grămadă de comentarii:
informații privind garanția și licențiere.
Aceasta este un fel de paradigmă comune în software-ul
pentru că o mulțime de software in aceste zile este ceea ce se numeste open source,
ceea ce înseamnă că cineva a scris codul și a făcut-o în mod liber la dispoziție
nu doar pentru a rula și de a folosi, dar pentru a citi de fapt și modifice și să se integreze în munca ta.
Deci, asta e ceea ce ai folosit, software-ul open source, deși într-o formă foarte mic.
Dacă aș defilați în jos trecut de comentariile, însă, vom începe pentru a vedea unele lucruri mult mai familiare.
Comunicarea din partea de sus aici, că dosarul cs50.h include o grămadă de fișiere antet.
Cele mai multe dintre acestea, nu am văzut până acum, dar unul este familiar.
Care dintre acestea am văzut, chiar dacă pentru scurt timp, până în prezent? >> [Elev] biblioteca Standard.
Da, biblioteca standard. stdlib.h are malloc.
Odată ce am început să vorbim despre alocarea dinamică a memoriei,
care ne vom întoarce la săptămâna viitoare, precum și, am început inclusiv acel fișier.
Se pare că bool și adevărat și fals, nu există de fapt în sine C
excepția cazului în care ați inclus acest fisier aici.
Noi am fost de câteva săptămâni, inclusiv stdbool.h
astfel încât să puteți utiliza noțiunea de. bool, adevărat sau fals
Fără acest lucru, va trebui să-l sortați de fals și de a folosi un int
și doar presupune că arbitrar 0 este falsă și 1 este adevărat.
Dacă vom defila în jos în continuare, aici este definiția noastră a unui șir.
Se pare că, așa cum am spus înainte, că în cazul în care aceasta este steaua nu contează cu adevărat.
Puteți avea chiar tot în jurul valorii de spațiu.
Am acest semestru au fost l promoveze ca acest lucru să se clarifice
că steaua are de a face cu tipul,
dar la fel de comună seama, daca nu putin mai comune,
este de a pus-o acolo, dar funcțional e același lucru.
Dar acum, dacă citim mai departe în jos, haideți să aruncăm o privire la GetInt
deoarece am folosit ca, probabil, înainte de orice altceva în acest semestru.
Aici este GetInt. Aceasta este ceea ce? >> [Elev] Un prototip. Aceasta >> este doar un prototip.
De multe ori, ne-am pus prototipuri la topuri ale noastre. Fișiere c,
dar puteți pune, de asemenea, prototipuri în fișiere antet, fișiere h., ca cel de aici
astfel încât, atunci când scrie unele funcții pe care doriți alte persoane să poată utiliza,
care este exact cazul cu biblioteca CS50,
nu numai în aplicare funcțiile în ceva de genul cs50.c,
ai pus, de asemenea, prototipurile nu la partea de sus a acelui fișier, dar la partea de sus a unui fișier antet.
Apoi, acel fișier header este ceea ce prietenii și colegii includ
cu # include în propriul lor cod.
Deci, tot acest timp, ați fost, inclusiv toate aceste prototipuri,
efectiv la partea de sus a fișierului, dar prin intermediul acestui mecanism # include,
care, în esență, copii și paste acest fișier în propria voastră.
Iată unele documente destul de detaliate.
Ne-am luat destul de mult pentru a acordat ca GetInt devine un int,
dar se pare că există unele cazuri de colt.
Ce se întâmplă dacă utilizatorul tipuri într-un număr care este mult prea mare, o quintillion,
că doar nu poate încăpea în interiorul unui int? Care este comportamentul așteptat?
În mod ideal, e previzibil.
Deci, în acest caz, dacă ai citit, de fapt amendă de imprimare,
veți vedea de fapt că, dacă linia nu poate fi citit, acest INT_MAX întoarce.
Nu ne-am vorbit despre asta, dar bazate pe capitalizarea ei, ceea ce este, probabil,?
[Elev] O constantă. >> E o constantă.
E o constantă de construcții care este, probabil, a declarat intr-unul din aceste fișiere header
care-i treaba mare în dosar, și INT_MAX este, probabil, ceva de genul aproximativ 2 miliarde de euro,
ideea fiind că, deoarece avem nevoie de pentru a semnifica faptul că într-un fel ceva nu a mers bine,
ne, da, au numere de 4 miliarde la dispoziția noastră: -2 miliarde EUR, pe de până la 2 miliarde de euro, da sau de a lua.
Ei bine, ceea ce este comun în programarea este furi doar unul dintre aceste numere,
Poate 0, poate 2 miliarde de euro, poate -2000000000,
astfel încât să petreci una dintre valorile posibile, astfel încât să vă puteți angaja în lume
că, dacă ceva nu merge bine, voi reveni această valoare super-mare.
Dar tu nu vrei ceva de utilizatorul tastarea criptic ca ... 234, un număr foarte mare.
Ai generalizeze în schimb ca o constantă.
Deci, într-adevăr, dacă au fost anal în ultimele săptămâni, în orice moment te-a sunat GetInt,
ar fi trebuit sa verificat cu o condiție în cazul în care a făcut tipul de utilizator în INT_MAX,
sau, mai precis, a făcut GetInt INT_MAX retur, deoarece în cazul în care a făcut-o,
că înseamnă, de fapt nu l-au tastați. Ceva a mers greșit în acest caz.
Deci, asta este ceea ce, în general, cunoscut sub numele de o valoare santinelă, ceea ce înseamnă doar speciale.
>> Să acum transforma in fisierul. C..
Dosarul C a existat în aparatul de ceva timp.
Și, de fapt, aparatul dispune de aceasta pre-compilat pentru tine în chestia aia l-am numit cod obiect,
dar pur si simplu nu conteaza pentru tine în cazul în care aceasta se datorează faptului că sistemul știe
în acest caz, în cazul în care aceasta este: aparatul.
Să defilați în jos pentru a GetInt acum și a vedea cum GetInt a lucrat in tot acest timp.
Aici avem comentarii similare din înainte.
Lasă-mă să mări doar pe porțiunea codul.
Și ceea ce avem pentru GetInt este următorul.
Este nevoie de nici o introducere.
Aceasta returnează un int, în timp ce (adevărat), așa că avem o buclă infinită în mod deliberat,
dar probabil vom iesi din aceasta într-un fel sau să se întoarcă din cadrul acestei.
>> Să vedem cum funcționează.
Ne pare să fie utilizând getString în această primă linie în interiorul buclei, 166.
Acest lucru este acum bună practică, deoarece în ce condiții ar putea reveni getString
specială cheie NULL? >> [Elev] În cazul în care ceva nu merge bine.
În cazul în care ceva nu merge bine. Și ce ar putea merge prost, atunci când apelați ceva de genul getString?
Da. >> [Elev] malloc nu reușește să dea de Ints.
Da. Poate malloc eșuează.
Undeva sub capota, getString este de asteptare malloc, care alocă memorie,
care permite magazin de calculatoare toate caracterele
faptul că utilizatorul tastează în tastatură.
Și să presupunem utilizatorul a avut o mulțime de timp liber și scris mai mult, de exemplu,
peste 2 miliarde de caractere în, mai multe caractere decât calculatorul are chiar memorie RAM.
GetString trebuie să fie în măsură pentru a semnifica asta pentru tine.
Chiar dacă acesta este un caz super, super-colț mai puțin frecvente,
trebuie să fie cumva capabil să se ocupe de acest lucru,
și așa getString, dacă ne-am întors și citiți documentația sa, face în schimb NULL fapt.
Deci, acum, dacă nu reușește, prin returnarea getString NULL, GetInt va eșua, prin returnarea INT_MAX
doar ca o santinelă. Acestea sunt doar convenții umane.
Singura cale ar trebui să știi asta e caz este prin citirea documentației.
>> Să defilați în jos pentru a în cazul în care este, de fapt int ajuns.
Dacă aș defilați în jos un pic mai departe, în linie 170, avem un comentariu de mai sus aceste linii.
Ne pronunțăm într-un int 172, n, și un char, C, și apoi această nouă funcție,
pe care unii dintre voi au dat peste înainte, sscanf.
Acest lucru vine de la scanf șir.
Cu alte cuvinte, da-mi un șir și o voi scana pentru piese de informații de interes.
Ce înseamnă asta?
Să presupunem că am tip în, literalmente, 123 la tastatură și apoi apăsați Enter.
Care este tipul de date de 123 atunci când sa întors de getString? >> [Elev] String.
Este, evident, un șir de caractere, nu? Am un șir de caractere.
Deci, 123 este într-adevăr, citat-citatul, 123 cu 0 \, la sfârșitul anului acesta.
Asta nu este un int. Asta nu e un număr. Se pare ca un număr, dar acesta nu este de fapt.
Deci, ce are GetInt trebuie să fac?
Ea are de a scana acel șir la stânga la dreapta - 123 \ 0 - si cumva converti la un întreg real.
Ai putea da seama cum să facă acest lucru.
Dacă credeți că inapoi la pset2, ai probabil ai un pic confortabil cu Cezar
sau Vigenere, astfel încât să puteți repeta peste un șir de caractere, puteți converti caractere la Ints.
Dar naiba, e o mulțime de muncă.
De ce nu suna ca o funcție sscanf care face asta pentru tine?
Deci, sscanf așteaptă un argument - în acest caz numit linie, care este un șir de caractere.
Ai specificați apoi, în ghilimele, foarte similar cu printf, ceea ce vă așteptați să vedeți în acest șir.
Și ce vreau să spun aici este că se așteaptă să vadă un număr zecimal și poate un caracter.
Și vom vedea de ce acesta este cazul într-o clipă.
Și se dovedește că această notație este acum amintește de lucruri am început să vorbim despre
doar peste o săptămână în urmă.
Ce este & N și C & faci pentru noi aici? >> [Elev] Adresa de n și adresa de c..
Da. Se dă-mi adresa lui n și adresa c.. De ce este așa de important?
Știi că, cu funcții în C, puteți reveni întotdeauna o valoare sau nici o valoare, la toate.
Puteți returna un int, un șir, un float, char o, indiferent, sau vă puteți întoarce nule,
dar vă puteți întoarce doar un singur lucru maxim.
Dar aici vrem să-mi întoarcă sscanf poate un int, un număr zecimal,
și, de asemenea, o. char, și vă voi explica de ce char într-un moment
Tu vrei eficient sscanf să se întoarcă două lucruri, dar asta nu e doar posibil, în C.
Puteți lucra în jurul valorii de faptul că prin trecerea în două adrese
deoarece de îndată ce vă dai o funcție două adrese,
ce pot face această funcție cu ele? >> [Elev] Trimite un mesaj pentru aceste adrese.
Se poate scrie la acele adrese.
Aveți posibilitatea să utilizați operațiunea stele și du-te acolo, la fiecare dintre aceste adrese.
E un fel de acest mecanism de back-door, dar foarte comun pentru modificarea valorilor variabilelor
mai mult decât un singur loc - în acest caz, două.
Acum observați Sunt de verificare pentru == 1 și apoi se întoarce n cazul în care nu, de fapt, evaluează la true.
Deci, ce se întâmplă? Punct de vedere tehnic, tot ce doresc cu adevărat să se întâmple în GetInt este aceasta.
Dorim să elimine, ca să spunem așa, ne-o dorim pentru a citi șir - citat-unquote 123 -
și în cazul în care se pare ca exista un numar acolo, ceea ce ne spune sscanf pentru a face
este pus acest număr - 123 - în această variabilă N pentru mine.
Deci, de ce atunci am avea acest fapt, precum și?
Care este rolul sscanf spui că s-ar putea obține, de asemenea un caracter aici?
[Răspuns studentul nu pot fi auzite] >> Un punct zecimal, de fapt ar putea funcționa.
Să susțin că gandit pentru un moment. Ce altceva?
[Elev] Ar putea fi NULL. Bine >> gândire. Ar putea fi caracterul nul.
Nu e de fapt în acest caz. Da. >> [Elev] ASCII.
ASCII. Sau lasă-mă să generalizăm și mai mult.
C% este doar pentru verificarea erorilor.
Noi nu vrem să existe un personaj după numărul,
dar ce-mi permite să fac este următorul.
Se pare că sscanf, pe lângă stocarea valorilor din n și c, în acest exemplu aici,
ceea ce, de asemenea, nu este returnează numărul de variabile pus valorile inch
Deci, dacă tastați doar în 123, atunci numai% d este de gând să se potrivească,
și numai n este stocat, cu o valoare cum ar fi 123,
și nimic nu se pune în c.
C rămâne o valoare de gunoi, ca să spunem așa -
gunoi, pentru că niciodată nu a fost inițializat la o anumită valoare.
Deci, în acest caz, sscanf returnează 1 deoarece am populat 1 a acestor indicii,
caz în care o mare, am o int, asa ca am elibera linia pentru a elibera memorie
că de fapt getString alocate, și apoi mă întorc n,
altceva dacă ați întrebat vreodată în cazul în care vine de la declarația Retry, vine chiar de aici.
Deci, dacă, prin contrast, de tip I în 123foo - doar câteva ordine aleatoare a textului -
sscanf se va vedea numărul, numărul, numărul, f,
și se va pune în 123 n; se va pune f în c și apoi să se întoarcă 2.
Deci avem, folosind doar definiția de bază a comportamentului lui sscanf, un mod foarte simplu -
bine, complex la prima vedere, dar, la sfârșitul zilei mecanismului destul de simplu -
de a spune este acolo un int și dacă da, este ca singurul lucru pe care-am găsit?
Și spațiu aici este deliberată.
Dacă ați citit documentația pentru sscanf, ea vă spune că, dacă includ o bucată de spații albe
la începutul sau la sfârșitul, sscanf prea va permite utilizatorului, indiferent de motiv,
pentru a lovi bara de spațiu și 123, care va fi legitim.
Tu nu va țipa la utilizatorul doar pentru că au lovit bara de spațiu
la începutul sau la sfârșitul, care este doar un pic mai user-friendly.
>> Orice întrebări Apoi, pe GetInt? Da. >> [Elev] Ce se întâmplă dacă ai pus doar într-o char?
Bună întrebare.
Ce se întâmplă dacă ai tastat într-un char cum ar fi f, apăsați Enter fără a introduce vreodată 123?
Ce părere aveți comportamentul această linie de cod ar fi atunci?
[Răspuns studentul neauzit]
Da, așa sscanf poate acoperi că prea, deoarece, în acest caz, nu este de gând să umple N sau C.
O să se întoarcă în locul 0, caz în care mă prinde, de asemenea, faptul că scenariul
deoarece valoarea anticipată vreau este 1.
Vreau doar unul și numai un singur lucru să fie umplut. Bună întrebare.
>> Altele? Bine.
>> Să nu mergem prin toate funcțiile de aici,
dar una care pare a fi, probabil, de interesul rămas să getString
deoarece se dovedește că GetFloat, GetInt, GetDouble, GetLongLong
toate punt o mulțime de funcționalități lor de a getString.
Deci, haideți să aruncăm o privire la modul în care el este pus în aplicare aici.
Asta arata un complex pic, dar se utilizează aceleași fundamentele
că am început să vorbim despre săptămâna trecută.
În getString, care ia nici un argument ca pe void aici
și-l întoarce un șir, eu am aparent de declarare a unei coarde numit tampon.
Nu știu cu adevărat ce se întâmplă să fie utilizate pentru încă, dar vom vedea.
Se pare ca capacitatea este implicit 0.
Nu este destul de sigur că în cazul în care acest lucru se întâmplă, nu, sigur că ceea ce n este de gând să fie utilizate pentru încă,
dar acum din ce in ce un pic mai interesant.
În conformitate 243, noi declarăm un int, c.
Aceasta este un fel de detaliu prost.
Un caracter este de 8 biți, 8 biți și poate stoca câte valori diferite? >> [Elev] 256. 256 >>.
Problema este dacă doriți să aveți 256 de caractere ASCII diferite, care nu sunt
, dacă credeți înapoi - și acest lucru nu este ceva să memoreze.
Dar, dacă credeți că inapoi la tabela ASCII mare am avut săptămâni în urmă,
au existat, în acest caz, 128 sau 256 de caractere ASCII.
Am folosit toate modelele de până 0s și 1s.
Asta este o problemă în cazul în care doriți să fie în măsură să detecteze o eroare
pentru că, dacă utilizați deja 256 de valori pentru personajele tale,
nu ai de gând cu adevărat înainte, deoarece acum nu ai nici o modalitate de a spune,
acest lucru nu este un personaj legit, aceasta este un mesaj eronat.
Deci, ce face lumea pe care o folosesc este mai mare valoarea următoare, ceva ca un int,
astfel încât să aveți un număr nebun de biți, 32, 4 miliarde de valori posibile
astfel încât să puteți ajunge pur și simplu prin utilizarea în esență, 257 din ele,
1 din care are o semnificație specială ca o eroare.
>> Deci, hai sa vedem cum funcționează.
În conformitate 246, am această buclă în timp ce de mare, care este de asteptare fgetc,
f fisier sensul, așa getc, și apoi stdin.
Se pare ca aceasta este doar mod mai precis de a spune citite de intrare de la tastatură.
Standard tastatură mijloace de intrare, de ieșire standard de mijloace ecran,
și eroarea standard, pe care le vom vedea în pset4, înseamnă că ecranul
dar o parte specială a ecranului, astfel încât nu este confundat cu producția efectivă
care ați intenționat să imprimați. Dar mai mult pe faptul că, în viitor.
Deci, fgetc înseamnă doar citi un caracter de la tastatură și păstrați-l în cazul în care?
Depozitați-l în c.
Și apoi atunci a verifica - deci eu sunt, folosind doar cateva conjuncțiilor booleene aici -
verificați că acesta nu este egal cu - \ n, astfel încât utilizatorul a lovit Enter, vrem să se oprească la acel moment,
sfârșitul bucla - și am dori, de asemenea pentru a verifica pentru EOF constanta specială,
care, dacă știți sau ghici, ceea ce nu se stea? >> [Elev] Sfârșitul de fișier. Sfârșit >> de fișier.
Acest lucru este un nonsens, deoarece un fel de, dacă mă tastarea la tastatura,
nu există cu adevărat nici un fișier nu implicat în acest lucru,
dar acest lucru este doar sorta de termen generic folosit pentru a înțelege
că nimic altceva nu vine de la degetele omului.
EOF - sfârșitul fișierului.
Ca o paranteza, dacă v-ați lovit vreodată de control D la tastatură, nu, care le-ar avea încă -
v-ați lovit de control C - Controlul D trimite această constantă special numit EOF.
Deci, acum avem doar niște alocare de memorie dinamică.
>> Deci, în cazul în care (n + 1> capacitate). Acum voi explica nr.
N este doar cât de multe bytes sunt în prezent în tampon,
șir că ești în prezent, construirea de utilizator.
Dacă aveți mai multe caractere din buffer-ul dvs. decât aveți capacitatea în tampon,
intuitiv ceea ce trebuie să facem, atunci se aloce o capacitate mai mare.
Așa că am de gând să răsfoiesc peste unele dintre aritmetice aici și să se concentreze doar pe această funcție aici.
Știi ce malloc este sau sunt, în general, de cel puțin familiare.
Ia ghici ce-o face realloc. >> [Elev] Adaugă memorie.
Nu e destul de adăugarea de memorie. Acesta realocă de memorie, după cum urmează.
Dacă există încă loc la sfârșitul șir pentru a vă oferi mai mult de faptul că memoria
decât a fost inițial ți-o dă, atunci veți obține că memorie suplimentară.
Astfel încât puteți să vă păstrați doar punerea de caractere șir de spate în spate la spate în spate.
Dar dacă asta nu e cazul pentru ca ai asteptat prea mult timp
și ceva aleatoriu a fost plopped în memorie acolo
dar nu e de memorie suplimentar aici, e în regulă.
Realloc este de gând să facă tot grea pentru tine,
muta șirul ați citit în astfel departe de aici, a pus-o acolo jos,
și să dea apoi pista de ceva mai mult de la acel moment.
>> Deci, cu un val de mana, permiteți-mi să spun că ceea ce face getString
este că începe cu un tampon mic, poate unul singur caracter,
și dacă utilizatorul tipurile din două caractere, getString sfârșește asteptare realloc și spune
un caracter nu era de ajuns, dă-mi două caractere.
Apoi, dacă ai citit prin logica bucla, o să spună
utilizatorul tastat în 3 caractere;-mi dau acum nu 2, dar 4 caractere,
atunci da-mi 8, atunci dă-mi 16 și 32.
Faptul că am dublarea capacității de fiecare dată
înseamnă că buffer-ul nu este de gând să crească încet, o să crească super rapid.
Și ce ar putea fi avantajul de asta?
De ce am dublarea dimensiunea buffer
chiar dacă utilizatorul ar putea avea nevoie doar de un caracter suplimentar de la tastatură?
[Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] Nu trebuie să-l crească la fel de des.
Exact. Nu trebuie să-l crească la fel de des.
Și acest lucru este doar un fel de acoperire ai pariurile aici,
ideea fiind că nu doriți să apelați realloc o mulțime, pentru că tinde să fie lent.
Orice moment să vă întreb sistemul de operare pentru memorie,
după cum veți vedea în curând într-un set de probleme în viitor, aceasta tinde să ia ceva timp.
Minimizând astfel că suma de timp, chiar dacă îți pierzi spațiu,
tinde să fie un lucru bun.
>> Dar dacă citim prin partea finală a getString aici -
și înțelegerea din nou de fiecare singură linie aici nu este atât de importantă astăzi -
observa că în cele din urmă solicită din nou malloc
și-l alocă exact așa cum octeți multe de care are nevoie pentru șirul
și apoi aruncă prin apel gratuit tampon excesiv de mare
în cazul în care într-adevăr s-au dublat de prea multe ori.
Deci, pe scurt, că e modul în care getString a lucrat in tot acest timp.
Tot ce nu se citește câte un caracter la un moment dat din nou și din nou și din nou,
și de fiecare dată când are nevoie de memorie suplimentară, aceasta solicită să se stabilească sistemul de operare pentru ea
sunand la realloc.
>> Alte întrebări? Bine.
>> Un atac.
Acum că am înțeles indicii sau cel puțin sunt din ce în ce familiarizați cu pointeri,
să ia în considerare modul în care toată lumea începe să se prăbușească
dacă nu apara destul de contradictorii împotriva utilizatorilor,
oameni care încearcă să hack în sistemul dvs.,
oameni care încearcă să fure software-ul dvs. prin ocolirea un cod de înregistrare
că acestea ar putea avea altfel de tip inch
>> Aruncati o privire la acest exemplu aici, care este la doar cod C care are o funcție principală la partea de jos
care apelează o funcție foo. Și pentru ce se trece la foo?
[Elev] Un singur argument. >> [Malan] Un singur argument.
Deci, argv [1], ceea ce înseamnă că primul cuvânt tastat de utilizator de la linia de comandă
după a.out sau orice program este numit.
Deci, foo în partea de sus ia într-o char *. Dar char * este doar ceea ce? >> [Elev] Un șir.
[Malan] Un șir, deci nu e nimic nou aici.
Că șirul este arbitrar fiind numit bar.
În această linie de aici, char c [12]; intr-un fel de semi-tehnic limba engleză, ceea ce se face această linie?
[Elev] O serie de - Array >> a? >> [Elev] Caractere. >> Caractere.
Dă-mi un tablou de 12 caractere. Așa că am putea numi asta un tampon.
Se numește punct de vedere tehnic C, dar un tampon în programare înseamnă doar o grămadă de spațiu
pe care le puteți pune niște chestii inch
Apoi în cele din urmă, nu ne-am memcpy folosit înainte, dar puteți ghici, probabil, ceea ce face.
Se copiază memoria. Ce face?
Se copiază aparent bar, intrare său, în C, dar numai până la lungimea de bare.
Dar există un bug aici. >> [Elev] Ai nevoie de caracterul sizeof. Bine >>.
Punct de vedere tehnic, ar trebui să facem cu adevărat strlen (bar) * sizeof (char)). Asta e corect.
Dar, în cel mai rău caz aici, să presupunem că that -
Bine. Apoi, există două bug-uri.
Deci, sizeof (char));
Să facem acest lucru un pic mai larg.
Deci, acum, există încă un bug, care este ceea ce? >> [Elevului răspunsul neauzit]
Verificați pentru ce? >> [Elev] Verifica pentru NULL.
Noi ar trebui să fie, în general, verificarea NULL, deoarece se întâmplă lucruri rele
atunci când indicatorul este NULL, deoarece s-ar putea sfârși prin a merge acolo,
și nu ar trebui să fie niciodată de gând să NULL prin dereferencing cu operatorul stea.
Deci asta e bine. Și ce altceva facem? În mod logic, e un defect aici.
[Elev] Verificați dacă argc este> = la 2.
Deci, verificați dacă este argc> = 2. Ok, deci sunt trei bug-uri în acest program aici.
Suntem acum a verifica dacă utilizatorul efectiv introdus în nimic în argv [1]. Bine.
Deci, ce e bug treia? Da. >> [Elev] C ar putea să nu fie suficient de mare.
Bine. Am verificat un scenariu.
Noi implicit verificat nu copiați mai multă memorie decât ar depăși lungimea de bara.
Deci, dacă șirul de utilizator introdus este de 10 de caractere în lungime,
acest lucru este spunând copia numai 10 caractere. Și asta e în regulă.
Dar ce se întâmplă dacă utilizatorul tastat într-un cuvânt, la promptul ca un cuvânt 20-caractere?
Aceasta spune copie 20 de caractere de la barul în ce?
C, altfel cunoscut sub numele tampon noastră, ceea ce înseamnă că a scris doar datele
la 8 locații octet care nu vă aparțin,
și nu le dețin în sensul că niciodată nu le-ai alocat.
Deci, asta este ceea ce, în general, cunoscut sub numele de atac buffer overflow sau atac tampon depășire.
Și e un atac în sensul că, dacă utilizatorul sau programul care este de asteptare funcția
face acest lucru cu rea intenție, ceea ce de fapt se întâmplă în continuare ar putea fi de fapt destul de rău.
>> Deci, haideți să aruncăm o privire la această imagine aici.
Această imagine reprezintă stiva de memorie.
Amintiți-vă că de fiecare dată când apelați o funcție te acest cadru mic pe stivă
și apoi altul și apoi altul și altul.
Și astfel acum, am doar un fel de abstracte acestea ca dreptunghiuri
fie pe bord sau pe ecran aici.
Dar, dacă ne apropia pe una dintre aceste dreptunghiuri, atunci când apelați un foo funcție,
se dovedește că există mai mult pe interiorul teancul de acel cadru, în acest dreptunghi
mult decât x și y, iar a și b, asa cum am facut vorbim despre swap.
Se pare că există unele detalii de nivel inferior, printre care adresa expeditorului.
Deci, se dovedește atunci când solicită principal foo, principala trebuie sa informeze foo
ce adresa principală este în memoria calculatorului
deoarece în caz contrar, imediat după foo se face de executare, la fel ca în acest caz aici,
Odată ce ați ajunge la acest bretele închis cret, la sfârșitul anului foo,
cum naiba nu foo știe unde controlul programului ar trebui să meargă?
Se pare că răspunsul la această întrebare este, în acest dreptunghi roșu aici.
Aceasta reprezintă un pointer, și este de până la computer pentru a stoca temporar
pe stiva așa-numita adresa principale, astfel încât, cât mai curând foo se face de executare,
calculatorul știe unde și ce linie în principal pentru a reveni la.
Indicatorul frame Salvat se referă în mod similar cu acest lucru.
Barul char * aici reprezintă ceea ce?
Acum, acest segment albastru aici este cadrul foo lui. Ce este bara?
Bar este doar argument pentru funcția de foo.
Deci, acum ne-am întors la fel de familiar imaginii.
Există mai multe lucruri și mai multe distrageri pe ecran,
dar acest segment este de culoare albastru deschis doar ceea ce am fost de desen pe tablă
pentru ceva de genul swap. Acesta este cadrul pentru foo.
Și singurul lucru în ea acum este barul, care este acest parametru.
Dar ce altceva ar trebui să fie în stivă în conformitate cu acest cod aici?
[Elev] char c [12]. >> [Malan] char c [12].
Noi ar trebui să vedeți, de asemenea, 12 patrate de memorie alocate unei variabile numita C,
și într-adevăr, avem că pe ecran.
Foarte de sus este c [0], iar apoi autorul acestei diagrame
nu sa deranjat desen toate pătrate, dar există într-adevăr, există 12
pentru că dacă te uiți la dreapta jos, c [11], dacă numeri de la 0 este octetul 12 astfel.
Dar aici e problema.
În ce direcție se c în creștere?
Un fel de sus în jos în cazul în care începe de la partea de sus și partea de jos creste la.
Ea nu arata ca am plecat noi înșine pista de mult aici, la toate.
Ne-am pictat un fel de noi înșine într-un colț,
și că, C [11] este dreptul de până împotriva bar, care este dreptul de până împotriva indicatorul frame Salvat,
care este dreptul de până împotriva Adresă de returnare. Nu e nici o camera mai mult.
Deci, ce e implicație, apoi, dacă o dai în bară
si tu incearca sa citesti 20 bytes într-un buffer de 12 byte?
În cazul în care sunt cele 8 octeți suplimentare de gând să mergi? >> [Elev] Inside -
În interiorul orice altceva, dintre care unele sunt foarte importante.
Și cel mai important lucru, potențial, este caseta roșie acolo, adresa expeditorului,
pentru că presupunem că vă fie accidental sau adversarially suprascrie aceste 4 octeți,
că adresa indicatorul, nu doar cu gunoaie, dar cu un număr de
care se întâmplă să reprezinte o adresă reală în memorie.
Care este implicarea, în mod logic? >> [Elev] Funcția este de gând să se întoarcă la un alt loc.
Exact.
Când se întoarce foo și hit-uri care bretele cret, programul este de gând să procedeze
nu pentru a reveni la principal, se va reveni la orice adresă este în cutie roșie.
>> În cazul înregistrării software-ului eluda,
Ce se întâmplă dacă adresa pe care a fost returnat este funcția care în mod normal este chemat
după ce ați plătit pentru software-ul și introduse codul de inregistrare?
Aveți posibilitatea să sortați de truc calculatorului în care nu merg aici, ci merge aici.
Sau daca esti cu adevarat inteligent, un adversar poate tastezi in la tastatură, de exemplu,
nu este un cuvânt real, nu 20 de caractere, dar să presupunem că el sau ea de fapt tipurile din
unele caractere care reprezintă codul.
Și nu va fi cod C, este de fapt va fi caracterele
care reprezintă cod mașină, 0s și 1s.
Dar să presupunem că acestea sunt suficient de inteligent pentru a face acest lucru,
pentru a lipi cumva în ceva promptul getString care este în esență cod compilat,
iar ultimele 4 octeți suprascrie acea adresă retur.
Și ce adresă are ca intrare face?
Este de fapt stochează în acest dreptunghi roșu adresa primul octet de tampon.
Deci, va trebui să fie cu adevărat inteligent, iar acest lucru este o mulțime de studiu și de eroare pentru oameni răi acolo,
dar dacă vă puteți da seama cât de mare acest buffer este
astfel încât octeți în ultimele câteva intrare le furnizați la programul de
se întâmplă să fie echivalentă cu adresa de start de tampon, puteți face acest lucru.
Dacă spunem că în mod normal, salut și \ 0, asta e ceea ce se termină până în tampon.
Dar dacă suntem mai inteligent și am umple acel buffer cu ceea ce vom numi generic codul de atac -
AAA, atac, atac, atac - în cazul în care acest lucru este doar ceva care face ceva rău,
ce se intampla daca esti cu adevarat inteligent, s-ar putea face acest lucru.
În caseta roșie aici este o secvență de numere - 80, C0, 35, 08.
Observați că se potrivește cu numărul pe care-i treaba aici.
E în ordine inversă, dar mai multe despre aceasta altă dată.
Observați că această adresă de retur a fost în mod deliberat modificat
la egal adresa aici, nu adresa de principal.
Deci, dacă cel rău este super inteligent, el sau ea este de gând să includă în acest cod de atac
ceva de genul ștergeți toate fișierele utilizatorului sau copiați parolele
sau să creați un cont de utilizator pe care le pot autentifica, apoi să - nimic, la toate.
>> Și acest lucru este atât pericolul și puterea lui C.
Pentru că ai acces la memorie prin pointeri
și, prin urmare, puteți scrie orice vrei în memoria unui computer,
puteti face un calculator face orice vrei
pur și simplu prin faptul că sari în jurul valorii de în spațiul său de memorie proprie.
Și așa la această zi atât de multe programe și site-uri atât de multe încât sunt compromise
fierbe în jos la oameni care profită de acest lucru.
Și acest lucru ar putea parea un atac sofisticat super, dar nu pornește întotdeauna așa.
Realitatea este că ceea ce oamenii răi vor face de obicei, este,
indiferent dacă este un program la o linie de comandă sau a unui program de GUI sau un site web,
începi furnizarea de prostii.
Tastați într-un cuvânt cu adevărat mare în câmpul de căutare și apăsați pe Enter,
și vă așteptați să vedeți dacă site-ul se blochează
sau astepti pentru a vedea dacă programul se manifestă unele mesaj de eroare
pentru că, dacă ai noroc ca tipul cel rău și vă oferim unele de intrare nebun
că blochează programul, asta înseamnă programator nu a anticipa comportamentul rău,
ceea ce înseamnă că puteți, probabil, cu un efort destul de, studiu și destul de eroare,
dau seama cum să ducă un atac mult mai precis.
Deci, la fel de mult o parte din securitate nu este doar evitarea acestor atacuri totul
dar să le detecteze și de fapt, se uită la Busteni
și văzând ce avea intrări nebuni oameni tastate in site-ul dvs.,
ce termeni de căutare au oamenii introdus în site-ul dvs.
în speranța de a debordant-un buffer.
Și toate astea se reduce la elementele de bază a ceea ce este simplu o matrice
și ce înseamnă să aloce și de a folosi memoria.
>> Legat de faptul că, atunci este de asemenea prezenta.
Hai arunca o privire doar în interiorul unui hard disk nou.
Vă amintiți de la o săptămână sau două în urmă că, atunci când trageți fișierele în coșul de reciclare sau coș de gunoi,
ce se intampla? >> [Elev] Nimic. Absolut nimic >>, nu?
În cele din urmă, dacă aveți puțin spațiu pe disc,
Windows sau Mac OS va începe ștergerea fișierelor pentru tine.
Dar, dacă vă trageți ceva acolo, care nu este deloc sigur.
Toate colegul tău de cameră sau un prieten sau membru de familie trebuie să faceți este să faceți dublu clic pe și, voila,
există toate fișierele schematice pe care ați încercat să le ștergeți.
Cei mai mulți dintre noi, cel puțin știu că trebuie să faceți clic dreapta sau Control clic
și gol coșul de gunoi sau ceva de genul asta.
Dar chiar și atunci, care nu face destul truc
pentru că ceea ce se întâmplă atunci când aveți un fișier de pe hard disk
care reprezintă o parte sau un document Word JPEG, iar acest lucru reprezintă hard disk,
și să spunem că această țeapă aici reprezintă acel dosar,
si este compus dintr-o grămadă de 0s și 1s.
Ce se întâmplă atunci când nu vă trageți numai acel fișier în coșul de gunoi poate sau coșul de gunoi
dar, de asemenea, goliți-l? Un fel de nimic.
Nu e absolut nimic acum.
Acum e doar nimic pentru că ceva se întâmplă în formă de tabel.
Deci, există un fel de bază de date sau tabel în interiorul memoriei unui computer
care are în esență, o coloană pentru fișiere "nume și o coloană pentru fișierele" Locul de amplasare,
în cazul în care aceasta ar putea fi locatia 123, doar un număr aleatoriu.
Deci, am putea avea ceva de genul x.jpeg și locația 123.
Ce se întâmplă atunci când goliți de fapt, gunoiul?
Asta dispare.
Dar ceea ce nu merge mai departe este de 0s și 1s.
>> Deci, ce e, apoi conexiunea la pset4?
Ei bine, cu pset4, doar pentru că am șters accidental card flash compact
care a avut toate aceste fotografii sau doar pentru că de ghinion a devenit corupt
nu înseamnă că 0s și 1s nu sunt încă acolo.
Poate câteva dintre ele sunt pierdute pentru că ceva a fost corupt
în sensul că unii au devenit 0s 1s 1s și a devenit 0s.
Lucruri rele se pot întâmpla din cauza software-ului sau hardware-ul defect buggy.
Dar multe dintre aceste biți, poate chiar 100% dintre ei, sunt încă acolo.
E doar faptul că calculatorul sau aparatul foto nu știe unde a început JPEG1
și în cazul în care JPEG2 început.
Dar dacă tu, programator, știu cu un pic de pricepere în cazul în care aceste JPEG sunt
sau ceea ce arata ca, astfel încât să puteți analiza JPEG 0s și 1s și spun, JPEG,
puteți scrie un program cu esență, doar o buclă în timp ce pentru sau
care recupereaza fiecare dintre aceste fișiere.
Deci, lecția, atunci este de a începe ștergerea în siguranță fișierele
dacă doriți, pentru a evita asta cu totul. Da.
>> [Elev] Cum se spune pe computer
că aveți mai multă memorie decât ai făcut-o înainte?
Au mai multă memorie decât ai făcut-o înainte - >> [elev] Mai multă memorie disponibilă.
Oh. Bună întrebare.
Deci, de ce atunci, după golirea de gunoi nu computerul să vă spun
că aveți mai mult spațiu liber decât ai făcut-o înainte?
Într-un cuvânt, pentru că minte.
Mai multe punct de vedere tehnic, voi aveti mai mult spațiu pentru că acum ați spus
poti pune alte lucruri în cazul în care dosarul a fost odata.
Dar asta nu inseamna ca bitii de gând departe,
și asta nu inseamna ca bitii sunt schimbate la toate 0s, de exemplu,
pentru protecția dumneavoastră.
Deci, prin contrast, dacă ștergeți în siguranță fișierele sau fizic distruge aparatul,
că într-adevăr este singura cale, uneori, în jurul valorii de asta.
>> Deci, de ce să nu lăsăm pe această notă semi-înfricoșător, iar noi te vom vedea pe luni.
[Aplauze]
>> [CS50.TV]