[Predvajanja glasbe] DAVID J. Malan V redu. [SMEH] Dobrodošel nazaj. To je CS50. In to konec petih teden. In do sedaj, smo precej jemala za samoumevno, da obstaja obstaja ta prevajalnik, Zvoka, ki ste se sklicuje na podlagi tega drugo orodje, imenovano Poskrbite, da nekako čudežno pretvori izvorno kodo v objektni kodi, ničel in enic da je vaš računalnik CPU, centralno procesna enota, dejansko razume. Vendar se izkaže, da je številka, ki je dogaja pod pokrovom v med vhodom in izhodom. In bi rad predlagal, da meso da v malo bolj podrobno v Ti štirje koraki, je nekaj, kar ti predobdelavo, kaj imenujemo združevanje, kar smo videli, nekaj, kar se imenuje montažo in nekaj, kar se imenuje povezovanje. Torej, do sedaj, v nekaterih naših Programi, ki smo jih imeli oster vključuje. Pred kratkim smo imeli nekaj ostrih definira konstant. Tako se izkaže, da tiste stvari, ki imajo predpono razpršitve simbol ali Simbol funt, so pre-procesor direktive. To je samo fancy način rekel, da je vrstica kode, ki je dejansko pretvori v nekaj drugega, preden Računalnik celo poskušali spremeniti svoje Program v ničel in enic. Na primer, oster vključuje standarda I / O. H, precej preprosto pomeni iti naprej, zgrabite vsebino datotek stdio.h in jih prilepite tam. Torej brez ničle in enice na še te točke. To je res samo zamenjavo. In to je storil v času tako imenovane faza predobdelavo, ko dejansko vozijo Jek ali posebej Da v večini primerov. Torej, vse to se je dogajalo Prvi samodejno doslej. Sledi priprava korak. Vendar so nam poenostavljeno kompilacija. Prevajali programa v resnici pomeni, da vzemi od nekaj podobnega C, Izvorna koda smo bili pisno, navzdol za nekaj, kar se imenuje zbor. Jezik zbor je na nižji ravni jezik, ki je, na srečo, ne bomo so veliko priložnost napisati ta semester. Ampak to je na najnižji ravni v Občutek, da ste dobesedno začnete pisati dodajajo ali odvzemajo in množijo in obremenitev iz spomina in shranite v spomin, Zelo osnovna navodila, da računalnik, Pod pokrovom motorja, dejansko razume. Končno, montaža nesramno jezik na ničel in enic, ki smo bili opisovanju doslej. In res zadnjič, da je tako imenovani povezovanje fazo, ki bomo glej vsak trenutek, ki združuje vaše ničle in enice z ničlami ​​in tisti drugi ljudje pred ki ste jih ustvarili. Tako da je to super preprost program. Bilo je iz tedna 1. Prav tako je dejal, Hello World, na zaslonu. To smo tekel skozi Jek. Ali smo tekel je skozi Znamka ki je potekal Jek. In outputted takrat, kadar nekateri ničle in enice. Vendar se izkaže, da je vmesni korak. Če grem tja - ups, ni rad bi ga videl še. Če grem tukaj v mojo naprave in sem odprla hello.c, tukaj je, da je isti program. In kaj bom naredil v mojem terminalu okno, tukaj se bom teči Jek namesto Znamka, ki avtomatizira vse štiri omenjeni koraki za nas. In bom naredil Jek-S in potem hello.c in nato enter. In dobim utripa hitro enkrat, kar je dobro. In zdaj v nekoliko večjem oknu Grem odpreti gedit tukaj. In jaz bom odpreti datoteko, da, Izkazalo se je, se imenuje hello.s to vsebuje to zbirni jezik Sem prej omenil. In to je tisto, kar se imenuje skupščina jezik, dokaj nizka stopnja navodila, ki vam Intel CPU ali karkoli že je, da je notri razume. In mov je za potezo. Razpis je namenjen kliče, funkcijo zelo nizki ravni. sub je za odštevanje. Torej, če imate posebno CPU v notranjosti vašega računalnika, zaradi česar je različni, v primerjavi z drugimi procesorjev na trg, ki je navodila za to razume in pogosto, kako učinkovit je je, kako hitro je pri izvajanju del teh navodil. Zdaj več o tem, si lahko Naslednja Fall CS61 na šoli. Ampak tukaj smo, na primer, nekaj identifikatorje, ki bi zgledal seznanjeni. hello.c je ime programa. . Besedilo - ni veliko zanimanja ni šele zdaj, opozarjajo, da besedilo Segment, kot v ponedeljek, je, če v Pomnilnik vaš program dejansko konča. Tako da je vsaj nejasno ni znano. Pri tem je seveda omenjena naše glavno funkcijo. Drsenje navzdol, ti se nanašajo na stvari ti registri, zelo majhne kose spomin znotraj vašega dejanskega CPU. In če sem se pomaknite navzdol celo še vidim neko posredna omemba ASCII. In tam, res je, da niz Pozdravljeni, vejica, svet. Tako da skrajšam zgodbo, je bilo to dogaja za vami, samodejno, Pod pokrovom vsem tem času. In kaj je bilo v resnici dogaja, ko ste teči Jek, ali z Poskrbite, da ste najprej dobili, iz izvorne kode, tako imenovani zbirni jezik. Potem je Jek pretvarjanjem te skupščine jezik do ničel in enic. In to je stran, ki smo začeli naša razprava v tednu 0 o - in nato teden 1 naprej. In potem končno, tisti ničle in enice so v kombinaciji z ničle in enice od teh knjižnic smo bili ob za samoumevne, kot so Standard I / O ali Niz knjižnica ali celo CS50 knjižnica. Torej slikati to sliko več vizualno, imamo hello.c. In to seveda uporablja printf deluje reči, zdravo svet. Korak kompilacija odnese navzdol da datoteka smo pravkar videli hello.s, čeprav čeprav to je tipično črta Za vas samodejno. Ampak to je koda montaža v srednjem koraku. In potem, ko smo sestavite sklop jezik, tako rekoč, da je, ko ste dobili tiste ničle in enice. Tako smo v povečani dejansko danes na kar smo jemali za samoumevno, pomeni dogaja izvorno kodo do ugovora kodo. Ampak na koncu, zdaj, ista slika - dajmo se posloviš prenesejo leva stran. In ne pozabite, da na vrhu ni Omenil sem stdio.h. To je datoteka, ki smo vključeni v skoraj vseh Programi, ki smo jih napisali. In to je datoteka, katere vsebina se prilepili kopija, učinkovito vrhu kodo. Ampak se je izkazalo, da je na računalniku Sistem nekje, tam je menda stdio.c datoteke, da je nekdo napisal leta nazaj, da izvaja vse Naloge, ki so bile razglašene v stdio.h. Zdaj v resnici je to verjetno ni na vaš Mac ali osebni računalnik, ali celo v CS50 aparat surovo kodo C. Nekdo je že zbrani in vključeni . O datoteko za objektni kodi ali. datoteke, ki se nanaša na skupni knjižnici , ki je bil predhodno nameščen in predhodno pripravijo za vas. Recimo, da je dejansko obstaja na našem računalniku stdio.c vzporedno z Jek. Kodo, ki je sestavljen in sestavljeni. stdio.c je koda, ki se zbirajo in sestavljeni tako, da prav ta zadnja korak, tukaj moramo nekako povezave, tako rekoč, vaši ničle in enice s svojo ničel in enic v enem preprost program, ki je navsezadnje imenovana le Pozdravljeni. Tako, da je vse od magije, ki je se je dogajalo doslej. In bo še naprej ti Postopki za odobreno, vendar zavedaš tam je veliko sočnih podrobnosti dogaja tukaj spodaj. In to je tisto, kar naredi vaše računalnik z Intel notranjosti predvsem različni. Torej na tej opombi, če bi želeli Pridružite se nam na kosilo v petek, to go na običajnem mestu cs50.net/rsvp, 13:15 ta petek. In zdaj nekaj objav. Tako da imamo nekaj dobrih novic. In imamo slabe novice. Začnite z dobrimi novicami tukaj. [Stoka] Vse je v redu. No, to je tehnično praznik, tako to ni tako veliko darilo od nas. Ampak potem slaba novica seveda. [Stoka] Veliko časa sem preživel na teh animacij. [SMEH] Tam se bo zasedanje pregled ta prihaja v ponedeljek. To se dogaja, da se ob 05:30. Mi vas bo spomnil vseh teh podrobnosti po elektronski pošti na tečaj je Spletna stran v samo nekaj dni časa. To bo posnet in na voljo kmalu zatem. Torej, če ne morete narediti, da je ponedeljek noč slot, ne skrbite. Oddelki to prihaja teden bo tudi osredotočiti na pregledu za kviz. Če je vaš oddelek je v ponedeljek, ki je res univerza počitnice, bomo Še vedno sestajajo v oddelku. Če ste preprosto ne more, da oddelek, saj boste proč, da je v redu. Udeležite se v nedeljo ali torek odsek ali tune-v razdelek Jasona, ki je na voljo na spletu. Torej, bolj slabe novice. Torej, v skladu z učnim načrtom, imamo predavanje naslednji petek. Ampak dobra novica - jasno je, da sem porabil preveč časa za to. [SMEH] Poleg predavanj v petek bomo preklicati. Tako da bo darilo za nas, tako da boste lahko res lepo predaha v med tem tednu do dveh tednov od tod. Tako da ni predavanja naslednji teden, samo majhen mali kviz, za katere si je treba postaja vedno bolj navdušena. Torej, kaj je zdaj pa našo pozornost nekaj, kar je res bolj vizualna in bolj razburljivo in določiti stopnjo za to, kar se dogaja, da se na obzorju V samo nekaj tednov časa. Po prvem kvizu, bomo pa osredotočiti naših problemskih sklopov v drugo domena poseben problem, da od forenzika ali varnostnih bolj na splošno. V bistvu, tradicija s tem problemom Niz je zame eden poučevanje kolegi ali CAS hoditi po kampus ob nekaj fotografij razpoznavna, vendar brez očitnih ljudi, krajev ali stvari, potem vsako leto sem nekako uspelo, da izbrišete ali poškodujete digitalne pomnilniške kartice da je znotraj našega fotoaparata. Ampak nič posebnega. Lahko grem naprej in priključite da v mojem računalniku. Lahko bi forenzične podobo tega, da govoriti, s kopiranjem ničle in tisti off te pomnilniško kartico, bodisi njegova SD kartico ali kartico Compact Flash ali karkoli ste seznanjeni s. In potem bomo lahko predali da ven. In tako izziv, med drugim stvari za vas, bo za pisanje C koda, ki okreva cel kup JPEG za mano in pokazala se bo tisti ljudje, kraji ali stvari. In bomo tudi govorili, da ta problem nastavljena in v dneh, ki prihajajo, o Grafika je bolj na splošno. Mi smo jih uporabljali, tečaj, za izbruhnejo. Vendar ste nekako samoumevno obstaja ti pojmi na visoki ravni kvadratkov in ovala. Ampak pod pokrovom obstajajo pik. In ste morali začeti razmišljanja o njih. Ali boste za p-set 4 razmišljati o razliki med vašim opeke, kako Hitro ste se žoga letela čez zaslon za izbruhnejo. Tako da je ta pojem pike na zaslonu, ki je pridejo v poštev že. Kaj zdaj vidiš, čeprav je kaj prideš na računalniškem zaslonu. Če ste kdaj gledali nekaj dobrega ali slab TV, odds so precej zdravljenje občinstvo kot technophobes , ki v resnici ne vem veliko o računalništvu. In tako je zelo enostaven za policijo detektiv reči, lahko poskrbel, da za mene? Ali okrepiti, kajne? Okrepiti je kot buzz besedo Najbolj vsaka predstava povezan kriminal. In realnost je, če ste vzeli zelo zamegljena slika osumljenca početje nekaj slabega, ne moreš samo poveča. Ne morete povečati neskončno. Ne morete videti v sijočimi od nekdo oči, ki so se zavezali, da Zlasti kriminal, kljub Prevalenca tega na TV. In tako s tem pa motivirati, da prihajajoči problem določijo s pogled na nekateri kažejo s katero boste seznanjeni. [Predvajanje videa] -V redu. Zdaj pa bi dobili dober pogled na vas. Jo-Drži. Teči nazaj. -Čakaj malo. Pojdi desno. -Tukaj je. Zamrzne, da. -Cel zaslon. -V redu. Zamrzne, da. -Privijte na to, bo ya? -Vektor na navedenem tipu z zadnje kolo. -Zoom tukaj na tem mestu. -S pravo opremo, posnel se lahko poveča in oster. Kaj je to? -To je program za izboljšanje. -Ali lahko jasno, da se vse? -Ne vem. Dajmo ga izboljšali. -Stopnjevati oddelek-6. -I povečala podrobnosti in - -Mislim, da je dovolj, da se poveča. Ga spustite na mojem zaslonu. -Povečati odsev v očeh. -Naj teče skozi to video opremo. -Edgar, lahko poveča to? -Drži. So-Sedaj sem se vrnil delajo podlagi tega razmisleka. -Nekdo je refleksija. -Reflection. -Tam je odraz od moškega obraza. -Refleksija. -Tam je refleksija. -Zoom v na ogledalu. -Lahko vidim odsev. -Ali lahko izboljšali podobo od tukaj? -Ga lahko poveča tukaj? -Lahko ga izboljšali? -Lahko ga izboljšali? -Se lahko poveča to? -Lahko ga izboljšali? -Počakaj trenutek, bom okrepitev. -Zoom na na vrata. -X10. -Zoom. [SMEH] -Pojdi noter -Čakaj, ustavi. -Nehaj. Jo-premor. -Zavrti za 75 stopinj okrog vertikalni prosim. [SMEH] -Stop in nazaj na delu o vratih znova. -Imam sliko ojačevalec da lahko bitne slike? Mogoče bomo lahko uporabite Pradeep Sen Metoda videti v oknih. -Ta programska oprema je stanje tehnike. -Vrednost ikona je izklopljen. -S pravo kombinacijo algoritmov. -Vzel je osvetlitev algoritmov Naslednja raven in da jih lahko uporabijo za izboljšanje tega fotografijo. -Lock naprej in povečati z-osi. -Stopnjevati. -Stopnjevati. -Stopnjevati. -Freeze in okrepiti. [END predvajanje videa] DAVID J. Malan: Torej Problem Set 5 je tisto, kar nas čaka tam. Tako da bomo kmalu dobili boljše razumevanje o tem, kdaj in zakaj lahko in naše ni mogoče povečati na ta način. Ampak najprej, kaj je vrniti našo pozornost nekatere od gradnikov bomo morajo biti sposobni povedati to zgodbo. Tako opozarjajo, da smo narisal to sliko Ponedeljek in malo prejšnji teden. In to opisuje postavitev stvari v spominu računalnika, ko teče nekaj program. Tech segmentu do vrha, odpoklic nanaša dejanskim ničel in enic da sestavite svoj program. Tam spodaj, da nekateri inicializiran ali nezačeto podatki, ki se običajno se nanaša na stvari, kot so konstante ali strune ali globalne spremenljivke, ki imajo bil najavljen. Tam je kup, ampak bomo prišli nazaj, da v nekaj. In potem je tu še kup. Podobno kot kup pladnjev v kavarno, to je, če spomin dobi večplastna in večplastna kadarkoli vam kaj v programu? Kaj je sklad za uporabo? Ja? Pokličite funkcije. Vsak čas pokličete funkcijo, to je dati IVer pomnilnika za njene lokalne spremenljivke ali njene parametre. In slikovno, vidimo, da je z vsakim zaporedne funkcija imenuje, ko klici B klici C D klice, ki jih se opira na kupu. In v vsako od teh rezine pomnilnik je v bistvu enotna obseg za to funkcijo, ki je seveda je problematično, če želite ročno iz ene funkcije na drugo kos podatkov, ki jo želite mutirajo ali spremeniti. Torej, kaj je naša rešitev, ki omogoča Funkcija za en kup zastopa okvir spremeniti spomin znotraj druge dimnika okvirja? Kako narediti teh dveh govoriti drug z drugim? Tako s pomočjo kazalcev ali naslovov, ki je spet le opisujejo kjer spomin, ki ga način specifična Številka ugriz, zlasti vrednost je mogoče najti. Torej spomnim zadnjič, ko smo tudi nadaljevali zgodbo in pogledal dokaj buggy programa. In ta program Otroški voziček za nekatere Razlogi, najbolj zaskrbljujoče je eden ker ne preverite, kaj? Ja, to ne uspe, da preverite vložek. Oprostite? Če je več kot 12 znakov. Tako zelo pametno, ko kliče memcopy, ki je, kot že ime pove, samo kopije pomnilnika od drugega argumenta v prvi argument. Tretji argument, zelo pametno, je preveriti, da se prepričajte, da ne boste kopirali več kot v tem primeru, dolžino v baru, število znakov, v okolici, ki je to matrika C. Ampak problem je, da tisto, kar če C sama po sebi ni dovolj velika zmogel? Boste kopirali število zlogov, da ste bili dani. Toda kaj dejansko imajo več zlogov, kot ga imajo prostor za? No, ta program zelo neumno samo slepo nadaljuje, da se ne glede na to je dana, zdravo backslash je 0 super, če je niz kratkih Dovolj, kot pet znakov. Ampak, če je to dejansko 12 znakov ali 1200 znakov, smo videli zadnjič da greš samo v celoti prepisati pomnilnika, ki ne pripada tebi. In v najslabšem primeru, če prepisati, da rdeči del je, da se imenuje povratni naslov - to je samo, če je računalnik samodejno, za vas, za prizori, tucks stran 32-bitna vrednost, ki ga spominja na to, kar naslov bi moral vrniti, ko foo to drugo funkcijo, poteka izvršitve. To je Prezla razpoloženje na katerega se vrne. Če prepisati, da je potencialno če si slab, lahko bi lahko prevzame nekdo računalnik. In boste prav gotovo crash v večini primerov. Zdaj se je ta problem še poslabšalo le ko smo začeli govoriti o spominu Upravljanje bolj na splošno. In malloc za dodeljevanje pomnilnika, je funkcije, ki jih lahko uporabite za dodelitev spomin, ko ne vemo vnaprej da bomo morda potrebovali nekaj. Tako, na primer, če grem nazaj na napravi tukaj. In sem odprla iz zadnjega časa hello2.c, spomni ta program tukaj, ki je izgledal Malo kaj takega, le tri linije - navesti svoje ime, nato pa niz, ime, Na levi strani je enaka getstring. In potem smo ga natisnite, ime uporabnika. Torej je bil to zelo preprost program. Da bo jasno, mi gredo naprej in se zdravo-2. Jaz bom naredil dot poševnica zdravo-2. Svoje ime - David. Enter. Pozdravljeni, David. Zdi se, da deluje v redu. Toda, kaj se v resnici dogaja Pod pokrovom tukaj? Najprej si lupine nazaj nekaj plasti. Niz je le sinonim smo jih spoznal za kaj? Char zvezda. Torej, da bi bilo malo bolj arcane ampak bolj tehnično pravilno, da se ta je znak zvezda, kar pomeni, da ime, ja, je spremenljiva. Ampak kaj ime trgovine je naslov char, ki meni malo čudno ker se bom vrnil niz. Grem nazaj več znakov ni znak. Seveda pa morate najprej le Naslov char je, da se spomnimo, kjer celoten niz je zato, ker zakaj? Kako si ugotoviti, kje konec Niz je vedeti začetek? Nagibnica nič. Torej, s tema dvema indicev vam razbrati Pred začetkom in koncem vsak niz so, v kolikor si ustrezno oblikovane s tem nična terminator, ki backslash nič. Toda to kliče getstring. In izkazalo se je, da getstring Ves ta čas je bil nekako varanje za nas. To je počel to dela, da se prepričate, pridobivanje niz od uporabnika. Ampak kje je ta spomin je prihajate? Če se vrnemo na sliki tu uporabljajo opredelitve iz pravkar Trenutek nazaj, da je sklad, kjer spomin gre, ko se funkcije imenujejo, po tej logiki, ko pokličete getstring, in potem sem tipa v D-A-V-I-D Vnašanje, pri čemer je D-A-V-I-D nagibnica nič shranjene na podlagi Zgodba nas smo povedali daleč? Zdi se, da je v dimnik, kajne? Ko pokličete dobili niz dobite malo rezino spomin na kupu. Tako da Razumno, da D--V-I-D Nagibnica nič se shrani tam na kupu. Toda počakaj malo, getstring donose da niz, tako rekoč, kar pomeni, je pladenj iz jedilnice je vzletelo stack. In mi je rekel zadnjič, da v najkrajšem možnem funkcija vrne in vas vzel pladenj, tako rekoč, off stack, kar lahko sklepate o ostankih da je spomin? Nekako sem jih redrew kot vprašaji ker so dejansko postala neznane vrednosti. Jih je mogoče ponovno uporabiti, ko nekateri Naslednja funkcija se imenuje. Z drugimi besedami, če se zgodi za shranjevanje - Pritegnil bom hiter sliko tukaj na kupu. Če se zgodi, da se pripravi na dno moje segmenta pomnilnika in bomo rekli, da je to mesto spomina z glavnim in morda arg c in zaseda arg proti in vse ostalo v programu, ko je getstring imenuje, predvidoma getstring dobi kos pomnilnika tukaj. Potem D-A-V-I-D nekako konča v to funkcijo. In jaz bom poenostavljam. Vendar predpostavimo, da je njena D-A-V-I-D backslash nič. Torej so to mnogi bajtov se uporabljajo v Okvir za getstring. Toda takoj, ko getstring donose, smo je dejal zadnji čas, da se ta spomin preko tu vse začne - woops! - Vse postane dejansko izbrisani. In lahko si to sedaj vprašanje znamke, ker kdo ve kaj se dogaja, da postanejo te spomin. Pravzaprav sem zelo pogosto imenujemo funkcije razen getstring. In takoj, ko sem poklical nekatere druge Funkcija kot getstring, morda ne v ta program smo pravkar pogledal ob toda nekatere druge, zagotovo nekatere druge funkcija morda na koncu dana to naslednji spot v dimnika. Zato ne more biti, da getstring trgovin D-A-V-I-D na sklad ker bi takoj izgubijo dostop do njega. Vendar vemo, da so getstring Samo vrne kaj? To se ne vračajo me šest znakov. Kaj je resnično vrača ni zaključimo zadnjič? Naslov prvega. Tako nekako, ko si poklical getstring, to je dodeljevanje kos pomnilnika niz, ki uporabnikom tip in nato vrnejo naslov njo. In izkazalo se je, da če želite, da deluje dodeliti pomnilnika v to pot in se vrniti na osebo, ki se imenuje ki delujejo, naslov da je kos pomnilnika, morate nujno ne more dati v sklad na dno, saj je le funkcionalno dogaja, da ne postane tvoja zelo hitro, tako da boste verjetno lahko uganiti, kjer bomo verjetno bo, da ga vržejo Namesto, ti kup. Torej med dnom vaš spomin je Postavitev in vrh tvoj spomin je Postavitev je cel kup segmentov. Ena je sklad, in prav nad njo je kup. In kup je le drugačen kos pomnilnika, ki je ne uporablja za funkcije ko si klical. To se uporablja za dolgoročnejši spomin, če hočeš eno funkcijo, da zgrabite nekatere spomin in biti sposoben, da visi na njem ne da bi izgubili nadzor nad njim. Zdaj si lahko morda takoj glej, da to ni nujno popoln videz. Kot je vaš program dodeljen spomin na sklad, ali pokličete bolj in več funkcij, ali so ti nameni spomin na kup s funkcije malloc off kot getstring počne, kar jasno Zdi se, da je neizogibna težava? Prav. Kot da te puščice obrnjena drug proti drugemu ne bode tudi. In res smo lahko zelo hitro crash Program v vsakem več načinov. V bistvu, mislim, da bi morali to storili pomotoma enkrat. Ali pa, če ne, dajmo namerno zdaj. Dovolite mi, da gredo naprej in pisati zelo hitro Program se imenuje dontdothis.c. In zdaj se bom tukaj v in Ne oster vključujejo stdio.h. Oglejmo razglasi funkcija foo traja nobenih argumentov, kar je označena tudi s praznino. In edina stvar, foo bo naredil, je klic foo, ki verjetno ne najpametnejša ideja, ampak tako je bilo. Ent glavni neveljavne. Zdaj je edina stvar, glavno se dogaja storiti je, da pokličete foo kot dobro. In samo za brcne, jaz grem naprej tu in reči printf "Pozdravljeni, iz foo. " OK. Torej, če nisem naredil nobene napake, Naredite dontdothis dot poševnice. In kaj je to v večjem oknu - dot slash, dontdothis. Daj no. Ojoj. Zdi se, da lahko to storite. Prekleto. OK. Počakaj. Stati. Sva - Nismo ga uporabljate z Naredi. [Vzdihi] Vem, ampak mislim, da mi šele izbrisati to. Uh, ja. Prekleto. Rešili ta Rob. Kaj je? To je zelo preprosto. Ja, smo se obrnili optimizacijo off. OK, stand adijo. Zdaj se počutim bolje. OK. Vse je v redu. Torej, kaj je to prevedem - Naredite si dontdothis. Morda boste morali preimenovati to dothis.c čez nekaj trenutkov. Takole. Hvala. OK. Torej dejstvo, da sem bil tiskanje kaj se je pravzaprav šele upočasnjuje postopek, s katerim bomo bi dosegli, da točka. OK. Fuj! Torej, kaj se dejansko dogaja? Razlog je, tako kot prahi, je storiti ničesar glede prispevkov in izhod kaže, da je počasnejši, ker ste morali napisati znake zaslon, ima za premikanje. Tako da skrajšam zgodbo, sem imel dejansko se je zgodilo tako nestrpni, bi morali to videli končni rezultat tudi. Zdaj, ko sem peljal od print-ups, bomo videli takoj. Torej, zakaj se to dogaja. No, preprosto razlaga seveda je, da foo verjetno ne bi se sama kliče. Sedaj na splošno, to je rekurzija. In smo mislili, da nekaj tednov Pred rekurzivni je dobro. Rekurzija je to čarobna način izražanje sebe super jedrnato. In to preprosto deluje. Vendar je ključna značilnost vseh rekurzivne programe smo govorili okoli in pogledal na doslej, ki je bila, da so imeli kaj? Osnovna ureditev, ki je nekaj težko kodirane zgodi, da omenjeni v nekaterih primerih ne kliči foo, kar je jasno ne v tem primeru. Torej, kaj se v resnici dogaja v smislu te slike? No, ko je glavna zahteva foo, da dobi svoj kos pomnilnika. Ko foo foo poziva, da postane rezina spomina. Ko foo foo zahteva, da dobi svoj kos. To postane rezino. To postane rezino. Ker foo se nikoli ne vrne. Mi nikoli ne izbriše eno od tistih okvirji iz dimnika. Torej smo piha skozi kup, ni omenjam, kdo ve kaj drugega, in smo prekoračila naših ti segment pomnilnika. Napaka iti segmentacija napačen. Torej rešitve ni očitno ne počni tega. Vendar večje posledice je to, da, ni nujno nekaj omejitev, tudi če je ne dobro opredeljene, o tem, kako številne funkcije, ki jih lahko pokličete na Program, kolikokrat funkcija sama lahko pokličete. Torej, čeprav smo pridigajo rekurzijo kot je to potencialno čarobna stvar Pred nekaj tedni za SIGMA funkcijo, in ko bomo dobili podatke strukture in CS50, boste videli drugo aplikacije za to, da je ni nujno najboljša stvar. Ker če sama funkcija zahteva, se zahteva, tudi če je baza primeru, če ne udaril, da je osnovni primer za 1.000 klicev ali 10.000 klicev, ki jih da je čas, ste morda zmanjka prostora na svoj tako imenovani dimnik ter zadeti nekateri drugi segmenti pomnilnika. Tako da tudi to je oblika kompromis med eleganco ter med Robustnost vaša zlasti izvajanje. Torej obstaja še druga negativna ali en kavelj za kar smo počeli doslej. Ko sem poklical getstring - Naj gredo nazaj v Hello-2. Obvestilo, da kličem getstring, ki se vrača naslov. In trdimo, da je danes naslov Iz kup. In zdaj sem tiskanje niz na tem naslovu. Ampak mi nikoli pozval nasproti getstring. Nikoli nismo imeli, da calll funkcijo kot ungetstring, kjer si roko nazaj da spomin. Vendar odkrito povedano mi verjetno bi morala biti. Ker, če smo ostali sprašuje računalnik za spomin, in sicer s pomočjo nekoga, kot je getstring vendar ga ni nikoli vrnila, zagotovo , ki je preveč nedvomno povzročila Težave s katerimi smo zmanjkalo pomnilnika. In v resnici, lahko iščemo ti težave z novo orodje, katerega uporaba je malce skrivnosten na vrsto. Ampak naj gredo naprej in pljuskanje na zaslonu v nekaj trenutkov. Jaz grem naprej in zagon Valgrind s parametrom S prvim ukazom Argument linija je ime tega programa zdravo-2. In na žalost je to proizvodnja je atrociously kompleksna brez pravega razloga. Tako vidimo vso to zmešnjavo. David je navedeno moje ime. Torej, to je program, dejansko deluje. In zdaj smo dobili ta rezultat. Torej Valgrind je podoben v duhu GDB. To ni iskanje in odpravljanje napak po sebi. Ampak to je spomin skladiščnik. To je program, ki bo teči vaš programirati, in vam povem, če si vprašal Računalnik za spomin in nikoli ne preda nazaj, kar pomeni, da imate pomnilnika. In spomin razpoka ponavadi slabo. In ti se uporabniki računalnikov so Verjetno menilo, da to, ali imate Mac ali PC. Ste že kdaj uporabljali računalnik medtem ko je rebooted in ne v več dni, ali pa ste pravkar dobil veliko programov teče, in prekleto stvar upočasni za brušenje zaustaviti ali vsaj to je zelo moteč za uporabo, saj vse, kar je pravkar dobil zelo počasi. Zdaj lahko poljubno število razlogov. To bi lahko neskončno zanko, napaka v Koda nekoga, ali, bolj preprosto, da lahko pomeni, da ste z uporabo več spomin, ali poskuša, kot je vaša Računalnik dejansko ima. In morda je napaka v nekem programu ki vodijo prosi za spomin. Brskalniki za let, je bila znana po to zahtevajo več in več pomnilnika ampak nikoli ne predajo nazaj. Seveda, če imate samo omejeno količino pomnilnika, ne morete zahtevati neskončno veliko časa za nekaj tega pomnilnika. In tako kar vidite tukaj, čeprav spet izhod Valgrind je nepotrebnem zapletena, da pogled na Prvič, to je zanimiv del. Kopica - v uporabi pri izhodu. Torej, tukaj je, koliko pomnilnika je v uporabi v kup na Čas moj program izstopilo - navidezno šest zlogov v enem bloku. Torej bom pomahati moje roke na kakšen blok. Pomislite na to je samo kos, več Tehnična beseda za kos. Ampak šest zlogov - kaj so šest zlogov, da so še vedno v uporabi? Točno tako. D-A-V-I-D nagibnica nič, pet črka Ime plus null terminator. Torej Valgrind ta program opazila, da sem prosil za šest bajtov, očitno, ga način getstring, vendar nikoli jih dal nazaj. In v resnici, to ne bi bilo tako očitno, če moj program ne tri linije, ampak to je 300 vrstic. Tako bomo lahko dejansko dal drug ukaz Argument linijo za Valgrind za bi bilo bolj zgovorni. To je malce nadležno, da se spomnimo. Ampak, če jaz - poglejmo. Pušča - Je bilo uhajanje - tudi jaz se ne spomnim kaj je to off roko. - Uhajanje-ček enak poln. Ja, hvala. - Uhajanje-ček enak poln. Enter. Isti program teče. Ponovno vnesite Davida. Zdaj vidim malo več podrobnosti. Vendar pod povzetka kopice, ki je enak štiri - ah, To je res super. Sedaj Valgrind je dejansko iščejo malo težje v mojo kodo. In to je rekel, da je očitno, malloc na liniji - smo pomanjšati. Na linija - ne bomo videli, kaj linija je. Ampak malloc je prvi krivec. Tam je blog v funkcije malloc. Vse v redu? OK, ne. Kajne? Poklical sem getstring. getstring očitno kliče malloc. Torej, kaj vrstica kode je očitno kriv za ob dodeljena ta spomin? Denimo, da kdor je napisal malloc je že dovolj dolgo, da je ni njihova krivda. Tako da je verjetno moja. getstring v cs50.c - tako, da je datoteko nekje na računalniku - v skladu 286 izgleda krivec. Predpostavimo, da je bilo CS50 približno za dostojno količino časa, tako da tudi mi, so nezmotljivi. In tako je to verjetno ni v getstring da leži napako, ampak v Zdravo-2.c vrstica 18. Torej, kaj si oglejte kaj je bilo, da je linija 18. Oh. Nekako ta vrstica ni nujno vozičkom po sebi, vendar je razlog za ta spomin razpoka. Tako zelo preprosto, kaj bi intuitivno je rešitev tukaj? Če smo prosi za spomin, niso nikoli se vrača, in da izgleda problem, ker se sčasoma moj računalnik Morda je zmanjkalo pomnilnika, lahko upočasnijo navzdol, se lahko zgodijo slabe stvari, no, kaj je preprosta intuitivna rešitev? Dajte ga nazaj. Kako boste sprostili, da je spomin? No, na srečo je precej preprost samo reči prostega ime. In nikoli nismo storili že prej. Vendar pa lahko v bistvu zamislite brezplačno, kot nasprotje funkcije malloc. prost je nasprotje dodeljevanju pomnilnika. Torej, zdaj naj prevedem to. Naredite Hello-2. Dovolite mi, da jo ponovno zaženite. Zdravo-2 David. Tako se zdi, da deluje v na povsem enak način. Ampak, če se vrnem v Valgrind in ponovno zagnati da isti ukaz na moje novo pripravijo program tipkanje v mojem imenu kot prej - lepo. Kopica povzetek - v uporabi pri izstopu - nič bajtov nič blokih. In to je super lepo, vse kopičijo bloki so bili osvobojeni. Ni mogoče uhajanje. Torej prihaja, ne z Težava Set 4, vendar Problem Set 5, forenziki in naprej, bo to tudi postal Ukrep pravilnosti vašega Program, ali imate ali nimajo spomin razpoka. Ampak na srečo, ne samo, da lahko argumentira prek njih intuitivno, ki je verjetno, enostaven za manjše programe vendar težje za večje programe, Valgrind, za tiste večjih programov, vam lahko pomagajo ugotoviti Poseben problem. Toda obstaja še ena težava ki se lahko pojavijo. Dovolite mi, da to datoteko odprli tukaj, ki je, spet nekoliko preprost primer. Vendar naj se osredotoči na tisto, ta program ne. To se imenuje memory.c. Bomo objavili kasneje danes zip današnje izvorne kode. In opazil, da imam funkcijo imenovano f, ki traja nobenih argumentov in vrne ničesar. V skladu 20, sem očitno razglasitvi kazalec na int in to x kliče. Jaz sem dodeljevanje je donos vrednost funkcije malloc. In samo, da bo jasno, koliko bajtov am Jaz verjetno dobili nazaj od funkcije malloc v tej situaciji? Verjetno 40. Kje ste dobili, da je iz? No, če se spomnimo, da je int pogosto 4 bajte, vsaj v Naprava, 10 krat 4 je očitno 40. Torej je malloc vrnjena naslov kos spomina in shranjevanje, da končno obravnavo v x. Torej, da bo jasno, kaj potem se dogaja? No, naj preklopiti nazaj na naši sliki tukaj. Dovolite mi, ne samo potegniti dna računalnika spomin, naj gredo naprej in sestaviti celoten pravokotnik, predstavlja vse moje RAM-a. Bomo rekli, da sklad je na dnu. In tam je odsek besedila v se nezačeto podatkov. Ampak grem na abstraktno tistih druge stvari stran kot pika, dot dot. Grem, da se na to sklicuje kot kup na vrhu. Nato na dnu te slike, da predstavlja glavni, bom da ga rezine spomin na kupu. Za f, bom dal to rezino spomina na kupu. Zdaj moram posvetovati moj Izvorna koda znova. Kakšne so lokalne spremenljivke za glavne? Očitno nič, tako da je rezina učinkovito prazna ali sploh ne tako velika kot sem jo sestavi. Toda v f, imam lokalno spremenljivko, ki se imenuje x. Tako da sem šel naprej in da f kos pomnilnika, je x kliče. In zdaj malloc 10 krat 4, Torej funkcije malloc 40, kjer je to spomin prihajate? Mi smo ne sestavijo sliko Pred všeč. Vendar pa domnevam, da je to dejansko prihajajo iz tukaj, tako da ena, dva, tri, štiri, pet. In zdaj moram 40 od ​​teh. Torej bom naredil piko, dot, pika predlagati da obstaja še več pomnilnika vračali iz kup. Zdaj, kaj je naslov? Oglejmo izbrati naše samovoljno obravnavati kot vedno - Ox123, čeprav je verjetno, da bo da je nekaj povsem drugega. To je naslov prvega bajt pri spomin, da vas prosim za malloc. Torej, na kratko, enkrat liniji 20 izvaja, kaj je dobesedno shranjeni v X tukaj? Ox123. Ox123. In Ox je nezanimivo. To samo pomeni, tukaj je šestnajstiško število. Toda kaj je ključno je, da tisto, kar sem trgovino in x, ki je lokalna spremenljivka. Toda njegova vrsta podatkov, še enkrat, je naslov notr. No, jaz grem za shranjevanje Ox123. Ampak še enkrat, če je to malo preveč zapleteno nepotrebnem, če sem se pomaknete nazaj, smo lahko abstraktno to stran precej razumno in le, da je x kazalec na ta kos pomnilnika. OK. Zdaj je vprašanje na dlani je naslednja: - linija 21, se je izkazalo, je buggy. Zakaj? Oprostite? To nima - pravijo, da še enkrat. No, to ni zastonj. Tako da je drugi pa. Torej je ena pa posebej v vrstici 21. Točno tako. Ta preprosta vrstica kode je samo buffer overflow, varovalni prekoračitve. Varovalni pomeni samo kos pomnilnika. Ampak da kos pomnilnika z velikostjo 10, 10 cela števila, kar pomeni, če smo Indeks vanjo pomočjo skladenjsko sladkorja za matrične zapisu kvadrat nosilci, boste imeli dostop do x kotnik 0 x nosilec 1 x, Nosilec pika, dot, pika. x nosilec 9 je ena največjih. Torej, če naredim x nosilec 10, kjer je Jaz sem pravzaprav dogaja v spominu? No, če imam 10 int - kaj je dejansko pripravijo vse od teh tukaj. To je bila prva pet. Tukaj je pet drugih ints. Torej x nosilec 0 je tukaj. x nosilec 1 je tukaj. x nosilec 9 je tukaj. x nosilec 10 je tukaj, kar pomeni, da sem povedal, v skladu 21, računalnik naj Številka kje? Številka 0, kje? No, to je 0, ja. Ampak samo dejstvo, da je njena 0 je nekako naključje. To je lahko število 50, za vse nas skrbi. Vendar se trudimo, da bi ga pri x nosilca 10, ki je, če je to Vprašanje znamka je sestavljena, ki ni dobra stvar. Ta program bi lahko zelo dobro crash kot rezultat. Zdaj pa gremo naprej in videli, če je to je res, kaj se zgodi. Naredite spomin, saj datoteka se imenuje memory.c. Pojdimo naprej in zagon programski spomin. Torej imamo srečo, pravzaprav se zdi. Srečo imamo. Ampak, da vidimo, če smo zdaj teče Valgrind. Na prvi pogled se morda moj program Zdi se, da je popolnoma pravilna. Ampak naj teče Valgrind z - Uhajanje-ček enak poln spomin. In zdaj, ko sem teči ta - zanimivo. Neveljavna napisati velikosti 4 na linija 21 memory.c. Linija 21 memory.c je katera? Oh, zanimivo. Toda počakaj. Velikost 4, kaj je to nanaša? Sem samo, da je eden napisal, vendar je v velikosti 4. Zakaj je 4? To je zato, ker je int, ki je, spet, štiri bajte. Torej Valgrind našel napako, da sem, Že pogled na mojo kodo, ni. In morda vaš TF bi ali ne bi. Toda kaj, Valgrind zagotovo ugotovila, da smo naredili napako tam, čeprav čeprav imamo srečo, in računalnik odločil, eh, ne bom crash samo zato, ker si se dotaknil en bajt, en int je vredno spomina, ki ga ni dejansko sama. No, kaj je buggy tukaj. Naslov - To je noro videti naslov v šestnajstiškem. To samo pomeni, da nekje v kupu je nič bajtov bloka velikosti 40. je dodeljen. Dovolite mi, da povečate ven in videli, če To je malo bolj koristno. Zanimivo. 40 bajtov se dokončno izgubil v izgube zapis 1 od 1. Again, več besede kot je koristno tukaj. Ampak temelji na poudarjenih linij, če bi jaz verjetno osredotočiti moja pozornosti za drugo napako? Izgleda linijo 20 memory.c. Torej, če se vrnemo na liniji 20, ki je tisti, ki ste odkrili prej. In to ni nujno buggy. Vendar smo to obrnilo njegove učinke. Torej, kako popraviti vsaj ena od teh napak? Kaj lahko storim po vrstici 21? Kar sem lahko storil brez x, tako da se vračati ta pomnilnik. In kako popraviti to napako? Jaz bi definitivno šel ne dlje kot 0. Torej, kaj mi poskusite ponovno zagnati to. Oprostite, definitivno šel ne dlje kot 9. Naredite spomin. Naj se ponovi Valgrind v večjem oknu. In zdaj poglej. Lepo. Vse kopičijo bloki so bili osvobojeni. Ni mogoče uhajanje. In tam zgoraj tukaj, ni omembe več od neveljavnih desno. Samo da bi dobili pohlepni, in naj vidim, če en dokaz ne gre kot je bilo predvideno - Nisem dobil srečen trenutek nazaj. In dejstvo, da je to 0 je morda nepotrebnem zavajajoče. Reciva, ne 50, nekoliko arbitrarno število, znamka spomin dot poševnica spomin - Še vedno posreči. Nič treskav. Recimo, da sem naredil nekaj res neumno, in jaz 100. Dovolite mi, da remake spomin, dot slash spomin - spet imaš srečo. Kaj pa 1000? ints zunaj, v grobem, , kjer bi moral biti? Naredite spomin - prekleto. [SMEH] OK. Naj ne zafrkava več. Ponovitev spomin. Takole. Vse je v redu. Torej, očitno si indeks 100.000 ints tam, kjer bi si bila v spomin, slabe stvari se dogajajo. To je torej očitno ni trdo, hitro pravilo. Bil sem nekako s sojenja in napake, da bi dobili tam. Ampak to je zato, ker skrajšam zgodbo, pomnilnik računalnika je razdeljen tudi v teh stvareh imenovano segmente. Včasih, računalnik dejansko je dal malo več pomnilnika kot jo zahteva. Ampak za učinkovitost, to je samo lažje zaslužiti več pomnilnika, vendar vam povem le, da ste dobili del njega. In če imate srečo včasih, Zato boste morda lahko na dotik spomin, ki ne pripada vam. Imate nobenega jamstva, da je tisto, kar vrednost si dal tam bo ostal, ker računalnik še vedno misli, da je ne vi, ampak to ni nujno, da bo udaril drugega segmenta pomnilnika v računalnik in povzročijo napako kot tale tukaj. Vse je v redu. Vsa vprašanja potem na spomin? Vse je v redu. Oglejmo si oglejte tukaj in nato, ob Nekaj ​​smo jih jemljemo dodeli za kar nekaj časa, kar je v tej datoteki, imenovano cs50.h. Torej je to datoteka. To je samo cel kup za pripombe do vrha. In morda si gledal to, če si podrezal okoli na napravi. Vendar se izkaže, da ves čas, ko smo se uporabljajo za uporabo kot niz sinonim, sredstvo, s katerim smo prijavljeni , ki je bil sinonim s tem Ključna beseda typedef za opredelitev tipa. In smo v bistvu pravi, da obesil sinonim za char zvezdico. Da so sredstva, s katerimi sklad ustvaril te kolesa za usposabljanje, znane kot niz. Zdaj tukaj je samo prototip za getchar. Smo lahko videli prej, vendar je to res kaj počne. getchar bo nobenih argumentov, vrne znak. getdouble traja nobenih argumentov, vrne dvojno. getfloat je brez argumentov in vrne plovec, in tako naprej. getint je tukaj. getlonglong je tukaj. In getstring je tukaj. In to je to. Ta vijolična linija je ena preprocesor Direktiva zaradi hashtag na začetku tega. Vse je v redu. Torej, zdaj me spustili v cs50.c. In mi ne bo govoril predolgo na tem. Ampak, da vam pogled kaj je se dogaja vse to Čas, pusti me, da - naredimo getchar. Torej getchar je večinoma komentarjev. Ampak izgleda takole. To je torej dejansko funkcija getchar, da smo bili ob samoumevnega obstaja. In čeprav nismo tega uporabil pogosto, če sploh kdaj, to je vsaj dokaj preprost. Torej je vredno vzeti Hiter pogled na tukaj. Torej getchar ima neskončno zanko, namenoma tako očitno. Nato poziva - in to je nekako Lepo ponovna uporaba kode mi sami napisal. Poziva getstring. Ker kaj počne pomeni, da se zna? No, morda pa tudi poskušali dobiti celotna vrstica besedila od uporabnika in potem pa poglej na enem od teh znakov. V skladu 60, tukaj je malo malo za preverjanje razumnosti. Če getstring vrne null, naj ne nadaljuje. Nekaj ​​je šlo narobe. Zdaj je to nekoliko nadležno, vendar konvencionalno v C. char max verjetno predstavlja, kaj šele ki temelji na svoje ime? To je konstantna. To je kot številski vrednosti Največji znak lahko predstavljajo z en ugriz, kar je verjetno število 255, ki je največje število, ki ga predstavlja osem bitov, začenši od nič. Tako sem to uporabiti v tej funkciji, ko pisanje te kode, samo zato, ker če gre kaj narobe v getchar vendar njen cilj v življenju je, da se vrnete char, morate nekako mogli opozori, da uporabnik tega Nekaj ​​je šlo narobe. Ne moremo se vrniti nično. Izkaže se, da je nična kazalec. In spet, getchar ima Za vrnitev znak. Torej konvencija, če gre kaj narobe, ti, programer, ali V tem primeru mi s knjižnico, sem imel Samo odločiti samovoljno, če gre kaj narobe, bom vrne število 255, ki je resnično pomeni, da ni mogoče, uporabnik ne more tip lik, ki ga zastopa številka 255, ker smo imeli ukrasti kot ti divjega vrednosti do predstavljajo problem. Zdaj pa se izkaže, da narava 255 ni nekaj, kar lahko tip na tipkovnico, tako da to ni nič takega. Uporabnik ne opazi, da Sem ukradli ta znak. Ampak, če ste kdaj videli v man strani na računalniški sistem, nekateri sklic vsi pokrovčki konstanta, kot je ta, ki pravi, v primerih napak, ta konstanta se lahko treba vrniti, to je vse, nekaj ljudi pa Pred leti se je samovoljno odločil, da vrne to posebno vrednost in je stalnica v primeru pokličite gre kaj narobe. Zdaj se zgodi čarovnija tukaj. Najprej sem razglasitvi v skladu 67. dva znaka, C1 in C2. In potem se v skladu 68., tam je dejansko vrstica kode, ki je spominja naš prijatelj printf, saj je pa imajo odstotkov Cs v narekovajih. Ampak obvestilo, kaj se dogaja tukaj. sscanf pomeni niz skeniranje - pomeni skeniranje formatiran string, ergo sscanf. Kaj to pomeni? To pomeni, da preide na sscanf niz. In line je karkoli uporabnik vnese palcev Podaš na sscanf oblikovnega niza, kot to, da pove, kaj so scanf si upal uporabnik vtipka Nato se boste peljali, v naslovih dveh kose pomnilnika, v tem primeru, ker imam dve ogradi. Zato bom, tako da ima naslov C1 in C2 naslov. In spomni, da daš funkcija naslov neke spremenljivke, kaj je posledice? Kaj lahko storite, da funkcija kot rezultat od kar daje naslov spremenljivka, v nasprotju z spremenljivka sama? To se lahko spremeni, kajne? Če ste imeli nekoga karto za fizično naslov, lahko gredo tja in stori karkoli hočejo na tem naslovu. Isto idejo tukaj. Če se peljemo proti sscanf, naslov dveh kose pomnilnika, tudi ti drobni majhne kose pomnilnika, C1 in C2, vendar smo ji povedal naslov njimi, sscanf ga lahko spremenite. Torej namen sscanf v življenju, če beremo Stran človek, je, da se glasi, kaj Uporabnik vnesli, upanje za uporabnika, vnesli v lik in morda drug znak, in ne glede uporabnik vnesli, prvi znak gre tod drugo število gre tukaj. Zdaj pa je to, in bi jo kot prahi Samo to vedo iz dokumentacije, Dejstvo, da sem dal prazen prostor tam pomeni le, da mi ni mar, če uporabnik zadene preslednico nekaj krat, preden on ali ona prevzame lik, bom ignorirati vsak prazen prostor. Tako da, vem iz dokumentacijo. Dejstvo, da je drugi% c sledi prazen prostor dejansko namerno. Rad bi lahko zazna, če uporabnik zajebali ali niso sodelovale. Tako da sem upal, da Vtipkali le v enem značaja, zato sem upal, da sscanf je samo še, da se vrnete vrednost 1, ker, spet, če sem prebral dokumentacijo, sscanf je namen v življenje je, da se vrnete na število spremenljivke, ki so bile napolnjene s prispevki uporabnikov. Opravil sem v dveh spremenljivkah naslovi, C1 in C2. Upam pa, da je le eden od jih ubili zato, ker če sscanf vrne 2, kar je verjetno posledice logično? Da je uporabnik ne daj mi eno karakter, kot sem mu povedal, ali ona. Verjetno so vnesli na Najmanj dva znaka. Torej, če se namesto ni imel drugi % C, sem imela enega, ki Iskreno bi bilo bolj intuitivno Pristop, mislim, da je prvi pogled, vam ne bodo mogli odkriti če je bil uporabnik, ki vam daje več vhod, kot si dejansko želel. Torej, to je implicitna oblika za preverjanje napak. Ampak obvestilo, kaj delam tukaj. Ko sem prepričan, da mi je uporabnik dal eno lik, sem osvobodil črto, gre nasprotno getstring, kar uporablja malloc, nato pa se bom vrnil C1, znak, da sem upal uporabniku na voljo in samo pod pogojem. Samo tako hitro zagledali, vendar vsa vprašanja o getchar? Vrnili se bomo z nekaterimi drugimi. No, naj gredo naprej in to - Predvidevam sedaj, samo da bi motivirali naše Razprava na teden plus čas, to je datoteka z imenom structs.h. In spet, to je samo okus nekaj, kar je pred nami. Ampak obvestilo, da je veliko za ta komentar. Naj izpostaviti le Zanimiv del za zdaj. typedef - tam je to isto ključno besedo znova. typedef bomo uporabili prijaviti niz kot posebno vrsto podatkov. Lahko uporabite typedef ustvariti povsem novo tipi podatkov, ki niso obstajale, ko C je izumil. Na primer, int prihaja s C. char prihaja z dvojno C. prihaja s C. Ampak ni pojem študenta. In vendar bi bilo zelo koristno, da sposoben napisati program, ki shranjuje v spremenljivko, študentske številka, njihovo ime, in njihova hiša. Z drugimi besedami, tri kose podatkov, kot int in Niz in drugi niz. Z typedef, kar je precej močna O tem in o ključnih sturct za strukture, ti, programer v letu 2013, dejansko lahko določite sami tipi podatkov, ki niso obstajale let Pred ampak da bo ustrezala vašim namene. In tako tukaj, v vrsticah 13 do 19, smo razglasitvi nove vrste podatkov, kot so int, vendar je študent kliče. In znotraj te spremenljivke bo tri stvari - int, string, in niz. Torej si lahko zamislite, kaj je res zgodilo, čeprav to malo poenostavitve za danes, Študent se v bistvu dogaja da izgleda nekako takole. Njena bo kos Pomnilnik z ID, ime polje in hiša polje. In bomo lahko uporabljali te kose spomin in dostop do njih, kot sledi. Če grem v struct0.c, tukaj je relativno dolgo, vendar po vzorec kode, ki uporablja to nov trik. Torej, najprej, kaj me opozoril do zanimivih delov do vrha. Sharp opredeljuje učence 3, izjavlja stalne pozvali študente in zakoniti je poljubno število 3, samo tako da imam tri učence, ki uporabljajo ta program, za zdaj. Prihaja Main. In obvestilo, kako izjavljam, matrika študentov? No, jaz šele raba enako sintakso. Beseda študent je seveda novo. Ampak študent, razred, nosilec študentov. Torej, žal pa je veliko ponovne uporabe izrazov tukaj. To je samo številka. Torej, to je, kot pravi, tri. Razred je samo tisto, kar hočem poklicati spremenljivko. Jaz bi lahko študenti poklicati. A razred, to ni class objektno usmerjen Java nekakšen način. To je samo razred učencev. In podatkovni tip vsakega elementa V tem polju je študent. Tako da to je malo drugačna in od rekel nekaj kot je ta, da je samo - Pravim, da mi tri učence in klic, da matrično razred. Vse je v redu. Zdaj tukaj je štiri zanke. Ta tip je znano - Ponovil od nič na do tri. In tukaj je nov del sintakse. Program me bo poziv, človeka, da ga študent ID, ki je int. In tukaj je sintakso, s katero lahko shranite nekaj v ID polju na lokacija razred nosilec I. Tako Ta sintaksa ni nova. To samo pomeni, da mi osma učenec v razredu. Toda ta simbol je nova. Do sedaj smo ni mogoče uporabiti piko, vsaj v kodo, kot je ta. To pomeni, pojdite na struct znan kot študent, in dal nekaj tam. Podobno tudi novo vrstico, 31, gredo naprej in dal vse, kar uporabnik vnese za ime, tu in kaj delajo za Hiša, ista stvar, pojdi naprej in ga dal v. hišo. Torej, kaj je ta program na koncu naredil? Ogledate si lahko malo teaser tam. Dovolite mi, da gredo naprej in ne bo konstrukti 0 dot slash struct 0, študenta ID 1, pravi David Mather, študent ID 2. Rob Kirkland, študent ID 3. Lauren Leverit - in edina stvar ta program naredil, ki je ravno povsem samovoljno, je Želel sem narediti nekaj, s temi podatki, Zdaj, ko sem nas je naučila, kako uporabite konstrukti, je samo sem imel ta dodatna zanka tukaj. Ponovil sem nad paleto študentov. Včasih sem naše, morda zdaj znano prijatelja Niz primerjati, stircomp za Preverjanje je 8. študentska hiša enako Mather? In če je tako, samo natisniti nekaj samovoljno všeč, ja, res je. Ampak še enkrat, samo mi dali priložnosti za uporabo in ponovno uporabo in ponovno uporabo te nove dot zapis. Torej, koga briga, kajne? Prihaja s študentskim programa nekoliko arbitrarna, vendar se izkaže, da lahko naredimo uporabne stvari z ta, na primer na naslednji način. To je veliko bolj zapletena struct v C. je dobil ducat ali več polj, Nekoliko cryptically imenom. Ampak, če ste že kdaj slišali za grafiko format se imenuje bitna, BMP, je Izkazalo se je, da bitmap format precej Izgleda, da je to. To je neumno malo Smiley face. To je majhna slika, ki sem jih v povečani na zelo velika, tako da lahko vidim vsak posameznih pik ali pik. Zdaj pa se je izkazalo, da lahko predstavljajo črna pika z, recimo, številko 0.. In bela pika s številko 1. Torej, z drugimi besedami, če želite narisati Nasmejan obraz in shranite sliko v Računalnik je dovolj za shranjevanje ničel in tisti, ki izgledajo kot to, kje, še enkrat, pa so bela in ničle so črni. In skupaj, če ste dejansko imajo prepasajo enic in ničel, imate mrežo točk, in če določajo jih ven, imaš luštna Malo Smiley face. Zdaj, bitna format, BMP, je učinkovito, da je pod pokrovom motorja, vendar z več pik SOT, da lahko dejansko predstavljajo barve. Toda, če imate bolj zapletene formate, kot so BMP in JPEG in GIF s katerim si boste seznanjeni tisti, Datoteke ponavadi ne samo na disku imajo ničel in enic za pik, vendar imajo nekatere metapodatke, kot tudi - meta v smislu, da ni res Podatki vendar je koristno imeti. Torej ta polja so tukaj kar pomeni, in bomo to videli bolj podrobno v P-set v 5, da pred ničle in enice, ki predstavljajo pik v sliki, tam je kup metapodatkov, kot so velikost slike in širina slike. In opazil sem skubljenje off nekaj samovoljno stvari tukaj - širina in višina. Število bit in še nekatere druge stvari. Torej, obstaja nekaj metapodatkov v datoteki. Ampak z razumevanjem, kako so datoteke, ki jih se na ta način, lahko dejansko potem manipulirajo podobe, izterja slike iz diska, velikost slike. Ampak ne moreš nujno povečati njihovo. Potreboval sem fotografijo. Tako sem šel nazaj na RJ tukaj, ki ste videli Na zaslonu se kar nekaj časa nazaj. In če sem odprla Keynote tukaj, to je kaj se zgodi, če poskusite za povečavo in povečati RJ. On ne postaja nič bolj res. Zdaj Keynote je nekako zabrisane je malo, samo da bi zatajili Dejstvo, da RJ ne dobi posebno okrepljeno ko povečate palca In če to storite na ta način, glej kvadratke? Ja, lahko zagotovo videli kvadratki na projektorju. To je tisto, kar dobiš, ko poveča. Ampak v razumevanju, kako naša RJ ali Smeško se izvaja nam bo dovolil dejansko napisati kodo, ki manipulira te stvari. In mislil sem, da bom na koncu na to opombo, s 55 sekund poveča to je, Sem upal, recimo precej zavajajoče. [Predvajanje videa] -Laže. O čem, ne vem. -Torej, kaj vemo? -To je ob 9:15 Ray Santoya je bil na bankomatu. Torej vprašanje je, kaj je delal na 09:16? -Streljanje devet milimetrov V nekaj. Morda je videl ostrostrelca. -Ali pa je delal z njim. -Počakajte. Pojdi nazaj eno. -Kaj vidiš? Prinesi svoj obraz gor, celozaslonski način. -Njegova očala. -Tam je refleksija. -To je Neuvitas baseball ekipa. To je njihov logo. In govoril je, da kdor je nosil to jakno. [END predvajanje videa] DAVID J. Malan: To bo Problem je Set 5. Vam bomo videli naslednji teden. MALE SPEAKER: Na naslednjem CS50. [Črički Pojoči] [Predvajanja glasbe]