[Glazba svira] David J. Malan: U redu. [Smijeh] Dobrodošao natrag. Ovo je CS50. I to je kraj tjedna pet. I do sada, mi smo prilično mnogo uzimali zdravo za gotovo da ne postoji postoji ovaj prevodilac, jeka, da ste zazivajući je putem ovog drugi alat zove Provjerite da na neki način magično pretvoriti svoj izvorni kod u objektnom kodu, nula i one da je vaša računala CPU, central procesorska jedinica, zapravo razumije. No, ispostavilo se da postoji broj koji je događa ispod poklopca motora u između ulaznih i izlaznih. I ja bih predložiti da se meso da je u malo više detalja u ove četiri koraka, ima nešto što se zove predobrada, nešto zove sastavljanje, što smo vidjeli, nešto što se zove montaže i nešto što se zove povezivanja. Dakle, do sada, u nekim od naših programi, koje smo imali oštre uključuje. Nedavno smo imali neke oštre određuje za konstanti. Tako ispada da su one stvari koje prefiks ima hash simbol ili pound simbol su pre-procesor direktive. To je samo fancy način govoreći da je linija koda koji je zapravo pretvoriti u nešto drugo prije Računalo i pokušati pretvoriti tvoj Program u nule i jedinice. Na primjer, oštri uključuje standardne I / O. H, prilično jednostavno znači ići naprijed, zgrabite sadržaj datoteke stdio.h i zalijepite ih tamo. Dakle, nema nule i jedinice u tom trenutku još. To je zapravo samo zamjena. I to je učinio tijekom tzv predobrada fazi, kada zapravo pokrenuti jeka ili posebno Provjerite u većini slučajeva. Dakle, sve ovo što se događa Prvi automatski do sada. Tada dolazi kompilacije korak. No, mi smo bili pojednostavni Kompilacija. Izrada programa zapravo znači ga uzeti od nečega poput C, koda smo pisali, prema dolje za nešto što se zove sklop. Skupština jezik je niža razina jezik koji se, srećom, nećemo su mnogo prigoda za napisati ovaj semestar. Ali to je na najnižoj razini u Osjećaj da ste doslovno početi pisati dodavanje i oduzimanje i množenje i učitavanje iz sjećanja i spremiti u memoriju, vrlo osnovne upute koje računalo, ispod poklopca motora, zapravo razumije. Konačno, montaže se na taj jezik do nule i jedinice koje smo bili opisuje do sada. I doista na kraju, tu je takozvani povezivanja faza, koje ćemo vidjeti samo na trenutak, koji kombinira Vaši nule i jedinice s nulama i one druge ljude prije koje ste stvorili. Pa upravo ovaj super jednostavan program. To je iz tjedna 1. On je samo rekao, Hello World, na zaslonu. Trčali smo kroz ovu jeka. Ili smo trčali kroz to napraviti koji je vodio jeka. I reproduciraju u vremenu u kojem neke nule i jedinice. No, ispostavilo se da postoji međukorak. Ako idem ovamo - pardon, nije Želim ga vidjeti. Ako idem ovamo na moj aparat i ja otvoriti hello.c, ovdje je da isti program. A ono što ću učiniti u mojoj terminala Prozor ovdje ću pokrenuti Dong nego napraviti, što automatizira sve četiri ti koraci za nas. A ja ću učiniti Dong-S i onda hello.c a zatim ući. I sam se treptanje brz opet, što je dobro. I sada u malo veći prozor, Idem otvoriti gedit ovdje. A ja ću otvoriti datoteku da, Ispada, to se zove hello.s Sadrži ta skupština jezik Ja tekstu ranije. I to je ono što se zove montažu jezik, prilično niska razina Upute kako vaš Intel procesora ili što god to je da je unutra razumije. I mov je u pokretu. poziv za zovete, vrlo nisku razinu funkciju. sub je za oduzimanje. Dakle, kada imate posebnu CPU unutar vašeg računala, što ga čini različita, u odnosu na ostale na CPU na tržištu, što je to s uputama razumije i često koliko je učinkovita je, koliko brzo je to, na neki izvršavanju tih uputa. Sada za više o tome, što može potrajati Sljedeći Jesen CS61 na faksu. Ali ovdje imamo, primjerice, neke identifikatori koje bi moglo zvučati poznato. hello.c je ime programa. . Tekst - nema puno interesa postoji Upravo sada, podsjetiti da je tekst segmentu, od ponedjeljka, gdje je u memorije vaš program zapravo završava. Pa to je barem maglovito poznato postoji. Ovdje, naravno, spominje od naših glavnih funkcija. Pomicanje prema dolje, to se odnosi na stvari tzv registri, vrlo male komade memorije unutar svoje stvarne CPU. A ako sam se pomaknite prema dolje i dalje, vidim neku neizravna spomen ASCII. I tu, zapravo, da je string, Pozdrav, zarez, svijet. Pa ne duljimo, ovo je bio događa za vas, automatski, ispod poklopca motora sve ovo vrijeme. A što se događa kad je stvarno ste pokrenuti Dong, ili putem Provjerite, da ste dobivanje prva, iz izvornog koda, tzv. zbirni jezik. Tada je Dong pretvoriti ovaj sklop jezik do nule i jedinice. A to je slajd koji smo započeli Naša rasprava u tjednu na 0 - a zatim Tjedan 1 na. A onda na kraju, one nule i jedinice u kombinaciji s nulama i one s tim knjižnicama uzimamo zdravo za gotovo, kao što su standardno I / O ili Gudački knjižnica ili čak CS50 knjižnice. Dakle slikati ovu sliku više vizualno, imamo hello.c. I to, naravno, koristi printf funkcionirati reći, Hello World. Kompilacija korak to traje sve do file da smo upravo vidjeli hello.s, čak iako je to obično je izbrisan automatski za vas. Ali to je kod montaže u sredini koraku. I onda kad smo okupiti zbor jezik, da se tako izrazim, to je kada dobiti one nule i jedinice. Tako smo zumirani učinkovito i danas na ono što uzimamo zdravo za gotovo, znači ide izvorni kod objektnog koda. Ali na kraju, sad kad ista slika - idemo ga gurati preko lijeva strana. I imajte na umu da je u vrhu postoji Spomenuo sam stdio.h. To je datoteka koja smo uključeni u gotovo svim Programi koje smo napisali. I to je file čiji sadržaj dobiti primjerak zalijepili, učinkovito vrhu kodu. No, ispostavilo se da je, na računalu Sustav negdje, tu je vjerojatno stdio.c sliku da je netko pisao godina Prije koji provodi sve Funkcije koje su proglašene u stdio.h. Sada je u stvarnosti to je vjerojatno nije na Mac ili računalo ili čak u CS50 aparat je sirovo C koda. Netko ga već sastavljen i uključene . O datoteku za šifri objekta ili. file, koji se odnosi na zajedničko knjižnica koji je bio predinstaliran i već sastavio za vas. Ali pretpostavimo da doista postoji na našem računalu stdio.c u paralelne s jeka. Vaš broj je sastavljao i skupi. stdio.c je broj se sastaviti i skupi, tako da je ova posljednja korak, ovdje dolje, moramo nekako link, da se tako izrazim, vaši nule i jedinice njegova ili njezina jedinica i nula u jednom jednostavan program koji je u konačnici Pozdrav zove jednostavno. Dakle, to je sve od magije koja je se događalo do sada. I dalje će se to procesi zdravo za gotovo, ali shvatite postoji mnogo sočnih detalja događa ispod postoji. I to je ono što čini vaš računalo sa Intel Inside osobito razvijen. Tako na to, ako bi željeli pridružite nam se na ručku u petak, idu na uobičajenom mjestu cs50.net/rsvp, 13:15 ovog petka. A sada nekoliko najave. Dakle, imamo dobre vijesti. I mi imamo neke loše vijesti. Počnite s nekim dobrim vijestima ovdje. [Stenjao] U redu. Pa, to je tehnički odmor, tako da to nije toliko dar od nas. Ali onda loše vijesti, naravno. [Stenjao] Proveo sam puno vremena na ove animacije. [Smijeh] Tu će biti sjednica recenziju U ponedjeljak. To će biti u 17:30. Mi ćemo vas podsjetiti na sve te detalje putem e-maila na golf-a web stranice u samo nekoliko dana vremena. To će biti sniman i staviti na raspolaganje ubrzo nakon toga. Dakle, ako ne možete učiniti da ponedjeljak Utor za noć, ne brinite. Sekcije idućeg tjedna će također usredotočiti na pregled za kviz. Ako je odjeljak u ponedjeljak, što je Doista sveučilište odmor, hoćemo Još uvijek se sastati u sekciji. Ako jednostavno ne možete učiniti da poglavlje jer ćete pobjeći, to je u redu. Sudjelujte u nedjelju ili utorak sekcija ili tune-u kako bi Jasonovoj sekciji, što je dostupni online. Dakle, više loših vijesti. Tako da prema programu, imamo predavanje sljedećeg petka. No, dobra vijest - jasno, sam proveo previše vremena na to. [Smijeh] Mi ćemo odustati od sljedećeg petka predavanja. Tako da će biti dar za nas, tako da stvarno može imati lijep predah u između ovog tjedna i dva tjedna kasnije. Dakle nema predavanja sljedeći tjedan, samo jedan maleni Malo kviz, koji bi trebali biti uzimajući sve više uzbuđen. Tako ćemo sada skrenuti pozornost na nešto što je doista više vizualni i više uzbudljiv i za postavljanje pozornice za ono što će biti na vidiku u samo nekoliko tjedana. Nakon prvog kviza, mi ćemo pretvoriti usredotočiti naših problema skupova u drugu domene specifičan problem, a to je forenzike ili sigurnosnih općenitije. U stvari, tradicije s ovim problemom Skup je za mene jedna od demonstrator ili CAS hodati po kampus uzimanje neke fotografije Prepoznatljiva, ali nisu očite ljudi, mjesta, ili stvari, onda svake godine sam nekako uspjeli slučajno izbrišete ili pokvariti digitalnih medija karticu da je unutar naše kamere. No, nije velika stvar. Ja mogu ići naprijed i priključiti da u mom računalu. Ja mogu napraviti forenzičke sliku o tome, tako da govoriti, kopiranjem nule i one s toga memorijsku karticu, bilo njegova SD kartica ili Compact Flash kartica ili sve što ste upoznati sa. A onda možemo ruka koja se. I tako je izazov pred nama, među ostalim stvari za vas, bit će pisati C kod koji oporavi cijela hrpa JPEG za mene i otkrio da neće biti ti ljudi, mjesta ili stvari. I također ćemo razgovarati, u tom problemu postavljena iu danima koji dolaze, o grafički općenitije. Mi smo ih koristili, tečaj, za break out. Ali vi ste vrsta uzeti zdravo za gotovo postoji ta visoka razina pojmovi pravokutnika i ovala. No, ispod poklopca motora postoje piksela. I vi ste imali za početak razmišljam o onima. Ili što će za p-set 4 razmišljati o jaz između svoje cigle, koliko je brzo ste lopta se kreće preko Zaslon za break out. Dakle, postoji taj pojam točkice na zaslonu koji je dolaze u igru ​​već. Sada ono što vidite, ipak, ono što je ste dobili na zaslonu računala. Ako ste ikada gledali neki dobar ili Loša TV, izgledi su oni prilično mnogo tretirati publiku kao technophobes koji to zapravo nisu znam puno o računalstvu. I to je vrlo lako za policiju Detektiv je reći, može li očistite taj gore za mene? Ili bi se poboljšala, zar ne? Poboljšajte je kao krilatica u najviše bilo zločina povezanih serija. A stvarnost je ako se vrlo mutna slika osumnjičenika radi nešto loše, ne možete Samo ga poboljšati. Ne možete zumirati u beskonačno. Ne možete vidjeti u odsjajem netko Oko tko je počinio to Konkretno zločin, bez obzira Prevalencija ovo na TV-u. I tako s tim ćemo motivirati da Problem nadolazeće set s pogled na neke emisije s kojima moglo biti poznato. [Video reprodukciju] -U redu. Sada, neka je dobiti dobar pogled na vas. Držite ga-. Run to natrag. -Čekaj malo. Idite desno. -Tu. Zaustavi. -Cijeli zaslon. -U redu. Zaustavi. Zategnite-up na to, molim te? Vector-u na tom tipu na stražnja kotača. Zoom-u upravo ovdje na ovom mjestu. -S pravom opremom, slikom može biti povećan i izoštriti. -Što je to? -To je pojašnjenje program. -Možete li jasno da se bilo? -Ne znam. Idemo ga poboljšati. -Unaprijedili dio-6. -Ja poboljšane detalje i - -Mislim da je dovoljno kako bi se poboljšala. Pustite ga na moj zaslon. -Povećati odraz u njezinim očima. -Da vidimo što o ovome video opremu. -Edgar, možete poboljšati ovo? -Drži se. -Ja radili na ovom razmišljanju. -Netko je odraz. -Razmišljanje. -Tu je odraz Muškarac je lice. -Refleksije. -Tu je odraz. -Povećavanje na ogledalu. -Možete vidjeti svoj odraz. -Može li se poboljšati imidž od ovog? -Mogu li ga unaprijedili ovdje? -Može li to poboljšati? -Može li to poboljšati? -Možemo li poboljšati ovo? -Može li to poboljšati? -Čekaj malo, ja ću unaprijediti. -Povećavanje na vratima. -X10. -Zoom. [Smijeh] -Pomicanje u. -Čekaj, stani. -Prestani. To-pauzirati. Rotirati za 75 stupnjeva oko vertikalni molimo. [Smijeh] -Stop, i natrag u dijelu na vrata ponovno. -Imaš slike pojačivač koji mogu bitmap? -Možda možemo koristiti Pradeep Sen Metoda vidjeti u prozore. -Ovaj softver je stanje u umjetnosti. -Icon Vrijednost isključen. -S pravom kombinacijom algoritama. -Uzeo osvjetljenje algoritme za Sljedeća razina i mogu ih koristiti za unaprijedili ovu fotografiju. -Lock povećanje z-osi. -Unaprijediti. -Unaprijediti. -Unaprijediti. -Zamrznuti i unaprijediti. [END video reprodukciju] David J. Malan: Dakle Problem Set 5 je ono što je pred nama postoji. Dakle, uskoro ćemo dobiti bolje razumijevanje od kada i zašto možete a naša se ne može poboljšati na taj način. Ali prvo, neka se vrati našu pozornost za neke od građevnih blokova ćemo Morate biti u mogućnosti reći da priča. Dakle podsjetiti da mi je nacrtao ovu sliku na Ponedjeljak i malo prošlog tjedna. A to opisuje izgled stvari u memorije računala kada prikazivati ​​neki program. Tech segmentu do vrha, podsjetimo, upućuje na stvarne i nula koje kako sastaviti svoj program. Tu je, ispod toga, neki inicijalizacije ili Nepoznati podaci, koji se obično odnosi se na stvari kao što su konstanti ili žice ili globalnih varijabli koje imaju proglašen unaprijed. Postoji gomila, ali vratit ćemo se vratiti na to u malo. A tu je i stog. Slično kao i hrpu ladica u kafeterija, ovo je mjesto gdje memorija dobiva slojevita i slojevita kad Što vam je činiti u programu? Što je stog za korištenje? Da? Poziv funkcije. Svaki put kad nazovete funkciju, to je dano luč memorije za njegovu lokalne varijable ili njezine parametre. I slikovito, možemo vidjeti da sa svakim sukcesivno funkcija zove, kada je pozivi pozivi B C D pozivi, oni se slojevito na stog. I u svakoj od tih kriške Memorija je u biti jedinstveno opseg za tu funkciju, što je, naravno, je problematično ako želite predati iz jedne u drugu funkciju komada podataka koji ga žele mutirati ili mijenjati. Dakle, ono što je naše rješenje za omogućavanje Funkcija zastupa jedan stog okvir za promjenu memorije unutar drugog stog okvira? Kako te dvije razgovarati jedni drugima? Dakle, kroz pokazivače ili adrese, koji se, opet, samo opisao gdje je u memorije, na način specifičan Ugriz broj, posebice Vrijednost se može naći. Dakle sjetiti zadnji put previše smo nastavili priču i pogledao Program prilično lud. I ovaj program je lud za neke Razlozi, ali najviše zabrinjava je jedna jer ne provjeriti što? Da, to ne uspije, provjerite ulaz. Nažalost? Ako je više od 12 znakova. Dakle, vrlo pametno, ako zovete memcopy, koji, kao što ime sugerira, jednostavno kopije memorije iz drugog argumenta u svom prvom argumentu. Treći argument, vrlo pametno, je provjeriti kako bi bili sigurni da se ne kopirati više nego, u ovom slučaju, duljinu od gola, broj znakova, u mjestu, što je to Niz C. No, problem je u tome što se Ako C sam po sebi nije dovoljno velika da obrađuju to? Ideš kopirati broj bajtova koje ste dobili. No, ono što vi zapravo imate više bajtova nego što ima mjesta za? Pa, ovaj program je vrlo jednostavno glupo slijepo nastavlja se bez obzira na to dano, halo backslash 0 je super ako string je kratko dovoljno, kao i pet znakova. No, je li to zapravo 12 znakova ili 1.200 znakova, vidjeli smo posljednji put da ste samo idući u potpunosti prepisivanje memorije koja ne pripada vama. I najgorem slučaju, ako prebrisati da crveni dio ima koji smo nazvali vrate adresu - to je samo u kojoj se računalo automatski, za vas, iza scene, tucks udaljeno 32-bitna vrijednost koja to podsjeća na ono što bi trebao adresa vratiti kada Foo, ovu drugu funkciju, vrši izvršavanju. To je prezla sorti na koje se vraća. Ako prebrisati da, potencijalno, ako si loš čovjek, mogu mogli potencijalno preuzme neko računalo. I vi ćete sigurno to pad u većini slučajeva. Sada je taj problem je samo pogoršan kao što smo počeli govoriti o memoriji Upravljanje općenito. I malloc, za dodjelu memorije, je funkcija koja možemo koristiti za dodjelu memorije kad ne znamo unaprijed da trebamo malo. Tako, na primjer, ako se vratim na aparatu ovdje. I ja se otvoriti na posljednji put hello2.c, prisjetiti ovaj program ovdje, koja je izgledala Malo se nešto ovako, samo tri linije - navesti svoje ime, a zatim String ime, na lijevoj strani, jednako getstring. I onda smo ga ispisati, korisničkog imena. Dakle, ovo je super jednostavan program. Da bude jasno, neka mi ići naprijed i čine halo-2. Ja ću učiniti dot crtu hello-2. Navedite svoje ime - David. Upišite. Pozdrav David. Čini se da rade u redu. No, ono što se stvarno događa ispod haube ovdje? Prvo neka se guliti natrag nekim slojevima. String je samo sinonim mi smo shvatila za što? Char star. Pa neka to bude nešto više kompliciranih , ali više tehnički točno da je ovo je char zvijezda, što znači da Naziv, da, je promjenjiva. No, ono što je naziv prodavaonice adresa char, koji se osjeća malo čudno jer sam dobivanje natrag niz. Ja sam dobivanje natrag višestruki znakovi nisu znak. Ali, naravno, trebate samo prva Char obraćanje sjetiti gdje Cijeli niz je jer zašto? Kako shvatiti gdje kraj string je znao početak? Backslash nuli. Dakle, s te dvije tragove li shvatiti Prije početka i kraja bilo string se, tako dugo dok su oni ispravno formirana s tim null Terminator, koji backslash nuli. No, to se zove getstring. I ispada da getstring Cijelo ovo vrijeme je vrsta vara za nas. To je bio događaj ovaj rad, kako bi bili sigurni, dobivanje niz od korisnika. Ali gdje je to memorije dolaze iz? Ako se vratimo na slici ovdje i primijeniti definiciju iz samo Trenutak prije, da je stog je gdje memory ide kad se funkcije zove, po toj logici, kada poziv getstring, a onda sam se upisati u D-A-V-I-D Enter, u kojoj je D-A-V-I-D backslash nula pohranjene na temelju Priča smo kazao nam je sada? Čini se da se u stog, zar ne? Kada zovete dobili niz dobivate Malo kriška memorije na stogu. Dakle, logično je da je D--V-I-D backslash nula je pohranjena postoji u snopu. Ali čekaj malo, getstring vraća da string, da se tako izrazim, što znači je ladicu iz kantine skida snop. I mi smo zadnji put rekao da čim funkcija vraća, a vi se da je ladica, da se tako izrazim, off snopa, ono Možete li pretpostaviti o ostacima da je sjećanje? Nekako ih redrew kao upitnicima jer oni učinkovito postanu nepoznat vrijednosti. Oni se mogu ponovno koristiti kada su neki Sljedeći funkcija se zove. Drugim riječima, ako se dogodi za pohranu - Ja ću povući brzu sliku Ovdje iz dimnjaka. Ako se dogodi da se izradi dno moje memorije segmentu, a mi ćemo reći da je to mjesto memorije okupirali glavni, a možda i Arg c ARG v i sve ostalo u programu, kada getstring se zove, valjda getstring dobiva komad memorije ovdje. A zatim D-A-V-I-D nekako završi na ovoj funkciji. A ja ću se pojednostavljuju. Ali pretpostavimo da je njegov D--V-I-D backslash nuli. Tako to mnogi bajta se koriste u Okvir za getstring. No, čim se vrati getstring, mi rekao je zadnji put da je ova memorija više Ovdje sve postaje - woops! - sve postaje djelotvorno izbrisani. I mi možemo razmišljati o tome sada kao pitanje ocjene jer tko zna što će biti od tog sjećanja. Doista, bio sam vrlo često poziva funkcije osim getstring. I čim sam nazvati neke druge Funkcija od getstring, možda ne u ovaj Program smo samo gledali ali na neki drugi, sigurno neki drugi Funkcija mogli završiti što je dobio ovaj sljedeći spot u stog. Dakle, to ne može biti da getstring trgovinama D-A-V-I-D na stog jer bi Odmah izgubiti pristup do njega. Ali mi znamo da getstring Samo vraća što? Nije povratka ja šest znakova. Što je to doista nije vratio zaključili smo zadnji put? Adresa prva. Tako nekako, kad zove getstring, to je dodjelom komad memorije za niz koji korisnici tipa i zatim se vraćaju adresu njega. I ispada da kad želite funkcionirati na alocirati memoriju u to smjer i povratak na osobu koja se zove tu funkciju, adresu da je komad memorije, što je apsolutno Ne mogu ga staviti u stog na dna, jer to je samo funkcionalno će ne postati vrlo tvoje brzo, tako da vjerojatno možete pogoditi gdje smo vjerojatno će to bacanje Umjesto toga, tzv gomila. Dakle između dna vaše pamćenje-a Raspored i vrh vaše pamćenje-a Raspored se cijela hrpa segmentima. Jedan je stog, i desno iznad njega je gomila. I gomila je samo drugačiji komad memorija koja ne služi za funkcije kada su pozvani. To se koristi za dugoročno pamćenje, kada je Želite jedna funkcija da zgrabite neke memorije i moći objesiti na njega bez gubitka kontrole nad njim. Sada bi možda odmah vidjeti da to nije nužno savršen dizajn. Kao vaš program dodjeljuje memoriju na stog, ili kako vi zovete više i više funkcija, ili kao što se dodijeliti memorije na gomili sa malloc off kao getstring se radi, što je očito Čini se da je neizbježan problem? Točno. Kao i činjenica da su ove strijele su okrenuti jedan prema drugom ne slutiti dobro. I doista, mogli bismo vrlo brzo srušiti Program u bilo koji broj načina. U stvari, mislim da smo mogli imati to učinio slučajno jednom. Ili, ako ne, neka je to učiniti Namjerno sada. Dopustite mi da ide naprijed i pisati super brzo Program pod nazivom dontdothis.c. A sada ću ići na ovdje i ne uključuju oštre stdio.h. Idemo proglasiti funkcija Foo traje Nema argumente, što je označena kao i prema praznini. I jedina stvar Foo će učiniti je Poziv Foo, koji vjerojatno nije najpametnija ideja, ali tako se to. Ent glavna nevažeće. Sada jedino što glavna ide učiniti je nazvati foo kao dobro. I samo za slatkiš, ja ću otići uoči ovdje i reći printf "Pozdrav iz Foo. " OK. Dakle, ako sam ne bi bilo pogreške, Provjerite dontdothis dot crtu. I neka je to učiniti u većem prozoru - dot slash, dontdothis. Hajde. Uh. Očito, možete to učiniti. Dovraga. OK. Pričekajte. Stand by. Jesmo li - Napravili smo ga koristiti s zaraditi. [Uzdahe] Znam, ali sam Mislimo Samo da se brišu. Uh, da. Dovraga. Riješite ovaj Rob. Što? To je vrlo jednostavna. Da, okrenuli smo optimizacije off. OK, stoje bok. Sada se osjećam bolje. OK. U redu. Tako ćemo ovu kompilirati - Provjerite što dontdothis. Možda ćete morati promijeniti naziv to dothis.c u samo trenutak. Tamo idemo. Hvala Vam. OK. Dakle, činjenica da sam ispisivao Nešto je bio zapravo samo usporava proces u kojem smo bi do te točke. OK. Fuj! Dakle, ono što se zapravo događa? Razlog postoji, baš kao što na stranu, je radi ništa u smislu ulaznih i Izlaz sklon biti sporiji zato što moram napisati znakova screen, ima za pomicanje. Pa ne duljimo, imala sam zapravo dogodilo tako nestrpljiva, imali bismo vidio ovo na kraju rezultat kao dobro. Sada kada sam dobio vožnju od print-up, smo ga odmah vidjeti. Pa zašto se to događa. Pa, jednostavno objašnjenje, dakako, Foo je da vjerojatno ne bi će se zvati. Sada je u općim uvjetima, ovo je rekurzija. I mislili smo prije par tjedana Prije rekurzivna je dobro. Rekurzije je taj čarobni način izražavanje sebe super jezgrovito. I to samo radi. Ali je ključna značajka sve rekurzivne programi smo razgovarali oko i pogledao do sada, što bilo da su imali što? Osnovni scenarij, koji je bio neki tvrdi kodirani slučaj da je u nekim situacijama ne zovite Foo, što je očito ovdje nije slučaj. Dakle, ono što se stvarno događa u smislu ove slike? Pa, kad je glavna naziva Foo, što dobiva kriška memorije. Kad Foo zove foo, to dobiva kriška memorije. Kad Foo zove foo, to dobiva krišku. Ona dobiva krišku. Ona dobiva krišku. Zbog Foo nikada se vraća. Mi nikada ne briše jedan od onih sličice iz dimnjaka. Tako smo puše kroz gomilu, ne spomenuti tko zna što još, i mi smo prekoračenje granice našeg tzv. segment memorije. Pogreška ide segmentacije lažna. Dakle rješenje postoji očito to ne rade. No, veća implikacija je da, da, postoji apsolutno je neka granica, čak i ako to nije dobro definirana, kako mnoge funkcije koje mogu pozvati na Program, koliko puta funkciju može se nazvati. Dakle, iako smo učinili propovijedaju rekurzija kao potencijalnu čarobnom stvar Prije nekoliko tjedana za sigma funkcija, a kada smo dobili podatke strukture i CS50, vidjet ćete drugima aplikacije za njega, to nije nužno najbolja stvar. Jer ako se funkcija poziva, sama naziva, čak i ako postoji baza slučaj, ako ne pogoditi taj osnovni scenarij za 1.000 poziva ili 10.000 poziva, od strane Vrijeme koje ste možda ponestane prostora na tzv stog i pritisnite neki drugi segmenti memorije. Dakle, to je također dizajn trade-off između elegancije i između robusnost vašem Provedba. Dakle, postoji još jedan minus ili još jedna gotcha da ono što smo radili do sada. Kad sam nazvao getstring - neka mi se vratiti u Hello-dva. Obavijest da sam pozivom getstring, koji se vraća adresu. I mi danas tvrde da je adresa je na hrpi. I sad sam ispis string na toj adresi. Ali nikad nismo pozvani nasuprot getstring. Mi nikada nismo morali calll funkciju kao ungetstring, gdje ruku natrag da je memorija. Ali iskreno mi vjerojatno trebao biti. Jer ako smo stalno postavljaju računalo za memoriju, na način kao što je netko getstring ali nikada ga vratiti, zasigurno to je također dužan voditi Problemi pri čemu nam ponestane memorije. A u stvari, možemo tražiti te Problemi s novim alatom čiji korištenja je malo zagonetan upisati. No, dopustite mi da ide naprijed i kapljice se na zaslonu u samo trenutak. Ja ću ići naprijed i pokrenuti Valgrind s parametrom čija je prva zapovijed linije argument je ime tog programa hello-2. I na žalost, to je Izlaz je atrociously kompleksu bez dobrog razloga. Dakle, vidimo svu tu zbrku. David je navesti svoje ime. Tako da je Program zapravo radi. I sada smo dobili ovaj izlaz. Dakle Valgrind je sličan u duhu GDB. To nije debugger po sebi. No, da je sjećanje provjeru. To je program koji će pokrenuti svoj programirati i reći vam ako ste pitali Računalo za pamćenje i nikada ga predao natrag, a time znači da imate otjecanje memorije. A memory leaks imaju tendenciju da se loše. A što se korisnici računala imaju vjerojatno osjetio to, imate li Mac ili PC. Jeste li ikada koristili svoje računalo a, a ne digne u nekoliko dana, ili ste upravo je dobio puno programima koji se izvode, a prokleta stvar usporava na brušenje zaustaviti, ili barem to je super neugodno za korištenje, jer sve samo dobio super slow. Sada može biti bilo koji broj razloga. To bi mogao biti klapa, bug u nečiji broj, ili, jednostavnije, to moglo značiti da koristite više memorije, ili pokušava, nego tvoj Računalo zapravo ima. A možda postoji bug u nekom programu da bi molba za pamćenje. Preglednici za nekoliko godina bili su poznati po tome to, traži sve više i više memorije ali nikad ga vraćajući. Sigurno, ako samo imaju ograničen količina memorije, ne možete pitati beskonačno mnogo puta za nešto od tog sjećanja. I tako ono što vidite ovdje, iako Ponovno Valgrind je izlaz nepotrebno složeno niti pogledati Prvi, ovo je zanimljiv dio. Heap - u uporabi na izlazu. Pa evo koliko memorije je u uporabi u hrpu na Vrijeme moj program izašao - očito šest bajtova u jednom bloku. Tako ću mahati ruke , na što je blok. Zamislite to je samo komad, više tehničku riječ za komad. No, prije šest bajtova - Koji su šest bajtova da su još uvijek u uporabi? Točno. D-A-V-I-D backslash nula, pet slova Naziv plus null terminator. Dakle, ovaj program Valgrind primijetio da sam pitao za šest bajtova, očito, prema getstring način, ali nikada ih je dao natrag. A u stvari, to ne može biti tako Očito, ako moj program nije tri linije, ali to je 300 linija. Tako smo zapravo može dobiti drugu naredbu linije argument za Valgrind se čine ga mnogo opširnije. To je malo neugodno za pamćenje. Ali ako mi je činiti - ćemo vidjeti. Pukotina - Je li to procuriti - ni ja se ne sjećam ono što je isključen ruci. - Curenja-check jednako puna. Aha, hvala. - Curenja-check jednako puna. Upišite. Sve program radi. Upišite se u Davida opet. Sada vidim nešto više detalja. No, ispod hrpe sažetku, koji identična je četiri - ah, to je vrsta lijepo. Sada Valgrind je zapravo u potrazi malo teže u mom kodu. I to govori da je, navodno, malloc na liniji - smo smanjili. U linije - ne vidim što je to linija. Ali malloc je prvi krivac. Tu je blog u malloc. U redu? OK, nema. Točno? Zvao sam getstring. getstring očito poziva malloc. Pa što linija koda je očito u krivu za potrebe dodijeljeno ovo sjećanje? Pretpostavimo da je onaj tko je napisao malloc je oko dovoljno dugo da je nije njihova krivnja. Dakle, to je vjerojatno moja. getstring u cs50.c - tako da je file negdje na računalu - u skladu 286 čini se da je krivac. Sada pretpostavimo da je CS50 oko za pristojan iznos od vrijeme, tako mi smo nepogrešivi. I tako je to vjerojatno nije u getstring da je bug laži, već u hello-2.c linije 18. Tako ćemo pogledati što je to linija 18 je. Oh. Nekako je ova linija nije nužno buggy, sami po sebi, ali to je razlog iza tog otjecanje memorije. Dakle super jednostavno, što bi intuitivno biti rješenje ovdje? Ako tražimo za pamćenje, nikada nisu bili ga vraćam, a čini se da je problem jer s vremenom moj računalo Možda ponestane memorije, moglo usporiti prema dolje, loše stvari mogu dogoditi, ali, ono je jednostavno intuitivno rješenje? Samo ga vratiti. Kako se osloboditi tog sjećanja? Pa, srećom, to je vrlo jednostavna samo reći besplatan ime. I nikada nismo učinili prije. Ali u biti može sjetiti besplatno kao suprotnost malloc. free je suprotnost dodjele memorije. Pa sad neka mi to kompilirati. Provjerite hello-dva. Dopustite mi da ga ponovno pokrenuti. hello-2 David. Dakle, čini se da rade u točno na isti način. No, ako se vratim u Valgrind i ponovno pokrenuti Iste naredbe na moj novo kompilirani program, tipkanje u moje ime kao i prije - lijepo. Skupi sažetak - u uporabi na izlazu - nula nula bajtova u blokovima. I to je super lijepo, sve nagomilavati blokovi su oslobođeni. Nema curenja su moguće. Tako dolazi, a ne s Problem Set 4, ali s Problem Set 5, forenzike i nadalje, i ovo će postati mjera u ispravnost vašeg Program, da li ili ne imate ili nemaju curenje memorije. No, srećom, ne samo da možete razmišljati kroz njih intuitivno, koji je, nedvojbeno, lako za male programe ali teže za veće programe, Valgrind, za one veće programe, može vam pomoći identificirati Poseban problem. No, postoji jedan drugi problem koji bi mogli nastati. Dopustite mi otvori ovu datoteku ovdje, što je, opet, pomalo jednostavan primjer. Ali neka se usredotočiti na ono što ovaj program čini. To se zove memory.c. Objavit ćemo to kasnije danas zip današnji izvornog koda. I primijetiti da imam funkciju pod nazivom f da se nema argumenata i vraća ništa. U skladu 20, ja sam očito proglašenja pointer na int i nazvavši ga x. Ja sam dodjeljivanjem je povratak vrijednost malloc. I samo da bude jasno, koliko bajtova am Ja vjerojatno vratiti na malloc u ovoj situaciji? Vjerojatno 40. Odakle ti to? Pa, ako se prisjetiti da je često int 4 bajta, barem u aparata, 10 puta 4 je očito 40. Dakle malloc vraća adresu od komad memorije i pohranjivanje koje rješavanje u konačnici x. Dakle, da bude jasno, što onda se događa? Pa, neka mi se vratiti na našu sliku ovdje. Dopustite mi da ne samo privući sveg memorije računala, dopustite mi da ide naprijed i nacrtati cijeli pravokutnik koji predstavlja sve moje RAM-a. Mi ćemo reći da je stog je na dnu. I tu je tekst segment u Nepoznati su podaci. Ali ja samo idem na apstraktne onima ostale stvari daleko kao točka, dot dot. Samo ću se odnose na ovu kao gomila na vrhu. I onda na dnu ove slike, da predstavljaju glavni, idem dati ga kriške memorije na stog. Za f, ja ću mu dati krišku memorije na stogu. Sada, moram konzultirati My izvornog koda ponovno. Koji su lokalne varijable za glavno? Očito ništa, tako da je odsječak biti prazan ili ne, čak i velika kao što sam ga izvući. No, u f, imam lokalne varijable, koji se zove x. Dakle, ja ću ići naprijed i dati f komad memorije, nazivajući ga x. A sada malloc od 10 puta 4, Dakle malloc 40, gdje je to memorije dolaze iz? Nismo nacrta slika kao što je ovaj prije. Ali pretpostavimo da je to djelotvorno dolazi iz ovdje, tako da se, dva, tri, četiri, pet. I sad trebam 40 tih. Dakle, ja ću samo napraviti točka, točka, točkica predložiti da postoji još više memorije vraća iz hrpa. Sada ono što je adresa? Idemo birati naša proizvoljna rješavanje kao i uvijek - Ox123, iako je to vjerojatno ide biti nešto sasvim drugo. To je adresa prvog bajta u memorije da tražim za malloc. Tako je u kratkom, jednom retku 20 izvršava, ono je doslovno pohranjeni unutar x. ovdje? Ox123. Ox123. I Bik je nezanimljivo. To samo znači evo heksadecimalni broj. No, ono što je ključno je da je ono što sam dućan u X, što je lokalna promjenljiva. No, njegova vrsta podataka, opet, je adresa int. Pa, ja idem za pohranu Ox123. Ali opet, ako je to malo previše komplicirano nepotrebno, ako sam pomicanje natrag, možemo apstraktno to prilično daleko razumno i samo reći da je x pokazivač na taj komad memorije. OK. Sada se postavlja pitanje u ruci je sljedeće - linije 21, ispostavilo se, je lud. Zašto? Nažalost? To nema - kažu da još jednom. Pa, to ipak nije besplatno. Dakle, to je drugo, ali. Dakle, postoji jedna druga, ali posebno na liniji 21. Točno. Ova jednostavna linija koda je samo buffera, prelijevanja spremnika. Tampon samo znači komad memorije. No, da je komad memorije je veličina 10, 10 cijelih brojeva, što znači, ako smo Indeks u nju pomoću sintaktičkih šećera od polja zapisa, Trg nosači, imate pristup x 0 x nosač nosač x 1, Nosač točka, točka, točka. x 9 nosač je najveći. Dakle, ako sam napraviti nosač x 10, gdje je Ja zapravo idem u memoriji? Pa, ako imam 10 int - neka je zapravo privući sve od ovih ovdje. Tako da je prvih pet. Evo pet drugih Ints. Dakle x nosač 0 je ovdje. x 1 nosač je ovdje. x nosač 9 je ovdje. x nosač 10 je ovdje, što znači da ti govorim, u skladu 21, računalo staviti Broj kojoj? Broj 0, gdje? Pa, to je 0, da. No, upravo činjenica da je njegov 0 je vrsta slučajnosti. To bi mogao biti broj 50, za sve nam je stalo. No, pokušavamo ga stavili na nosač x 10, koji je gdje je to Upitnik je sastavljen, što nije dobra stvar. Ovaj program može vrlo dobro pad kao rezultat. Sada, idemo naprijed i vidjeti ako je to je, doista, što će se dogoditi. Provjerite memorije, budući file naziva memory.c. Idemo naprijed i pokrenuti Program memorije. Tako smo sretni, zapravo, čini se. Imamo sreće. Ali neka je vidjeti ako mi sada pokrenuti Valgrind. Na prvi pogled, moj bi program mogao Čini se da su savršeno točne. No, dopustite mi da vodim Valgrind s - Curenja-check jednako pune memorije. I sad kad sam pokrenuti ovu - Zanimljivo. Nevažeći pisati o veličini, na 4 linija 21 od memory.c. Linija 21 od memory.c je što neki? Oh, zanimljiva. Ali čekajte. Veličina 4, što je to odnosi? Ja samo da je jedan pisati, , ali to je od veličine 4. Zašto je 4? To je zato što je int, koji je, opet, četiri bajta. Dakle Valgrind pronašao bug koji sam, Bacimo li pogled na moj broj, zar ne. A možda tvoj TF bi ili ne bi. Što Ali Valgrind sigurno utvrdio da smo pogriješili tamo, ni iako mi se posrećilo, a računalo odlučio, eh, ja ne idem na sudar samo zato što je dotaknuo jedan bajt, jedan Int je vrijedno pamćenja da nisi zapravo sami. Pa, što je tu lud ovdje. Adresa - ovo je luda potrazi adresa u heksadecimalnom. To samo znači negdje u hrpi je nula bajtova nakon blok veličine 40 raspoređuje. Dopustite mi da smanjivanje ovdje i vidjeti ako ovo je malo više pomoći. Zanimljivi. 40 bajtova definitivno su izgubili u gubitak rekord 1. 1.. Opet, više riječi nego je korisno ovdje. No, na temelju istaknute linije, gdje bi ja vjerojatno usredotočiti moju pozornost za druge bug? Izgleda poput linije 20. memory.c. Dakle, ako smo se vratiti na liniji 20, koji je onaj koji što smo već utvrdili. I to nije nužno lud. No, mi smo to preinačio svoje učinke. Pa kako sam ispraviti barem jedna od tih grešaka? Što sam mogao učiniti nakon što liniji 21? Ja mogao učiniti bez x, tako da je vratiti taj memorije. I kako mogu popraviti ovaj bug? Ja svakako trebao ići ne dalje od 0. Pa neka mi pokušati ponovno pokrenuti ovo. Žao nam je, definitivno ići ne dalje od 9. Provjerite memorije. Dopustite mi reprizu Valgrind u većem prozoru. A sad pogledaj. Nica. Svi nagomilavati blokovi su oslobođeni. Nema curenja su moguće. A gore navedeni ovdje, nema spomena više od neispravnih prava. Samo da se pohlepni, i neka je vidjeti ako drugi demonstracije ne ide onako kako smo zamislili - Ja je netko sretan trenutak prije. A činjenica da je to 0 je možda nepotrebno zabludu. Ajmo napraviti 50, pomalo proizvoljno broj, bi memorijsku dot slash memorije - Još uvijek se posreći. Ništa se nije pad. Pretpostavimo da sam samo napraviti nešto stvarno glupo, i ja sto. Dopustite mi da ponovno napravite memorije, dot slash memorije - posrećilo opet. Što mislite o 1000? Ints izvan, ugrubo, gdje sam trebao biti? Provjerite memorije - k vragu. [Smijeh] OK. Nemojmo nered oko više. Repriza memorije. Tamo idemo. U redu. Dakle, očito ste Indeks 100.000 Ints onu gdje je trebao biti u memorije, loše stvari događaju. Dakle, to očito nije Teško, brzo pravilo. Bio sam vrsta pomoću ispitivanje i pogrešaka doći. Ali to je zato što, ne duljimo, memorije računala također je podijeljen na ove stvari zove segmentima. A ponekad, računalo zapravo dao malo više memorije nego što tražiti. Ali za učinkovitost, to je samo lakše dobiti više memorije, ali samo da vam kažem da ste dobivanje dio njega. A ako vam se posreći ponekad, Stoga, možda ćete biti u mogućnosti dotaknuti memorije koji ne pripada vama. Nemate jamstvo da ono vrijednost ste stavili tamo će ostati tamo, jer je Računalo još uvijek misli da to nije tvoje, ali to ne mora nužno ide pogoditi još jedan segment u memoriji Računalo i izazivaju takvu pogrešku Ovaj ovdje. U redu. Sva pitanja onda na pamćenje? U redu. Idemo pogledati ovdje, a zatim, na nešto što uzimamo za dodjeljuje za neko vrijeme, koje je u ovoj datoteci pod nazivom cs50.h. Tako je to datoteka. To su samo cijela hrpa od komentara do vrha. A možda sam gledao na to, ako što poked oko na aparatu. No, ispostavilo se da je cijelo vrijeme, kad smo se koristiti kao string sinonim, sredstvo kojim smo proglasili koji je sinonim s ovim ključne riječi typedef, za tip definiciji. I mi u biti govoriš, da nanizati sinonim za char zvijezde. To su sredstva kojima stog stvorio ove obuke kotača poznate kao string. Sada ovdje je samo prototip za getchar. Možda smo ga vidjeli prije, ali to je doista ono što on radi. getchar se nema argumenata, vraća znak. getdouble se nema argumenata, vraća dvojnika. getfloat se nema argumenata, vraća float, i tako dalje. getint je ovdje. getlonglong je ovdje. I getstring je ovdje. I to je to. Ovo je još jedna ljubičasta linija preprocesor Direktiva zbog hashtag na početku to. U redu. Pa sad neka mi ide u cs50.c. I nećemo razgovarati predugo na to. No, kako bi vam dati uvid u ono što je traje sve ovo Vrijeme, pusti me da - učinimo getchar. Dakle getchar je uglavnom komentari. No, to izgleda ovako. Dakle, ovo je stvarna funkcija getchar da smo bili uzimanje zdravo za gotovo ne postoji. I premda nismo iskoristili ovo jedan koje često, ako ikada, to je u najmanju ruku relativno jednostavna. Dakle, to je vrijedno uzimanje Brzi pogled na ovdje. Dakle getchar ima beskonačnu petlju, namjerno tako očito. To onda zahtijeva - i to je vrsta Lijepo prenamjena koda mi sami pisali. Ona poziva getstring. Jer ono što ga čini znači da se char? Pa, možda i pokušati dobiti Cijela linija teksta od korisnika i a zatim pogledajte samo jednom od onih likova. U skladu 60, evo malo malo duševne ček. Ako getstring vratio null, nemojmo nastavite. Nešto je pošlo po zlu. Sada je to nešto neugodno, ali konvencionalni u C. char max vjerojatno predstavlja ono jednostavno temelji se na svoje ime? To je konstanta. To je kao numeričke vrijednosti Najveći znak da može predstavljati s jedan ugriz, što je vjerojatno broj 255, što je najveći broj koji predstavlja osam bitova, počevši od nule. Tako sam koristiti ovaj, u ovoj funkciji, kada je pisanja ovog koda, samo zato ako nešto pođe po zlu, ali u getchar njegova svrha u životu je da se vrate char, morate biti u stanju nekako da signalizira korisniku da nešto je pošlo po zlu. Ne možemo se vratiti null. Ispada da je null pointer. A opet, ima getchar vratiti char. Dakle konvencije, ako nešto pođe redu, je li, programer, ili u U ovom slučaju, ja s knjižnicom, morao sam samo odlučiti samovoljno, ako nešto pođe po zlu, idem vratiti broj 255, koji je doista znači da se ne može, korisnik ne može upisati lik zastupa broj 255, jer imali smo ga ukrali kao tzv sentinel vrijednosti u predstavljati problem. Sada ispada da je lik 255 nije nešto što se može upisati na tipkovnice, tako da to nije velika stvar. Korisnik ne primijetiti da Ja sam ukrao taj lik. Ali, ako ste ikada vidjeli u man stranicama na računalni sustav neke referenca sve kape stalno ovako kako kaže, u slučaju pogreške tom stalnom možda se vratio, to je sve što su neki ljudi učinili godina je samovoljno odlučio vratite ovu posebnu vrijednost i nazvati konstanta u slučaju nešto pođe po zlu. Sada magija se događa ovdje dolje. Prvo, ja sam u redu proglašenje 67. dva znaka, C1 i C2. A onda je u redu 68, tu je zapravo linija koda koji je podsjeća printf naš prijatelj, s obzirom da je nema posto Cs u navodnike. Ali primjetiti što se događa ovdje. sscanf znači string skeniranje - znači skeniranje formatirani string, ergo sscanf. Što to znači? To znači da prođe na sscanf je string. A linija je god korisnik upiše u. Možete proći na sscanf formata kao string ovo govori da je ono što se scanf nadajući se da korisnik unese Nakon toga prođe-u na adrese dviju komadi sjećanja, u ovom slučaju, jer imam dva rezervirana mjesta. Dakle, ja ću mu dati adresu C1 i C2 na adresi. I sjećam se da si daju funkcijskom adresa neke varijable, što je dublji smisao? Što mogu učiniti da se funkcija kao rezultat od dajući mu adresu promjenjiva, za razliku od varijabla sama? To mogu ga promijeniti, zar ne? Ako je netko karte za fizičke adresa, oni mogu ići tamo i raditi što god žele na toj adresi. Sve ideja ovdje. Ako ćemo proći u sscanf, adresa dvoje komadi sjećanja, čak i ovi maleni male komade memorije, C1 i C2, ali možemo reći da adresu njih, sscanf možete ga promijeniti. Dakle sscanf je svrha u životu, ako čitamo Čovjek stranica, je čitati ono što Korisnik upisali u, nadam za korisnika ima upisali u karakteru i možda Još jedan lik, i bez obzira korisnik upisali, prvi znak ide Ovdje, drugi lik ide ovdje. Sada, kako na stranu, to i što bi samo znam to iz dokumentacije, Činjenica da sam stavio prazan prostor postoji samo znači da ja ne briga ako korisnik klikne na razmaknicu neke puta prije nego što je on ili ona vodi lik, ja ću ignorirati na prazni prostor. Tako da, ja znam iz dokumentacije. Činjenica da postoji drugi% c slijedi bijeli prostor je zapravo namjerno. Želim biti u mogućnosti to otkriti ako korisnik zeznuo ili ne surađuju. Dakle, ja sam u nadi da korisnik samo upisali u jednom karaktera, stoga se nadam da sscanf je samo ide da se vrate vrijednost 1, jer, opet, ako sam pročitao dokumentacije, sscanf je svrha u život je za povratak na broju varijable koje su ispunjene s korisničkog unosa. Prolazio sam u dvije varijable adrese, C1 i C2. Nadam se, ipak, da je samo jedan od ih pogine jer ako sscanf vrati 2, što je vjerojatno Posljedica logično? Taj korisnik nije mi samo dati jedan lik kao što sam mu rekao ili nju. Vjerojatno su upisali po najmanje dva znaka. Dakle, ako sam, umjesto nisu imali drugi % C, samo sam imao jednu, koja iskreno će biti više intuitivno Pristup, mislim na prvi pogled, nećeš biti u mogućnosti otkriti ako korisnik je dajući vam više Ulaz nego što zapravo želi. Dakle, ovo je implicitni oblik od provjere pogreške. No primijetite što radim ovdje. Jednom sam siguran da je korisnik dao mi jedan lik, sam osloboditi liniju, radi suprotno od getstring, što pak koristi malloc, a onda se vratiti C1, lik koji sam se nadao Korisnik pod uvjetom i samo pod uvjetom. Tako brzo nazire samo, ali Imate li pitanja o getchar? Vratit ćemo se na neke od drugih. Pa, neka mi ići naprijed i učiniti - Pretpostavljam da je sada, samo motivirati naše Rasprava u tjednu plus vrijeme, to je spis pod nazivom structs.h. I opet, to je samo djelić nečega što je pred nama. Ali primijetite da je dosta za to je komentara. Pa neka mi istaknuti samo Zanimljiv dio za sada. typedef - tu je da ista ključna opet. typedef smo iskoristili da se proglasi string kao posebnu vrstu podataka. Možete koristiti typedef stvoriti potpuno novi vrste podataka koje nisu postojale kad C je izmišljen. Na primjer, int dolazi s C. Char dolazi s dvostrukim C. dolazi s C. No, ne postoji pojam student. Pa ipak, to će biti prilično korisno biti mogli napisati program koji pohranjuje u varijable, studenta ID broj, njihovo ime, a njihova kuća. Drugim riječima, tri komada podataka, kao int i string, a drugi niz. S typedef, što je prilično snažan o tome i ključne riječi za sturct struktura, što, programer u 2013, zapravo mogu definirati vlastite vizualnih podataka koje ne postoje godina Prije nego da odgovaraju vašim svrhe. I evo, u linijama 13 do 19, mi smo proglašenja novu vrstu podataka, kao što su int, ali nazvavši ga student. A unutar ove varijable će se biti tri stvari - int, string, i ogrlicu. Dakle, možete misliti na ono što je stvarno ovdje dogodilo, iako je to malo pojednostavljenja za danas, Student će biti da izgleda ovako. Njegova će biti komad memorije uz predočenje osobne iskaznice, ime polje, a kuća polje. I mi ćemo biti u mogućnosti koristiti one komade memorije i pristupiti im na sljedeći način. Ako odem u struct0.c, ovdje je relativno dugo, no nakon uzorak, koda koji koristi ovaj novi trik. Tako je prvi, neka mi da skrenem vašu pozornost do zanimljivih dijelova do vrha. Sharp definira studente 3, izjavljuje konstantu zvanu studentima i dodjeljuje arbitrarno broj 3, samo tako da imam troje studenata pomoću ovaj program za sada. Ovdje dolazi Main. I obavijest, kako mogu izjaviti Niz studenata? Pa, ja samo koriste istu sintaksu. Riječ je očito novi učenik. Ali, student klase, zagrada studenata. Dakle, nažalost, ima puno ponovne uporabe pojmova ovdje. To je samo broj. Dakle, to je kao da kažete tri. Klasa je upravo ono što želim pozvati varijablu. Mogao bih to nazvao studenata. Ali klase, to nije klasa u objektno orijentirani Java vrsta način. To je jednostavno klasa studenata. I vrsta podataka svakog elementa u tom nizu je studentica. Dakle, ovo je malo drugačije i od nešto govori kao što je ovaj, to je samo - Ja govorim daj mi tri studente i poziv da klasu polje. U redu. Sada ovdje je četiri petlje. Taj lik upoznati - iteraciju od nule na do tri. I ovdje je novi komad sintakse. Program će me pitati, čovjeka, da bi ga student ID, što je int. I ovdje je sintaksa s kojima možete spremiti nešto u ID polje, na Mjesto na nosač klase I. Dakle Ova sintaksa nije nova. To samo znači da mi osma učenik u razredu. No, ovaj simbol je novi. Do sada, nismo si mogu koristiti točku, barem kod ovako. To znači ići na struct poznat kao Student i staviti nešto tamo. Isto tako, u ovom sljedećem retku, 31, idite naprijed i stavi sve što korisnik unese za ime ovdje i što im je činiti za Kuća, ista stvar, samo naprijed i staviti ga u kući.. Pa što se ovaj program konačnici učiniti? Možete vidjeti mali teaser tamo. Dopustite mi da ide naprijed i ne bi tvorevina, 0 dot slash rekonstruirati 0, studentski ID 1, David kažu Mather, student ID 2. Rob Kirkland, student ID 3. Lauren Leverit - i jedino što ovaj program je, što je samo potpuno proizvoljno, je Htjela sam napraviti nešto s tim podacima, sad kad sam nas je učio kako se koristite tvorevina, je upravo sam imao ovaj dodatni petlje ovdje. Ja iteraciju preko niz studenata. Ja koristiti našu, možda je sada poznato prijatelja, string usporedbu, stircomp se Ček je 8. studenta kuća jednaka Mather? I ako je tako, samo ispisati nešto samovoljno sviđa, da, to je. Ali opet, samo mi daje mogućnosti za korištenje i ponovno korištenje i ponovno ovaj novi zapis dot. Dakle, koga briga, zar ne? Dolazi sa studentskom programu dosta proizvoljna, ali ispada da možemo napraviti korisne stvari s to, na primjer, kako slijedi. To je mnogo kompliciranije struct u C. To je dobio desetak ili više polja, nešto šifrirano ime. Ali, ako ste ikada čuli za grafiku format zove bitmap, BMP, to Ispada da bitmap format prilično mnogo izgleda kao da je to. To je glupo malo smješka. To je mala slika koje sam zumirani Na prilično velika, tako da sam mogao vidjeti svaku od pojedinačnih točaka ili piksela. Sada ispada da mogu predstavljati crna točka s, recimo, broja 0. I bijela točka s brojem 1. Dakle, drugim riječima, ako želite privući Smješko i spremiti tu sliku u Računalo, dovoljno je pohraniti nule i one koje izgledaju kao što je ovaj, gdje, opet, one su bijele i nula su crne. I zajedno, ako imate učinkovito podsmijeh od jedinica i nula, imate Rešetka od piksela, i ako stavi ih se, imate slatka Malo smješka. Sada, bitmap format, BMP, je djelotvorno da se ispod haube, ali s više piksela Sot da Možete zapravo predstavljaju boje. Ali kada imate sofisticiraniji formate kao što su BMP i JPEG i GIF s kojima bi mogli biti upoznati, onima datoteke na disku u pravilu ne samo imaju nula i one za piksela, ali oni imaju neku metapodataka kao i - meta u smislu da nije stvarno Podaci ali to je korisno imati. Dakle, ove stavke su ovdje podrazumijeva i vidjet ćemo to detaljnije u P-set 5, da je prije nego što su nule i jedinice koje predstavljaju piksela na slici, postoji hrpa metapodataka kao što su veličina slike i širina slike. I ja sam primijetio čupanjem s nekim proizvoljne stvari ovdje - širina i visina. Bit računati i neke druge stvari. Dakle, postoji neki metapodataka u datoteci. Ali razumijevanje kako se datoteke položili se na taj način, možete zapravo onda manipulirati slike, slike oporavak s diska, promijeniti veličinu slike. Ali ne može nužno ih poboljšati. Trebala mi je fotografiju. Vratio sam se RJ ovdje, koji ste vidjeli Na zaslonu se prije nekog vremena. A ako sam otvoriti Keynote ovdje, ovo je što će se dogoditi ako pokušate povećavanje i poboljšala RJ. On ne uzimajući bilo bolje stvarno. Sada Keynote je vrsta zamućivanje je malo, samo prijeći preko Činjenica da RJ ne bi osobito poboljšana kada zoom u. A ako to učiniti na ovaj način, vidjeti kvadrate? Da, definitivno možete vidjeti trgovi na projektoru. To je ono što dobivate kada se poboljšala. No, u razumijevanju kako se naša RJ ili Smješka se provodi omogućit će nam zapravo pisanje koda koji manipulira te stvari. A ja mislio da ću završiti na ovoj bilješci, s 55 sekundi poboljšala to je, Usudio bih se, kažu, a zabludu. [Video reprodukciju] -On laže. O tome što, ne znam. -Pa što mi to znamo? -Da se u 09:15 Ray Santoya bio na bankomatu. -Dakle, pitanje je što je radio u 9:16? Pucanje-devet milimetara na nešto. Možda je vidio snajpera. -Ili je raditi s njim. -Čekaj. Vrati jedan. -Što vidiš? -Donesite svoje lice prema gore, preko cijelog zaslona. -Njegove čaše. -Tu je odraz. -To je momčad Neuvitas baseball. To je njihov logo. -I on govori da onaj tko je nosio tu jaknu. [END video reprodukciju] David J. Malan: To će Problem se Set 5. Mi ćemo vidjeti sljedeći tjedan. MALE ZVUČNI: Na sljedećem CS50. [Cvrkut cvrčaka] [Glazba svira]