1 00:00:00,000 --> 00:00:10,970 >> [Glazba svira] 2 00:00:10,970 --> 00:00:12,536 >> David J. Malan: U redu. 3 00:00:12,536 --> 00:00:13,392 >> [Smijeh] 4 00:00:13,392 --> 00:00:14,240 >> Dobrodošao natrag. 5 00:00:14,240 --> 00:00:14,990 Ovo je CS50. 6 00:00:14,990 --> 00:00:16,890 I to je kraj tjedna pet. 7 00:00:16,890 --> 00:00:20,020 I do sada, mi smo prilično mnogo uzimali zdravo za gotovo da ne postoji 8 00:00:20,020 --> 00:00:23,480 postoji ovaj prevodilac, jeka, da ste zazivajući je putem ovog 9 00:00:23,480 --> 00:00:27,100 drugi alat zove Provjerite da na neki način magično pretvoriti svoj izvorni kod 10 00:00:27,100 --> 00:00:31,350 u objektnom kodu, nula i one da je vaša računala CPU, central 11 00:00:31,350 --> 00:00:33,410 procesorska jedinica, zapravo razumije. 12 00:00:33,410 --> 00:00:36,770 No, ispostavilo se da postoji broj koji je događa ispod poklopca motora u 13 00:00:36,770 --> 00:00:38,690 između ulaznih i izlaznih. 14 00:00:38,690 --> 00:00:41,800 >> I ja bih predložiti da se meso da je u malo više detalja u 15 00:00:41,800 --> 00:00:45,130 ove četiri koraka, ima nešto što se zove predobrada, nešto 16 00:00:45,130 --> 00:00:48,300 zove sastavljanje, što smo vidjeli, nešto što se zove montaže i 17 00:00:48,300 --> 00:00:49,420 nešto što se zove povezivanja. 18 00:00:49,420 --> 00:00:53,270 Dakle, do sada, u nekim od naših programi, koje smo imali oštre uključuje. 19 00:00:53,270 --> 00:00:56,650 Nedavno smo imali neke oštre određuje za konstanti. 20 00:00:56,650 --> 00:01:00,660 Tako ispada da su one stvari koje prefiks ima hash simbol ili 21 00:01:00,660 --> 00:01:04,150 pound simbol su pre-procesor direktive. 22 00:01:04,150 --> 00:01:07,960 To je samo fancy način govoreći da je linija koda koji je zapravo 23 00:01:07,960 --> 00:01:12,280 pretvoriti u nešto drugo prije Računalo i pokušati pretvoriti tvoj 24 00:01:12,280 --> 00:01:13,800 Program u nule i jedinice. 25 00:01:13,800 --> 00:01:19,000 >> Na primjer, oštri uključuje standardne I / O. H, prilično jednostavno znači ići 26 00:01:19,000 --> 00:01:24,010 naprijed, zgrabite sadržaj datoteke stdio.h i zalijepite ih tamo. 27 00:01:24,010 --> 00:01:25,880 Dakle, nema nule i jedinice u tom trenutku još. 28 00:01:25,880 --> 00:01:27,470 To je zapravo samo zamjena. 29 00:01:27,470 --> 00:01:30,790 I to je učinio tijekom tzv predobrada fazi, kada 30 00:01:30,790 --> 00:01:34,230 zapravo pokrenuti jeka ili posebno Provjerite u većini slučajeva. 31 00:01:34,230 --> 00:01:36,950 Dakle, sve ovo što se događa Prvi automatski do sada. 32 00:01:36,950 --> 00:01:38,800 >> Tada dolazi kompilacije korak. 33 00:01:38,800 --> 00:01:40,920 No, mi smo bili pojednostavni Kompilacija. 34 00:01:40,920 --> 00:01:45,060 Izrada programa zapravo znači ga uzeti od nečega poput C, 35 00:01:45,060 --> 00:01:48,430 koda smo pisali, prema dolje za nešto što se zove sklop. 36 00:01:48,430 --> 00:01:52,900 Skupština jezik je niža razina jezik koji se, srećom, nećemo 37 00:01:52,900 --> 00:01:55,480 su mnogo prigoda za napisati ovaj semestar. 38 00:01:55,480 --> 00:01:59,100 Ali to je na najnižoj razini u Osjećaj da ste doslovno početi pisati 39 00:01:59,100 --> 00:02:04,270 dodavanje i oduzimanje i množenje i učitavanje iz sjećanja i spremiti u memoriju, 40 00:02:04,270 --> 00:02:08,259 vrlo osnovne upute koje računalo, ispod poklopca motora, 41 00:02:08,259 --> 00:02:09,639 zapravo razumije. 42 00:02:09,639 --> 00:02:14,930 >> Konačno, montaže se na taj jezik do nule i jedinice koje smo bili 43 00:02:14,930 --> 00:02:16,190 opisuje do sada. 44 00:02:16,190 --> 00:02:19,270 I doista na kraju, tu je takozvani povezivanja faza, koje ćemo 45 00:02:19,270 --> 00:02:22,360 vidjeti samo na trenutak, koji kombinira Vaši nule i jedinice s nulama i 46 00:02:22,360 --> 00:02:24,870 one druge ljude prije koje ste stvorili. 47 00:02:24,870 --> 00:02:26,660 >> Pa upravo ovaj super jednostavan program. 48 00:02:26,660 --> 00:02:27,560 To je iz tjedna 1. 49 00:02:27,560 --> 00:02:29,610 On je samo rekao, Hello World, na zaslonu. 50 00:02:29,610 --> 00:02:30,920 Trčali smo kroz ovu jeka. 51 00:02:30,920 --> 00:02:33,200 Ili smo trčali kroz to napraviti koji je vodio jeka. 52 00:02:33,200 --> 00:02:36,170 I reproduciraju u vremenu u kojem neke nule i jedinice. 53 00:02:36,170 --> 00:02:38,100 No, ispostavilo se da postoji međukorak. 54 00:02:38,100 --> 00:02:40,460 Ako idem ovamo - pardon, nije Želim ga vidjeti. 55 00:02:40,460 --> 00:02:44,800 Ako idem ovamo na moj aparat i ja otvoriti hello.c, ovdje 56 00:02:44,800 --> 00:02:46,160 je da isti program. 57 00:02:46,160 --> 00:02:48,600 A ono što ću učiniti u mojoj terminala Prozor ovdje ću 58 00:02:48,600 --> 00:02:51,430 pokrenuti Dong nego napraviti, što automatizira sve četiri 59 00:02:51,430 --> 00:02:52,870 ti koraci za nas. 60 00:02:52,870 --> 00:02:58,620 A ja ću učiniti Dong-S i onda hello.c a zatim ući. 61 00:02:58,620 --> 00:03:00,590 >> I sam se treptanje brz opet, što je dobro. 62 00:03:00,590 --> 00:03:05,280 I sada u malo veći prozor, Idem otvoriti gedit ovdje. 63 00:03:05,280 --> 00:03:09,610 A ja ću otvoriti datoteku da, Ispada, to se zove hello.s 64 00:03:09,610 --> 00:03:11,870 Sadrži ta skupština jezik Ja tekstu ranije. 65 00:03:11,870 --> 00:03:15,060 I to je ono što se zove montažu jezik, prilično niska razina 66 00:03:15,060 --> 00:03:18,470 Upute kako vaš Intel procesora ili što god to je da je unutra 67 00:03:18,470 --> 00:03:19,350 razumije. 68 00:03:19,350 --> 00:03:24,480 I mov je u pokretu. poziv za zovete, vrlo nisku razinu funkciju. 69 00:03:24,480 --> 00:03:26,380 sub je za oduzimanje. 70 00:03:26,380 --> 00:03:30,370 >> Dakle, kada imate posebnu CPU unutar vašeg računala, što ga čini 71 00:03:30,370 --> 00:03:34,300 različita, u odnosu na ostale na CPU na tržištu, što je to s uputama 72 00:03:34,300 --> 00:03:39,460 razumije i često koliko je učinkovita je, koliko brzo je to, na neki izvršavanju 73 00:03:39,460 --> 00:03:40,380 tih uputa. 74 00:03:40,380 --> 00:03:45,150 Sada za više o tome, što može potrajati Sljedeći Jesen CS61 na faksu. 75 00:03:45,150 --> 00:03:48,170 Ali ovdje imamo, primjerice, neke identifikatori koje bi moglo zvučati poznato. 76 00:03:48,170 --> 00:03:50,150 hello.c je ime programa. 77 00:03:50,150 --> 00:03:51,070 >> . Tekst - 78 00:03:51,070 --> 00:03:54,190 nema puno interesa postoji Upravo sada, podsjetiti da je tekst 79 00:03:54,190 --> 00:03:59,190 segmentu, od ponedjeljka, gdje je u memorije vaš program zapravo završava. 80 00:03:59,190 --> 00:04:01,330 Pa to je barem maglovito poznato postoji. 81 00:04:01,330 --> 00:04:03,730 Ovdje, naravno, spominje od naših glavnih funkcija. 82 00:04:03,730 --> 00:04:07,220 Pomicanje prema dolje, to se odnosi na stvari tzv registri, vrlo male komade 83 00:04:07,220 --> 00:04:09,190 memorije unutar svoje stvarne CPU. 84 00:04:09,190 --> 00:04:12,930 A ako sam se pomaknite prema dolje i dalje, vidim neku 85 00:04:12,930 --> 00:04:14,240 neizravna spomen ASCII. 86 00:04:14,240 --> 00:04:17,120 I tu, zapravo, da je string, Pozdrav, zarez, svijet. 87 00:04:17,120 --> 00:04:20,079 >> Pa ne duljimo, ovo je bio događa za vas, automatski, 88 00:04:20,079 --> 00:04:22,140 ispod poklopca motora sve ovo vrijeme. 89 00:04:22,140 --> 00:04:26,450 A što se događa kad je stvarno ste pokrenuti Dong, ili putem 90 00:04:26,450 --> 00:04:29,150 Provjerite, da ste dobivanje prva, iz izvornog koda, 91 00:04:29,150 --> 00:04:30,700 tzv. zbirni jezik. 92 00:04:30,700 --> 00:04:35,210 Tada je Dong pretvoriti ovaj sklop jezik do nule i jedinice. 93 00:04:35,210 --> 00:04:38,340 A to je slajd koji smo započeli Naša rasprava u tjednu na 0 - 94 00:04:38,340 --> 00:04:39,840 a zatim Tjedan 1 na. 95 00:04:39,840 --> 00:04:44,030 A onda na kraju, one nule i jedinice u kombinaciji s nulama i one 96 00:04:44,030 --> 00:04:47,190 s tim knjižnicama uzimamo zdravo za gotovo, kao što su standardno I / O ili 97 00:04:47,190 --> 00:04:50,010 Gudački knjižnica ili čak CS50 knjižnice. 98 00:04:50,010 --> 00:04:54,200 >> Dakle slikati ovu sliku više vizualno, imamo hello.c. 99 00:04:54,200 --> 00:04:57,220 I to, naravno, koristi printf funkcionirati reći, Hello World. 100 00:04:57,220 --> 00:05:01,810 Kompilacija korak to traje sve do file da smo upravo vidjeli hello.s, čak 101 00:05:01,810 --> 00:05:04,290 iako je to obično je izbrisan automatski za vas. 102 00:05:04,290 --> 00:05:06,050 Ali to je kod montaže u sredini koraku. 103 00:05:06,050 --> 00:05:09,750 I onda kad smo okupiti zbor jezik, da se tako izrazim, to je kada 104 00:05:09,750 --> 00:05:10,830 dobiti one nule i jedinice. 105 00:05:10,830 --> 00:05:13,920 Tako smo zumirani učinkovito i danas na ono što uzimamo zdravo za gotovo, 106 00:05:13,920 --> 00:05:16,430 znači ide izvorni kod objektnog koda. 107 00:05:16,430 --> 00:05:18,850 >> Ali na kraju, sad kad ista slika - idemo ga gurati preko 108 00:05:18,850 --> 00:05:20,020 lijeva strana. 109 00:05:20,020 --> 00:05:22,880 I imajte na umu da je u vrhu postoji Spomenuo sam stdio.h. 110 00:05:22,880 --> 00:05:25,030 To je datoteka koja smo uključeni u gotovo svim 111 00:05:25,030 --> 00:05:26,250 Programi koje smo napisali. 112 00:05:26,250 --> 00:05:28,830 I to je file čiji sadržaj dobiti primjerak zalijepili, 113 00:05:28,830 --> 00:05:30,350 učinkovito vrhu kodu. 114 00:05:30,350 --> 00:05:34,170 No, ispostavilo se da je, na računalu Sustav negdje, tu je vjerojatno 115 00:05:34,170 --> 00:05:39,150 stdio.c sliku da je netko pisao godina Prije koji provodi sve 116 00:05:39,150 --> 00:05:41,870 Funkcije koje su proglašene u stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Sada je u stvarnosti to je vjerojatno nije na Mac ili računalo ili čak u 118 00:05:45,465 --> 00:05:47,660 CS50 aparat je sirovo C koda. 119 00:05:47,660 --> 00:05:52,710 Netko ga već sastavljen i uključene . O datoteku za šifri objekta ili. 120 00:05:52,710 --> 00:05:56,020 file, koji se odnosi na zajedničko knjižnica koji je bio predinstaliran i 121 00:05:56,020 --> 00:05:57,240 već sastavio za vas. 122 00:05:57,240 --> 00:06:01,950 Ali pretpostavimo da doista postoji na našem računalu stdio.c u paralelne 123 00:06:01,950 --> 00:06:02,650 s jeka. 124 00:06:02,650 --> 00:06:04,960 Vaš broj je sastavljao i skupi. 125 00:06:04,960 --> 00:06:09,200 stdio.c je broj se sastaviti i skupi, tako da je ova posljednja 126 00:06:09,200 --> 00:06:13,730 korak, ovdje dolje, moramo nekako link, da se tako izrazim, vaši nule i jedinice 127 00:06:13,730 --> 00:06:18,430 njegova ili njezina jedinica i nula u jednom jednostavan program koji je u konačnici 128 00:06:18,430 --> 00:06:20,540 Pozdrav zove jednostavno. 129 00:06:20,540 --> 00:06:23,340 >> Dakle, to je sve od magije koja je se događalo do sada. 130 00:06:23,340 --> 00:06:26,430 I dalje će se to procesi zdravo za gotovo, ali shvatite 131 00:06:26,430 --> 00:06:28,750 postoji mnogo sočnih detalja događa ispod postoji. 132 00:06:28,750 --> 00:06:31,920 I to je ono što čini vaš računalo sa Intel Inside 133 00:06:31,920 --> 00:06:33,940 osobito razvijen. 134 00:06:33,940 --> 00:06:37,020 >> Tako na to, ako bi željeli pridružite nam se na ručku u petak, idu 135 00:06:37,020 --> 00:06:41,570 na uobičajenom mjestu cs50.net/rsvp, 13:15 ovog petka. 136 00:06:41,570 --> 00:06:43,400 A sada nekoliko najave. 137 00:06:43,400 --> 00:06:44,670 Dakle, imamo dobre vijesti. 138 00:06:44,670 --> 00:06:45,970 I mi imamo neke loše vijesti. 139 00:06:45,970 --> 00:06:47,260 Počnite s nekim dobrim vijestima ovdje. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Stenjao] 142 00:06:54,510 --> 00:06:54,710 >> U redu. 143 00:06:54,710 --> 00:06:56,670 Pa, to je tehnički odmor, tako da to nije toliko dar od nas. 144 00:06:56,670 --> 00:06:58,030 Ali onda loše vijesti, naravno. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Stenjao] 147 00:07:01,880 --> 00:07:03,530 >> Proveo sam puno vremena na ove animacije. 148 00:07:03,530 --> 00:07:04,690 >> [Smijeh] 149 00:07:04,690 --> 00:07:07,000 >> Tu će biti sjednica recenziju U ponedjeljak. 150 00:07:07,000 --> 00:07:08,340 To će biti u 17:30. 151 00:07:08,340 --> 00:07:11,210 Mi ćemo vas podsjetiti na sve te detalje putem e-maila na golf-a 152 00:07:11,210 --> 00:07:13,470 web stranice u samo nekoliko dana vremena. 153 00:07:13,470 --> 00:07:16,610 To će biti sniman i staviti na raspolaganje ubrzo nakon toga. 154 00:07:16,610 --> 00:07:19,200 Dakle, ako ne možete učiniti da ponedjeljak Utor za noć, ne brinite. 155 00:07:19,200 --> 00:07:22,270 Sekcije idućeg tjedna će također usredotočiti na pregled za kviz. 156 00:07:22,270 --> 00:07:25,670 Ako je odjeljak u ponedjeljak, što je Doista sveučilište odmor, hoćemo 157 00:07:25,670 --> 00:07:26,920 Još uvijek se sastati u sekciji. 158 00:07:26,920 --> 00:07:28,890 Ako jednostavno ne možete učiniti da poglavlje jer ćete 159 00:07:28,890 --> 00:07:29,860 pobjeći, to je u redu. 160 00:07:29,860 --> 00:07:33,710 Sudjelujte u nedjelju ili utorak sekcija ili tune-u kako bi Jasonovoj sekciji, što je 161 00:07:33,710 --> 00:07:35,110 dostupni online. 162 00:07:35,110 --> 00:07:37,490 >> Dakle, više loših vijesti. 163 00:07:37,490 --> 00:07:41,960 Tako da prema programu, imamo predavanje sljedećeg petka. 164 00:07:41,960 --> 00:07:43,690 No, dobra vijest - 165 00:07:43,690 --> 00:07:44,860 jasno, sam proveo previše vremena na to. 166 00:07:44,860 --> 00:07:45,280 >> [Smijeh] 167 00:07:45,280 --> 00:07:47,140 >> Mi ćemo odustati od sljedećeg petka predavanja. 168 00:07:47,140 --> 00:07:50,590 Tako da će biti dar za nas, tako da stvarno može imati lijep predah u 169 00:07:50,590 --> 00:07:52,990 između ovog tjedna i dva tjedna kasnije. 170 00:07:52,990 --> 00:07:57,460 Dakle nema predavanja sljedeći tjedan, samo jedan maleni Malo kviz, koji bi trebali biti 171 00:07:57,460 --> 00:07:59,030 uzimajući sve više uzbuđen. 172 00:07:59,030 --> 00:08:03,870 >> Tako ćemo sada skrenuti pozornost na nešto što je doista više vizualni 173 00:08:03,870 --> 00:08:06,990 i više uzbudljiv i za postavljanje pozornice za ono što će biti na vidiku 174 00:08:06,990 --> 00:08:08,420 u samo nekoliko tjedana. 175 00:08:08,420 --> 00:08:12,160 Nakon prvog kviza, mi ćemo pretvoriti usredotočiti naših problema skupova u drugu 176 00:08:12,160 --> 00:08:16,710 domene specifičan problem, a to je forenzike ili sigurnosnih općenitije. 177 00:08:16,710 --> 00:08:19,550 >> U stvari, tradicije s ovim problemom Skup je za mene jedna od 178 00:08:19,550 --> 00:08:24,850 demonstrator ili CAS hodati po kampus uzimanje neke fotografije 179 00:08:24,850 --> 00:08:29,450 Prepoznatljiva, ali nisu očite ljudi, mjesta, ili stvari, onda svake godine sam 180 00:08:29,450 --> 00:08:34,520 nekako uspjeli slučajno izbrišete ili pokvariti digitalnih medija karticu 181 00:08:34,520 --> 00:08:35,720 da je unutar naše kamere. 182 00:08:35,720 --> 00:08:36,860 No, nije velika stvar. 183 00:08:36,860 --> 00:08:39,200 Ja mogu ići naprijed i priključiti da u mom računalu. 184 00:08:39,200 --> 00:08:43,010 Ja mogu napraviti forenzičke sliku o tome, tako da govoriti, kopiranjem nule i 185 00:08:43,010 --> 00:08:46,830 one s toga memorijsku karticu, bilo njegova SD kartica ili Compact Flash kartica ili 186 00:08:46,830 --> 00:08:48,100 sve što ste upoznati sa. 187 00:08:48,100 --> 00:08:49,300 A onda možemo ruka koja se. 188 00:08:49,300 --> 00:08:53,190 >> I tako je izazov pred nama, među ostalim stvari za vas, bit će pisati 189 00:08:53,190 --> 00:08:58,630 C kod koji oporavi cijela hrpa JPEG za mene i otkrio da neće biti 190 00:08:58,630 --> 00:09:00,190 ti ljudi, mjesta ili stvari. 191 00:09:00,190 --> 00:09:03,340 I također ćemo razgovarati, u tom problemu postavljena iu danima koji dolaze, o 192 00:09:03,340 --> 00:09:04,440 grafički općenitije. 193 00:09:04,440 --> 00:09:06,140 Mi smo ih koristili, tečaj, za break out. 194 00:09:06,140 --> 00:09:09,080 Ali vi ste vrsta uzeti zdravo za gotovo postoji ta visoka razina pojmovi 195 00:09:09,080 --> 00:09:10,680 pravokutnika i ovala. 196 00:09:10,680 --> 00:09:12,450 No, ispod poklopca motora postoje piksela. 197 00:09:12,450 --> 00:09:14,370 I vi ste imali za početak razmišljam o onima. 198 00:09:14,370 --> 00:09:18,800 Ili što će za p-set 4 razmišljati o jaz između svoje cigle, koliko je 199 00:09:18,800 --> 00:09:21,990 brzo ste lopta se kreće preko Zaslon za break out. 200 00:09:21,990 --> 00:09:24,830 Dakle, postoji taj pojam točkice na zaslonu koji je 201 00:09:24,830 --> 00:09:26,290 dolaze u igru ​​već. 202 00:09:26,290 --> 00:09:29,430 >> Sada ono što vidite, ipak, ono što je ste dobili na zaslonu računala. 203 00:09:29,430 --> 00:09:33,680 Ako ste ikada gledali neki dobar ili Loša TV, izgledi su oni prilično mnogo 204 00:09:33,680 --> 00:09:36,280 tretirati publiku kao technophobes koji to zapravo nisu 205 00:09:36,280 --> 00:09:37,630 znam puno o računalstvu. 206 00:09:37,630 --> 00:09:40,840 I to je vrlo lako za policiju Detektiv je reći, može li 207 00:09:40,840 --> 00:09:41,710 očistite taj gore za mene? 208 00:09:41,710 --> 00:09:42,710 Ili bi se poboljšala, zar ne? 209 00:09:42,710 --> 00:09:45,550 Poboljšajte je kao krilatica u najviše bilo zločina povezanih serija. 210 00:09:45,550 --> 00:09:49,240 A stvarnost je ako se vrlo mutna slika osumnjičenika radi 211 00:09:49,240 --> 00:09:51,620 nešto loše, ne možete Samo ga poboljšati. 212 00:09:51,620 --> 00:09:53,080 Ne možete zumirati u beskonačno. 213 00:09:53,080 --> 00:09:56,350 Ne možete vidjeti u odsjajem netko Oko tko je počinio to 214 00:09:56,350 --> 00:09:59,860 Konkretno zločin, bez obzira Prevalencija ovo na TV-u. 215 00:09:59,860 --> 00:10:04,110 >> I tako s tim ćemo motivirati da Problem nadolazeće set s pogled na 216 00:10:04,110 --> 00:10:05,765 neke emisije s kojima moglo biti poznato. 217 00:10:05,765 --> 00:10:06,500 >> [Video reprodukciju] 218 00:10:06,500 --> 00:10:07,835 >> -U redu. 219 00:10:07,835 --> 00:10:09,956 Sada, neka je dobiti dobar pogled na vas. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> Držite ga-. 222 00:10:17,766 --> 00:10:18,658 Run to natrag. 223 00:10:18,658 --> 00:10:19,550 >> -Čekaj malo. 224 00:10:19,550 --> 00:10:21,580 Idite desno. 225 00:10:21,580 --> 00:10:21,800 >> -Tu. 226 00:10:21,800 --> 00:10:22,690 Zaustavi. 227 00:10:22,690 --> 00:10:23,692 >> -Cijeli zaslon. 228 00:10:23,692 --> 00:10:23,846 >> -U redu. 229 00:10:23,846 --> 00:10:24,154 Zaustavi. 230 00:10:24,154 --> 00:10:25,140 >> Zategnite-up na to, molim te? 231 00:10:25,140 --> 00:10:27,090 >> Vector-u na tom tipu na stražnja kotača. 232 00:10:27,090 --> 00:10:29,730 >> Zoom-u upravo ovdje na ovom mjestu. 233 00:10:29,730 --> 00:10:33,700 >> -S pravom opremom, slikom može biti povećan i izoštriti. 234 00:10:33,700 --> 00:10:34,490 >> -Što je to? 235 00:10:34,490 --> 00:10:35,870 >> -To je pojašnjenje program. 236 00:10:35,870 --> 00:10:36,793 >> -Možete li jasno da se bilo? 237 00:10:36,793 --> 00:10:38,560 >> -Ne znam. 238 00:10:38,560 --> 00:10:39,090 Idemo ga poboljšati. 239 00:10:39,090 --> 00:10:41,690 >> -Unaprijedili dio-6. 240 00:10:41,690 --> 00:10:43,510 >> -Ja poboljšane detalje i - 241 00:10:43,510 --> 00:10:44,456 >> -Mislim da je dovoljno kako bi se poboljšala. 242 00:10:44,456 --> 00:10:45,402 Pustite ga na moj zaslon. 243 00:10:45,402 --> 00:10:47,300 >> -Povećati odraz u njezinim očima. 244 00:10:47,300 --> 00:10:49,330 >> -Da vidimo što o ovome video opremu. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, možete poboljšati ovo? 246 00:10:50,340 --> 00:10:52,320 >> -Drži se. 247 00:10:52,320 --> 00:10:54,290 >> -Ja radili na ovom razmišljanju. 248 00:10:54,290 --> 00:10:55,560 >> -Netko je odraz. 249 00:10:55,560 --> 00:10:56,440 >> -Razmišljanje. 250 00:10:56,440 --> 00:10:57,940 >> -Tu je odraz Muškarac je lice. 251 00:10:57,940 --> 00:10:58,860 >> -Refleksije. 252 00:10:58,860 --> 00:10:59,710 >> -Tu je odraz. 253 00:10:59,710 --> 00:11:00,900 >> -Povećavanje na ogledalu. 254 00:11:00,900 --> 00:11:03,500 >> -Možete vidjeti svoj odraz. 255 00:11:03,500 --> 00:11:04,700 >> -Može li se poboljšati imidž od ovog? 256 00:11:04,700 --> 00:11:05,700 >> -Mogu li ga unaprijedili ovdje? 257 00:11:05,700 --> 00:11:06,500 >> -Može li to poboljšati? 258 00:11:06,500 --> 00:11:07,380 >> -Može li to poboljšati? 259 00:11:07,380 --> 00:11:08,190 >> -Možemo li poboljšati ovo? 260 00:11:08,190 --> 00:11:08,940 >> -Može li to poboljšati? 261 00:11:08,940 --> 00:11:10,280 >> -Čekaj malo, ja ću unaprijediti. 262 00:11:10,280 --> 00:11:11,570 >> -Povećavanje na vratima. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Smijeh] 266 00:11:13,197 --> 00:11:14,360 >> -Pomicanje u. 267 00:11:14,360 --> 00:11:15,100 >> -Čekaj, stani. 268 00:11:15,100 --> 00:11:15,740 >> -Prestani. 269 00:11:15,740 --> 00:11:16,290 >> To-pauzirati. 270 00:11:16,290 --> 00:11:19,390 >> Rotirati za 75 stupnjeva oko vertikalni molimo. 271 00:11:19,390 --> 00:11:19,886 >> [Smijeh] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, i natrag u dijelu na vrata ponovno. 273 00:11:24,350 --> 00:11:26,330 >> -Imaš slike pojačivač koji mogu bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Možda možemo koristiti Pradeep Sen Metoda vidjeti u prozore. 275 00:11:28,990 --> 00:11:30,680 >> -Ovaj softver je stanje u umjetnosti. 276 00:11:30,680 --> 00:11:31,676 >> -Icon Vrijednost isključen. 277 00:11:31,676 --> 00:11:34,166 >> -S pravom kombinacijom algoritama. 278 00:11:34,166 --> 00:11:38,399 >> -Uzeo osvjetljenje algoritme za Sljedeća razina i mogu ih koristiti za 279 00:11:38,399 --> 00:11:38,648 unaprijedili ovu fotografiju. 280 00:11:38,648 --> 00:11:42,050 >> -Lock povećanje z-osi. 281 00:11:42,050 --> 00:11:42,760 >> -Unaprijediti. 282 00:11:42,760 --> 00:11:43,060 >> -Unaprijediti. 283 00:11:43,060 --> 00:11:43,760 >> -Unaprijediti. 284 00:11:43,760 --> 00:11:45,010 >> -Zamrznuti i unaprijediti. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END video reprodukciju] 287 00:11:47,910 --> 00:11:51,470 >> David J. Malan: Dakle Problem Set 5 je ono što je pred nama postoji. 288 00:11:51,470 --> 00:11:55,260 Dakle, uskoro ćemo dobiti bolje razumijevanje od kada i zašto možete 289 00:11:55,260 --> 00:11:57,300 a naša se ne može poboljšati na taj način. 290 00:11:57,300 --> 00:12:00,090 Ali prvo, neka se vrati našu pozornost za neke od građevnih blokova ćemo 291 00:12:00,090 --> 00:12:02,250 Morate biti u mogućnosti reći da priča. 292 00:12:02,250 --> 00:12:05,580 >> Dakle podsjetiti da mi je nacrtao ovu sliku na Ponedjeljak i malo prošlog tjedna. 293 00:12:05,580 --> 00:12:09,970 A to opisuje izgled stvari u memorije računala kada 294 00:12:09,970 --> 00:12:11,000 prikazivati ​​neki program. 295 00:12:11,000 --> 00:12:14,310 Tech segmentu do vrha, podsjetimo, upućuje na stvarne i nula koje 296 00:12:14,310 --> 00:12:16,000 kako sastaviti svoj program. 297 00:12:16,000 --> 00:12:19,340 Tu je, ispod toga, neki inicijalizacije ili Nepoznati podaci, koji se obično 298 00:12:19,340 --> 00:12:22,910 odnosi se na stvari kao što su konstanti ili žice ili globalnih varijabli koje imaju 299 00:12:22,910 --> 00:12:24,200 proglašen unaprijed. 300 00:12:24,200 --> 00:12:26,500 Postoji gomila, ali vratit ćemo se vratiti na to u malo. 301 00:12:26,500 --> 00:12:27,410 >> A tu je i stog. 302 00:12:27,410 --> 00:12:30,660 Slično kao i hrpu ladica u kafeterija, ovo je mjesto gdje memorija dobiva 303 00:12:30,660 --> 00:12:33,610 slojevita i slojevita kad Što vam je činiti u programu? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Što je stog za korištenje? 306 00:12:37,730 --> 00:12:39,320 >> Da? 307 00:12:39,320 --> 00:12:40,000 >> Poziv funkcije. 308 00:12:40,000 --> 00:12:42,890 Svaki put kad nazovete funkciju, to je dano luč memorije za njegovu 309 00:12:42,890 --> 00:12:45,020 lokalne varijable ili njezine parametre. 310 00:12:45,020 --> 00:12:48,810 I slikovito, možemo vidjeti da sa svakim sukcesivno funkcija zove, kada je 311 00:12:48,810 --> 00:12:52,520 pozivi pozivi B C D pozivi, oni se slojevito na stog. 312 00:12:52,520 --> 00:12:55,630 I u svakoj od tih kriške Memorija je u biti jedinstveno opseg 313 00:12:55,630 --> 00:12:58,590 za tu funkciju, što je, naravno, je problematično ako želite predati 314 00:12:58,590 --> 00:13:01,850 iz jedne u drugu funkciju komada podataka koji ga žele 315 00:13:01,850 --> 00:13:03,500 mutirati ili mijenjati. 316 00:13:03,500 --> 00:13:08,060 >> Dakle, ono što je naše rješenje za omogućavanje Funkcija zastupa jedan stog 317 00:13:08,060 --> 00:13:11,390 okvir za promjenu memorije unutar drugog stog okvira? 318 00:13:11,390 --> 00:13:14,590 Kako te dvije razgovarati jedni drugima? 319 00:13:14,590 --> 00:13:18,510 Dakle, kroz pokazivače ili adrese, koji se, opet, samo opisao gdje je u 320 00:13:18,510 --> 00:13:22,280 memorije, na način specifičan Ugriz broj, posebice 321 00:13:22,280 --> 00:13:23,830 Vrijednost se može naći. 322 00:13:23,830 --> 00:13:26,860 Dakle sjetiti zadnji put previše smo nastavili priču i pogledao 323 00:13:26,860 --> 00:13:28,280 Program prilično lud. 324 00:13:28,280 --> 00:13:32,900 I ovaj program je lud za neke Razlozi, ali najviše zabrinjava je jedna 325 00:13:32,900 --> 00:13:34,620 jer ne provjeriti što? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Da, to ne uspije, provjerite ulaz. 328 00:13:40,450 --> 00:13:41,870 Nažalost? 329 00:13:41,870 --> 00:13:43,880 >> Ako je više od 12 znakova. 330 00:13:43,880 --> 00:13:47,260 Dakle, vrlo pametno, ako zovete memcopy, koji, kao što ime sugerira, jednostavno 331 00:13:47,260 --> 00:13:50,630 kopije memorije iz drugog argumenta u svom prvom argumentu. 332 00:13:50,630 --> 00:13:54,730 Treći argument, vrlo pametno, je provjeriti kako bi bili sigurni da se ne 333 00:13:54,730 --> 00:13:59,400 kopirati više nego, u ovom slučaju, duljinu od gola, broj znakova, 334 00:13:59,400 --> 00:14:03,810 u mjestu, što je to Niz C. No, problem je u tome što se 335 00:14:03,810 --> 00:14:07,230 Ako C sam po sebi nije dovoljno velika da obrađuju to? 336 00:14:07,230 --> 00:14:09,900 Ideš kopirati broj bajtova koje ste dobili. 337 00:14:09,900 --> 00:14:13,040 No, ono što vi zapravo imate više bajtova nego što ima mjesta za? 338 00:14:13,040 --> 00:14:16,770 >> Pa, ovaj program je vrlo jednostavno glupo slijepo nastavlja se bez obzira na to 339 00:14:16,770 --> 00:14:20,650 dano, halo backslash 0 je super ako string je kratko 340 00:14:20,650 --> 00:14:22,040 dovoljno, kao i pet znakova. 341 00:14:22,040 --> 00:14:26,470 No, je li to zapravo 12 znakova ili 1.200 znakova, vidjeli smo posljednji put 342 00:14:26,470 --> 00:14:29,380 da ste samo idući u potpunosti prepisivanje memorije koja 343 00:14:29,380 --> 00:14:30,470 ne pripada vama. 344 00:14:30,470 --> 00:14:34,390 I najgorem slučaju, ako prebrisati da crveni dio ima koji smo nazvali 345 00:14:34,390 --> 00:14:35,380 vrate adresu - 346 00:14:35,380 --> 00:14:38,370 to je samo u kojoj se računalo automatski, za vas, iza 347 00:14:38,370 --> 00:14:43,130 scene, tucks udaljeno 32-bitna vrijednost koja to podsjeća na ono što bi trebao adresa 348 00:14:43,130 --> 00:14:47,080 vratiti kada Foo, ovu drugu funkciju, vrši izvršavanju. 349 00:14:47,080 --> 00:14:49,320 To je prezla sorti na koje se vraća. 350 00:14:49,320 --> 00:14:52,490 Ako prebrisati da, potencijalno, ako si loš čovjek, mogu mogli 351 00:14:52,490 --> 00:14:54,750 potencijalno preuzme neko računalo. 352 00:14:54,750 --> 00:14:58,020 I vi ćete sigurno to pad u većini slučajeva. 353 00:14:58,020 --> 00:15:01,690 >> Sada je taj problem je samo pogoršan kao što smo počeli govoriti o memoriji 354 00:15:01,690 --> 00:15:03,010 Upravljanje općenito. 355 00:15:03,010 --> 00:15:07,150 I malloc, za dodjelu memorije, je funkcija koja možemo koristiti za dodjelu 356 00:15:07,150 --> 00:15:11,260 memorije kad ne znamo unaprijed da trebamo malo. 357 00:15:11,260 --> 00:15:13,960 Tako, na primjer, ako se vratim na aparatu ovdje. 358 00:15:13,960 --> 00:15:21,010 I ja se otvoriti na posljednji put hello2.c, prisjetiti ovaj program ovdje, koja je izgledala 359 00:15:21,010 --> 00:15:23,500 Malo se nešto ovako, samo tri linije - 360 00:15:23,500 --> 00:15:27,940 navesti svoje ime, a zatim String ime, na lijevoj strani, jednako getstring. 361 00:15:27,940 --> 00:15:29,690 I onda smo ga ispisati, korisničkog imena. 362 00:15:29,690 --> 00:15:31,170 >> Dakle, ovo je super jednostavan program. 363 00:15:31,170 --> 00:15:34,870 Da bude jasno, neka mi ići naprijed i čine halo-2. 364 00:15:34,870 --> 00:15:36,680 Ja ću učiniti dot crtu hello-2. 365 00:15:36,680 --> 00:15:37,750 Navedite svoje ime - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Upišite. 368 00:15:38,840 --> 00:15:39,540 Pozdrav David. 369 00:15:39,540 --> 00:15:41,060 Čini se da rade u redu. 370 00:15:41,060 --> 00:15:43,140 No, ono što se stvarno događa ispod haube ovdje? 371 00:15:43,140 --> 00:15:44,670 Prvo neka se guliti natrag nekim slojevima. 372 00:15:44,670 --> 00:15:48,380 String je samo sinonim mi smo shvatila za što? 373 00:15:48,380 --> 00:15:49,110 Char star. 374 00:15:49,110 --> 00:15:52,740 Pa neka to bude nešto više kompliciranih , ali više tehnički točno da je ovo 375 00:15:52,740 --> 00:15:55,570 je char zvijezda, što znači da Naziv, da, je promjenjiva. 376 00:15:55,570 --> 00:15:59,920 No, ono što je naziv prodavaonice adresa char, koji se osjeća malo čudno 377 00:15:59,920 --> 00:16:01,050 jer sam dobivanje natrag niz. 378 00:16:01,050 --> 00:16:03,580 Ja sam dobivanje natrag višestruki znakovi nisu znak. 379 00:16:03,580 --> 00:16:07,400 >> Ali, naravno, trebate samo prva Char obraćanje sjetiti gdje 380 00:16:07,400 --> 00:16:08,870 Cijeli niz je jer zašto? 381 00:16:08,870 --> 00:16:12,700 Kako shvatiti gdje kraj string je znao početak? 382 00:16:12,700 --> 00:16:13,630 Backslash nuli. 383 00:16:13,630 --> 00:16:17,260 Dakle, s te dvije tragove li shvatiti Prije početka i kraja 384 00:16:17,260 --> 00:16:20,280 bilo string se, tako dugo dok su oni ispravno formirana s tim null 385 00:16:20,280 --> 00:16:22,110 Terminator, koji backslash nuli. 386 00:16:22,110 --> 00:16:24,520 >> No, to se zove getstring. 387 00:16:24,520 --> 00:16:28,020 I ispada da getstring Cijelo ovo vrijeme je vrsta 388 00:16:28,020 --> 00:16:28,820 vara za nas. 389 00:16:28,820 --> 00:16:32,460 To je bio događaj ovaj rad, kako bi bili sigurni, dobivanje niz od korisnika. 390 00:16:32,460 --> 00:16:34,580 Ali gdje je to memorije dolaze iz? 391 00:16:34,580 --> 00:16:38,440 Ako se vratimo na slici ovdje i primijeniti definiciju iz samo 392 00:16:38,440 --> 00:16:42,610 Trenutak prije, da je stog je gdje memory ide kad se funkcije zove, 393 00:16:42,610 --> 00:16:45,370 po toj logici, kada poziv getstring, a onda sam se upisati u 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Enter, u kojoj je D-A-V-I-D backslash nula pohranjene na temelju 395 00:16:50,900 --> 00:16:53,480 Priča smo kazao nam je sada? 396 00:16:53,480 --> 00:16:55,190 >> Čini se da se u stog, zar ne? 397 00:16:55,190 --> 00:16:58,120 Kada zovete dobili niz dobivate Malo kriška memorije na stogu. 398 00:16:58,120 --> 00:17:01,630 Dakle, logično je da je D--V-I-D backslash nula je pohranjena 399 00:17:01,630 --> 00:17:02,770 postoji u snopu. 400 00:17:02,770 --> 00:17:07,680 Ali čekaj malo, getstring vraća da string, da se tako izrazim, što znači 401 00:17:07,680 --> 00:17:11,700 je ladicu iz kantine skida snop. 402 00:17:11,700 --> 00:17:14,560 I mi smo zadnji put rekao da čim funkcija vraća, a vi se da je 403 00:17:14,560 --> 00:17:20,109 ladica, da se tako izrazim, off snopa, ono Možete li pretpostaviti o ostacima 404 00:17:20,109 --> 00:17:21,819 da je sjećanje? 405 00:17:21,819 --> 00:17:25,160 Nekako ih redrew kao upitnicima jer oni učinkovito postanu 406 00:17:25,160 --> 00:17:26,250 nepoznat vrijednosti. 407 00:17:26,250 --> 00:17:29,500 Oni se mogu ponovno koristiti kada su neki Sljedeći funkcija se zove. 408 00:17:29,500 --> 00:17:31,870 >> Drugim riječima, ako se dogodi za pohranu - 409 00:17:31,870 --> 00:17:34,350 Ja ću povući brzu sliku Ovdje iz dimnjaka. 410 00:17:34,350 --> 00:17:38,690 Ako se dogodi da se izradi dno moje memorije segmentu, a mi ćemo reći 411 00:17:38,690 --> 00:17:42,230 da je to mjesto memorije okupirali glavni, a možda i Arg c 412 00:17:42,230 --> 00:17:46,790 ARG v i sve ostalo u programu, kada getstring se zove, 413 00:17:46,790 --> 00:17:51,120 valjda getstring dobiva komad memorije ovdje. 414 00:17:51,120 --> 00:17:53,940 A zatim D-A-V-I-D nekako završi na ovoj funkciji. 415 00:17:53,940 --> 00:17:55,320 A ja ću se pojednostavljuju. 416 00:17:55,320 --> 00:18:00,050 Ali pretpostavimo da je njegov D--V-I-D backslash nuli. 417 00:18:00,050 --> 00:18:03,500 Tako to mnogi bajta se koriste u Okvir za getstring. 418 00:18:03,500 --> 00:18:08,270 >> No, čim se vrati getstring, mi rekao je zadnji put da je ova memorija više 419 00:18:08,270 --> 00:18:11,340 Ovdje sve postaje - woops! - 420 00:18:11,340 --> 00:18:14,270 sve postaje djelotvorno izbrisani. 421 00:18:14,270 --> 00:18:17,220 I mi možemo razmišljati o tome sada kao pitanje ocjene jer tko zna 422 00:18:17,220 --> 00:18:18,720 što će biti od tog sjećanja. 423 00:18:18,720 --> 00:18:22,130 Doista, bio sam vrlo često poziva funkcije osim getstring. 424 00:18:22,130 --> 00:18:24,750 I čim sam nazvati neke druge Funkcija od getstring, možda ne u 425 00:18:24,750 --> 00:18:28,860 ovaj Program smo samo gledali ali na neki drugi, sigurno neki drugi 426 00:18:28,860 --> 00:18:34,180 Funkcija mogli završiti što je dobio ovaj sljedeći spot u stog. 427 00:18:34,180 --> 00:18:39,410 >> Dakle, to ne može biti da getstring trgovinama D-A-V-I-D na stog jer bi 428 00:18:39,410 --> 00:18:41,040 Odmah izgubiti pristup do njega. 429 00:18:41,040 --> 00:18:43,720 Ali mi znamo da getstring Samo vraća što? 430 00:18:43,720 --> 00:18:47,220 Nije povratka ja šest znakova. 431 00:18:47,220 --> 00:18:51,090 Što je to doista nije vratio zaključili smo zadnji put? 432 00:18:51,090 --> 00:18:52,480 Adresa prva. 433 00:18:52,480 --> 00:18:56,650 Tako nekako, kad zove getstring, to je dodjelom komad memorije za 434 00:18:56,650 --> 00:18:59,620 niz koji korisnici tipa i zatim se vraćaju adresu njega. 435 00:18:59,620 --> 00:19:02,930 I ispada da kad želite funkcionirati na alocirati memoriju u to 436 00:19:02,930 --> 00:19:08,390 smjer i povratak na osobu koja se zove tu funkciju, adresu 437 00:19:08,390 --> 00:19:11,870 da je komad memorije, što je apsolutno Ne mogu ga staviti u stog na 438 00:19:11,870 --> 00:19:14,750 dna, jer to je samo funkcionalno će ne postati vrlo tvoje 439 00:19:14,750 --> 00:19:17,800 brzo, tako da vjerojatno možete pogoditi gdje smo vjerojatno će to bacanje 440 00:19:17,800 --> 00:19:20,130 Umjesto toga, tzv gomila. 441 00:19:20,130 --> 00:19:25,290 >> Dakle između dna vaše pamćenje-a Raspored i vrh vaše pamćenje-a 442 00:19:25,290 --> 00:19:26,820 Raspored se cijela hrpa segmentima. 443 00:19:26,820 --> 00:19:29,270 Jedan je stog, i desno iznad njega je gomila. 444 00:19:29,270 --> 00:19:33,680 I gomila je samo drugačiji komad memorija koja ne služi za funkcije 445 00:19:33,680 --> 00:19:34,770 kada su pozvani. 446 00:19:34,770 --> 00:19:38,100 To se koristi za dugoročno pamćenje, kada je Želite jedna funkcija da zgrabite neke 447 00:19:38,100 --> 00:19:42,700 memorije i moći objesiti na njega bez gubitka kontrole nad njim. 448 00:19:42,700 --> 00:19:45,550 >> Sada bi možda odmah vidjeti da to nije 449 00:19:45,550 --> 00:19:48,060 nužno savršen dizajn. 450 00:19:48,060 --> 00:19:51,350 Kao vaš program dodjeljuje memoriju na stog, ili kako vi zovete više i 451 00:19:51,350 --> 00:19:55,540 više funkcija, ili kao što se dodijeliti memorije na gomili sa malloc off kao 452 00:19:55,540 --> 00:20:00,690 getstring se radi, što je očito Čini se da je neizbježan problem? 453 00:20:00,690 --> 00:20:00,860 >> Točno. 454 00:20:00,860 --> 00:20:03,150 Kao i činjenica da su ove strijele su okrenuti jedan prema drugom 455 00:20:03,150 --> 00:20:04,380 ne slutiti dobro. 456 00:20:04,380 --> 00:20:08,630 I doista, mogli bismo vrlo brzo srušiti Program u bilo koji broj načina. 457 00:20:08,630 --> 00:20:12,050 U stvari, mislim da smo mogli imati to učinio slučajno jednom. 458 00:20:12,050 --> 00:20:14,020 Ili, ako ne, neka je to učiniti Namjerno sada. 459 00:20:14,020 --> 00:20:21,330 Dopustite mi da ide naprijed i pisati super brzo Program pod nazivom dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 A sada ću ići na ovdje i ne uključuju oštre stdio.h. 461 00:20:26,730 --> 00:20:32,620 Idemo proglasiti funkcija Foo traje Nema argumente, što je 462 00:20:32,620 --> 00:20:34,040 označena kao i prema praznini. 463 00:20:34,040 --> 00:20:37,830 >> I jedina stvar Foo će učiniti je Poziv Foo, koji vjerojatno nije 464 00:20:37,830 --> 00:20:39,100 najpametnija ideja, ali tako se to. 465 00:20:39,100 --> 00:20:40,490 Ent glavna nevažeće. 466 00:20:40,490 --> 00:20:45,270 Sada jedino što glavna ide učiniti je nazvati foo kao dobro. 467 00:20:45,270 --> 00:20:51,050 I samo za slatkiš, ja ću otići uoči ovdje i reći printf "Pozdrav iz 468 00:20:51,050 --> 00:20:52,340 Foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Dakle, ako sam ne bi bilo pogreške, Provjerite dontdothis dot crtu. 471 00:21:00,160 --> 00:21:01,960 I neka je to učiniti u većem prozoru - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Hajde. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh. 477 00:21:11,890 --> 00:21:13,100 Očito, možete to učiniti. 478 00:21:13,100 --> 00:21:15,190 Dovraga. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Pričekajte. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Jesmo li - 483 00:21:18,270 --> 00:21:20,110 Napravili smo ga koristiti s zaraditi. 484 00:21:20,110 --> 00:21:22,050 >> [Uzdahe] 485 00:21:22,050 --> 00:21:25,110 >> Znam, ali sam Mislimo Samo da se brišu. 486 00:21:25,110 --> 00:21:28,410 Uh, da. 487 00:21:28,410 --> 00:21:30,660 Dovraga. 488 00:21:30,660 --> 00:21:32,640 Riješite ovaj Rob. 489 00:21:32,640 --> 00:21:34,678 Što? 490 00:21:34,678 --> 00:21:35,928 To je vrlo jednostavna. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Da, okrenuli smo optimizacije off. 493 00:21:47,360 --> 00:21:48,970 OK, stoje bok. 494 00:21:48,970 --> 00:21:49,950 Sada se osjećam bolje. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 U redu. 497 00:21:51,780 --> 00:21:53,430 >> Tako ćemo ovu kompilirati - 498 00:21:53,430 --> 00:21:55,880 Provjerite što dontdothis. 499 00:21:55,880 --> 00:22:00,090 Možda ćete morati promijeniti naziv to dothis.c u samo trenutak. 500 00:22:00,090 --> 00:22:00,710 Tamo idemo. 501 00:22:00,710 --> 00:22:01,240 Hvala Vam. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Dakle, činjenica da sam ispisivao Nešto je bio zapravo samo 504 00:22:05,480 --> 00:22:08,150 usporava proces u kojem smo bi do te točke. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Fuj! 507 00:22:08,870 --> 00:22:11,180 >> Dakle, ono što se zapravo događa? 508 00:22:11,180 --> 00:22:14,440 Razlog postoji, baš kao što na stranu, je radi ništa u smislu ulaznih i 509 00:22:14,440 --> 00:22:17,270 Izlaz sklon biti sporiji zato što moram napisati znakova 510 00:22:17,270 --> 00:22:18,600 screen, ima za pomicanje. 511 00:22:18,600 --> 00:22:21,720 Pa ne duljimo, imala sam zapravo dogodilo tako nestrpljiva, imali bismo 512 00:22:21,720 --> 00:22:23,260 vidio ovo na kraju rezultat kao dobro. 513 00:22:23,260 --> 00:22:26,220 Sada kada sam dobio vožnju od print-up, smo ga odmah vidjeti. 514 00:22:26,220 --> 00:22:28,410 Pa zašto se to događa. 515 00:22:28,410 --> 00:22:31,300 Pa, jednostavno objašnjenje, dakako, Foo je da vjerojatno ne bi 516 00:22:31,300 --> 00:22:32,500 će se zvati. 517 00:22:32,500 --> 00:22:34,470 >> Sada je u općim uvjetima, ovo je rekurzija. 518 00:22:34,470 --> 00:22:36,970 I mislili smo prije par tjedana Prije rekurzivna je dobro. 519 00:22:36,970 --> 00:22:40,330 Rekurzije je taj čarobni način izražavanje sebe super jezgrovito. 520 00:22:40,330 --> 00:22:41,400 I to samo radi. 521 00:22:41,400 --> 00:22:45,060 Ali je ključna značajka sve rekurzivne programi smo razgovarali 522 00:22:45,060 --> 00:22:48,260 oko i pogledao do sada, što bilo da su imali što? 523 00:22:48,260 --> 00:22:52,610 Osnovni scenarij, koji je bio neki tvrdi kodirani slučaj da je u nekim situacijama 524 00:22:52,610 --> 00:22:56,210 ne zovite Foo, što je očito ovdje nije slučaj. 525 00:22:56,210 --> 00:22:58,920 >> Dakle, ono što se stvarno događa u smislu ove slike? 526 00:22:58,920 --> 00:23:01,790 Pa, kad je glavna naziva Foo, što dobiva kriška memorije. 527 00:23:01,790 --> 00:23:04,150 Kad Foo zove foo, to dobiva kriška memorije. 528 00:23:04,150 --> 00:23:06,430 Kad Foo zove foo, to dobiva krišku. 529 00:23:06,430 --> 00:23:07,080 Ona dobiva krišku. 530 00:23:07,080 --> 00:23:08,120 Ona dobiva krišku. 531 00:23:08,120 --> 00:23:09,460 Zbog Foo nikada se vraća. 532 00:23:09,460 --> 00:23:12,160 Mi nikada ne briše jedan od onih sličice iz dimnjaka. 533 00:23:12,160 --> 00:23:15,930 Tako smo puše kroz gomilu, ne spomenuti tko zna što još, i 534 00:23:15,930 --> 00:23:19,600 mi smo prekoračenje granice našeg tzv. segment memorije. 535 00:23:19,600 --> 00:23:21,790 Pogreška ide segmentacije lažna. 536 00:23:21,790 --> 00:23:24,110 >> Dakle rješenje postoji očito to ne rade. 537 00:23:24,110 --> 00:23:28,830 No, veća implikacija je da, da, postoji apsolutno je neka granica, 538 00:23:28,830 --> 00:23:32,470 čak i ako to nije dobro definirana, kako mnoge funkcije koje mogu pozvati na 539 00:23:32,470 --> 00:23:34,970 Program, koliko puta funkciju može se nazvati. 540 00:23:34,970 --> 00:23:38,430 Dakle, iako smo učinili propovijedaju rekurzija kao potencijalnu čarobnom stvar 541 00:23:38,430 --> 00:23:41,870 Prije nekoliko tjedana za sigma funkcija, a kada smo dobili podatke 542 00:23:41,870 --> 00:23:45,270 strukture i CS50, vidjet ćete drugima aplikacije za njega, to nije 543 00:23:45,270 --> 00:23:46,500 nužno najbolja stvar. 544 00:23:46,500 --> 00:23:50,070 Jer ako se funkcija poziva, sama naziva, čak i ako postoji baza 545 00:23:50,070 --> 00:23:54,860 slučaj, ako ne pogoditi taj osnovni scenarij za 1.000 poziva ili 10.000 poziva, od strane 546 00:23:54,860 --> 00:23:58,800 Vrijeme koje ste možda ponestane prostora na tzv stog i pritisnite 547 00:23:58,800 --> 00:24:00,400 neki drugi segmenti memorije. 548 00:24:00,400 --> 00:24:03,950 Dakle, to je također dizajn trade-off između elegancije i između 549 00:24:03,950 --> 00:24:06,920 robusnost vašem Provedba. 550 00:24:06,920 --> 00:24:10,780 >> Dakle, postoji još jedan minus ili još jedna gotcha da ono što smo 551 00:24:10,780 --> 00:24:11,720 radili do sada. 552 00:24:11,720 --> 00:24:12,980 Kad sam nazvao getstring - 553 00:24:12,980 --> 00:24:15,120 neka mi se vratiti u Hello-dva. 554 00:24:15,120 --> 00:24:18,170 Obavijest da sam pozivom getstring, koji se vraća adresu. 555 00:24:18,170 --> 00:24:20,730 I mi danas tvrde da je adresa je na hrpi. 556 00:24:20,730 --> 00:24:24,480 I sad sam ispis string na toj adresi. 557 00:24:24,480 --> 00:24:27,000 Ali nikad nismo pozvani nasuprot getstring. 558 00:24:27,000 --> 00:24:30,850 Mi nikada nismo morali calll funkciju kao ungetstring, gdje ruku natrag 559 00:24:30,850 --> 00:24:31,610 da je memorija. 560 00:24:31,610 --> 00:24:33,250 Ali iskreno mi vjerojatno trebao biti. 561 00:24:33,250 --> 00:24:37,390 Jer ako smo stalno postavljaju računalo za memoriju, na način kao što je netko 562 00:24:37,390 --> 00:24:40,830 getstring ali nikada ga vratiti, zasigurno to je također dužan voditi 563 00:24:40,830 --> 00:24:42,970 Problemi pri čemu nam ponestane memorije. 564 00:24:42,970 --> 00:24:46,140 >> A u stvari, možemo tražiti te Problemi s novim alatom čiji korištenja 565 00:24:46,140 --> 00:24:47,640 je malo zagonetan upisati. 566 00:24:47,640 --> 00:24:50,960 No, dopustite mi da ide naprijed i kapljice se na zaslonu u samo trenutak. 567 00:24:50,960 --> 00:24:56,940 Ja ću ići naprijed i pokrenuti Valgrind s parametrom čija je prva zapovijed 568 00:24:56,940 --> 00:25:00,260 linije argument je ime tog programa hello-2. 569 00:25:00,260 --> 00:25:02,650 I na žalost, to je Izlaz je atrociously 570 00:25:02,650 --> 00:25:04,290 kompleksu bez dobrog razloga. 571 00:25:04,290 --> 00:25:06,280 Dakle, vidimo svu tu zbrku. 572 00:25:06,280 --> 00:25:07,530 David je navesti svoje ime. 573 00:25:07,530 --> 00:25:09,760 Tako da je Program zapravo radi. 574 00:25:09,760 --> 00:25:11,180 I sada smo dobili ovaj izlaz. 575 00:25:11,180 --> 00:25:13,400 >> Dakle Valgrind je sličan u duhu GDB. 576 00:25:13,400 --> 00:25:14,950 To nije debugger po sebi. 577 00:25:14,950 --> 00:25:16,270 No, da je sjećanje provjeru. 578 00:25:16,270 --> 00:25:20,140 To je program koji će pokrenuti svoj programirati i reći vam ako ste pitali 579 00:25:20,140 --> 00:25:23,860 Računalo za pamćenje i nikada ga predao natrag, a time znači da imate 580 00:25:23,860 --> 00:25:24,570 otjecanje memorije. 581 00:25:24,570 --> 00:25:26,240 A memory leaks imaju tendenciju da se loše. 582 00:25:26,240 --> 00:25:29,120 A što se korisnici računala imaju vjerojatno osjetio to, imate li 583 00:25:29,120 --> 00:25:30,300 Mac ili PC. 584 00:25:30,300 --> 00:25:33,730 Jeste li ikada koristili svoje računalo a, a ne digne u nekoliko 585 00:25:33,730 --> 00:25:36,820 dana, ili ste upravo je dobio puno programima koji se izvode, a prokleta stvar 586 00:25:36,820 --> 00:25:42,360 usporava na brušenje zaustaviti, ili barem to je super neugodno za korištenje, jer 587 00:25:42,360 --> 00:25:44,350 sve samo dobio super slow. 588 00:25:44,350 --> 00:25:46,260 >> Sada može biti bilo koji broj razloga. 589 00:25:46,260 --> 00:25:49,600 To bi mogao biti klapa, bug u nečiji broj, ili, jednostavnije, to 590 00:25:49,600 --> 00:25:53,250 moglo značiti da koristite više memorije, ili pokušava, nego tvoj 591 00:25:53,250 --> 00:25:54,920 Računalo zapravo ima. 592 00:25:54,920 --> 00:25:57,770 A možda postoji bug u nekom programu da bi molba za pamćenje. 593 00:25:57,770 --> 00:26:02,480 Preglednici za nekoliko godina bili su poznati po tome to, traži sve više i više memorije 594 00:26:02,480 --> 00:26:03,870 ali nikad ga vraćajući. 595 00:26:03,870 --> 00:26:07,220 Sigurno, ako samo imaju ograničen količina memorije, ne možete pitati 596 00:26:07,220 --> 00:26:09,990 beskonačno mnogo puta za nešto od tog sjećanja. 597 00:26:09,990 --> 00:26:13,070 >> I tako ono što vidite ovdje, iako Ponovno Valgrind je izlaz 598 00:26:13,070 --> 00:26:17,490 nepotrebno složeno niti pogledati Prvi, ovo je zanimljiv dio. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 u uporabi na izlazu. 601 00:26:20,060 --> 00:26:22,810 Pa evo koliko memorije je u uporabi u hrpu na 602 00:26:22,810 --> 00:26:24,300 Vrijeme moj program izašao - 603 00:26:24,300 --> 00:26:27,280 očito šest bajtova u jednom bloku. 604 00:26:27,280 --> 00:26:28,710 Tako ću mahati ruke , na što je blok. 605 00:26:28,710 --> 00:26:31,270 Zamislite to je samo komad, više tehničku riječ za komad. 606 00:26:31,270 --> 00:26:33,140 No, prije šest bajtova - 607 00:26:33,140 --> 00:26:36,870 Koji su šest bajtova da su još uvijek u uporabi? 608 00:26:36,870 --> 00:26:37,390 >> Točno. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D backslash nula, pet slova Naziv plus null terminator. 610 00:26:41,520 --> 00:26:46,350 Dakle, ovaj program Valgrind primijetio da sam pitao za šest bajtova, očito, prema 611 00:26:46,350 --> 00:26:48,950 getstring način, ali nikada ih je dao natrag. 612 00:26:48,950 --> 00:26:52,030 A u stvari, to ne može biti tako Očito, ako moj program nije tri 613 00:26:52,030 --> 00:26:53,590 linije, ali to je 300 linija. 614 00:26:53,590 --> 00:26:56,920 Tako smo zapravo može dobiti drugu naredbu linije argument za Valgrind se 615 00:26:56,920 --> 00:26:58,290 čine ga mnogo opširnije. 616 00:26:58,290 --> 00:26:59,760 To je malo neugodno za pamćenje. 617 00:26:59,760 --> 00:27:01,580 Ali ako mi je činiti - 618 00:27:01,580 --> 00:27:01,930 ćemo vidjeti. 619 00:27:01,930 --> 00:27:03,540 Pukotina - 620 00:27:03,540 --> 00:27:05,030 Je li to procuriti - 621 00:27:05,030 --> 00:27:07,580 ni ja se ne sjećam ono što je isključen ruci. 622 00:27:07,580 --> 00:27:08,550 >> - Curenja-check jednako puna. 623 00:27:08,550 --> 00:27:10,180 Aha, hvala. 624 00:27:10,180 --> 00:27:12,520 - Curenja-check jednako puna. 625 00:27:12,520 --> 00:27:13,800 Upišite. 626 00:27:13,800 --> 00:27:14,940 Sve program radi. 627 00:27:14,940 --> 00:27:16,180 Upišite se u Davida opet. 628 00:27:16,180 --> 00:27:17,660 Sada vidim nešto više detalja. 629 00:27:17,660 --> 00:27:20,890 No, ispod hrpe sažetku, koji identična je četiri - ah, 630 00:27:20,890 --> 00:27:22,120 to je vrsta lijepo. 631 00:27:22,120 --> 00:27:25,460 Sada Valgrind je zapravo u potrazi malo teže u mom kodu. 632 00:27:25,460 --> 00:27:29,580 I to govori da je, navodno, malloc na liniji - 633 00:27:29,580 --> 00:27:30,580 smo smanjili. 634 00:27:30,580 --> 00:27:31,980 U linije - 635 00:27:31,980 --> 00:27:32,930 ne vidim što je to linija. 636 00:27:32,930 --> 00:27:35,110 Ali malloc je prvi krivac. 637 00:27:35,110 --> 00:27:38,630 Tu je blog u malloc. 638 00:27:38,630 --> 00:27:39,810 >> U redu? 639 00:27:39,810 --> 00:27:40,450 OK, nema. 640 00:27:40,450 --> 00:27:40,940 Točno? 641 00:27:40,940 --> 00:27:42,520 Zvao sam getstring. 642 00:27:42,520 --> 00:27:44,460 getstring očito poziva malloc. 643 00:27:44,460 --> 00:27:47,800 Pa što linija koda je očito u krivu za potrebe 644 00:27:47,800 --> 00:27:49,050 dodijeljeno ovo sjećanje? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Pretpostavimo da je onaj tko je napisao malloc je oko dovoljno dugo da je 647 00:27:55,540 --> 00:27:56,390 nije njihova krivnja. 648 00:27:56,390 --> 00:27:57,520 Dakle, to je vjerojatno moja. 649 00:27:57,520 --> 00:28:02,000 getstring u cs50.c - tako da je file negdje na računalu - 650 00:28:02,000 --> 00:28:05,210 u skladu 286 čini se da je krivac. 651 00:28:05,210 --> 00:28:08,140 Sada pretpostavimo da je CS50 oko za pristojan iznos od vrijeme, tako 652 00:28:08,140 --> 00:28:09,720 mi smo nepogrešivi. 653 00:28:09,720 --> 00:28:14,080 I tako je to vjerojatno nije u getstring da je bug laži, već u 654 00:28:14,080 --> 00:28:17,810 hello-2.c linije 18. 655 00:28:17,810 --> 00:28:20,670 >> Tako ćemo pogledati što je to linija 18 je. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Nekako je ova linija nije nužno buggy, sami po sebi, ali to je razlog 658 00:28:27,130 --> 00:28:28,630 iza tog otjecanje memorije. 659 00:28:28,630 --> 00:28:32,140 Dakle super jednostavno, što bi intuitivno biti rješenje ovdje? 660 00:28:32,140 --> 00:28:34,710 Ako tražimo za pamćenje, nikada nisu bili ga vraćam, a čini se da je 661 00:28:34,710 --> 00:28:37,940 problem jer s vremenom moj računalo Možda ponestane memorije, moglo usporiti 662 00:28:37,940 --> 00:28:42,110 prema dolje, loše stvari mogu dogoditi, ali, ono je jednostavno intuitivno rješenje? 663 00:28:42,110 --> 00:28:43,140 Samo ga vratiti. 664 00:28:43,140 --> 00:28:44,770 >> Kako se osloboditi tog sjećanja? 665 00:28:44,770 --> 00:28:49,970 Pa, srećom, to je vrlo jednostavna samo reći besplatan ime. 666 00:28:49,970 --> 00:28:51,260 I nikada nismo učinili prije. 667 00:28:51,260 --> 00:28:55,890 Ali u biti može sjetiti besplatno kao suprotnost malloc. 668 00:28:55,890 --> 00:28:58,030 free je suprotnost dodjele memorije. 669 00:28:58,030 --> 00:28:59,540 Pa sad neka mi to kompilirati. 670 00:28:59,540 --> 00:29:02,050 Provjerite hello-dva. 671 00:29:02,050 --> 00:29:04,620 Dopustite mi da ga ponovno pokrenuti. hello-2 David. 672 00:29:04,620 --> 00:29:07,290 Dakle, čini se da rade u točno na isti način. 673 00:29:07,290 --> 00:29:11,180 No, ako se vratim u Valgrind i ponovno pokrenuti Iste naredbe na moj novo 674 00:29:11,180 --> 00:29:14,720 kompilirani program, tipkanje u moje ime kao i prije - 675 00:29:14,720 --> 00:29:15,370 lijepo. 676 00:29:15,370 --> 00:29:16,760 Skupi sažetak - 677 00:29:16,760 --> 00:29:17,740 u uporabi na izlazu - 678 00:29:17,740 --> 00:29:19,370 nula nula bajtova u blokovima. 679 00:29:19,370 --> 00:29:21,840 I to je super lijepo, sve nagomilavati blokovi su oslobođeni. 680 00:29:21,840 --> 00:29:23,480 Nema curenja su moguće. 681 00:29:23,480 --> 00:29:27,200 >> Tako dolazi, a ne s Problem Set 4, ali s Problem Set 5, forenzike 682 00:29:27,200 --> 00:29:30,740 i nadalje, i ovo će postati mjera u ispravnost vašeg 683 00:29:30,740 --> 00:29:33,630 Program, da li ili ne imate ili nemaju curenje memorije. 684 00:29:33,630 --> 00:29:36,900 No, srećom, ne samo da možete razmišljati kroz njih intuitivno, koji 685 00:29:36,900 --> 00:29:40,430 je, nedvojbeno, lako za male programe ali teže za veće programe, 686 00:29:40,430 --> 00:29:43,860 Valgrind, za one veće programe, može vam pomoći identificirati 687 00:29:43,860 --> 00:29:45,360 Poseban problem. 688 00:29:45,360 --> 00:29:47,500 >> No, postoji jedan drugi problem koji bi mogli nastati. 689 00:29:47,500 --> 00:29:51,245 Dopustite mi otvori ovu datoteku ovdje, što je, opet, pomalo jednostavan primjer. 690 00:29:51,245 --> 00:29:53,760 Ali neka se usredotočiti na ono što ovaj program čini. 691 00:29:53,760 --> 00:29:55,190 To se zove memory.c. 692 00:29:55,190 --> 00:29:58,380 Objavit ćemo to kasnije danas zip današnji izvornog koda. 693 00:29:58,380 --> 00:30:01,610 I primijetiti da imam funkciju pod nazivom f da se nema argumenata i 694 00:30:01,610 --> 00:30:02,800 vraća ništa. 695 00:30:02,800 --> 00:30:07,240 U skladu 20, ja sam očito proglašenja pointer na int i nazvavši ga x. 696 00:30:07,240 --> 00:30:09,570 Ja sam dodjeljivanjem je povratak vrijednost malloc. 697 00:30:09,570 --> 00:30:14,590 I samo da bude jasno, koliko bajtova am Ja vjerojatno vratiti na malloc 698 00:30:14,590 --> 00:30:17,080 u ovoj situaciji? 699 00:30:17,080 --> 00:30:18,040 >> Vjerojatno 40. 700 00:30:18,040 --> 00:30:18,840 Odakle ti to? 701 00:30:18,840 --> 00:30:22,410 Pa, ako se prisjetiti da je često int 4 bajta, barem u 702 00:30:22,410 --> 00:30:25,110 aparata, 10 puta 4 je očito 40. 703 00:30:25,110 --> 00:30:28,920 Dakle malloc vraća adresu od komad memorije i pohranjivanje koje 704 00:30:28,920 --> 00:30:30,800 rješavanje u konačnici x. 705 00:30:30,800 --> 00:30:32,570 Dakle, da bude jasno, što onda se događa? 706 00:30:32,570 --> 00:30:34,990 Pa, neka mi se vratiti na našu sliku ovdje. 707 00:30:34,990 --> 00:30:38,150 Dopustite mi da ne samo privući sveg memorije računala, dopustite mi da ide naprijed i 708 00:30:38,150 --> 00:30:42,990 nacrtati cijeli pravokutnik koji predstavlja sve moje RAM-a. 709 00:30:42,990 --> 00:30:44,790 >> Mi ćemo reći da je stog je na dnu. 710 00:30:44,790 --> 00:30:47,010 I tu je tekst segment u Nepoznati su podaci. 711 00:30:47,010 --> 00:30:49,880 Ali ja samo idem na apstraktne onima ostale stvari daleko kao točka, dot dot. 712 00:30:49,880 --> 00:30:53,470 Samo ću se odnose na ovu kao gomila na vrhu. 713 00:30:53,470 --> 00:30:57,070 I onda na dnu ove slike, da predstavljaju glavni, idem 714 00:30:57,070 --> 00:30:59,880 dati ga kriške memorije na stog. 715 00:30:59,880 --> 00:31:03,150 Za f, ja ću mu dati krišku memorije na stogu. 716 00:31:03,150 --> 00:31:05,140 Sada, moram konzultirati My izvornog koda ponovno. 717 00:31:05,140 --> 00:31:07,170 Koji su lokalne varijable za glavno? 718 00:31:07,170 --> 00:31:10,710 Očito ništa, tako da je odsječak biti prazan ili ne, čak i velika 719 00:31:10,710 --> 00:31:11,600 kao što sam ga izvući. 720 00:31:11,600 --> 00:31:15,730 No, u f, imam lokalne varijable, koji se zove x. 721 00:31:15,730 --> 00:31:20,410 Dakle, ja ću ići naprijed i dati f komad memorije, nazivajući ga x. 722 00:31:20,410 --> 00:31:24,680 >> A sada malloc od 10 puta 4, Dakle malloc 40, gdje je to 723 00:31:24,680 --> 00:31:25,430 memorije dolaze iz? 724 00:31:25,430 --> 00:31:27,530 Nismo nacrta slika kao što je ovaj prije. 725 00:31:27,530 --> 00:31:31,140 Ali pretpostavimo da je to djelotvorno dolazi iz ovdje, tako da se, 726 00:31:31,140 --> 00:31:33,170 dva, tri, četiri, pet. 727 00:31:33,170 --> 00:31:34,680 I sad trebam 40 tih. 728 00:31:34,680 --> 00:31:37,540 Dakle, ja ću samo napraviti točka, točka, točkica predložiti da postoji još više memorije 729 00:31:37,540 --> 00:31:39,350 vraća iz hrpa. 730 00:31:39,350 --> 00:31:40,710 Sada ono što je adresa? 731 00:31:40,710 --> 00:31:42,620 Idemo birati naša proizvoljna rješavanje kao i uvijek - 732 00:31:42,620 --> 00:31:46,310 Ox123, iako je to vjerojatno ide biti nešto sasvim drugo. 733 00:31:46,310 --> 00:31:50,420 To je adresa prvog bajta u memorije da tražim za malloc. 734 00:31:50,420 --> 00:31:53,630 >> Tako je u kratkom, jednom retku 20 izvršava, ono je doslovno 735 00:31:53,630 --> 00:31:57,170 pohranjeni unutar x. ovdje? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 I Bik je nezanimljivo. 739 00:32:01,550 --> 00:32:03,200 To samo znači evo heksadecimalni broj. 740 00:32:03,200 --> 00:32:06,490 No, ono što je ključno je da je ono što sam dućan u X, što je lokalna promjenljiva. 741 00:32:06,490 --> 00:32:10,260 No, njegova vrsta podataka, opet, je adresa int. 742 00:32:10,260 --> 00:32:12,710 Pa, ja idem za pohranu Ox123. 743 00:32:12,710 --> 00:32:16,610 Ali opet, ako je to malo previše komplicirano nepotrebno, ako sam pomicanje 744 00:32:16,610 --> 00:32:21,490 natrag, možemo apstraktno to prilično daleko razumno i samo reći da je x 745 00:32:21,490 --> 00:32:23,910 pokazivač na taj komad memorije. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Sada se postavlja pitanje u ruci je sljedeće - 748 00:32:26,230 --> 00:32:29,910 linije 21, ispostavilo se, je lud. 749 00:32:29,910 --> 00:32:31,160 Zašto? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Nažalost? 752 00:32:36,930 --> 00:32:38,640 To nema - 753 00:32:38,640 --> 00:32:40,390 kažu da još jednom. 754 00:32:40,390 --> 00:32:41,240 Pa, to ipak nije besplatno. 755 00:32:41,240 --> 00:32:42,350 Dakle, to je drugo, ali. 756 00:32:42,350 --> 00:32:45,000 Dakle, postoji jedna druga, ali posebno na liniji 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Točno. 759 00:32:50,040 --> 00:32:54,980 Ova jednostavna linija koda je samo buffera, prelijevanja spremnika. 760 00:32:54,980 --> 00:32:57,050 Tampon samo znači komad memorije. 761 00:32:57,050 --> 00:33:01,520 No, da je komad memorije je veličina 10, 10 cijelih brojeva, što znači, ako smo 762 00:33:01,520 --> 00:33:05,350 Indeks u nju pomoću sintaktičkih šećera od polja zapisa, Trg 763 00:33:05,350 --> 00:33:09,220 nosači, imate pristup x 0 x nosač nosač x 1, 764 00:33:09,220 --> 00:33:10,390 Nosač točka, točka, točka. 765 00:33:10,390 --> 00:33:13,270 x 9 nosač je najveći. 766 00:33:13,270 --> 00:33:17,680 Dakle, ako sam napraviti nosač x 10, gdje je Ja zapravo idem u memoriji? 767 00:33:17,680 --> 00:33:19,120 >> Pa, ako imam 10 int - 768 00:33:19,120 --> 00:33:21,070 neka je zapravo privući sve od ovih ovdje. 769 00:33:21,070 --> 00:33:22,700 Tako da je prvih pet. 770 00:33:22,700 --> 00:33:24,660 Evo pet drugih Ints. 771 00:33:24,660 --> 00:33:29,580 Dakle x nosač 0 je ovdje. x 1 nosač je ovdje. x nosač 9 je ovdje. x nosač 772 00:33:29,580 --> 00:33:37,960 10 je ovdje, što znači da ti govorim, u skladu 21, računalo staviti 773 00:33:37,960 --> 00:33:39,400 Broj kojoj? 774 00:33:39,400 --> 00:33:42,010 Broj 0, gdje? 775 00:33:42,010 --> 00:33:43,380 Pa, to je 0, da. 776 00:33:43,380 --> 00:33:45,460 No, upravo činjenica da je njegov 0 je vrsta slučajnosti. 777 00:33:45,460 --> 00:33:47,140 To bi mogao biti broj 50, za sve nam je stalo. 778 00:33:47,140 --> 00:33:50,480 No, pokušavamo ga stavili na nosač x 10, koji je gdje je to 779 00:33:50,480 --> 00:33:53,700 Upitnik je sastavljen, što nije dobra stvar. 780 00:33:53,700 --> 00:33:57,070 Ovaj program može vrlo dobro pad kao rezultat. 781 00:33:57,070 --> 00:33:59,400 >> Sada, idemo naprijed i vidjeti ako je to je, doista, što će se dogoditi. 782 00:33:59,400 --> 00:34:02,600 Provjerite memorije, budući file naziva memory.c. 783 00:34:02,600 --> 00:34:05,950 Idemo naprijed i pokrenuti Program memorije. 784 00:34:05,950 --> 00:34:08,239 Tako smo sretni, zapravo, čini se. 785 00:34:08,239 --> 00:34:09,340 Imamo sreće. 786 00:34:09,340 --> 00:34:11,060 Ali neka je vidjeti ako mi sada pokrenuti Valgrind. 787 00:34:11,060 --> 00:34:14,170 Na prvi pogled, moj bi program mogao Čini se da su savršeno točne. 788 00:34:14,170 --> 00:34:18,010 No, dopustite mi da vodim Valgrind s - Curenja-check jednako pune memorije. 789 00:34:18,010 --> 00:34:20,110 >> I sad kad sam pokrenuti ovu - 790 00:34:20,110 --> 00:34:21,030 Zanimljivo. 791 00:34:21,030 --> 00:34:26,800 Nevažeći pisati o veličini, na 4 linija 21 od memory.c. 792 00:34:26,800 --> 00:34:29,284 Linija 21 od memory.c je što neki? 793 00:34:29,284 --> 00:34:30,340 Oh, zanimljiva. 794 00:34:30,340 --> 00:34:31,080 Ali čekajte. 795 00:34:31,080 --> 00:34:32,389 Veličina 4, što je to odnosi? 796 00:34:32,389 --> 00:34:34,969 Ja samo da je jedan pisati, , ali to je od veličine 4. 797 00:34:34,969 --> 00:34:36,889 Zašto je 4? 798 00:34:36,889 --> 00:34:39,280 To je zato što je int, koji je, opet, četiri bajta. 799 00:34:39,280 --> 00:34:42,510 Dakle Valgrind pronašao bug koji sam, Bacimo li pogled na moj broj, zar ne. 800 00:34:42,510 --> 00:34:45,040 A možda tvoj TF bi ili ne bi. 801 00:34:45,040 --> 00:34:48,469 Što Ali Valgrind sigurno utvrdio da smo pogriješili tamo, ni 802 00:34:48,469 --> 00:34:52,719 iako mi se posrećilo, a računalo odlučio, eh, ja ne idem na sudar 803 00:34:52,719 --> 00:34:57,470 samo zato što je dotaknuo jedan bajt, jedan Int je vrijedno pamćenja da nisi 804 00:34:57,470 --> 00:34:58,550 zapravo sami. 805 00:34:58,550 --> 00:35:00,380 >> Pa, što je tu lud ovdje. 806 00:35:00,380 --> 00:35:01,180 Adresa - 807 00:35:01,180 --> 00:35:03,190 ovo je luda potrazi adresa u heksadecimalnom. 808 00:35:03,190 --> 00:35:06,890 To samo znači negdje u hrpi je nula bajtova nakon blok veličine 40 809 00:35:06,890 --> 00:35:07,620 raspoređuje. 810 00:35:07,620 --> 00:35:10,610 Dopustite mi da smanjivanje ovdje i vidjeti ako ovo je malo više pomoći. 811 00:35:10,610 --> 00:35:11,410 Zanimljivi. 812 00:35:11,410 --> 00:35:15,600 40 bajtova definitivno su izgubili u gubitak rekord 1. 1.. 813 00:35:15,600 --> 00:35:17,840 Opet, više riječi nego je korisno ovdje. 814 00:35:17,840 --> 00:35:21,350 No, na temelju istaknute linije, gdje bi ja vjerojatno usredotočiti moju 815 00:35:21,350 --> 00:35:24,070 pozornost za druge bug? 816 00:35:24,070 --> 00:35:26,570 Izgleda poput linije 20. memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Dakle, ako smo se vratiti na liniji 20, koji je onaj koji što smo već utvrdili. 818 00:35:30,990 --> 00:35:33,030 I to nije nužno lud. 819 00:35:33,030 --> 00:35:35,160 No, mi smo to preinačio svoje učinke. 820 00:35:35,160 --> 00:35:38,790 Pa kako sam ispraviti barem jedna od tih grešaka? 821 00:35:38,790 --> 00:35:42,240 Što sam mogao učiniti nakon što liniji 21? 822 00:35:42,240 --> 00:35:47,110 Ja mogao učiniti bez x, tako da je vratiti taj memorije. 823 00:35:47,110 --> 00:35:49,230 I kako mogu popraviti ovaj bug? 824 00:35:49,230 --> 00:35:52,120 Ja svakako trebao ići ne dalje od 0. 825 00:35:52,120 --> 00:35:53,670 Pa neka mi pokušati ponovno pokrenuti ovo. 826 00:35:53,670 --> 00:35:56,080 Žao nam je, definitivno ići ne dalje od 9. 827 00:35:56,080 --> 00:35:57,510 Provjerite memorije. 828 00:35:57,510 --> 00:36:00,650 Dopustite mi reprizu Valgrind u većem prozoru. 829 00:36:00,650 --> 00:36:01,580 A sad pogledaj. 830 00:36:01,580 --> 00:36:02,250 Nica. 831 00:36:02,250 --> 00:36:03,270 Svi nagomilavati blokovi su oslobođeni. 832 00:36:03,270 --> 00:36:04,270 Nema curenja su moguće. 833 00:36:04,270 --> 00:36:07,520 A gore navedeni ovdje, nema spomena više od neispravnih prava. 834 00:36:07,520 --> 00:36:09,820 >> Samo da se pohlepni, i neka je vidjeti ako drugi demonstracije 835 00:36:09,820 --> 00:36:11,050 ne ide onako kako smo zamislili - 836 00:36:11,050 --> 00:36:12,560 Ja je netko sretan trenutak prije. 837 00:36:12,560 --> 00:36:15,530 A činjenica da je to 0 je možda nepotrebno zabludu. 838 00:36:15,530 --> 00:36:20,650 Ajmo napraviti 50, pomalo proizvoljno broj, bi memorijsku dot slash memorije - 839 00:36:20,650 --> 00:36:21,410 Još uvijek se posreći. 840 00:36:21,410 --> 00:36:22,510 Ništa se nije pad. 841 00:36:22,510 --> 00:36:26,150 Pretpostavimo da sam samo napraviti nešto stvarno glupo, i ja sto. 842 00:36:26,150 --> 00:36:30,360 Dopustite mi da ponovno napravite memorije, dot slash memorije - 843 00:36:30,360 --> 00:36:31,075 posrećilo opet. 844 00:36:31,075 --> 00:36:32,800 Što mislite o 1000? 845 00:36:32,800 --> 00:36:35,370 Ints izvan, ugrubo, gdje sam trebao biti? 846 00:36:35,370 --> 00:36:37,410 Provjerite memorije - 847 00:36:37,410 --> 00:36:38,570 k vragu. 848 00:36:38,570 --> 00:36:39,920 >> [Smijeh] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Nemojmo nered oko više. 851 00:36:43,920 --> 00:36:45,120 Repriza memorije. 852 00:36:45,120 --> 00:36:45,840 Tamo idemo. 853 00:36:45,840 --> 00:36:46,410 U redu. 854 00:36:46,410 --> 00:36:52,500 Dakle, očito ste Indeks 100.000 Ints onu gdje je trebao biti u 855 00:36:52,500 --> 00:36:54,410 memorije, loše stvari događaju. 856 00:36:54,410 --> 00:36:56,430 Dakle, to očito nije Teško, brzo pravilo. 857 00:36:56,430 --> 00:36:58,190 Bio sam vrsta pomoću ispitivanje i pogrešaka doći. 858 00:36:58,190 --> 00:37:02,230 Ali to je zato što, ne duljimo, memorije računala također je podijeljen 859 00:37:02,230 --> 00:37:03,580 na ove stvari zove segmentima. 860 00:37:03,580 --> 00:37:07,260 A ponekad, računalo zapravo dao malo više memorije 861 00:37:07,260 --> 00:37:08,400 nego što tražiti. 862 00:37:08,400 --> 00:37:12,170 Ali za učinkovitost, to je samo lakše dobiti više memorije, ali samo da vam kažem 863 00:37:12,170 --> 00:37:13,780 da ste dobivanje dio njega. 864 00:37:13,780 --> 00:37:16,370 >> A ako vam se posreći ponekad, Stoga, možda ćete biti u mogućnosti dotaknuti 865 00:37:16,370 --> 00:37:17,795 memorije koji ne pripada vama. 866 00:37:17,795 --> 00:37:21,860 Nemate jamstvo da ono vrijednost ste stavili tamo će ostati tamo, jer je 867 00:37:21,860 --> 00:37:25,080 Računalo još uvijek misli da to nije tvoje, ali to ne mora nužno ide 868 00:37:25,080 --> 00:37:29,910 pogoditi još jedan segment u memoriji Računalo i izazivaju takvu pogrešku 869 00:37:29,910 --> 00:37:31,710 Ovaj ovdje. 870 00:37:31,710 --> 00:37:32,060 U redu. 871 00:37:32,060 --> 00:37:37,240 Sva pitanja onda na pamćenje? 872 00:37:37,240 --> 00:37:37,590 >> U redu. 873 00:37:37,590 --> 00:37:40,610 Idemo pogledati ovdje, a zatim, na nešto što uzimamo za 874 00:37:40,610 --> 00:37:48,361 dodjeljuje za neko vrijeme, koje je u ovoj datoteci pod nazivom cs50.h. 875 00:37:48,361 --> 00:37:49,420 Tako je to datoteka. 876 00:37:49,420 --> 00:37:51,130 To su samo cijela hrpa od komentara do vrha. 877 00:37:51,130 --> 00:37:53,900 A možda sam gledao na to, ako što poked oko na aparatu. 878 00:37:53,900 --> 00:37:57,000 No, ispostavilo se da je cijelo vrijeme, kad smo se koristiti kao string 879 00:37:57,000 --> 00:38:01,130 sinonim, sredstvo kojim smo proglasili koji je sinonim s ovim 880 00:38:01,130 --> 00:38:03,990 ključne riječi typedef, za tip definiciji. 881 00:38:03,990 --> 00:38:07,500 I mi u biti govoriš, da nanizati sinonim za char zvijezde. 882 00:38:07,500 --> 00:38:11,190 To su sredstva kojima stog stvorio ove obuke kotača poznate kao 883 00:38:11,190 --> 00:38:12,040 string. 884 00:38:12,040 --> 00:38:14,830 >> Sada ovdje je samo prototip za getchar. 885 00:38:14,830 --> 00:38:17,350 Možda smo ga vidjeli prije, ali to je doista ono što on radi. getchar 886 00:38:17,350 --> 00:38:19,070 se nema argumenata, vraća znak. 887 00:38:19,070 --> 00:38:21,340 getdouble se nema argumenata, vraća dvojnika. 888 00:38:21,340 --> 00:38:24,440 getfloat se nema argumenata, vraća float, i tako dalje. 889 00:38:24,440 --> 00:38:27,270 getint je ovdje. getlonglong je ovdje. 890 00:38:27,270 --> 00:38:28,820 I getstring je ovdje. 891 00:38:28,820 --> 00:38:29,420 I to je to. 892 00:38:29,420 --> 00:38:33,080 Ovo je još jedna ljubičasta linija preprocesor Direktiva zbog 893 00:38:33,080 --> 00:38:35,550 hashtag na početku to. 894 00:38:35,550 --> 00:38:35,870 >> U redu. 895 00:38:35,870 --> 00:38:38,380 Pa sad neka mi ide u cs50.c. 896 00:38:38,380 --> 00:38:40,400 I nećemo razgovarati predugo na to. 897 00:38:40,400 --> 00:38:43,280 No, kako bi vam dati uvid u ono što je traje sve ovo 898 00:38:43,280 --> 00:38:46,434 Vrijeme, pusti me da - 899 00:38:46,434 --> 00:38:48,250 učinimo getchar. 900 00:38:48,250 --> 00:38:51,050 Dakle getchar je uglavnom komentari. 901 00:38:51,050 --> 00:38:52,060 No, to izgleda ovako. 902 00:38:52,060 --> 00:38:54,800 Dakle, ovo je stvarna funkcija getchar da smo bili 903 00:38:54,800 --> 00:38:56,055 uzimanje zdravo za gotovo ne postoji. 904 00:38:56,055 --> 00:38:59,370 I premda nismo iskoristili ovo jedan koje često, ako ikada, to je u najmanju ruku 905 00:38:59,370 --> 00:39:00,470 relativno jednostavna. 906 00:39:00,470 --> 00:39:02,580 Dakle, to je vrijedno uzimanje Brzi pogled na ovdje. 907 00:39:02,580 --> 00:39:06,540 >> Dakle getchar ima beskonačnu petlju, namjerno tako očito. 908 00:39:06,540 --> 00:39:10,050 To onda zahtijeva - i to je vrsta Lijepo prenamjena koda mi sami pisali. 909 00:39:10,050 --> 00:39:11,220 Ona poziva getstring. 910 00:39:11,220 --> 00:39:12,460 Jer ono što ga čini znači da se char? 911 00:39:12,460 --> 00:39:14,730 Pa, možda i pokušati dobiti Cijela linija teksta od korisnika i 912 00:39:14,730 --> 00:39:16,940 a zatim pogledajte samo jednom od onih likova. 913 00:39:16,940 --> 00:39:19,170 U skladu 60, evo malo malo duševne ček. 914 00:39:19,170 --> 00:39:21,610 Ako getstring vratio null, nemojmo nastavite. 915 00:39:21,610 --> 00:39:22,820 Nešto je pošlo po zlu. 916 00:39:22,820 --> 00:39:28,120 >> Sada je to nešto neugodno, ali konvencionalni u C. char max vjerojatno 917 00:39:28,120 --> 00:39:29,960 predstavlja ono jednostavno temelji se na svoje ime? 918 00:39:29,960 --> 00:39:31,670 To je konstanta. 919 00:39:31,670 --> 00:39:36,040 To je kao numeričke vrijednosti Najveći znak da može predstavljati s 920 00:39:36,040 --> 00:39:40,370 jedan ugriz, što je vjerojatno broj 255, što je najveći broj koji 921 00:39:40,370 --> 00:39:42,720 predstavlja osam bitova, počevši od nule. 922 00:39:42,720 --> 00:39:47,460 Tako sam koristiti ovaj, u ovoj funkciji, kada je pisanja ovog koda, samo zato 923 00:39:47,460 --> 00:39:51,753 ako nešto pođe po zlu, ali u getchar njegova svrha u životu je da se vrate 924 00:39:51,753 --> 00:39:54,830 char, morate biti u stanju nekako da signalizira korisniku da 925 00:39:54,830 --> 00:39:55,840 nešto je pošlo po zlu. 926 00:39:55,840 --> 00:39:56,970 Ne možemo se vratiti null. 927 00:39:56,970 --> 00:39:58,480 Ispada da je null pointer. 928 00:39:58,480 --> 00:40:01,030 A opet, ima getchar vratiti char. 929 00:40:01,030 --> 00:40:04,760 >> Dakle konvencije, ako nešto pođe redu, je li, programer, ili u 930 00:40:04,760 --> 00:40:08,160 U ovom slučaju, ja s knjižnicom, morao sam samo odlučiti samovoljno, ako 931 00:40:08,160 --> 00:40:12,230 nešto pođe po zlu, idem vratiti broj 255, koji je doista 932 00:40:12,230 --> 00:40:17,240 znači da se ne može, korisnik ne može upisati lik zastupa 933 00:40:17,240 --> 00:40:21,410 broj 255, jer imali smo ga ukrali kao tzv sentinel vrijednosti u 934 00:40:21,410 --> 00:40:23,410 predstavljati problem. 935 00:40:23,410 --> 00:40:27,010 Sada ispada da je lik 255 nije nešto što se može upisati na 936 00:40:27,010 --> 00:40:28,380 tipkovnice, tako da to nije velika stvar. 937 00:40:28,380 --> 00:40:30,910 Korisnik ne primijetiti da Ja sam ukrao taj lik. 938 00:40:30,910 --> 00:40:34,620 Ali, ako ste ikada vidjeli u man stranicama na računalni sustav neke referenca 939 00:40:34,620 --> 00:40:38,560 sve kape stalno ovako kako kaže, u slučaju pogreške tom stalnom možda 940 00:40:38,560 --> 00:40:42,720 se vratio, to je sve što su neki ljudi učinili godina je samovoljno odlučio 941 00:40:42,720 --> 00:40:45,680 vratite ovu posebnu vrijednost i nazvati konstanta u slučaju 942 00:40:45,680 --> 00:40:46,840 nešto pođe po zlu. 943 00:40:46,840 --> 00:40:48,580 >> Sada magija se događa ovdje dolje. 944 00:40:48,580 --> 00:40:52,600 Prvo, ja sam u redu proglašenje 67. dva znaka, C1 i C2. 945 00:40:52,600 --> 00:40:57,080 A onda je u redu 68, tu je zapravo linija koda koji je podsjeća 946 00:40:57,080 --> 00:41:01,140 printf naš prijatelj, s obzirom da je nema posto Cs u navodnike. 947 00:41:01,140 --> 00:41:06,490 Ali primjetiti što se događa ovdje. sscanf znači string skeniranje - 948 00:41:06,490 --> 00:41:11,690 znači skeniranje formatirani string, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Što to znači? 950 00:41:12,590 --> 00:41:16,310 To znači da prođe na sscanf je string. 951 00:41:16,310 --> 00:41:18,420 A linija je god korisnik upiše u. 952 00:41:18,420 --> 00:41:23,520 Možete proći na sscanf formata kao string ovo govori da je ono što se scanf 953 00:41:23,520 --> 00:41:25,870 nadajući se da korisnik unese 954 00:41:25,870 --> 00:41:29,730 Nakon toga prođe-u na adrese dviju komadi sjećanja, u ovom slučaju, 955 00:41:29,730 --> 00:41:31,150 jer imam dva rezervirana mjesta. 956 00:41:31,150 --> 00:41:34,610 Dakle, ja ću mu dati adresu C1 i C2 na adresi. 957 00:41:34,610 --> 00:41:37,700 >> I sjećam se da si daju funkcijskom adresa neke varijable, što je 958 00:41:37,700 --> 00:41:38,950 dublji smisao? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Što mogu učiniti da se funkcija kao rezultat od dajući mu adresu 961 00:41:45,050 --> 00:41:48,170 promjenjiva, za razliku od varijabla sama? 962 00:41:48,170 --> 00:41:49,450 To mogu ga promijeniti, zar ne? 963 00:41:49,450 --> 00:41:53,250 Ako je netko karte za fizičke adresa, oni mogu ići tamo i raditi 964 00:41:53,250 --> 00:41:54,750 što god žele na toj adresi. 965 00:41:54,750 --> 00:41:55,800 Sve ideja ovdje. 966 00:41:55,800 --> 00:41:59,950 Ako ćemo proći u sscanf, adresa dvoje komadi sjećanja, čak i ovi maleni 967 00:41:59,950 --> 00:42:03,585 male komade memorije, C1 i C2, ali možemo reći da adresu njih, 968 00:42:03,585 --> 00:42:05,170 sscanf možete ga promijeniti. 969 00:42:05,170 --> 00:42:08,530 >> Dakle sscanf je svrha u životu, ako čitamo Čovjek stranica, je čitati ono što 970 00:42:08,530 --> 00:42:13,420 Korisnik upisali u, nadam za korisnika ima upisali u karakteru i možda 971 00:42:13,420 --> 00:42:16,470 Još jedan lik, i bez obzira korisnik upisali, prvi znak ide 972 00:42:16,470 --> 00:42:19,310 Ovdje, drugi lik ide ovdje. 973 00:42:19,310 --> 00:42:22,470 Sada, kako na stranu, to i što bi samo znam to iz dokumentacije, 974 00:42:22,470 --> 00:42:25,570 Činjenica da sam stavio prazan prostor postoji samo znači da ja ne briga ako 975 00:42:25,570 --> 00:42:28,440 korisnik klikne na razmaknicu neke puta prije nego što je on ili ona vodi 976 00:42:28,440 --> 00:42:30,400 lik, ja ću ignorirati na prazni prostor. 977 00:42:30,400 --> 00:42:32,510 Tako da, ja znam iz dokumentacije. 978 00:42:32,510 --> 00:42:36,570 >> Činjenica da postoji drugi% c slijedi bijeli prostor je zapravo 979 00:42:36,570 --> 00:42:37,410 namjerno. 980 00:42:37,410 --> 00:42:41,190 Želim biti u mogućnosti to otkriti ako korisnik zeznuo ili ne surađuju. 981 00:42:41,190 --> 00:42:45,630 Dakle, ja sam u nadi da korisnik samo upisali u jednom karaktera, stoga se nadam 982 00:42:45,630 --> 00:42:50,640 da sscanf je samo ide da se vrate vrijednost 1, jer, opet, ako sam pročitao 983 00:42:50,640 --> 00:42:55,400 dokumentacije, sscanf je svrha u život je za povratak na broju 984 00:42:55,400 --> 00:42:59,170 varijable koje su ispunjene s korisničkog unosa. 985 00:42:59,170 --> 00:43:02,270 >> Prolazio sam u dvije varijable adrese, C1 i C2. 986 00:43:02,270 --> 00:43:06,420 Nadam se, ipak, da je samo jedan od ih pogine jer ako sscanf 987 00:43:06,420 --> 00:43:11,130 vrati 2, što je vjerojatno Posljedica logično? 988 00:43:11,130 --> 00:43:14,600 Taj korisnik nije mi samo dati jedan lik kao što sam mu rekao ili nju. 989 00:43:14,600 --> 00:43:17,860 Vjerojatno su upisali po najmanje dva znaka. 990 00:43:17,860 --> 00:43:22,430 Dakle, ako sam, umjesto nisu imali drugi % C, samo sam imao jednu, koja 991 00:43:22,430 --> 00:43:25,370 iskreno će biti više intuitivno Pristup, mislim na prvi pogled, 992 00:43:25,370 --> 00:43:30,220 nećeš biti u mogućnosti otkriti ako korisnik je dajući vam više 993 00:43:30,220 --> 00:43:31,780 Ulaz nego što zapravo želi. 994 00:43:31,780 --> 00:43:34,100 Dakle, ovo je implicitni oblik od provjere pogreške. 995 00:43:34,100 --> 00:43:35,640 >> No primijetite što radim ovdje. 996 00:43:35,640 --> 00:43:39,970 Jednom sam siguran da je korisnik dao mi jedan lik, sam osloboditi liniju, radi 997 00:43:39,970 --> 00:43:44,450 suprotno od getstring, što pak koristi malloc, a onda se vratiti 998 00:43:44,450 --> 00:43:51,030 C1, lik koji sam se nadao Korisnik pod uvjetom i samo pod uvjetom. 999 00:43:51,030 --> 00:43:54,680 Tako brzo nazire samo, ali Imate li pitanja o getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vratit ćemo se na neke od drugih. 1002 00:43:59,590 --> 00:44:03,770 >> Pa, neka mi ići naprijed i učiniti - Pretpostavljam da je sada, samo motivirati naše 1003 00:44:03,770 --> 00:44:08,910 Rasprava u tjednu plus vrijeme, to je spis pod nazivom structs.h. 1004 00:44:08,910 --> 00:44:11,440 I opet, to je samo djelić nečega što je pred nama. 1005 00:44:11,440 --> 00:44:13,090 Ali primijetite da je dosta za to je komentara. 1006 00:44:13,090 --> 00:44:17,440 Pa neka mi istaknuti samo Zanimljiv dio za sada. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 tu je da ista ključna opet. 1009 00:44:19,700 --> 00:44:23,100 typedef smo iskoristili da se proglasi string kao posebnu vrstu podataka. 1010 00:44:23,100 --> 00:44:27,490 Možete koristiti typedef stvoriti potpuno novi vrste podataka koje nisu postojale kad 1011 00:44:27,490 --> 00:44:28,570 C je izmišljen. 1012 00:44:28,570 --> 00:44:32,520 Na primjer, int dolazi s C. Char dolazi s dvostrukim C. dolazi s C. No, 1013 00:44:32,520 --> 00:44:34,000 ne postoji pojam student. 1014 00:44:34,000 --> 00:44:37,230 Pa ipak, to će biti prilično korisno biti mogli napisati program koji pohranjuje 1015 00:44:37,230 --> 00:44:40,440 u varijable, studenta ID broj, njihovo ime, a njihova kuća. 1016 00:44:40,440 --> 00:44:42,890 Drugim riječima, tri komada podataka, kao int i 1017 00:44:42,890 --> 00:44:44,420 string, a drugi niz. 1018 00:44:44,420 --> 00:44:48,220 >> S typedef, što je prilično snažan o tome i ključne riječi za sturct 1019 00:44:48,220 --> 00:44:53,660 struktura, što, programer u 2013, zapravo mogu definirati vlastite 1020 00:44:53,660 --> 00:44:57,530 vizualnih podataka koje ne postoje godina Prije nego da odgovaraju vašim svrhe. 1021 00:44:57,530 --> 00:45:01,910 I evo, u linijama 13 do 19, mi smo proglašenja novu vrstu podataka, kao što su 1022 00:45:01,910 --> 00:45:04,320 int, ali nazvavši ga student. 1023 00:45:04,320 --> 00:45:09,310 A unutar ove varijable će se biti tri stvari - int, string, 1024 00:45:09,310 --> 00:45:09,930 i ogrlicu. 1025 00:45:09,930 --> 00:45:13,040 Dakle, možete misliti na ono što je stvarno ovdje dogodilo, iako je to 1026 00:45:13,040 --> 00:45:17,160 malo pojednostavljenja za danas, Student će biti 1027 00:45:17,160 --> 00:45:19,450 da izgleda ovako. 1028 00:45:19,450 --> 00:45:22,580 Njegova će biti komad memorije uz predočenje osobne iskaznice, ime 1029 00:45:22,580 --> 00:45:25,580 polje, a kuća polje. 1030 00:45:25,580 --> 00:45:30,670 I mi ćemo biti u mogućnosti koristiti one komade memorije i pristupiti im na sljedeći način. 1031 00:45:30,670 --> 00:45:38,870 >> Ako odem u struct0.c, ovdje je relativno dugo, no nakon 1032 00:45:38,870 --> 00:45:42,630 uzorak, koda koji koristi ovaj novi trik. 1033 00:45:42,630 --> 00:45:45,790 Tako je prvi, neka mi da skrenem vašu pozornost do zanimljivih dijelova do vrha. 1034 00:45:45,790 --> 00:45:49,670 Sharp definira studente 3, izjavljuje konstantu zvanu studentima i dodjeljuje 1035 00:45:49,670 --> 00:45:53,450 arbitrarno broj 3, samo tako da imam troje studenata pomoću 1036 00:45:53,450 --> 00:45:54,830 ovaj program za sada. 1037 00:45:54,830 --> 00:45:55,960 Ovdje dolazi Main. 1038 00:45:55,960 --> 00:45:58,860 I obavijest, kako mogu izjaviti Niz studenata? 1039 00:45:58,860 --> 00:46:00,480 Pa, ja samo koriste istu sintaksu. 1040 00:46:00,480 --> 00:46:02,110 Riječ je očito novi učenik. 1041 00:46:02,110 --> 00:46:04,790 Ali, student klase, zagrada studenata. 1042 00:46:04,790 --> 00:46:06,720 >> Dakle, nažalost, ima puno ponovne uporabe pojmova ovdje. 1043 00:46:06,720 --> 00:46:07,660 To je samo broj. 1044 00:46:07,660 --> 00:46:09,040 Dakle, to je kao da kažete tri. 1045 00:46:09,040 --> 00:46:11,430 Klasa je upravo ono što želim pozvati varijablu. 1046 00:46:11,430 --> 00:46:12,840 Mogao bih to nazvao studenata. 1047 00:46:12,840 --> 00:46:15,880 Ali klase, to nije klasa u objektno orijentirani Java vrsta način. 1048 00:46:15,880 --> 00:46:17,220 To je jednostavno klasa studenata. 1049 00:46:17,220 --> 00:46:20,590 I vrsta podataka svakog elementa u tom nizu je studentica. 1050 00:46:20,590 --> 00:46:23,040 Dakle, ovo je malo drugačije i od nešto govori 1051 00:46:23,040 --> 00:46:25,250 kao što je ovaj, to je samo - 1052 00:46:25,250 --> 00:46:29,500 Ja govorim daj mi tri studente i poziv da klasu polje. 1053 00:46:29,500 --> 00:46:29,800 >> U redu. 1054 00:46:29,800 --> 00:46:30,680 Sada ovdje je četiri petlje. 1055 00:46:30,680 --> 00:46:33,480 Taj lik upoznati - iteraciju od nule na do tri. 1056 00:46:33,480 --> 00:46:35,160 I ovdje je novi komad sintakse. 1057 00:46:35,160 --> 00:46:37,710 Program će me pitati, čovjeka, da bi ga student 1058 00:46:37,710 --> 00:46:39,200 ID, što je int. 1059 00:46:39,200 --> 00:46:44,650 I ovdje je sintaksa s kojima možete spremiti nešto u ID polje, na 1060 00:46:44,650 --> 00:46:48,630 Mjesto na nosač klase I. Dakle Ova sintaksa nije nova. 1061 00:46:48,630 --> 00:46:51,450 To samo znači da mi osma učenik u razredu. 1062 00:46:51,450 --> 00:46:52,940 No, ovaj simbol je novi. 1063 00:46:52,940 --> 00:46:56,320 Do sada, nismo si mogu koristiti točku, barem kod ovako. 1064 00:46:56,320 --> 00:47:01,490 To znači ići na struct poznat kao Student i staviti nešto tamo. 1065 00:47:01,490 --> 00:47:05,670 Isto tako, u ovom sljedećem retku, 31, idite naprijed i stavi sve što korisnik unese 1066 00:47:05,670 --> 00:47:10,530 za ime ovdje i što im je činiti za Kuća, ista stvar, samo naprijed i 1067 00:47:10,530 --> 00:47:13,230 staviti ga u kući.. 1068 00:47:13,230 --> 00:47:15,955 >> Pa što se ovaj program konačnici učiniti? 1069 00:47:15,955 --> 00:47:17,220 Možete vidjeti mali teaser tamo. 1070 00:47:17,220 --> 00:47:24,780 Dopustite mi da ide naprijed i ne bi tvorevina, 0 dot slash rekonstruirati 0, studentski ID 1, 1071 00:47:24,780 --> 00:47:28,250 David kažu Mather, student ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 i jedino što ovaj program je, što je samo potpuno proizvoljno, je 1075 00:47:38,380 --> 00:47:40,980 Htjela sam napraviti nešto s tim podacima, sad kad sam nas je učio kako se 1076 00:47:40,980 --> 00:47:43,450 koristite tvorevina, je upravo sam imao ovaj dodatni petlje ovdje. 1077 00:47:43,450 --> 00:47:45,260 Ja iteraciju preko niz studenata. 1078 00:47:45,260 --> 00:47:49,170 Ja koristiti našu, možda je sada poznato prijatelja, string usporedbu, stircomp se 1079 00:47:49,170 --> 00:47:53,780 Ček je 8. studenta kuća jednaka Mather? 1080 00:47:53,780 --> 00:47:56,760 I ako je tako, samo ispisati nešto samovoljno sviđa, da, to je. 1081 00:47:56,760 --> 00:47:59,430 Ali opet, samo mi daje mogućnosti za korištenje i ponovno korištenje i 1082 00:47:59,430 --> 00:48:02,270 ponovno ovaj novi zapis dot. 1083 00:48:02,270 --> 00:48:03,250 >> Dakle, koga briga, zar ne? 1084 00:48:03,250 --> 00:48:06,270 Dolazi sa studentskom programu dosta proizvoljna, ali ispada 1085 00:48:06,270 --> 00:48:09,800 da možemo napraviti korisne stvari s to, na primjer, kako slijedi. 1086 00:48:09,800 --> 00:48:14,600 To je mnogo kompliciranije struct u C. To je dobio desetak ili više polja, 1087 00:48:14,600 --> 00:48:15,880 nešto šifrirano ime. 1088 00:48:15,880 --> 00:48:20,110 Ali, ako ste ikada čuli za grafiku format zove bitmap, BMP, to 1089 00:48:20,110 --> 00:48:22,830 Ispada da bitmap format prilično mnogo izgleda kao da je to. 1090 00:48:22,830 --> 00:48:24,200 To je glupo malo smješka. 1091 00:48:24,200 --> 00:48:27,840 To je mala slika koje sam zumirani Na prilično velika, tako da sam mogao vidjeti svaku 1092 00:48:27,840 --> 00:48:30,410 od pojedinačnih točaka ili piksela. 1093 00:48:30,410 --> 00:48:33,800 Sada ispada da mogu predstavljati crna točka s, recimo, broja 0. 1094 00:48:33,800 --> 00:48:35,520 I bijela točka s brojem 1. 1095 00:48:35,520 --> 00:48:39,140 >> Dakle, drugim riječima, ako želite privući Smješko i spremiti tu sliku u 1096 00:48:39,140 --> 00:48:42,680 Računalo, dovoljno je pohraniti nule i one koje izgledaju kao što je ovaj, gdje, 1097 00:48:42,680 --> 00:48:45,250 opet, one su bijele i nula su crne. 1098 00:48:45,250 --> 00:48:48,290 I zajedno, ako imate učinkovito podsmijeh od jedinica i nula, imate 1099 00:48:48,290 --> 00:48:51,030 Rešetka od piksela, i ako stavi ih se, imate slatka 1100 00:48:51,030 --> 00:48:52,560 Malo smješka. 1101 00:48:52,560 --> 00:48:58,150 Sada, bitmap format, BMP, je djelotvorno da se ispod haube, 1102 00:48:58,150 --> 00:49:00,970 ali s više piksela Sot da Možete zapravo predstavljaju boje. 1103 00:49:00,970 --> 00:49:05,170 >> Ali kada imate sofisticiraniji formate kao što su BMP i JPEG i GIF 1104 00:49:05,170 --> 00:49:09,360 s kojima bi mogli biti upoznati, onima datoteke na disku u pravilu ne samo 1105 00:49:09,360 --> 00:49:13,760 imaju nula i one za piksela, ali oni imaju neku metapodataka kao i - 1106 00:49:13,760 --> 00:49:16,960 meta u smislu da nije stvarno Podaci ali to je korisno imati. 1107 00:49:16,960 --> 00:49:21,370 Dakle, ove stavke su ovdje podrazumijeva i vidjet ćemo to detaljnije u P-set 1108 00:49:21,370 --> 00:49:25,810 5, da je prije nego što su nule i jedinice koje predstavljaju piksela na slici, 1109 00:49:25,810 --> 00:49:29,110 postoji hrpa metapodataka kao što su veličina slike i 1110 00:49:29,110 --> 00:49:30,250 širina slike. 1111 00:49:30,250 --> 00:49:32,910 I ja sam primijetio čupanjem s nekim proizvoljne stvari ovdje - 1112 00:49:32,910 --> 00:49:34,260 širina i visina. 1113 00:49:34,260 --> 00:49:36,160 Bit računati i neke druge stvari. 1114 00:49:36,160 --> 00:49:37,840 Dakle, postoji neki metapodataka u datoteci. 1115 00:49:37,840 --> 00:49:41,470 >> Ali razumijevanje kako se datoteke položili se na taj način, možete zapravo 1116 00:49:41,470 --> 00:49:45,890 onda manipulirati slike, slike oporavak s diska, promijeniti veličinu slike. 1117 00:49:45,890 --> 00:49:47,560 Ali ne može nužno ih poboljšati. 1118 00:49:47,560 --> 00:49:48,480 Trebala mi je fotografiju. 1119 00:49:48,480 --> 00:49:52,840 Vratio sam se RJ ovdje, koji ste vidjeli Na zaslonu se prije nekog vremena. 1120 00:49:52,840 --> 00:49:57,160 A ako sam otvoriti Keynote ovdje, ovo je što će se dogoditi ako pokušate povećavanje i 1121 00:49:57,160 --> 00:49:59,380 poboljšala RJ. 1122 00:49:59,380 --> 00:50:01,480 On ne uzimajući bilo bolje stvarno. 1123 00:50:01,480 --> 00:50:06,240 Sada Keynote je vrsta zamućivanje je malo, samo prijeći preko 1124 00:50:06,240 --> 00:50:11,040 Činjenica da RJ ne bi osobito poboljšana kada zoom u. 1125 00:50:11,040 --> 00:50:13,310 A ako to učiniti na ovaj način, vidjeti kvadrate? 1126 00:50:13,310 --> 00:50:15,490 Da, definitivno možete vidjeti trgovi na projektoru. 1127 00:50:15,490 --> 00:50:17,690 >> To je ono što dobivate kada se poboljšala. 1128 00:50:17,690 --> 00:50:22,570 No, u razumijevanju kako se naša RJ ili Smješka se provodi omogućit će nam 1129 00:50:22,570 --> 00:50:24,950 zapravo pisanje koda koji manipulira te stvari. 1130 00:50:24,950 --> 00:50:29,970 A ja mislio da ću završiti na ovoj bilješci, s 55 sekundi poboljšala to je, 1131 00:50:29,970 --> 00:50:31,230 Usudio bih se, kažu, a zabludu. 1132 00:50:31,230 --> 00:50:32,990 >> [Video reprodukciju] 1133 00:50:32,990 --> 00:50:34,790 >> -On laže. 1134 00:50:34,790 --> 00:50:38,310 O tome što, ne znam. 1135 00:50:38,310 --> 00:50:41,200 >> -Pa što mi to znamo? 1136 00:50:41,200 --> 00:50:45,280 >> -Da se u 09:15 Ray Santoya bio na bankomatu. 1137 00:50:45,280 --> 00:50:47,830 >> -Dakle, pitanje je što je radio u 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> Pucanje-devet milimetara na nešto. 1139 00:50:50,750 --> 00:50:52,615 Možda je vidio snajpera. 1140 00:50:52,615 --> 00:50:54,760 >> -Ili je raditi s njim. 1141 00:50:54,760 --> 00:50:56,120 >> -Čekaj. 1142 00:50:56,120 --> 00:50:57,450 Vrati jedan. 1143 00:50:57,450 --> 00:50:58,700 >> -Što vidiš? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Donesite svoje lice prema gore, preko cijelog zaslona. 1146 00:51:09,490 --> 00:51:09,790 >> -Njegove čaše. 1147 00:51:09,790 --> 00:51:11,040 >> -Tu je odraz. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -To je momčad Neuvitas baseball. 1150 00:51:23,520 --> 00:51:24,530 To je njihov logo. 1151 00:51:24,530 --> 00:51:27,040 >> -I on govori da onaj tko je nosio tu jaknu. 1152 00:51:27,040 --> 00:51:27,530 >> [END video reprodukciju] 1153 00:51:27,530 --> 00:51:29,180 >> David J. Malan: To će Problem se Set 5. 1154 00:51:29,180 --> 00:51:30,720 Mi ćemo vidjeti sljedeći tjedan. 1155 00:51:30,720 --> 00:51:32,330 >> MALE ZVUČNI: Na sljedećem CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Cvrkut cvrčaka] 1157 00:51:39,240 --> 00:51:41,270 >> [Glazba svira]