1 00:00:00,000 --> 00:00:03,381 >> [MUSIC JOC] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO PLAYBACK] 4 00:00:11,610 --> 00:00:13,640 >> -El Minte. 5 00:00:13,640 --> 00:00:14,380 >> -Despre ce? 6 00:00:14,380 --> 00:00:17,182 >> -Eu nu stiu. 7 00:00:17,182 --> 00:00:19,990 >> Deci ce știm? 8 00:00:19,990 --> 00:00:23,145 >> Asta la 09:15, Ray Santoya fost la ATM. 9 00:00:23,145 --> 00:00:23,644 Da. 10 00:00:23,644 --> 00:00:27,030 Deci, întrebarea este, ce făcea la 09:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting 9 milimetru la ceva. 12 00:00:29,720 --> 00:00:31,540 Poate a văzut lunetist. 13 00:00:31,540 --> 00:00:33,412 >> Sau a fost de lucru cu el. 14 00:00:33,412 --> 00:00:34,340 >> -Stai asa. 15 00:00:34,340 --> 00:00:36,200 Du-te înapoi o. 16 00:00:36,200 --> 00:00:36,975 >> -Ce vezi? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> Adu fața în sus pe ecran complet. 19 00:00:47,805 --> 00:00:48,680 >> Ochelari -His. 20 00:00:48,680 --> 00:00:50,060 >> -Nu E un reflecție. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Este Echipa de baseball Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Asta e logo-ul lor. 24 00:01:03,110 --> 00:01:05,820 >> -Si El vorbește cu oricine poartă jacheta. 25 00:01:05,820 --> 00:01:06,670 >> [END PLAYBACK] 26 00:01:06,670 --> 00:01:07,628 >> DAVID MALAN: Bine. 27 00:01:07,628 --> 00:01:11,210 Acest lucru este CS50 și acest lucru este un pic mai mult de [inaudibil] cu care esti 28 00:01:11,210 --> 00:01:12,890 abuza cu problema set de patru. 29 00:01:12,890 --> 00:01:16,606 Astăzi vom începe să se uite un pic mai mult profund la aceste lucruri numite indicii, 30 00:01:16,606 --> 00:01:18,480 care chiar dacă este un subiect destul de arcane, 31 00:01:18,480 --> 00:01:20,813 se dovedește că aceasta va să fie mijloacele prin care am 32 00:01:20,813 --> 00:01:24,320 poate începe construirea și asamblarea programe mult mai sofisticate. 33 00:01:24,320 --> 00:01:28,150 Dar am făcut-o pe ultima zi de miercuri prin intermediul unora claymation primul. 34 00:01:28,150 --> 00:01:30,190 Deci acest lucru, amintesc, este Binky și l-am folosit 35 00:01:30,190 --> 00:01:33,148 să aruncăm o privire la un program care nu într-adevăr ceva interesant, 36 00:01:33,148 --> 00:01:34,950 dar a făcut-o dezvăluie câteva probleme. 37 00:01:34,950 --> 00:01:38,570 Deci, pentru a începe astăzi, de ce nu am mers rapid prin câteva dintre aceste etape, 38 00:01:38,570 --> 00:01:41,920 încercați să distilare în termeni umani lui exact ceea ce se întâmplă aici 39 00:01:41,920 --> 00:01:45,410 și de ce acest lucru este rău, și apoi trece la și de fapt, începe construirea ceva 40 00:01:45,410 --> 00:01:46,309 cu aceasta tehnica? 41 00:01:46,309 --> 00:01:48,350 Deci, acestea au fost primele două linii în acest program 42 00:01:48,350 --> 00:01:51,340 și în termeni de nespecialist, ceea ce sunt aceste două linii faci? 43 00:01:51,340 --> 00:01:55,600 Cineva care e rezonabil confortabil cu ceea ce a declarat pe ecran? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Ce sunt aceste două linii fac? 46 00:02:00,120 --> 00:02:02,070 Nu e tot ce diferită de o saptamana, 47 00:02:02,070 --> 00:02:03,611 dar există unele noi simbol special. 48 00:02:03,611 --> 00:02:04,152 Da? 49 00:02:04,152 --> 00:02:05,628 Acolo. 50 00:02:05,628 --> 00:02:07,092 >> Audiența: Declararea indicii? 51 00:02:07,092 --> 00:02:08,050 DAVID MALAN: Spune din nou? 52 00:02:08,050 --> 00:02:08,860 Audiența: Declararea indicii? 53 00:02:08,860 --> 00:02:11,776 DAVID MALAN: indicii Declararea și să-l rafina un pic mai mult. 54 00:02:11,776 --> 00:02:14,050 Audiența: [inaudibil] Adresa x si y, apoi. 55 00:02:14,050 --> 00:02:15,300 DAVID MALAN: Și apoi adresa. 56 00:02:15,300 --> 00:02:18,550 Deci, exact ceea ce facem este ne declararea două variabile. 57 00:02:18,550 --> 00:02:21,252 Aceste variabile, însă, sunt de gând să fie de tip stea Int, care 58 00:02:21,252 --> 00:02:23,210 înseamnă mai exact acestea sunt de gând pentru a stoca 59 00:02:23,210 --> 00:02:26,450 adresa de int, respectiv, x și y. 60 00:02:26,450 --> 00:02:27,660 Acum sunt acolo orice valori? 61 00:02:27,660 --> 00:02:32,621 Există adrese reale în aceste două variabile de la acest moment? 62 00:02:32,621 --> 00:02:33,120 Nu. 63 00:02:33,120 --> 00:02:35,030 E doar așa-numitele valori de gunoi. 64 00:02:35,030 --> 00:02:38,120 Dacă nu atribuiți de fapt o variabilă, ce era în RAM 65 00:02:38,120 --> 00:02:42,224 anterior se va umple cu zerouri și cele două de aceste variabile. 66 00:02:42,224 --> 00:02:44,140 Dar noi nu știm încă ceea ce sunt și asta e 67 00:02:44,140 --> 00:02:47,060 va fi cheia de ce Binky a pierdut capul săptămâna trecută. 68 00:02:47,060 --> 00:02:49,980 >> Deci aceasta a fost claymation încarnare a acestui 69 00:02:49,980 --> 00:02:53,580 prin care aveți doar două variabile, mici piese circulare de lut, 70 00:02:53,580 --> 00:02:57,330 care poate stoca variabile, ci ca săgețile împachetate sus sugerează, 71 00:02:57,330 --> 00:03:00,640 ei nu sunt de fapt îndreptat a cunoscut oriunde în sine. 72 00:03:00,640 --> 00:03:03,670 Deci, atunci am avut această linie, iar acest lucru era nou săptămâna trecută, malloc pentru memorie 73 00:03:03,670 --> 00:03:07,130 alocare, care este doar un mod de lux de a spune sistemul de operare, Linux 74 00:03:07,130 --> 00:03:09,750 sau Mac OS sau Windows, Hei, dă-mi niște memorie, 75 00:03:09,750 --> 00:03:11,780 și tot ce trebuie să-i spuneți sistemul de operare 76 00:03:11,780 --> 00:03:14,699 este ceea ce atunci când solicită memorie. 77 00:03:14,699 --> 00:03:16,990 Nu o să aibă grijă ce ai de gând să faci cu ea, 78 00:03:16,990 --> 00:03:19,786 dar aveți nevoie să-i spuneți de operare sistem ce prin intermediul malloc. 79 00:03:19,786 --> 00:03:20,286 Da? 80 00:03:20,286 --> 00:03:21,078 >> Audiența: Cât de mult? 81 00:03:21,078 --> 00:03:21,994 DAVID MALAN: Cât de mult? 82 00:03:21,994 --> 00:03:25,280 Cât de mult în bytes, și așa mai departe, acest, din nou, un exemplu contrived, este doar că 83 00:03:25,280 --> 00:03:27,360 da-mi dimensiunea unei Int. 84 00:03:27,360 --> 00:03:30,550 Acum, dimensiunea int este de patru bytes sau 32 de biți. 85 00:03:30,550 --> 00:03:32,850 Deci, aceasta este doar o modalitate de a spunând, hei, sistem de operare, 86 00:03:32,850 --> 00:03:37,290 da-mi patru bytes de memorie pe care le pot folosi la dispoziție, 87 00:03:37,290 --> 00:03:40,560 și, în special, ceea ce face întoarcere malloc cu respect 88 00:03:40,560 --> 00:03:41,795 la care bucată de patru bytes? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 Audiența: Adresa? 91 00:03:44,860 --> 00:03:45,901 DAVID MALAN: Adresa. 92 00:03:45,901 --> 00:03:47,580 Adresa de care bucată de patru octeți. 93 00:03:47,580 --> 00:03:48,190 Exact. 94 00:03:48,190 --> 00:03:51,430 Și așa mai departe asta e ceea ce este stocat în cele din urmă în X și de aceea nu prea 95 00:03:51,430 --> 00:03:55,240 pasă ce numărul de pe care Adresa este, indiferent dacă este sau OX1 OX2 96 00:03:55,240 --> 00:03:57,110 sau unele adresa hexazecimal criptice. 97 00:03:57,110 --> 00:03:59,850 Doar ne pasă pictural că variabila x este acum 98 00:03:59,850 --> 00:04:01,630 subliniind că bucată de memorie. 99 00:04:01,630 --> 00:04:05,570 Deci săgeata reprezintă un pointer, sau mai precis, o adresă de memorie. 100 00:04:05,570 --> 00:04:09,120 Dar, din nou, nu ne pasă de obicei ce aceste adrese reale sunt. 101 00:04:09,120 --> 00:04:11,780 Acum, această linie spune ceea ce în termeni de nespecialist? 102 00:04:11,780 --> 00:04:14,330 Stele X devine 42 și virgulă. 103 00:04:14,330 --> 00:04:17,390 Ce înseamnă acest lucru? 104 00:04:17,390 --> 00:04:18,200 Vrei să mergi? 105 00:04:18,200 --> 00:04:20,102 Nu zgâriați gât. 106 00:04:20,102 --> 00:04:22,360 >> Audiența: Adresa de x este la 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID MALAN: Adresa de x este la 42. 108 00:04:24,300 --> 00:04:25,190 Nu chiar. 109 00:04:25,190 --> 00:04:28,485 Atat de aproape, dar nu destul, pentru că există steaua care a prefixarea această x. 110 00:04:28,485 --> 00:04:29,860 Deci, avem nevoie să tweak un pic. 111 00:04:29,860 --> 00:04:31,032 Da? 112 00:04:31,032 --> 00:04:36,044 >> Audiența: valoarea pe care pointer X indică spre este de 42. 113 00:04:36,044 --> 00:04:36,710 DAVID MALAN: OK. 114 00:04:36,710 --> 00:04:40,840 Valoarea că indicatorul x este arătând spre, să zicem, va fi 42, 115 00:04:40,840 --> 00:04:44,165 sau altfel spus, steaua X spune, du-te la orice adresă 116 00:04:44,165 --> 00:04:48,340 este în x, fie că este vorba de 1 Oxford Stradă sau 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 sau OX1 sau ox33, indiferent de că adresa numerică este, 118 00:04:51,850 --> 00:04:54,380 stele x este dereferencing de X. 119 00:04:54,380 --> 00:04:57,297 Deci, du-te la acea adresă și apoi pune numărul 42 acolo. 120 00:04:57,297 --> 00:04:59,380 Deci, care ar fi o mod echivalent a spune că. 121 00:04:59,380 --> 00:05:01,860 Deci asta e tot bine și apoi ne-ar reprezenta imaginea 122 00:05:01,860 --> 00:05:05,370 după cum urmează în cazul în care am adăugat cele 42 de care bucată de patru 123 00:05:05,370 --> 00:05:09,370 octeți pe partea dreaptă, dar aceasta linie a fost în cazul în care lucrurile au mers razna 124 00:05:09,370 --> 00:05:11,120 și capul lui Binky apărut off în acest moment, 125 00:05:11,120 --> 00:05:15,290 pentru că se întâmplă lucruri rele atunci când te dereference valori de gunoi 126 00:05:15,290 --> 00:05:18,210 sau dereference invalid indicii, și spun invalid 127 00:05:18,210 --> 00:05:21,020 pentru că la acest punct în poveste, ceea ce este în interiorul y? 128 00:05:21,020 --> 00:05:24,440 Care este valoarea lui y pe baza pe câțiva pași trecut? 129 00:05:24,440 --> 00:05:25,360 Da? 130 00:05:25,360 --> 00:05:26,115 Ce-i asta? 131 00:05:26,115 --> 00:05:26,990 >> Audiența: O adresă. 132 00:05:26,990 --> 00:05:28,460 DAVID MALAN: O adresă. 133 00:05:28,460 --> 00:05:31,910 Ar trebui să fie o adresă dar am o inițializată? 134 00:05:31,910 --> 00:05:32,800 Deci, eu nu au încă. 135 00:05:32,800 --> 00:05:35,430 Deci, ceea ce este cunoscut a fi acolo? 136 00:05:35,430 --> 00:05:37,590 E doar o valoare de gunoi. 137 00:05:37,590 --> 00:05:41,500 Ar putea fi orice adresa de la zero la 2 miliarde, dacă aveți două concerte de RAM, 138 00:05:41,500 --> 00:05:44,289 sau zero la 4 miliarde, dacă ai Trebuie patru gigabytes de memorie RAM. 139 00:05:44,289 --> 00:05:46,080 Este o valoare de gunoi, dar problema este 140 00:05:46,080 --> 00:05:48,200 că sistemul de operare, dacă acesta nu a dat 141 00:05:48,200 --> 00:05:51,140 că bucată de memorie special că sunteți încercarea de a merge la, 142 00:05:51,140 --> 00:05:54,650 se, în general, ceea ce va provoca am văzut ca o eroare de segmentare. 143 00:05:54,650 --> 00:05:57,810 Deci, în fapt, oricare dintre voi care au luptat la probleme la ore de birou 144 00:05:57,810 --> 00:06:00,393 sau în probleme care e mai mult în general, cu încearcă să dau seama 145 00:06:00,393 --> 00:06:02,150 o eroare de segmentare, înseamnă că, în general, 146 00:06:02,150 --> 00:06:05,017 te atinge un segment de de memorie pe care nu ar trebui să fie. 147 00:06:05,017 --> 00:06:07,350 Ești atinge de memorie care sistemul de operare nu are 148 00:06:07,350 --> 00:06:10,450 permis să atingă, fie că este vorba de a merge prea departe în matrice ta 149 00:06:10,450 --> 00:06:12,870 sau începând de acum, dacă este pentru că te atinge 150 00:06:12,870 --> 00:06:14,780 memorie care este doar o anumită valoare gunoi. 151 00:06:14,780 --> 00:06:18,230 >> Astfel stele X aici se tip de comportament nedefinit. 152 00:06:18,230 --> 00:06:22,030 Nu ar trebui să o facă pentru că cote sunt, programul se doar de gând să se prăbușească, 153 00:06:22,030 --> 00:06:24,050 pentru că spui, du-te la această adresă 154 00:06:24,050 --> 00:06:27,000 și nu aveți nici o idee în cazul în care că adresa este de fapt. 155 00:06:27,000 --> 00:06:30,300 Deci sistemul de operare este probabil O să se prăbușească programul 156 00:06:30,300 --> 00:06:33,840 ca urmare și, într-adevăr, asta e ceea ce sa întâmplat acolo pentru a Binky. 157 00:06:33,840 --> 00:06:37,210 Deci în cele din urmă, Binky fix această problemă cu asta. 158 00:06:37,210 --> 00:06:38,909 Astfel încât programul în sine a fost greșită. 159 00:06:38,909 --> 00:06:41,450 Dar, dacă un fel de a merge înainte și să execute această linie în schimb, 160 00:06:41,450 --> 00:06:45,580 y este egal cu x doar înseamnă orice Adresa este un x, de asemenea, pune-l în y. 161 00:06:45,580 --> 00:06:48,740 >> Și astfel pictural, ne-am reprezentat acest lucru cu două săgeți 162 00:06:48,740 --> 00:06:51,570 de la x si y din indicare în același loc. 163 00:06:51,570 --> 00:06:55,760 Deci semantic, x este egal a y deoarece ambele celor 164 00:06:55,760 --> 00:07:00,300 sunt la fel de stocare adresa, ergo arătând la 42, 165 00:07:00,300 --> 00:07:04,910 și acum, când spui stele y, du-te la adresa din y, 166 00:07:04,910 --> 00:07:06,790 acest lucru are un efect secundar interesant. 167 00:07:06,790 --> 00:07:10,320 Deci, adresa din y este același lucru ca și adresa de la X. 168 00:07:10,320 --> 00:07:15,060 Deci, dacă spui duci la adresa în y și modificați valoarea la 13, 169 00:07:15,060 --> 00:07:17,140 Cine mai este afectat? 170 00:07:17,140 --> 00:07:21,100 X este, punctul D, ca să spunem așa, ar trebui să fie afectate, de asemenea. 171 00:07:21,100 --> 00:07:24,340 >> Și într-adevăr, cum Nick desenat această imagine în claymation a fost exact acest lucru. 172 00:07:24,340 --> 00:07:28,665 Chiar dacă urmăm indicatorul y, am ajuns în același loc, 173 00:07:28,665 --> 00:07:32,780 și așa, dacă am fost pentru a imprima out X sau Y pointee lui, 174 00:07:32,780 --> 00:07:35,720 atunci am vedea valoarea 13. 175 00:07:35,720 --> 00:07:37,927 Acum, eu spun pointee să fie în concordanță cu video. 176 00:07:37,927 --> 00:07:39,760 Programatorii, pentru a-mi cunoștințe, de fapt, niciodată 177 00:07:39,760 --> 00:07:42,460 spune pointee cuvânt, ceea ce este ascuțit 178 00:07:42,460 --> 00:07:44,650 la, dar pentru consistență cu video, realiza 179 00:07:44,650 --> 00:07:47,520 asta e tot ce a fost însemnat în această situație. 180 00:07:47,520 --> 00:07:54,190 Deci, orice întrebări cu privire la claymation sau indicii sau malloc doar încă? 181 00:07:54,190 --> 00:07:54,850 Nu? 182 00:07:54,850 --> 00:07:55,470 In regula. 183 00:07:55,470 --> 00:07:58,560 >> Deci fără alte ADO, haideți să aruncăm o privire 184 00:07:58,560 --> 00:08:00,700 la în cazul în care acest lucru are de fapt fost folosit de ceva timp. 185 00:08:00,700 --> 00:08:03,580 Deci am avut această bibliotecă CS50 care are toate aceste funcții. 186 00:08:03,580 --> 00:08:06,810 Am folosit getint mult, getString, probabil mai devreme GetLongLong 187 00:08:06,810 --> 00:08:09,840 în PSET mea unul sau așa, dar ceea ce a fost de fapt se întâmplă? 188 00:08:09,840 --> 00:08:12,920 Ei bine, haideți să aruncăm o privire rapidă sub capota la un program care 189 00:08:12,920 --> 00:08:17,017 inspiră de ce am vă dau CS50 bibliotecă, și într-adevăr așa cum a săptămâna trecută, 190 00:08:17,017 --> 00:08:18,850 am inceput sa iau cele roți de formare off. 191 00:08:18,850 --> 00:08:21,080 Deci, acest lucru este acum sortate de o post-mortem a ceea 192 00:08:21,080 --> 00:08:23,690 a fost întâmplă în interiorul bibliotecii CS50, 193 00:08:23,690 --> 00:08:27,250 chiar dacă acum va începe să se miște departe de el pentru majoritatea programelor. 194 00:08:27,250 --> 00:08:29,460 >> Deci, acest lucru este un program numit scanf 0. 195 00:08:29,460 --> 00:08:30,510 Este foarte scurt. 196 00:08:30,510 --> 00:08:33,909 Este doar are aceste linii, dar introduce o funcție numită scanf 197 00:08:33,909 --> 00:08:36,909 că suntem de fapt de gând să vezi în un moment în interiorul bibliotecii CS50, 198 00:08:36,909 --> 00:08:38,600 deși într-o formă ușor diferită. 199 00:08:38,600 --> 00:08:41,330 Deci, acest program de pe linia 16 declară un X variabilă. 200 00:08:41,330 --> 00:08:43,150 Deci dă-mi patru octeți pentru un int. 201 00:08:43,150 --> 00:08:45,750 A fost spune utilizator, numărul te rog, și apoi 202 00:08:45,750 --> 00:08:49,010 aceasta este o linie de interesant faptul că de fapt, leagă împreună săptămâna trecută 203 00:08:49,010 --> 00:08:49,790 și asta. 204 00:08:49,790 --> 00:08:53,230 Scanf, și apoi observați este nevoie de o string format, la fel ca printf, 205 00:08:53,230 --> 00:08:57,480 % i înseamnă un int, iar apoi este nevoie de o al doilea argument care arată un pic 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 E ampersand X, și să reamintească, am văzut doar în această săptămână o dată trecută. 208 00:09:01,880 --> 00:09:03,465 Ce ampersand X reprezintă? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Ce face ampersand in C? 211 00:09:08,450 --> 00:09:08,950 Da? 212 00:09:08,950 --> 00:09:10,024 >> Audiența: Adresa de. 213 00:09:10,024 --> 00:09:11,190 DAVID MALAN: Adresa de. 214 00:09:11,190 --> 00:09:13,190 Deci e opusul operatorului stele, 215 00:09:13,190 --> 00:09:17,270 întrucât operatorul stea spune, du-te la această adresă, operatorul ampersand 216 00:09:17,270 --> 00:09:20,280 spune, dau seama de Adresa de această variabilă, 217 00:09:20,280 --> 00:09:23,530 și așa mai departe acest lucru este cheia, pentru că Scopul scanf în viața 218 00:09:23,530 --> 00:09:26,320 este de a scana utilizatorului de intrare de la tastatură, 219 00:09:26,320 --> 00:09:29,970 în funcție de ceea ce el sau ea tipuri, și apoi citiți de intrare care utilizatorului 220 00:09:29,970 --> 00:09:32,970 într-o variabilă, dar am văzut în ultimele două săptămâni 221 00:09:32,970 --> 00:09:36,080 că funcția de swap pe care le încercat efort să pună în aplicare 222 00:09:36,080 --> 00:09:37,110 a fost doar rupt. 223 00:09:37,110 --> 00:09:42,470 Amintiți-vă că cu funcția swap, dacă ne-am declarat A și B ca int, 224 00:09:42,470 --> 00:09:47,040 ne-am SWAP cu succes două variabile din interiorul schimb 225 00:09:47,040 --> 00:09:50,080 la fel ca cu lapte și JO, dar de îndată ce a revenit de swap, 226 00:09:50,080 --> 00:09:55,200 care a fost rezultatul cu respect pentru x și y, valorile originale? 227 00:09:55,200 --> 00:09:55,700 Nimic. 228 00:09:55,700 --> 00:09:56,200 Da. 229 00:09:56,200 --> 00:09:59,754 Nu sa întâmplat nimic acel moment, pentru că swap-uri schimba doar de exemplare sale locale, 230 00:09:59,754 --> 00:10:01,670 adică, toate de data aceasta, ori de câte ori ne-am 231 00:10:01,670 --> 00:10:04,010 fost trecerea în argumente la funcții, suntem 232 00:10:04,010 --> 00:10:05,939 doar in trecere copii ale acestor argumente. 233 00:10:05,939 --> 00:10:07,980 Puteți face cu asta ce vrei cu ei, 234 00:10:07,980 --> 00:10:10,890 dar ei vor avea nici o efect asupra valorilor inițiale. 235 00:10:10,890 --> 00:10:13,650 Deci acest lucru este problematic dacă doresc să aibă o funcție ca scanf 236 00:10:13,650 --> 00:10:17,170 în viață, al cărei scop este de a scana intrare utilizatorului de la tastatura 237 00:10:17,170 --> 00:10:22,010 și apoi completați spațiile libere, astfel încât să vorbesc, că este, da o variabilă ca X 238 00:10:22,010 --> 00:10:25,410 o valoare, pentru că dacă aș fi pentru a trece doar x pentru a scanf, 239 00:10:25,410 --> 00:10:28,790 dacă ia în considerare logica ultima săptămână, scanf poate face ce vrea 240 00:10:28,790 --> 00:10:33,100 cu o copie a X, dar nu a putut schimba permanent X dacă nu vom da 241 00:10:33,100 --> 00:10:37,120 scanf o hartă a comorii, ca să spunem așa, unde x marchează locul, prin care 242 00:10:37,120 --> 00:10:41,860 trecem în adresa lui x, astfel încât scanf poate merge acolo și, de fapt schimbare 243 00:10:41,860 --> 00:10:42,920 valoarea lui x. 244 00:10:42,920 --> 00:10:45,080 Și astfel, într-adevăr, toate că acest program nu 245 00:10:45,080 --> 00:10:53,180 dacă am face scanf 0, în sursa mea Director 5m, face scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot slash scanf, numărul Vă rugăm să 50, multumesc pentru 50. 247 00:10:57,730 --> 00:11:01,020 >> Deci nu e tot ce interesant, dar ce se întâmplă într-adevăr 248 00:11:01,020 --> 00:11:04,820 este faptul că, de îndată ce eu numesc scanf aici, valoarea lui x 249 00:11:04,820 --> 00:11:06,410 se schimbă în permanență. 250 00:11:06,410 --> 00:11:08,335 Acum, acest lucru pare frumos și bine, și, de fapt, ea 251 00:11:08,335 --> 00:11:11,200 se pare ca nu avem cu adevărat nevoie de biblioteca CS50 deloc mai. 252 00:11:11,200 --> 00:11:13,960 De exemplu, să rulați de data asta mai mult aici. 253 00:11:13,960 --> 00:11:15,750 Lasă-mă să-l redeschidă pentru un al doilea. 254 00:11:15,750 --> 00:11:20,600 Să încercăm un număr, vă rugăm și în loc de a spune 50 ca înainte, 255 00:11:20,600 --> 00:11:22,810 hai să spunem nu. 256 00:11:22,810 --> 00:11:24,000 OK, asta e un pic ciudat. 257 00:11:24,000 --> 00:11:25,270 BINE. 258 00:11:25,270 --> 00:11:28,680 Și doar câteva prostii aici. 259 00:11:28,680 --> 00:11:31,170 Deci, nu pare să gestiona situații eronate. 260 00:11:31,170 --> 00:11:33,620 Așa că trebuie să minim de pornire adăugând unele erori de verificare 261 00:11:33,620 --> 00:11:37,460 pentru a vă asigura că utilizatorul are tastat într-un număr real ca 50, 262 00:11:37,460 --> 00:11:40,720 deoarece cuvintele aparent dactilografiere nu este detectat ca fiind problematică, 263 00:11:40,720 --> 00:11:42,020 dar probabil ar trebui să fie. 264 00:11:42,020 --> 00:11:46,450 >> Să ne uităm la această versiune acum asta e incercarea mea de a reimplementeze getString. 265 00:11:46,450 --> 00:11:48,437 Dacă scanf are toate astea funcționalitate construit în, 266 00:11:48,437 --> 00:11:51,270 de ce am fost abuza cu aceste roți de formare, cum ar fi getString? 267 00:11:51,270 --> 00:11:55,450 Ei bine, aici este, probabil, propria mea versiune simpla a getString 268 00:11:55,450 --> 00:12:00,766 care în urmă cu o săptămână, s-ar putea fi spus, da-mi un șir și îl numesc tampon. 269 00:12:00,766 --> 00:12:03,390 Astăzi, am de gând să înceapă doar spunând stele char, care, amintesc, 270 00:12:03,390 --> 00:12:04,400 e doar sinonim. 271 00:12:04,400 --> 00:12:06,629 Se pare infricosator, dar este exact același lucru. 272 00:12:06,629 --> 00:12:09,420 Deci, da-mi un tampon variabilă numită care va stoca un șir, 273 00:12:09,420 --> 00:12:12,780 spune șirul de utilizator, vă rugăm, și apoi, la fel ca înainte, 274 00:12:12,780 --> 00:12:17,760 să încercăm să împrumute această lecție scanf % s acest moment și apoi să treacă în tampon. 275 00:12:17,760 --> 00:12:19,310 Acum, o verificare rapidă bun-simț. 276 00:12:19,310 --> 00:12:22,120 De ce nu mi spun ampersand tampon de data asta? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Deduce din exemplul anterior. 279 00:12:26,625 --> 00:12:28,000 Audiența: Char stele este un pointer. 280 00:12:28,000 --> 00:12:29,920 DAVID MALAN: Exact, că de data aceasta, char 281 00:12:29,920 --> 00:12:34,080 stele este deja un pointer, o adresă, prin definiție, din care stele a fi acolo. 282 00:12:34,080 --> 00:12:37,530 Și dacă scanf așteaptă o adresă, este suficient doar pentru a trece în tampon. 283 00:12:37,530 --> 00:12:39,260 Nu am nevoie să spun tampon ampersand. 284 00:12:39,260 --> 00:12:42,177 Pentru curiosi, ai putea face ceva de genul asta. 285 00:12:42,177 --> 00:12:43,510 Aceasta ar avea sens diferit. 286 00:12:43,510 --> 00:12:47,240 Acest lucru ar da un pointer la un pointer, care este de fapt 287 00:12:47,240 --> 00:12:50,050 un lucru valabil în C, dar pentru acum, hai să-l păstrați simplu 288 00:12:50,050 --> 00:12:51,750 și să păstreze povestea consistent. 289 00:12:51,750 --> 00:12:54,100 Mă duc să treacă în tampon și asta e corect. 290 00:12:54,100 --> 00:12:56,487 Problema însă este aceasta. 291 00:12:56,487 --> 00:12:58,820 Lasă-mă să mergeți mai departe și a alerga acest Programul după compilarea ea. 292 00:12:58,820 --> 00:13:00,902 Face scanf 1. 293 00:13:00,902 --> 00:13:02,610 La naiba, compilator meu prinderea greșeala mea. 294 00:13:02,610 --> 00:13:04,090 Dă-mi o secundă. 295 00:13:04,090 --> 00:13:05,460 Zăngăni. 296 00:13:05,460 --> 00:13:06,990 Să spunem scanf-1.C. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 BINE. 299 00:13:11,380 --> 00:13:12,720 Nu mergem. 300 00:13:12,720 --> 00:13:14,280 Am nevoie de ea. 301 00:13:14,280 --> 00:13:16,750 CS50 ID are diferite setările de configurare 302 00:13:16,750 --> 00:13:18,280 pe care le proteja împotriva tine. 303 00:13:18,280 --> 00:13:21,300 Am nevoie pentru a dezactiva cele de rularea zăngăni manual de data asta. 304 00:13:21,300 --> 00:13:22,140 Deci, vă rugăm să șir. 305 00:13:22,140 --> 00:13:25,560 Am de gând să mergeți mai departe și tastați în lumea mea preferata salut. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 Asta nu e ceea ce am scris. 308 00:13:27,700 --> 00:13:29,690 Deci e un indicator al ceva în neregulă fiind. 309 00:13:29,690 --> 00:13:33,920 Lasă-mă să mergeți mai departe și de tip într-un șir foarte lung. 310 00:13:33,920 --> 00:13:37,210 Multumesc pentru nul și nu știu dacă am de gând să fie în măsură să-l accident. 311 00:13:37,210 --> 00:13:40,240 Să încercăm un pic copie lipiți și a vedea dacă acest lucru vă ajută. 312 00:13:40,240 --> 00:13:43,290 Doar inserați o mulțime de acest lucru. 313 00:13:43,290 --> 00:13:47,310 Este cu siguranta o mai mare string decât de obicei. 314 00:13:47,310 --> 00:13:51,450 Să adevarat scrie. 315 00:13:51,450 --> 00:13:51,950 Nu. 316 00:13:51,950 --> 00:13:52,650 La naiba. 317 00:13:52,650 --> 00:13:53,480 Comanda nu a fost găsită. 318 00:13:53,480 --> 00:13:54,550 Așa că e fără legătură. 319 00:13:54,550 --> 00:13:56,440 Asta pentru că am lipit unele personaje rele, 320 00:13:56,440 --> 00:13:59,780 dar acest lucru se dovedește a nu va funcționa. 321 00:13:59,780 --> 00:14:03,510 >> Să încercăm încă o dată, pentru că e mai distractiv dacă am de fapt, accident. 322 00:14:03,510 --> 00:14:09,116 Să acest tip, iar acum, eu sunt merge pentru a copia un șir foarte lung 323 00:14:09,116 --> 00:14:10,990 și acum să vedem dacă ne poate prăbuși acest lucru. 324 00:14:10,990 --> 00:14:14,235 Observați am omis spații și noi linii și punct și virgulă 325 00:14:14,235 --> 00:14:16,035 și toate caracterele funky. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 Și acum rețeaua este doar fiind lent. 329 00:14:22,880 --> 00:14:27,460 Am apăsat Command-V prea mult timp, în mod clar. 330 00:14:27,460 --> 00:14:28,190 La naiba! 331 00:14:28,190 --> 00:14:29,260 Comanda nu a fost găsită. 332 00:14:29,260 --> 00:14:29,780 >> BINE. 333 00:14:29,780 --> 00:14:32,240 Ei bine, ideea este cu toate acestea, următoarele. 334 00:14:32,240 --> 00:14:36,910 Deci, ceea ce se întâmplă de fapt pe de această declarație 335 00:14:36,910 --> 00:14:39,240 de tampon stele char pe linia 16? 336 00:14:39,240 --> 00:14:41,820 Deci, ce sunt eu obtinerea atunci când am declara un pointer? 337 00:14:41,820 --> 00:14:47,440 Tot Primesc este o valoare de patru octet numit tampon, dar ceea ce este în interiorul acestuia 338 00:14:47,440 --> 00:14:49,540 Momentan? 339 00:14:49,540 --> 00:14:50,930 E doar o valoare de gunoi. 340 00:14:50,930 --> 00:14:54,170 Pentru că de fiecare dată când declara o variabilă în C, e doar o valoare de gunoi, 341 00:14:54,170 --> 00:14:56,220 si suntem incepand de la excursie pe această realitate. 342 00:14:56,220 --> 00:14:59,720 Acum, când am spune scanf, du-te la această adresă 343 00:14:59,720 --> 00:15:01,520 și a pus, indiferent de utilizator tipuri de. 344 00:15:01,520 --> 00:15:06,400 Dacă utilizatorul tipurile de salut lume, ei bine, unde am pus? 345 00:15:06,400 --> 00:15:07,750 Buffer este o valoare gunoi. 346 00:15:07,750 --> 00:15:11,510 >> Deci, asta e un fel de o săgeată care este îndreptat cine știe unde. 347 00:15:11,510 --> 00:15:13,880 Poate e îndreptat chiar aici, în memoria mea. 348 00:15:13,880 --> 00:15:16,560 Și astfel, atunci când utilizatorul tipurile din lume salut, 349 00:15:16,560 --> 00:15:22,380 programul încearcă să pună string Bună ziua lume backslash 0 350 00:15:22,380 --> 00:15:23,910 în bucată de memorie. 351 00:15:23,910 --> 00:15:27,070 Dar cu mare probabilitate, dar în mod clar nu 100% probabilitate, 352 00:15:27,070 --> 00:15:30,440 computerul va apoi sa se prabuseasca programul deoarece aceasta nu este 353 00:15:30,440 --> 00:15:32,490 memorie ar trebui să li se permită să atingă. 354 00:15:32,490 --> 00:15:36,330 Deci, pe scurt, acest program este viciată pentru exact acest motiv. 355 00:15:36,330 --> 00:15:38,070 Eu fundamental nu este ceea ce faci? 356 00:15:38,070 --> 00:15:42,366 Ce măsuri au omis eu, la fel ca am omis cu prim exemplu Binky lui? 357 00:15:42,366 --> 00:15:42,866 Da? 358 00:15:42,866 --> 00:15:43,710 >> Audiența: Alocarea de memorie? 359 00:15:43,710 --> 00:15:45,001 >> DAVID MALAN: alocare de memorie. 360 00:15:45,001 --> 00:15:48,400 Nu am alocat de fapt orice memorie pentru că șir. 361 00:15:48,400 --> 00:15:50,270 Astfel încât să putem rezolva acest lucru în câteva moduri. 362 00:15:50,270 --> 00:15:52,700 Unul, putem păstrați-l simplu și, de fapt, acum ești 363 00:15:52,700 --> 00:15:55,116 va începe pentru a vedea o neclaritate a liniilor între ceea ce 364 00:15:55,116 --> 00:15:58,520 o serie este, ceea ce este un șir, ce stele char este, o serie de caractere 365 00:15:58,520 --> 00:15:59,020 este. 366 00:15:59,020 --> 00:16:02,450 Iată un al doilea exemplu implicând siruri de caractere și notificare 367 00:16:02,450 --> 00:16:05,690 tot ce am făcut pe linia 16 este, în loc de a spune 368 00:16:05,690 --> 00:16:09,530 că tampon va fi un char stele, un pointer la o bucată de memorie, 369 00:16:09,530 --> 00:16:14,057 Am de gând să dea foarte proactiv eu un tampon pentru 16 caractere, 370 00:16:14,057 --> 00:16:16,390 și, de fapt, în cazul în care esti familiarizat cu tamponarea pe termen lung, 371 00:16:16,390 --> 00:16:20,570 probabil din lumea de videoclipuri, în cazul în care un video este de tamponare, de tamponare, 372 00:16:20,570 --> 00:16:21,175 tamponare. 373 00:16:21,175 --> 00:16:22,550 Ei bine, ceea ce este legătura aici? 374 00:16:22,550 --> 00:16:24,960 Ei bine, interiorul YouTube și în interiorul playere video 375 00:16:24,960 --> 00:16:27,200 în general, este o matrice care este mai mare decât 16. 376 00:16:27,200 --> 00:16:30,340 Ar putea fi o serie de dimensiuni unul megabyte, poate 10 megaocteți, 377 00:16:30,340 --> 00:16:34,330 și în care matrice nu browser-ul dvs. descărca o grămadă de bytes, 378 00:16:34,330 --> 00:16:37,500 o grămadă de megabytes de video și video player, 379 00:16:37,500 --> 00:16:40,930 YouTube sau cine e, începe citit octeți de care matrice, 380 00:16:40,930 --> 00:16:43,530 și de fiecare dată când vedea pe tamponare cuvânt, de tamponare, 381 00:16:43,530 --> 00:16:46,350 ceea ce înseamnă că jucătorul are ajuns la sfârșitul acestei matrice. 382 00:16:46,350 --> 00:16:50,430 Rețeaua este atât de lent încât nu are reumplut matrice cu mai multe bytes 383 00:16:50,430 --> 00:16:55,610 și așa ai ieșit de biți pentru a afișa pentru utilizator. 384 00:16:55,610 --> 00:16:59,430 >> Deci tampon este un termen apt aici, în care e doar o matrice, o bucată de memorie. 385 00:16:59,430 --> 00:17:02,530 Și acest lucru se va rezolva pentru că se pare că 386 00:17:02,530 --> 00:17:07,410 pe care le poate trata ca și cum tablouri ele sunt adrese, chiar dacă tampon 387 00:17:07,410 --> 00:17:10,710 este doar un simbol, este un secvență de caractere, tampon, 388 00:17:10,710 --> 00:17:14,760 care este util pentru mine, programator, puteți trece numele acestuia în jurul 389 00:17:14,760 --> 00:17:17,079 ca și cum ar fi fost un pointer, ca și cum ar 390 00:17:17,079 --> 00:17:21,000 erau adresa de o bucată de memorie de 16 caractere. 391 00:17:21,000 --> 00:17:24,530 Așa că e de spus, eu pot trece scanf exact acest cuvânt 392 00:17:24,530 --> 00:17:30,670 și așa mai departe acum, dacă am face acest program, face scanf 2, punct slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 și de tip în salut lume, Introduceți, că time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, ce sa întâmplat? 395 00:17:37,590 --> 00:17:39,340 Șir, vă rugăm. 396 00:17:39,340 --> 00:17:41,430 Cu ce ​​am greșit? 397 00:17:41,430 --> 00:17:43,800 Bună ziua lume, tampon. 398 00:17:43,800 --> 00:17:44,705 Buna, lume. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, știu ce face. 401 00:17:49,420 --> 00:17:49,920 BINE. 402 00:17:49,920 --> 00:17:51,628 Deci e lectură până până la primul spațiu. 403 00:17:51,628 --> 00:17:55,680 Deci, haideți să trișeze pentru o clipă și spun că am vrut doar să tastați ceva 404 00:17:55,680 --> 00:18:01,408 foarte lung ca aceasta este o propoziție lungă acesta este unul, doi, trei, patru, cinci, 405 00:18:01,408 --> 00:18:04,420 șase, șapte, opt, nouă, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 BINE. 407 00:18:05,300 --> 00:18:07,600 Este într-adevăr o propoziție lungă. 408 00:18:07,600 --> 00:18:10,710 Deci această teză este mai mult de 16 caractere 409 00:18:10,710 --> 00:18:13,670 și așa că atunci când am lovit Enter, ce se va întâmpla? 410 00:18:13,670 --> 00:18:16,940 Ei bine, în acest caz de tampon poveste, am declarat 411 00:18:16,940 --> 00:18:22,190 a fi de fapt o matrice cu 16 de caractere gata să meargă. 412 00:18:22,190 --> 00:18:27,426 Deci unul, doi, trei, patru, cinci, sase, șapte, opt, nouă, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Deci 16 de caractere, iar acum, când am citit în ceva de genul acesta este un lung 415 00:18:34,410 --> 00:18:43,950 teză, ce se va întâmpla este că am de gând să citesc în acest sens este o lungă 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, propoziții. 417 00:18:49,660 --> 00:18:52,270 >> Deci acest lucru este în mod deliberat un lucru rău pe care am 418 00:18:52,270 --> 00:18:55,060 păstra scris dincolo de limitele de matrice meu, 419 00:18:55,060 --> 00:18:56,660 dincolo de granițele de tampon meu. 420 00:18:56,660 --> 00:19:00,100 Aș putea avea noroc și programul va continua să fie difuzate și nu le pasă, 421 00:19:00,100 --> 00:19:03,450 dar, în general vorbind, acest se va prăbuși într-adevăr programul meu, 422 00:19:03,450 --> 00:19:06,440 și este un bug în mea codul momentul în care am pasul 423 00:19:06,440 --> 00:19:08,576 dincolo de granițele din matrice, pentru că am 424 00:19:08,576 --> 00:19:10,450 Nu știu dacă e neapărat de gând să se prăbușească 425 00:19:10,450 --> 00:19:12,120 sau dacă Mă duc pentru a avea noroc. 426 00:19:12,120 --> 00:19:15,750 Deci acest lucru este problematic, deoarece în acest caz, se pare să funcționeze 427 00:19:15,750 --> 00:19:20,931 și să ispiti soarta aici, chiar dacă IDE pare să tolereze destul de un pic 428 00:19:20,931 --> 00:19:21,430 de-- 429 00:19:21,430 --> 00:19:22,040 >> Nu mergem. 430 00:19:22,040 --> 00:19:23,240 In cele din urma. 431 00:19:23,240 --> 00:19:26,470 Deci, eu sunt singurul care poate vedea acest lucru. 432 00:19:26,470 --> 00:19:29,630 Așa că am avut doar o mulțime de distracție dactilografiere o frază foarte lung real 433 00:19:29,630 --> 00:19:32,800 că cu siguranță depășit 16 bytes, pentru că am 434 00:19:32,800 --> 00:19:38,050 scris în acest nebun lung multi-line frază, și apoi observați ceea ce sa întâmplat. 435 00:19:38,050 --> 00:19:41,110 Programul a încercat imprimarea aceasta și apoi a primit o eroare de segmentare 436 00:19:41,110 --> 00:19:44,430 defecte de segmentare este atunci când se întâmplă ceva de genul asta 437 00:19:44,430 --> 00:19:47,650 și sistemul de operare spune Nu, nu se poate atinge acea memorie. 438 00:19:47,650 --> 00:19:49,570 Mergem să-l omoare programul cu totul. 439 00:19:49,570 --> 00:19:51,180 >> Deci, acest lucru pare problematic. 440 00:19:51,180 --> 00:19:54,540 Am îmbunătățit programul prin care cel puțin au unele de memorie, 441 00:19:54,540 --> 00:19:58,000 dar acest lucru ar părea să se limiteze funcția getString pentru obtinerea 442 00:19:58,000 --> 00:20:00,780 șiruri de unele lungime finit 16. 443 00:20:00,780 --> 00:20:04,200 Deci, dacă doriți să sprijine mai mult Exemple de mult de 16 de caractere, 444 00:20:04,200 --> 00:20:04,880 ce faci? 445 00:20:04,880 --> 00:20:07,970 Ei bine, puteți crește Dimensiunea de acest tampon la 32 446 00:20:07,970 --> 00:20:09,190 sau care pare un fel de scurt. 447 00:20:09,190 --> 00:20:12,260 De ce nu ne-am face l 1000, dar împinge înapoi. 448 00:20:12,260 --> 00:20:17,100 Care este răspunsul intuitiv de evitând doar această problemă prin 449 00:20:17,100 --> 00:20:20,660 tampon meu mai mare, cum ar fi de 1.000 de caractere? 450 00:20:20,660 --> 00:20:23,470 Prin implementarea getString acest fel. 451 00:20:23,470 --> 00:20:27,130 Ce e bun sau rău aici? 452 00:20:27,130 --> 00:20:28,033 Da? 453 00:20:28,033 --> 00:20:30,574 Audiența: Dacă va obligati o mulțime de spațiu și nu-l utilizați, 454 00:20:30,574 --> 00:20:33,500 atunci nu se poate realoca că spațiul. 455 00:20:33,500 --> 00:20:34,500 DAVID MALAN: Absolut. 456 00:20:34,500 --> 00:20:38,480 E risipă în măsura în care, dacă nu de fapt, nevoie de 900 dintre aceste bytes 457 00:20:38,480 --> 00:20:41,057 și totuși ceri pentru 1.000 în total, oricum, 458 00:20:41,057 --> 00:20:44,140 esti doar consuma mai multă memorie pe computerul utilizatorului decât aveți nevoie pentru a, 459 00:20:44,140 --> 00:20:45,740 și după toate, unele dintre ați întâlnit deja 460 00:20:45,740 --> 00:20:47,620 în viață că, atunci când ești rulează o mulțime de programe 461 00:20:47,620 --> 00:20:50,470 și ei consumă o mulțime de memorie, acest lucru poate avea un impact de fapt, performanța 462 00:20:50,470 --> 00:20:52,220 și experiența utilizatorului pe calculator. 463 00:20:52,220 --> 00:20:56,090 Deci asta e un fel de soluție leneș, sigur, și invers, 464 00:20:56,090 --> 00:21:00,140 nu e numai risipă, care-i problema rămâne, chiar dacă am face tampon meu 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Da? 467 00:21:02,600 --> 00:21:04,475 >> Audiența: Șirul este de lungime 1001. 468 00:21:04,475 --> 00:21:05,350 DAVID MALAN: Exact. 469 00:21:05,350 --> 00:21:08,280 În cazul în care șirul este de lungime 1001, aveți aceeași problemă exact, 470 00:21:08,280 --> 00:21:10,705 și prin argumentul meu, aș face- doar atunci face 2000, 471 00:21:10,705 --> 00:21:12,830 dar nu știți în avans cât de mare ar trebui să fie, 472 00:21:12,830 --> 00:21:16,890 și totuși, eu nu trebuie să compilați programul meu înainte de a lăsa oamenii folosesc și descărcare 473 00:21:16,890 --> 00:21:17,390 aceasta. 474 00:21:17,390 --> 00:21:21,490 Astfel încât acesta este exact tipul de chestii care incearca biblioteca CS50 475 00:21:21,490 --> 00:21:24,750 pentru a ne ajuta cu si vom numai ochire la unele dintre această implementare a 476 00:21:24,750 --> 00:21:29,790 aici, dar acest lucru este CS50 punct C. Acest este fișierul care a fost pe CS50 IDE 477 00:21:29,790 --> 00:21:31,420 toate aceste săptămâni care ați fost utilizați. 478 00:21:31,420 --> 00:21:34,280 Este pre-compilate și ai a fost folosind-o în mod automat 479 00:21:34,280 --> 00:21:38,780 prin natura de a avea buzna pavilion CS50 L cu zăngănit, 480 00:21:38,780 --> 00:21:42,300 dar dacă am defilați în jos prin toate aceste funcții, aici e getString, 481 00:21:42,300 --> 00:21:44,636 și doar pentru a vă oferi o gust de ceea ce se întâmplă, 482 00:21:44,636 --> 00:21:46,760 haideți să aruncăm o privire rapidă la de complexitatea relativă. 483 00:21:46,760 --> 00:21:48,870 Nu e un super lung funcție, dar nu am 484 00:21:48,870 --> 00:21:52,530 trebuie să se gândească tot greu despre cum de a merge despre obtinerea siruri de caractere. 485 00:21:52,530 --> 00:21:55,660 >> Deci, aici e tampon mea și eu se pare că inițializa la null. 486 00:21:55,660 --> 00:21:57,990 Aceasta, desigur, este același lucru ca stea char, 487 00:21:57,990 --> 00:22:00,585 dar am decis în punerea în aplicare a bibliotecii CS50 488 00:22:00,585 --> 00:22:02,460 că, dacă vom fi complet dinamic, 489 00:22:02,460 --> 00:22:05,770 Nu știu în avans cât de mare de o Utilizatorii șir de gând să doriți să obțineți. 490 00:22:05,770 --> 00:22:08,140 Deci, am de gând să încep cu doar un șir gol 491 00:22:08,140 --> 00:22:11,507 și am de gând să construiască cât mai mult Memoria ca am nevoie pentru a se potrivi șir de utilizator 492 00:22:11,507 --> 00:22:13,340 și dacă nu am suficient, am de gând să întreb 493 00:22:13,340 --> 00:22:15,010 sistemul de operare pentru mai multă memorie. 494 00:22:15,010 --> 00:22:17,510 Am de gând să se mute șir lor într-o bucată mai mare de memorie 495 00:22:17,510 --> 00:22:21,847 și am de gând să elibereze sau elibera bucată mare de memorie insuficient 496 00:22:21,847 --> 00:22:23,680 si noi suntem doar de gând a face acest lucru iterativ. 497 00:22:23,680 --> 00:22:25,570 >> Deci, o privire rapidă, aici e doar o variabilă 498 00:22:25,570 --> 00:22:28,780 cu care am de gând să țină evidența din capacitatea de tampon mea. 499 00:22:28,780 --> 00:22:30,071 Câte bytes pot potrivi? 500 00:22:30,071 --> 00:22:32,070 Iată o variabilă cu n pe care am de gând să păstreze 501 00:22:32,070 --> 00:22:36,200 evidența cât de multe bytes sunt de fapt în tamponul sau care utilizatorul a tastat. 502 00:22:36,200 --> 00:22:39,900 Dacă nu ați văzut acest lucru înainte, tu poate specifica faptul că o variabilă ca un int 503 00:22:39,900 --> 00:22:46,370 este nesemnat, care, așa cum sugerează și numele, înseamnă că este non-negativ, și de ce ar fi 504 00:22:46,370 --> 00:22:50,590 Am dori vreodată să deranjez, specificând că un întreg nu este doar un int, 505 00:22:50,590 --> 00:22:52,540 dar este un int nesemnate? 506 00:22:52,540 --> 00:22:55,064 Este un int non-negativ. 507 00:22:55,064 --> 00:22:56,355 Ce înseamnă [neauzit] înseamnă? 508 00:22:56,355 --> 00:22:58,910 >> Audiența: E descrie o cantitate de memorie care poate fi [neauzit]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID MALAN: Da. 510 00:22:59,660 --> 00:23:03,710 Deci, dacă spun nesemnate, aceasta este de fapt oferindu-vă un pic de memorie suplimentară 511 00:23:03,710 --> 00:23:07,440 și se pare un fel de prostie, dar dacă au un pic de memorie suplimentară, care 512 00:23:07,440 --> 00:23:09,940 înseamnă că aveți două ori mai multe valorile pe care le pot reprezenta, 513 00:23:09,940 --> 00:23:11,570 deoarece poate fi un 0 sau un 1. 514 00:23:11,570 --> 00:23:14,660 Deci în mod implicit, un int poate fi aproximativ negativ 2 miliarde de tot felul 515 00:23:14,660 --> 00:23:16,030 până la 2 miliarde de pozitiv. 516 00:23:16,030 --> 00:23:18,540 Acestea sunt domenii de mari, dar este încă un fel de risipitor 517 00:23:18,540 --> 00:23:21,280 dacă îți pasă doar despre dimensiuni, care tocmai intuitiv 518 00:23:21,280 --> 00:23:24,620 ar trebui să fie non-negativ sau pozitiv sau 0, Ei bine, atunci, 519 00:23:24,620 --> 00:23:28,884 de ce pierdem 2000000000 Valorile posibile pentru numere negative 520 00:23:28,884 --> 00:23:30,300 dacă nu sunteți niciodată de gând să le folosească? 521 00:23:30,300 --> 00:23:35,350 Deci, spunând nesemnate, acum Int mei pot fie între 0 și aproximativ 4 miliarde. 522 00:23:35,350 --> 00:23:39,280 >> Deci, aici e doar un int C, din motive nu vom intra în chiar acum ca 523 00:23:39,280 --> 00:23:42,280 de ce este un int loc de un char, dar aici este 524 00:23:42,280 --> 00:23:44,630 esența a ceea ce se întâmplă pe, și unii dintre voi 525 00:23:44,630 --> 00:23:48,340 Este posibil să utilizați, de exemplu, Funcția fgetc chiar și în patru PSET 526 00:23:48,340 --> 00:23:51,580 sau după aceea, vom vedea din nou în problemă set de cinci, 527 00:23:51,580 --> 00:23:55,410 fgetc este frumos pentru că și numele un fel de, sugerează un fel de arcanely, 528 00:23:55,410 --> 00:23:57,940 este o funcție care devine un personaj și așa, 529 00:23:57,940 --> 00:24:00,690 ceea ce este fundamental diferit despre ceea ce facem în getString 530 00:24:00,690 --> 00:24:03,110 este că nu utilizați scanf în același mod. 531 00:24:03,110 --> 00:24:07,550 Suntem doar insinuează de-a lungul pas cu pas peste tot ce utilizatorul a tastat în, 532 00:24:07,550 --> 00:24:10,970 pentru că putem aloca întotdeauna unul char, și astfel încât să putem întotdeauna în condiții de siguranță 533 00:24:10,970 --> 00:24:15,599 uita-te la un char la un moment dat, și magia începe să se întâmple aici. 534 00:24:15,599 --> 00:24:17,890 Am de gând pentru a defila în jos pentru a mijlocul acestei funcții 535 00:24:17,890 --> 00:24:20,360 doar pentru a introduce pe scurt această funcție. 536 00:24:20,360 --> 00:24:22,670 La fel ca exista o Funcția malloc, nu e 537 00:24:22,670 --> 00:24:27,740 o funcție în cazul în care realloc realloc vă permite să realoce o bucată de memorie 538 00:24:27,740 --> 00:24:29,570 și să-l mare sau mai mic. 539 00:24:29,570 --> 00:24:33,060 Povestea atât de mult timp scurt și cu un val de mâna mea pentru ziua de azi, 540 00:24:33,060 --> 00:24:35,620 Știu că ceea ce getString este de a face este un fel 541 00:24:35,620 --> 00:24:39,720 de magic în creștere sau scădere tamponul ca utilizatorul 542 00:24:39,720 --> 00:24:41,440 tipurile din șir sale. 543 00:24:41,440 --> 00:24:43,962 >> Deci, în cazul în care tipurile de utilizator un string scurt, acest cod 544 00:24:43,962 --> 00:24:45,920 numai alocă suficient memorie pentru a se potrivi șir. 545 00:24:45,920 --> 00:24:48,086 Dacă utilizatorul continuă să dactilografiere așa cum am făcut-o din nou și din nou 546 00:24:48,086 --> 00:24:50,330 și din nou, bine, în cazul în care lui tampon inițial atât de mare 547 00:24:50,330 --> 00:24:53,310 și programul realizează, la Stai puțin, eu sunt din spațiu, 548 00:24:53,310 --> 00:24:55,410 se va dubla dimensiunea buffer- 549 00:24:55,410 --> 00:24:59,110 și apoi dublați dimensiunea memoriei tampon și codul care face dublarea, 550 00:24:59,110 --> 00:25:03,170 dacă ne uităm la ea aici, e doar acest inteligent one-liner. 551 00:25:03,170 --> 00:25:06,830 S-ar putea să nu fi văzut această sintaxă înainte, dar dacă spui stele este egal, 552 00:25:06,830 --> 00:25:10,470 acest lucru este același lucru ca și spune ori de capacitate 2. 553 00:25:10,470 --> 00:25:13,390 Deci, doar ține dublarea capacitatea tamponului 554 00:25:13,390 --> 00:25:17,480 și apoi spune realloc pentru a da se că mult mai multă memorie. 555 00:25:17,480 --> 00:25:19,720 >> Acum, ca o paranteză, acolo sunt alte funcții de aici 556 00:25:19,720 --> 00:25:23,680 că nu vom uita în detaliu altele decât pentru a arăta în getint, 557 00:25:23,680 --> 00:25:26,150 vom folosi getString în getint. 558 00:25:26,150 --> 00:25:28,192 Noi verificam ca nu este nul, care, amintesc, 559 00:25:28,192 --> 00:25:30,400 este valoarea specială pe care înseamnă ceva a mers prost. 560 00:25:30,400 --> 00:25:31,233 Suntem din memorie. 561 00:25:31,233 --> 00:25:32,310 Mai bine verifica acest lucru. 562 00:25:32,310 --> 00:25:33,710 Și ne întoarcem o valoare santinelă. 563 00:25:33,710 --> 00:25:37,850 Dar voi amâna la comentariile cu privire la de ce și apoi vom folosi acest văr de scanf 564 00:25:37,850 --> 00:25:42,100 numit sscanf și se pare că că scanf sscanf, sau șir, 565 00:25:42,100 --> 00:25:45,310 vă permite să aruncăm o privire la linia care utilizatorul a tastat și l-ai lăsat 566 00:25:45,310 --> 00:25:49,610 analizeze, în esență, și ceea ce sunt aici este că spun sscanf, 567 00:25:49,610 --> 00:25:54,440 analiza indiferent utilizatorul are tastat și asigurați-vă că% i, 568 00:25:54,440 --> 00:25:59,250 există un întreg în ea, și nu vom intra in ziua de azi exact de ce există, de asemenea 569 00:25:59,250 --> 00:26:03,760 % o C aici, dar că, în scurt permite ne pentru a detecta dacă utilizatorul a introdus 570 00:26:03,760 --> 00:26:06,050 în ceva fals, după numărul. 571 00:26:06,050 --> 00:26:11,766 Deci, motivul pentru care getint și getString vă spun să încercați din nou, încercați din nou, încercați din nou 572 00:26:11,766 --> 00:26:13,640 este cauza tuturor acest cod am scris, 573 00:26:13,640 --> 00:26:17,900 e un fel de a privi la intrarea utilizatorului în a face sigur că e în întregime numeric 574 00:26:17,900 --> 00:26:21,700 sau este un plutitoare real Valoarea punct sau altele asemenea, 575 00:26:21,700 --> 00:26:24,233 în funcție de ceea ce valoare funcționează pe care îl utilizați. 576 00:26:24,233 --> 00:26:25,060 >> Whew. 577 00:26:25,060 --> 00:26:25,710 BINE. 578 00:26:25,710 --> 00:26:27,592 Asta a fost o gura dar punctul de aici este 579 00:26:27,592 --> 00:26:29,550 că motivul pentru care am avut aceste roți de formare privind 580 00:26:29,550 --> 00:26:32,880 se datorează faptului că la cel mai scăzut nivel, există doar atât de multe lucruri pe care 581 00:26:32,880 --> 00:26:35,674 pot merge prost pe care ne-am dorit să se ocupe de preemptively 582 00:26:35,674 --> 00:26:38,090 aceste lucruri cu siguranță în primele săptămâni de la clasa, 583 00:26:38,090 --> 00:26:42,230 dar acum cu PSET patru și cinci și PSET dincolo va veți vedea că e mult până 584 00:26:42,230 --> 00:26:45,570 te dar, de asemenea esti mai capabil de rezolvarea acestor tipuri de probleme 585 00:26:45,570 --> 00:26:47,180 te. 586 00:26:47,180 --> 00:26:51,770 Orice întrebări cu privire la getString sau getint? 587 00:26:51,770 --> 00:26:52,630 Da? 588 00:26:52,630 --> 00:26:55,130 >> Audiența: De ce ai dubla capacitatea tamponului 589 00:26:55,130 --> 00:26:57,630 mai degrabă decât doar în creștere prin suma exactă? 590 00:26:57,630 --> 00:26:58,100 >> DAVID MALAN: Bună întrebare. 591 00:26:58,100 --> 00:27:00,474 De ce ne-ar dubla capacitatea de din tamponul spre deosebire 592 00:27:00,474 --> 00:27:02,800 la doar o creștere de o anumită valoare constantă? 593 00:27:02,800 --> 00:27:03,900 A fost o decizie de design. 594 00:27:03,900 --> 00:27:08,590 Tocmai am decis că, deoarece tinde să fi un pic mai scump timp înțelept pentru a cere 595 00:27:08,590 --> 00:27:10,440 sistemul de operare pentru memorie, nu am 596 00:27:10,440 --> 00:27:13,210 vrei să ajungi intra in o situație pentru siruri de caractere mari 597 00:27:13,210 --> 00:27:14,960 că am fost cere sistemul de operare nou și din nou 598 00:27:14,960 --> 00:27:17,500 și din nou și din nou în succesiune rapidă pentru memorie. 599 00:27:17,500 --> 00:27:20,387 Deci, ne-am decis, oarecum arbitrar dar sperăm rezonabil, 600 00:27:20,387 --> 00:27:22,720 că, știi ce, hai să să încercați să obțineți înainte de noi înșine 601 00:27:22,720 --> 00:27:25,520 și chiar a păstra dublarea în așa fel încât am minimizarea cantității de ori 602 00:27:25,520 --> 00:27:29,010 avem de a apela sau malloc realloc, dar o judecată totală 603 00:27:29,010 --> 00:27:31,820 apel în lipsa de cunoaștere ceea ce utilizatorii ar putea dori să tastați în. 604 00:27:31,820 --> 00:27:33,600 Ambele moduri ar putea fi discutabil. 605 00:27:33,600 --> 00:27:35,430 Se poate argumenta că bine. 606 00:27:35,430 --> 00:27:39,240 >> Deci, haideți să aruncăm o privire la un cuplu de alte efecte secundare de memorie, 607 00:27:39,240 --> 00:27:41,610 lucruri care pot merge prost și instrumente pe care le puteți 608 00:27:41,610 --> 00:27:43,880 utiliza pentru a prinde aceste tipuri de greșeli. 609 00:27:43,880 --> 00:27:47,800 Se pare că voi toți, chiar dacă check50 nu ți-a spus la fel de mult, 610 00:27:47,800 --> 00:27:50,050 au scris buggy Codul de la o saptamana, 611 00:27:50,050 --> 00:27:53,630 chiar dacă toate testele sunt check50 trecut, și chiar dacă și TF dvs. 612 00:27:53,630 --> 00:27:56,010 sunt super încrezători că codul funcționează ca destinate. 613 00:27:56,010 --> 00:27:59,190 Codul dvs. a fost buggy sau viciată în care voi toți, 614 00:27:59,190 --> 00:28:02,540 în utilizarea bibliotecii CS50, au fost scurgeri de memorie. 615 00:28:02,540 --> 00:28:06,040 Ai cerut sistemul de operare pentru memorie în majoritatea programelor 616 00:28:06,040 --> 00:28:08,850 ai scris, dar ai nu dat de fapt înapoi. 617 00:28:08,850 --> 00:28:12,110 Ai sunat getString și getint și GetFloat, 618 00:28:12,110 --> 00:28:15,270 dar cu getString, ai nu numit unGetString sau Dă 619 00:28:15,270 --> 00:28:19,890 String Înapoi sau altele asemenea, dar am vazut că getString nu aloca memorie 620 00:28:19,890 --> 00:28:22,810 prin intermediul malloc sau această Funcția realloc, care este doar 621 00:28:22,810 --> 00:28:25,670 foarte similare în spirit, și totuși, am fost 622 00:28:25,670 --> 00:28:28,629 cere sistemul de operare pentru de memorie și memoria nou și din nou 623 00:28:28,629 --> 00:28:29,670 dar nu-l da înapoi. 624 00:28:29,670 --> 00:28:33,550 >> Acum, ca o parte, se pare că atunci când un program se închide, toate de memorie 625 00:28:33,550 --> 00:28:34,870 este eliberat în mod automat. 626 00:28:34,870 --> 00:28:36,150 Deci nu a fost o afacere uriașă. 627 00:28:36,150 --> 00:28:38,590 Nu va pentru a rupe IDE sau lucruri încetini, 628 00:28:38,590 --> 00:28:40,670 dar atunci când programele face scurgeri de memorie, în general, 629 00:28:40,670 --> 00:28:42,170 și ei de funcționare pentru o lungă perioadă de timp. 630 00:28:42,170 --> 00:28:45,640 Dacă ați văzut vreodată puținul prost minge de plajă în Mac OS sau clepsidra 631 00:28:45,640 --> 00:28:51,160 pe Windows în cazul în care este un fel de încetinirea sau de gândire sau de gândire 632 00:28:51,160 --> 00:28:53,770 sau pur și simplu într-adevăr începe pentru a încetini la un crawl, 633 00:28:53,770 --> 00:28:56,960 este foarte posibil ar putea fi rezultatul unei scurgeri de memorie. 634 00:28:56,960 --> 00:28:59,970 Programatorii care au scris software-ul pe care îl utilizați 635 00:28:59,970 --> 00:29:03,570 cere sistemul de operare pentru memorie la fiecare câteva minute, în fiecare oră. 636 00:29:03,570 --> 00:29:05,570 Dar, dacă rulați software-ul, chiar dacă este 637 00:29:05,570 --> 00:29:08,680 minimizat în calculatorul dumneavoastră timp de ore sau zile în șir, 638 00:29:08,680 --> 00:29:11,980 s-ar putea să ceri mai mult și mai mult memorie și niciodată de fapt, folosind-o 639 00:29:11,980 --> 00:29:15,180 și așa mai departe codul ar putea fi, sau programe pot fi scurgeri de memorie, 640 00:29:15,180 --> 00:29:18,350 și dacă începeți să scurgeri de memorie, există mai puțină memorie pentru alte programe, 641 00:29:18,350 --> 00:29:21,220 iar efectul este de a încetini totul. 642 00:29:21,220 --> 00:29:23,600 >> Acum, acest lucru este de departe una dintre programele cele mai atroce 643 00:29:23,600 --> 00:29:26,350 veți avea oportunități pentru a rula în măsura CS50 644 00:29:26,350 --> 00:29:31,650 ca producția sa este chiar mai mult de ezoterice lui zăngăni sau face sau orice a comenzii 645 00:29:31,650 --> 00:29:35,930 programe de linie am rula înainte, dar Din fericire, încorporate în producția 646 00:29:35,930 --> 00:29:39,810 este câteva sfaturi foarte utile care va fi util fie pentru PSET patru 647 00:29:39,810 --> 00:29:41,510 sau cu siguranță PSET cinci. 648 00:29:41,510 --> 00:29:44,250 Deci, Valgrind este un instrument care poate fi folosită pentru a căuta 649 00:29:44,250 --> 00:29:46,930 pentru pierderi de memorie din programul dumneavoastră. 650 00:29:46,930 --> 00:29:48,570 Este relativ simplu pentru a rula. 651 00:29:48,570 --> 00:29:51,420 Tu a alerga Valgrind și apoi, chiar deși este un pic verbose, 652 00:29:51,420 --> 00:29:54,440 liniuță de verificare a scurgerilor liniuță este egal completă, și apoi dot 653 00:29:54,440 --> 00:29:56,320 slash și numele programului dumneavoastră. 654 00:29:56,320 --> 00:30:00,010 Deci, Valgrind va rula apoi programul și la sfârșitul programului dumneavoastră 655 00:30:00,010 --> 00:30:02,240 rulează înainte de a închide și vă oferă o altă promptă, 656 00:30:02,240 --> 00:30:04,980 se va analiza dvs. Programul în timp ce a fost difuzate 657 00:30:04,980 --> 00:30:07,740 și să vă spun ai scurgeri orice memorie și mai bine, 658 00:30:07,740 --> 00:30:10,610 ai atinge de memorie care nu vă aparține? 659 00:30:10,610 --> 00:30:13,700 Ea nu poate prinde totul, dar e destul de bun la prinderea cele mai multe lucruri. 660 00:30:13,700 --> 00:30:19,700 >> Deci, aici e un exemplu de a avea alerga meu acest program, având alerga Valgrind, 661 00:30:19,700 --> 00:30:21,470 pe un program numit memorie, și am de gând 662 00:30:21,470 --> 00:30:24,730 pentru a evidenția liniile de care sunt în cele din urmă de interes pentru noi. 663 00:30:24,730 --> 00:30:27,690 Deci nu e chiar mai mult de distragere care le-am șters din diapozitiv. 664 00:30:27,690 --> 00:30:30,930 Dar hai să vedem ce aceasta Programul este capabil de a ne spune. 665 00:30:30,930 --> 00:30:34,800 Este capabil de a spune lucruri noi ca scrie invalid de dimensiuni 4. 666 00:30:34,800 --> 00:30:38,020 Cu alte cuvinte, dacă atingeți de memorie, în special 4 bytes de memorie 667 00:30:38,020 --> 00:30:40,350 că nu ar trebui să aibă, Valgrind vă pot spune că. 668 00:30:40,350 --> 00:30:41,660 Scrie invalid de dimensiuni 4. 669 00:30:41,660 --> 00:30:43,640 Ai atins patru bytes că nu ar trebui să aibă. 670 00:30:43,640 --> 00:30:44,840 În cazul în care ai făcut asta? 671 00:30:44,840 --> 00:30:45,900 Aceasta este frumusetea. 672 00:30:45,900 --> 00:30:50,000 Dot memorie C linie 21 este în cazul în care greșit și de aceea este util. 673 00:30:50,000 --> 00:30:53,410 La fel ca GDB, acesta poate ajuta vă punctul de la eroarea actuale. 674 00:30:53,410 --> 00:30:57,170 >> Acum, asta e un pic mai mult verbose, dacă nu confuze. 675 00:30:57,170 --> 00:31:01,307 40 bytes in 1 blocuri sunt cu siguranta pierdut în evidență pierderea 1 din 1. 676 00:31:01,307 --> 00:31:02,140 Ce înseamnă asta? 677 00:31:02,140 --> 00:31:05,920 Ei bine, aceasta înseamnă doar ai cerut 40 bytes și niciodată nu a dat înapoi. 678 00:31:05,920 --> 00:31:08,930 Ai sunat malloc sau te-a chemat GetString și sistemul de operare 679 00:31:08,930 --> 00:31:12,450 ai 40 de bytes, dar ți-a dat niciodată eliberat sau eliberat că memoria, 680 00:31:12,450 --> 00:31:15,400 și pentru a fi corect, am niciodată arăta cum să dea înapoi de memorie. 681 00:31:15,400 --> 00:31:17,910 Se pare că există un super Funcția simplu numit gratuit. 682 00:31:17,910 --> 00:31:21,170 Ia un argument, lucru pe care doriți să elibereze sau să dea înapoi, 683 00:31:21,170 --> 00:31:23,430 dar 40 de bytes, se pare, în acest program 684 00:31:23,430 --> 00:31:27,300 au fost pierdute la linia 20 de memorie dot c. 685 00:31:27,300 --> 00:31:28,650 >> Deci, să vedem acest program. 686 00:31:28,650 --> 00:31:31,020 E foarte inutil. 687 00:31:31,020 --> 00:31:33,980 Demonstrează doar această eroare special. 688 00:31:33,980 --> 00:31:34,920 Deci, haideți să aruncăm o privire. 689 00:31:34,920 --> 00:31:39,920 Iată principalele și principalele, anunț, apeluri o funcție numită întoarce F și apoi. 690 00:31:39,920 --> 00:31:41,550 Deci, nu tot ceea ce interesant. 691 00:31:41,550 --> 00:31:42,664 Ce face f? 692 00:31:42,664 --> 00:31:44,330 Observați nu am deranjez cu un prototip. 693 00:31:44,330 --> 00:31:46,520 Am vrut să păstreze codul pe cât posibil minim. 694 00:31:46,520 --> 00:31:49,530 Așa că am pus f de mai sus principal și asta e bine, cu siguranță, 695 00:31:49,530 --> 00:31:51,500 pentru programe scurte, cum ar fi acest lucru. 696 00:31:51,500 --> 00:31:56,910 Deci, f nu se întoarce nimic și nu nu ia nimic, dar nu face acest lucru. 697 00:31:56,910 --> 00:31:59,620 Declară, la fel ca în exemplul Binky, 698 00:31:59,620 --> 00:32:02,682 un pointer numit X, care se întâmplă pentru a stoca adresa de int. 699 00:32:02,682 --> 00:32:03,890 Deci asta e partea stângă. 700 00:32:03,890 --> 00:32:07,230 În limba engleză, ceea ce este partea dreaptă faci? 701 00:32:07,230 --> 00:32:09,770 Oricine? 702 00:32:09,770 --> 00:32:13,665 Ce este aceasta face pentru noi? 703 00:32:13,665 --> 00:32:14,651 Da? 704 00:32:14,651 --> 00:32:16,623 >> Audiența: [inaudibil] ori mai mare decât un int 705 00:32:16,623 --> 00:32:19,175 care este de 10 ori mai mare decât [Inaudibil] 706 00:32:19,175 --> 00:32:20,800 DAVID MALAN: Bine și lasă-mă să rezuma. 707 00:32:20,800 --> 00:32:25,480 Deci, aloca suficient spatiu pentru 10 numere întregi sau 10, ceea ce este de dimensiunea unei Int, 708 00:32:25,480 --> 00:32:29,340 e patru octeți, astfel încât de 10 ori 4 este 40, astfel încât partea dreaptă care le-am 709 00:32:29,340 --> 00:32:33,930 evidențiată este da-mi 40 de bytes și stoca adresa primului octet 710 00:32:33,930 --> 00:32:34,940 în x. 711 00:32:34,940 --> 00:32:38,380 Și acum, în sfârșit, și în cazul în care aici este acest program este buggy, ceea ce este 712 00:32:38,380 --> 00:32:41,540 în neregulă cu linie 21 bazat pe logica asta? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Ce e în neregulă cu linia 21? 715 00:32:46,280 --> 00:32:46,780 Da? 716 00:32:46,780 --> 00:32:49,550 Audiența: Nu poți index în X [neauzit]. 717 00:32:49,550 --> 00:32:50,300 DAVID MALAN: Da. 718 00:32:50,300 --> 00:32:52,270 Nu ar trebui să indice în x de genul asta. 719 00:32:52,270 --> 00:32:53,850 Deci sintactic, e OK. 720 00:32:53,850 --> 00:32:56,990 Ce e frumos este, la fel ca tine poate trata numele unui tablou 721 00:32:56,990 --> 00:33:01,080 ca și cum este un pointer, în mod similar poate trata un indicator ca și cum e 722 00:33:01,080 --> 00:33:06,425 o matrice, și așa am putea sintactic spune X Suport ceva, x suport I, 723 00:33:06,425 --> 00:33:07,800 dar 10 este problematic. 724 00:33:07,800 --> 00:33:09,096 Ce? 725 00:33:09,096 --> 00:33:10,910 >> Audiența: Pentru că nu e înăuntru. 726 00:33:10,910 --> 00:33:12,390 >> DAVID MALAN: Nu este în interiorul că bucată de memorie. 727 00:33:12,390 --> 00:33:15,306 Care este cea mai mare valoare ar trebui să fi punerea în aceste paranteze drepte? 728 00:33:15,306 --> 00:33:16,870 9, 0 la 9. 729 00:33:16,870 --> 00:33:18,160 Din cauza indexare zero. 730 00:33:18,160 --> 00:33:20,190 Deci, la 0 la 9 ar fi bine. 731 00:33:20,190 --> 00:33:23,960 Bracket 10 nu este bun și dar, deși amintesc, de fiecare dată 732 00:33:23,960 --> 00:33:27,017 Se pare că încerca să facă CS50 IDE accident prin tastarea în valori false, 733 00:33:27,017 --> 00:33:29,100 aceasta nu cooperează întotdeauna, și într-adevăr, de multe ori 734 00:33:29,100 --> 00:33:31,460 noroc doar pentru că Sistemul de operare nu 735 00:33:31,460 --> 00:33:35,467 observați că ați vreodată atât de ușor trece unele bucată de memorie, 736 00:33:35,467 --> 00:33:38,300 pentru că ai rămas în vedere tehnic segment, dar mai mult pe faptul că 737 00:33:38,300 --> 00:33:40,940 într-o clasă sisteme de operare, și așa ceva de genul asta 738 00:33:40,940 --> 00:33:43,000 ar putea merge foarte usor nedetectate. 739 00:33:43,000 --> 00:33:48,120 Programul tău nu se va prăbuși în mod constant, dar poate din cand in cand. 740 00:33:48,120 --> 00:33:50,610 >> Și astfel să încercăm Valgrind în acest sens, și aici e 741 00:33:50,610 --> 00:33:52,870 în cazul în care vom avea copleșit de ieșire momentan. 742 00:33:52,870 --> 00:34:00,810 Deci, asigurați-memorie de verificare a scurgerilor Valgrind este egal cu complet de memorie punct slash. 743 00:34:00,810 --> 00:34:03,040 Si iata de ce promit acest lucru ar copleși. 744 00:34:03,040 --> 00:34:05,700 Iată ce Valgrind, aici e ceea ce un programator, câțiva ani ago- 745 00:34:05,700 --> 00:34:08,469 decis că ar fi o idee bună pentru producția sa arate ca. 746 00:34:08,469 --> 00:34:09,750 Așa că haideți să facem sens de acest lucru. 747 00:34:09,750 --> 00:34:13,120 Deci tot drumul pe-o parte stânga parte pentru nici un motiv bun 748 00:34:13,120 --> 00:34:16,620 este ID-ul de proces a programului ne-am rula, identificatorul unic 749 00:34:16,620 --> 00:34:18,030 pentru programul tocmai am fugit. 750 00:34:18,030 --> 00:34:19,738 Am eliminat de la care slide, dar nu 751 00:34:19,738 --> 00:34:22,190 este unele informații utile aici. 752 00:34:22,190 --> 00:34:24,684 >> Să derulați până la foarte de sus. 753 00:34:24,684 --> 00:34:25,600 Iată unde am început. 754 00:34:25,600 --> 00:34:27,040 Deci, nu e tot atât de mult de ieșire. 755 00:34:27,040 --> 00:34:30,429 Iată că a scrie invalid de mărime 4 pe linia 21. 756 00:34:30,429 --> 00:34:31,760 Ei bine, ceea ce a fost linia 21? 757 00:34:31,760 --> 00:34:34,500 Line 21 a fost exact acest lucru și este logic 758 00:34:34,500 --> 00:34:37,290 că eu sunt în mod valabil scris 4 bytes pentru că eu sunt 759 00:34:37,290 --> 00:34:40,389 încercarea de a pune acest întreg, care ar putea fi orice, 760 00:34:40,389 --> 00:34:42,370 se întâmplă să fie zero, dar am încercat 761 00:34:42,370 --> 00:34:44,940 să-l pună într-o locație care nu-mi aparține. 762 00:34:44,940 --> 00:34:50,900 Mai mult, în jos de aici, 40 de bytes într-o blocuri sunt cu siguranta pierdut în înregistrare 1. 763 00:34:50,900 --> 00:34:56,500 Asta pentru că, atunci când am apel malloc aici, n-am elibera de fapt memoria. 764 00:34:56,500 --> 00:34:58,140 >> Deci, cum putem rezolva această problemă? 765 00:34:58,140 --> 00:35:02,970 Lasă-mă să merg mai departe și să fie un pic mai sigur și de a face 9 acolo și să-mi aici gratuit x. 766 00:35:02,970 --> 00:35:04,820 Aceasta este noua funcție de ziua de azi. 767 00:35:04,820 --> 00:35:11,520 Dacă acum rulați face dot memorie slash, să ruleze Valgrind pe el din nou, 768 00:35:11,520 --> 00:35:14,990 maximiza fereastra mea și a lovi Enter. 769 00:35:14,990 --> 00:35:16,900 Acum, e bine. 770 00:35:16,900 --> 00:35:19,590 Ei îngropa vestea bună în toate această ieșire. 771 00:35:19,590 --> 00:35:20,810 Toate blocurile heap au fost libere. 772 00:35:20,810 --> 00:35:23,604 Ne vom întoarce la ceea ce heap este, dar există scurgeri sunt posibile. 773 00:35:23,604 --> 00:35:25,520 Deci, aceasta este doar un alt instrument pentru kit instrument 774 00:35:25,520 --> 00:35:30,220 cu care puteți începe să găsi acum erori de genul asta. 775 00:35:30,220 --> 00:35:34,532 >> Dar să vedem ce mai pot merge prost aici. 776 00:35:34,532 --> 00:35:38,890 Să tranziție acum la rezolvarea de fapt o problemă. 777 00:35:38,890 --> 00:35:42,440 Ca o paranteza, daca acest lucru va scuti o pic de confuzie sau tensiune, 778 00:35:42,440 --> 00:35:43,430 acest lucru este acum amuzant. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Da. 781 00:35:46,900 --> 00:35:49,040 Asta e destul de bun. 782 00:35:49,040 --> 00:35:50,890 Deoarece indicii sunt adresele și adresele 783 00:35:50,890 --> 00:35:53,098 sunt, în general, prin convenție scris cu hexazecimal. 784 00:35:53,098 --> 00:35:54,650 Ha, ha,, e amuzant acum. 785 00:35:54,650 --> 00:35:58,390 Oricum, Să acum rezolva de fapt o problemă. 786 00:35:58,390 --> 00:36:00,840 Acest lucru a fost super, super-nivel scăzut până acum, 787 00:36:00,840 --> 00:36:03,950 si putem face de fapt utile lucruri cu aceste detalii de nivel scăzut. 788 00:36:03,950 --> 00:36:06,710 >> Deci, am introdus câteva săptămâni acum noțiunea de matrice. 789 00:36:06,710 --> 00:36:09,177 O serie a fost frumos pentru că este greu pentru a curăța codul nostru 790 00:36:09,177 --> 00:36:11,760 pentru că dacă am vrut să scrie o program cu multiple studenți 791 00:36:11,760 --> 00:36:15,270 sau mai multe nume și case și cămine și colegii și toate astea, 792 00:36:15,270 --> 00:36:19,430 am putea stoca tot mai curat în interiorul unei matrice. 793 00:36:19,430 --> 00:36:23,039 Dar propune un dezavantaj de o serie de până acum. 794 00:36:23,039 --> 00:36:26,080 Chiar dacă nu ați suferit-te într-un program, doar instinctiv, 795 00:36:26,080 --> 00:36:30,870 ceea ce este un lucru rău despre un tablou, poate? 796 00:36:30,870 --> 00:36:32,337 Am auzit niște murmure. 797 00:36:32,337 --> 00:36:34,170 Audiența: Este dificil pentru a modifica dimensiunea. 798 00:36:34,170 --> 00:36:36,128 DAVID MALAN: Este dificil pentru a modifica dimensiunea. 799 00:36:36,128 --> 00:36:38,660 Nu puteți modifica dimensiunea al unui tablou, în fapt, în sine 800 00:36:38,660 --> 00:36:43,040 în C. Puteți aloca o altă matrice, muta totul, de la cel vechi 801 00:36:43,040 --> 00:36:45,380 în noi, și acum au unele spațiu suplimentar, 802 00:36:45,380 --> 00:36:47,469 dar nu e ca o limbă ca Java sau Python 803 00:36:47,469 --> 00:36:49,760 sau orice număr de alte limbi cu care unii dintre voi 804 00:36:49,760 --> 00:36:52,070 s-ar putea să fie familiarizat în cazul în care pot păstra doar adăugarea lucruri 805 00:36:52,070 --> 00:36:53,930 ad nauseam la sfârșitul unei matrice. 806 00:36:53,930 --> 00:36:57,880 Când aveți o serie de Dimensiunea 6, care este dimensiunea sa, 807 00:36:57,880 --> 00:37:01,970 și atât de mult ca ideea mai devreme având un tampon de o anumită dimensiune, 808 00:37:01,970 --> 00:37:05,940 va trebui să ghicească din poarta ce dimensiune vrei să fie? 809 00:37:05,940 --> 00:37:07,880 Dacă ați ghicit prea mare, îți pierzi spațiu. 810 00:37:07,880 --> 00:37:10,950 Dacă ați ghicit prea mici, nu se poate stoca aceste date, cel puțin 811 00:37:10,950 --> 00:37:12,940 fără o mult mai mult de lucru. 812 00:37:12,940 --> 00:37:18,180 >> Așa că astăzi, datorită indicii, putem începe împletit împreună propriul nostru personalizat 813 00:37:18,180 --> 00:37:20,989 structuri de date, și în De fapt, aici este ceva 814 00:37:20,989 --> 00:37:23,030 care arată un pic mai mult criptic la prima vedere, 815 00:37:23,030 --> 00:37:26,440 dar acest lucru este ceea ce numim noi o legătură vom listă, iar numele său a rezumă fel 816 00:37:26,440 --> 00:37:26,940 aceasta. 817 00:37:26,940 --> 00:37:29,550 Este o listă de numere, sau în acest caz, o listă de numere, 818 00:37:29,550 --> 00:37:33,480 dar ar putea fi o listă de nimic, dar e legate între ele prin intermediul săgeți, 819 00:37:33,480 --> 00:37:36,380 și să ia doar o presupunere cu ce tehnica 820 00:37:36,380 --> 00:37:38,310 vom fi capabili la cusatura împreună, 821 00:37:38,310 --> 00:37:42,540 un fel de floricele cu un fir, un legat liste dreptunghiuri aici? 822 00:37:42,540 --> 00:37:43,936 Numerele sale? 823 00:37:43,936 --> 00:37:45,560 Care este funcția de bază de limbă? 824 00:37:45,560 --> 00:37:46,350 >> Audiența: Un pointer. 825 00:37:46,350 --> 00:37:47,308 >> DAVID MALAN: Un pointer. 826 00:37:47,308 --> 00:37:51,700 Deci, fiecare dintre aceste săgeți reprezintă aici un pointer sau doar o adresă. 827 00:37:51,700 --> 00:37:54,590 Deci, cu alte cuvinte, dacă vreau pentru a stoca o listă de numere, 828 00:37:54,590 --> 00:37:59,040 Nu pot să-l păstrează dacă vreau capacitatea de a dezvolta și micșora 829 00:37:59,040 --> 00:38:00,990 structura mea de date într-o matrice. 830 00:38:00,990 --> 00:38:03,000 Așa că am nevoie pentru a avea un pic de mai mult rafinament, 831 00:38:03,000 --> 00:38:05,720 dar observați că această Imaginea fel de sugerează 832 00:38:05,720 --> 00:38:08,650 că, dacă tocmai ați luat fire mici conectarea totul împreună, 833 00:38:08,650 --> 00:38:13,100 probabil, nu este așa de greu pentru a face loc între două dintre aceste dreptunghiuri 834 00:38:13,100 --> 00:38:16,750 sau două dintre aceste noduri, așa cum vom începe numindu-le, a pus într-un nou nod, 835 00:38:16,750 --> 00:38:19,547 și apoi cu unele noi fir, doar șanț cele trei noduri împreună, 836 00:38:19,547 --> 00:38:22,880 prima, ultima, și cea pe care tocmai ați introdus în mijloc. 837 00:38:22,880 --> 00:38:26,000 >> Și într-adevăr o listă legată, spre deosebire de o matrice, este dinamic. 838 00:38:26,000 --> 00:38:27,840 Se poate să crească și se poate psihiatru și nu 839 00:38:27,840 --> 00:38:32,434 Trebuie să știi sau de îngrijire în avans cum Date de mult ai de gând să fie stocarea, 840 00:38:32,434 --> 00:38:35,600 dar se pare că trebuie să fie un pic atent cu privire la modul în care să pună în aplicare acest lucru. 841 00:38:35,600 --> 00:38:39,070 Deci, în primul rând să ia în considerare modul în care punem în aplicare unul dintre aceste dreptunghiuri mici. 842 00:38:39,070 --> 00:38:40,690 Este ușor să pună în aplicare un int. 843 00:38:40,690 --> 00:38:44,000 Tu spui doar int n și apoi te 4 octeți pentru un int, 844 00:38:44,000 --> 00:38:49,089 dar cum a face I a lua un int, o numesc n, și apoi un pointer, să o numim viitor. 845 00:38:49,089 --> 00:38:50,880 Am putea numi aceste lucruri orice vrem 846 00:38:50,880 --> 00:38:53,590 dar am nevoie de o structură de date personalizat. 847 00:38:53,590 --> 00:38:54,257 Da? 848 00:38:54,257 --> 00:38:57,020 >> Audiența: Ampersand [neauzit]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID MALAN: Deci ampersand vom folosi pentru a obține adresa unui nod potențial. 850 00:39:00,940 --> 00:39:02,740 Dar avem nevoie de un alt caracteristică de C, în scopul 851 00:39:02,740 --> 00:39:06,700 să-mi dea posibilitatea de a crea acest dreptunghi personalizate, acest obicei 852 00:39:06,700 --> 00:39:08,919 variabilă dacă vreți, în memorie. 853 00:39:08,919 --> 00:39:09,710 Audiența: Un struct. 854 00:39:09,710 --> 00:39:10,626 DAVID MALAN: A struct. 855 00:39:10,626 --> 00:39:14,310 Amintiți de săptămâna trecută, am introdus struct, acest cuvânt cheie relativ simplu 856 00:39:14,310 --> 00:39:16,254 care ne permite să face lucruri de genul asta. 857 00:39:16,254 --> 00:39:18,420 C nu a venit cu o date structura numita elev. 858 00:39:18,420 --> 00:39:22,190 Acesta este dotat cu Int și float și char și astfel, dar aceasta nu vine cu elevul, 859 00:39:22,190 --> 00:39:26,750 dar putem crea un tip de date de student, o structură de student, cu această sintaxă 860 00:39:26,750 --> 00:39:27,250 Aici. 861 00:39:27,250 --> 00:39:28,350 Și veți vedea acest lucru din nou și din nou. 862 00:39:28,350 --> 00:39:30,426 Deci, nu vă faceți griji cu privire la memorarea cuvintele cheie, 863 00:39:30,426 --> 00:39:33,300 dar cuvântul cheie care este important este doar faptul că am spus struct 864 00:39:33,300 --> 00:39:37,590 și apoi l-am sunat de student și în interiorul de student a fost un nume și o casă 865 00:39:37,590 --> 00:39:39,390 sau un cămin sau altele asemenea. 866 00:39:39,390 --> 00:39:41,980 >> Și așa acum astăzi, să propună acest lucru. 867 00:39:41,980 --> 00:39:45,240 Am adăugat câteva cuvinte, dar dacă vreau să pună în aplicare acest dreptunghi care este 868 00:39:45,240 --> 00:39:48,440 Trebuie atât un int și o pointer, știi ce, eu sunt 869 00:39:48,440 --> 00:39:51,540 O să declare o struct numit nod. 870 00:39:51,540 --> 00:39:55,630 Sunt, de asemenea,, în interiorul acestuia, de gând să spun că un nod, acest dreptunghi, are un int 871 00:39:55,630 --> 00:39:59,730 și vom numi n și are un pointer următoare. 872 00:39:59,730 --> 00:40:02,540 Și aceasta este un pic verbose, dar dacă te gândești la asta, 873 00:40:02,540 --> 00:40:07,300 săgețile care erau în imagine un moment în urmă sunt de ce tip de date? 874 00:40:07,300 --> 00:40:12,330 În cazul în care fiecare dintre aceste săgeți este îndreptat la ce tip de structură de date? 875 00:40:12,330 --> 00:40:14,332 Nu este îndreptat doar la un int sine. 876 00:40:14,332 --> 00:40:16,165 Este arătând spre toată chestia dreptunghiular 877 00:40:16,165 --> 00:40:18,720 și chestia aia dreptunghiulară, am spus, este numit un nod. 878 00:40:18,720 --> 00:40:21,720 Și așa am un fel de trebuie să defini recursiv acest cum 879 00:40:21,720 --> 00:40:26,270 că un nod, vom spune, va conține un int numit n 880 00:40:26,270 --> 00:40:31,070 și un pointer numita viitor și tip de structură de date la care 881 00:40:31,070 --> 00:40:35,770 că indicatorul este aparent va fi nod struct. 882 00:40:35,770 --> 00:40:41,550 >> Deci acest lucru este enervant verbose și doar pentru a fi pedant, 883 00:40:41,550 --> 00:40:44,100 motivul pentru care nu putem doar spun acest lucru, care sincer 884 00:40:44,100 --> 00:40:46,860 pare mult mai ușor de citit, se datorează faptului că amintesc că C citit 885 00:40:46,860 --> 00:40:48,710 lucruri de sus în jos, la stânga la dreapta. 886 00:40:48,710 --> 00:40:54,120 Nu e până când vom obține punct și virgulă că de fapt există nodul de cuvinte cheie. 887 00:40:54,120 --> 00:40:57,980 Deci, dacă vrem să avem acest tip de referință ciclică interiorul a datelor 888 00:40:57,980 --> 00:41:02,120 structură, trebuie să facem acest lucru, în cazul în care spunem nod struct în partea de sus, care 889 00:41:02,120 --> 00:41:06,770 ne oferă o modalitate de a descrie acest mai lucru, apoi în interiorul spunem nod struct, 890 00:41:06,770 --> 00:41:09,560 și apoi în ultimul linie spunem, bine, C, de altfel, 891 00:41:09,560 --> 00:41:12,060 sună al naibii de tot acest lucru un nod și se va opri 892 00:41:12,060 --> 00:41:14,360 folosind cuvinte cheie struct cu totul. 893 00:41:14,360 --> 00:41:18,030 Deci, aceasta este doar un fel de sintactic truc pe care în cele din urmă ne permite să creați 894 00:41:18,030 --> 00:41:21,370 ceva care arată exact ca aceasta. 895 00:41:21,370 --> 00:41:25,010 >> Deci, dacă presupunem acum putem punerea în aplicare a acestui lucru în C, 896 00:41:25,010 --> 00:41:28,040 cum putem de fapt începe traversează acest? 897 00:41:28,040 --> 00:41:32,360 Ei bine, de fapt, tot ce trebuie să faceți este să repeta de la stânga la dreapta și doar 898 00:41:32,360 --> 00:41:35,960 un fel de a introduce noduri sau șterge noduri sau sa cautati lucruri oriunde ne-o dorim, 899 00:41:35,960 --> 00:41:39,560 dar pentru a face acest lucru, să mergem mai departe și să facă lucrurile un pic mai real, deoarece acest 900 00:41:39,560 --> 00:41:42,560 a fost super-nivel scăzut până acum. 901 00:41:42,560 --> 00:41:45,700 Vrea cineva literalmente pentru a fi primul? 902 00:41:45,700 --> 00:41:46,200 BINE. 903 00:41:46,200 --> 00:41:47,092 Haide sus. 904 00:41:47,092 --> 00:41:47,800 Care e numele tău? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID MALAN: David. 907 00:41:49,290 --> 00:41:49,998 Îmi pare bine să te cunosc. 908 00:41:49,998 --> 00:41:50,960 Eu la fel. 909 00:41:50,960 --> 00:41:52,450 In regula. 910 00:41:52,450 --> 00:41:53,990 Și avem nevoie de un număr de 9. 911 00:41:53,990 --> 00:41:55,240 Nu la fel de bun ca primul, poate. 912 00:41:55,240 --> 00:41:56,430 OK, numărul 9. 913 00:41:56,430 --> 00:41:59,667 Un număr de 17, vă rog. 914 00:41:59,667 --> 00:42:01,000 Lasă-mă să mă întorc un pic mai departe. 915 00:42:01,000 --> 00:42:03,980 Numărul 22, te rog, și Ce zici de departe înapoi 916 00:42:03,980 --> 00:42:06,344 dacă pot vedea orice mâinile cu toată lumina sau nu. 917 00:42:06,344 --> 00:42:08,010 Cineva sa oferit voluntar să fie chiar acolo. 918 00:42:08,010 --> 00:42:08,968 Vrei să vină? 919 00:42:08,968 --> 00:42:10,450 Antebratul este forțat în creștere. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 vine în jos. 923 00:42:15,120 --> 00:42:18,450 Ar dori să oricine altcineva forcefully-- Haide sus. 924 00:42:18,450 --> 00:42:21,030 Un voluntar actuale. 925 00:42:21,030 --> 00:42:23,330 >> Deci foarte repede, în cazul în care voi putea aranja 926 00:42:23,330 --> 00:42:26,550 vă place doar nodurile de pe ecran. 927 00:42:26,550 --> 00:42:27,510 Multumesc. 928 00:42:27,510 --> 00:42:29,234 Și veți fi 26. 929 00:42:29,234 --> 00:42:30,650 Toate introduceri corecte și rapide. 930 00:42:30,650 --> 00:42:32,139 Deci, eu sunt David și tu sunt, de asemenea? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID MALAN: Și tu ești? 933 00:42:33,721 --> 00:42:34,229 JAKE: Jake. 934 00:42:34,229 --> 00:42:34,729 SUE: Sue. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Raphael. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID MALAN: Taylor. 939 00:42:37,466 --> 00:42:37,590 Excelent. 940 00:42:37,590 --> 00:42:39,810 Deci, acestea sunt voluntarii nostri pentru ziua de azi și mergeți mai departe 941 00:42:39,810 --> 00:42:43,090 și trecerea în acest fel un pic, și du-te mai departe și să păstreze 942 00:42:43,090 --> 00:42:47,024 exploatație numerele ca esti sau dvs. Primul semn și cu mâna stângă, 943 00:42:47,024 --> 00:42:48,940 mergeți mai departe și să pună în aplicare doar aceste săgeți, doar 944 00:42:48,940 --> 00:42:51,360 astfel încât mâna stângă este literalmente arătând la tot ce ar trebui să arate 945 00:42:51,360 --> 00:42:54,610 la, si da-te unele cameră, astfel încât putem vedea vizual bratele de fapt 946 00:42:54,610 --> 00:42:58,120 îndreptat, și vă poate indica doar un fel de la sol este bine. 947 00:42:58,120 --> 00:43:03,040 >> Deci, aici avem o listă legată de una, două, trei, patru, cinci noduri inițial, 948 00:43:03,040 --> 00:43:05,860 și observați avem această speciale pointer la începutul cine e 949 00:43:05,860 --> 00:43:09,770 cheie, deoarece avem de a urmări din toata lista lungime cumva. 950 00:43:09,770 --> 00:43:13,590 Tipii ăștia, chiar dacă ele sunt lăsate la dreapta, spate în spate în memorie, 951 00:43:13,590 --> 00:43:15,950 ele pot fi de fapt oriunde în memoria calculatorului. 952 00:43:15,950 --> 00:43:18,240 Deci tipii ăștia ar putea fi picioare oriunde pe scena 953 00:43:18,240 --> 00:43:20,960 și asta e bine, atâta timp cât acestea sunt de fapt, arătând spre un altul, 954 00:43:20,960 --> 00:43:22,770 dar pentru a menține lucrurile curat și simplu, vom 955 00:43:22,770 --> 00:43:25,728 doar le trage la stânga la dreapta la fel ca acest lucru, dar ar putea exista lacune masive 956 00:43:25,728 --> 00:43:26,790 între aceste noduri. 957 00:43:26,790 --> 00:43:30,710 >> Acum, dacă vreau să insera de fapt, unele valoare nouă, să mergem mai departe și de a face acest lucru. 958 00:43:30,710 --> 00:43:33,720 Avem o oportunitate de acum pentru a alege un alt nod. 959 00:43:33,720 --> 00:43:39,820 Spune să începem cu mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Ar deranja cineva fiind malloc? 961 00:43:41,320 --> 00:43:42,280 OK, haide sus. 962 00:43:42,280 --> 00:43:42,992 Care e numele tău? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Rainbow. 964 00:43:43,700 --> 00:43:44,050 DAVID MALAN: Rainbow? 965 00:43:44,050 --> 00:43:44,810 In regula. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Haide sus. 968 00:43:47,450 --> 00:43:51,610 Deci, acum trebuie să ne întrebăm algoritmic unde putem pune 55. 969 00:43:51,610 --> 00:43:53,610 Deci, noi toți știm, evident, în cazul în care ea, probabil, 970 00:43:53,610 --> 00:43:55,401 aparține dacă încercăm pentru a menține această sortate 971 00:43:55,401 --> 00:43:58,299 și dacă voi putea lua o un pas înapoi ca să nu cad de pe 972 00:43:58,299 --> 00:43:59,590 etapa, care ar fi grozav. 973 00:43:59,590 --> 00:44:01,420 Deci, de fapt, Rainbow, începe aici cu mine, 974 00:44:01,420 --> 00:44:04,200 pentru că noi, ca computerul acum poate vedea doar o variabilă la un moment dat. 975 00:44:04,200 --> 00:44:05,190 Deci, dacă acest lucru este primul nod. 976 00:44:05,190 --> 00:44:07,160 Observați că nu este un nod, e doar un pointer, 977 00:44:07,160 --> 00:44:10,270 și de aceea el atras de fi numai dimensiunea unui pointer, nu 978 00:44:10,270 --> 00:44:11,780 unul dintre acele dreptunghiuri pline. 979 00:44:11,780 --> 00:44:16,650 Deci vom verifica la fiecare iterație este mai mică de 55 9? 980 00:44:16,650 --> 00:44:17,150 Nu. 981 00:44:17,150 --> 00:44:19,060 Este mai puțin de 55 17? 982 00:44:19,060 --> 00:44:19,720 Nu. 983 00:44:19,720 --> 00:44:20,800 Mai puțin de 22? 984 00:44:20,800 --> 00:44:22,020 Mai puțin de 26? 985 00:44:22,020 --> 00:44:23,390 Mai puțin de 34? 986 00:44:23,390 --> 00:44:25,890 Și așa acum, în mod evident, Curcubeu face parte, la sfârșitul. 987 00:44:25,890 --> 00:44:27,270 Deci, să fie clar, și ce a fost numele tău, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID MALAN: Deci între lui Taylor stânga și mâinile Rainbow e aici, 990 00:44:32,510 --> 00:44:38,324 a cărui mână are nevoie pentru a indica la ce în Pentru a insera 55 în această listă? 991 00:44:38,324 --> 00:44:39,240 Ce trebuie să facem? 992 00:44:39,240 --> 00:44:39,700 Da? 993 00:44:39,700 --> 00:44:41,140 >> Audiența: mâna lui Taylor trebuie să punctul din stanga. 994 00:44:41,140 --> 00:44:41,680 >> DAVID MALAN: Exact. 995 00:44:41,680 --> 00:44:43,800 Deci, introducerea unui nod în capătul listei 996 00:44:43,800 --> 00:44:47,140 este destul de simplu, deoarece Taylor doar ului trebuie sa fie, in loc de la sol 997 00:44:47,140 --> 00:44:49,640 sau vom numi nul, nul este un fel de lipsa 998 00:44:49,640 --> 00:44:51,640 de un pointer sau o special pointer la zero, ești 999 00:44:51,640 --> 00:44:53,740 merge de la punctul cu stânga mână la Rainbow și apoi Rainbow, 1000 00:44:53,740 --> 00:44:55,910 în cazul în care ar trebui să stânga mână, probabil, punctul? 1001 00:44:55,910 --> 00:44:56,570 Jos. 1002 00:44:56,570 --> 00:45:00,140 Nu e bine, dacă mâna este un fel de îndreptat off aici sau orice fel de 1003 00:45:00,140 --> 00:45:00,640 in ce directie. 1004 00:45:00,640 --> 00:45:02,407 Asta ar fi considerate o valoare de gunoi, 1005 00:45:02,407 --> 00:45:04,240 dar dacă ea arată spre o valoare cunoscută, vom 1006 00:45:04,240 --> 00:45:07,360 numesc zero sau nul, e OK pentru că avem un termen în acest 1007 00:45:07,360 --> 00:45:09,390 și știm lista acum este completă. 1008 00:45:09,390 --> 00:45:11,550 >> Deci, ce este un alt caz relativ simplu? 1009 00:45:11,550 --> 00:45:13,125 Putem malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Haide sus. 1011 00:45:14,010 --> 00:45:14,782 Care e numele tău? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID MALAN: Îmi pare rău? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID MALAN: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 In regula. 1017 00:45:17,110 --> 00:45:19,071 Tiffany a fost malloced cu valoarea 5. 1018 00:45:19,071 --> 00:45:19,570 Haide sus. 1019 00:45:19,570 --> 00:45:23,820 Asta e relativ usor de asemenea, dar să luăm în considerare pentru a operațiunilor de acum. 1020 00:45:23,820 --> 00:45:25,820 A fost destul de ușor cu Taylor la sfârșitul anului. 1021 00:45:25,820 --> 00:45:30,302 Numărul 5 este, desigur, mai puțin de 9, și așa ne-am pe David, avem Tiffany, 1022 00:45:30,302 --> 00:45:31,260 și ceea ce a fost numele tău? 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: Jake. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID MALAN: Jake. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Jake, și David. 1026 00:45:34,300 --> 00:45:36,580 A cărui mână ar trebui să fie actualizate în primul rând? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Ce vrei să faci aici? 1029 00:45:40,590 --> 00:45:45,244 Există câteva posibile moduri, dar există, de asemenea una sau mai multe moduri greșite. 1030 00:45:45,244 --> 00:45:46,620 >> Audiența: Începeți cu stânga. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID MALAN: Începeți cu cel mai din stânga. 1032 00:45:47,800 --> 00:45:49,008 Cine e cel mai din stânga aici atunci? 1033 00:45:49,008 --> 00:45:49,700 Audiența: Prima. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID MALAN: OK. 1035 00:45:50,366 --> 00:45:53,781 Deci, începe cu primul și în cazul în care nu-i doriți să actualizați mâinile lui David să fie? 1036 00:45:53,781 --> 00:45:54,780 Audiența: Spre 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID MALAN: OK. 1038 00:45:55,446 --> 00:45:59,026 Deci David, punct de la cinci sau Tiffany aici, și acum? 1039 00:45:59,026 --> 00:46:01,072 >> Audiența: Tiffany puncte la 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID MALAN: Perfect, cu excepția lui Binky șef doar un fel de a căzut, nu? 1041 00:46:04,030 --> 00:46:06,820 Pentru că ceea ce e în neregulă cu această imagine literalmente? 1042 00:46:06,820 --> 00:46:08,070 Audiența: Nimic nu este îndreptat. 1043 00:46:08,070 --> 00:46:09,945 DAVID MALAN: Nimic nu este arătând spre Jake acum. 1044 00:46:09,945 --> 00:46:13,360 Am orfani literalmente 9 și 17, și ne-am literalmente 1045 00:46:13,360 --> 00:46:18,450 scurgeri toate acestea memorie, deoarece de actualizarea mâna lui David în primul rând, asta e 1046 00:46:18,450 --> 00:46:21,660 amendă în măsura în care este în mod corect arătând la Tiffany acum, 1047 00:46:21,660 --> 00:46:25,410 dar dacă nimeni nu a avut previziune pentru a indica la Jake, 1048 00:46:25,410 --> 00:46:27,490 apoi ne-am pierdut toate elementele de lista. 1049 00:46:27,490 --> 00:46:28,200 Deci, haideți să anulați. 1050 00:46:28,200 --> 00:46:30,950 Deci, asta a fost un lucru bun pentru excursie peste dar să corecteze acum. 1051 00:46:30,950 --> 00:46:33,624 Ce ar trebui să facem mai întâi în schimb? 1052 00:46:33,624 --> 00:46:34,124 Da? 1053 00:46:34,124 --> 00:46:35,791 >> Audiența: Tiffany ar trebui să punct la 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID MALAN: Nu pot obține că aproape de tine. 1055 00:46:37,582 --> 00:46:38,720 Cine ar trebui să arate la 9? 1056 00:46:38,720 --> 00:46:39,220 >> Audiența: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID MALAN: Bine. 1058 00:46:39,390 --> 00:46:41,200 Deci, ar trebui să Tiffany primul punct la 9. 1059 00:46:41,200 --> 00:46:43,550 Deci, ar trebui să ia Tiffany pe o valoare identică 1060 00:46:43,550 --> 00:46:45,820 David, care pare redundant pentru un moment, 1061 00:46:45,820 --> 00:46:48,820 dar asta e bine pentru că acum, în al doilea rând pas, putem actualiza mâna lui David 1062 00:46:48,820 --> 00:46:52,680 la punctul de la Tiffany, și apoi, dacă noi doar un fel de curat lucrurile 1063 00:46:52,680 --> 00:46:55,740 ca și cum acest lucru este un fel de-primăvară cum ar fi, Acum, că e un introducere corectă. 1064 00:46:55,740 --> 00:46:56,700 Deci excelent. 1065 00:46:56,700 --> 00:46:57,970 Deci, acum suntem aproape acolo. 1066 00:46:57,970 --> 00:47:01,075 Să introduceți un finală Valoarea ca valoarea 20. 1067 00:47:01,075 --> 00:47:03,010 Dacă am putea malloc o voluntar finală? 1068 00:47:03,010 --> 00:47:04,140 Haide sus. 1069 00:47:04,140 --> 00:47:06,224 Deci asta e un pic mai complicat. 1070 00:47:06,224 --> 00:47:08,390 Dar, de fapt, codul suntem scris, deși verbal, 1071 00:47:08,390 --> 00:47:10,610 este la fel ca având un buchet de cazul în care condițiile acum, nu? 1072 00:47:10,610 --> 00:47:12,318 Am avut o stare a verifica dacă acesta face parte 1073 00:47:12,318 --> 00:47:13,840 la final, poate la început. 1074 00:47:13,840 --> 00:47:15,940 Avem nevoie de un fel de buclă la găsi locul în mijloc. 1075 00:47:15,940 --> 00:47:17,400 Deci, hai sa facem asta cu care e numele tău? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID MALAN: Eric? 1078 00:47:18,340 --> 00:47:18,660 Eric. 1079 00:47:18,660 --> 00:47:19,368 Îmi pare bine să te cunosc. 1080 00:47:19,368 --> 00:47:20,490 Deci avem 20. 1081 00:47:20,490 --> 00:47:21,220 Mai puțin de cinci? 1082 00:47:21,220 --> 00:47:21,530 Nu. 1083 00:47:21,530 --> 00:47:22,160 Mai puțin de nouă? 1084 00:47:22,160 --> 00:47:22,410 Nu. 1085 00:47:22,410 --> 00:47:23,050 Mai puțin de 17? 1086 00:47:23,050 --> 00:47:23,550 Nu. 1087 00:47:23,550 --> 00:47:23,740 BINE. 1088 00:47:23,740 --> 00:47:25,701 El aparține aici și numele voastre din nou sunt? 1089 00:47:25,701 --> 00:47:26,200 SUE: Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID MALAN: Sue. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID MALAN: Sue, Alex, și? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID MALAN: Eric. 1095 00:47:30,120 --> 00:47:32,140 Ale căror mâini nevoie pentru a obține actualizate primul? 1096 00:47:32,140 --> 00:47:32,930 >> Audiența: Eric. 1097 00:47:32,930 --> 00:47:33,429 BINE. 1098 00:47:33,429 --> 00:47:35,200 Deci, Eric ar trebui să arate la unde? 1099 00:47:35,200 --> 00:47:35,930 La 22. 1100 00:47:35,930 --> 00:47:36,430 Bine. 1101 00:47:36,430 --> 00:47:38,180 Și acum ce urmează? 1102 00:47:38,180 --> 00:47:40,800 Sue poate indica apoi la Eric și acum, dacă voi doar 1103 00:47:40,800 --> 00:47:44,077 face unele cameră, ceea ce este bine vizual, acum am făcut introducerea. 1104 00:47:44,077 --> 00:47:47,160 Deci, haideți să considerăm acum o întrebare, dar vă mulțumesc foarte mult pentru voluntarii nostri. 1105 00:47:47,160 --> 00:47:48,090 Foarte bine facut. 1106 00:47:48,090 --> 00:47:50,831 Puteți să vă păstrați cei, dacă doriți. 1107 00:47:50,831 --> 00:47:54,140 Și avem un cadou minunat de despărțire, dacă ai dori să ia fiecare o minge de stres. 1108 00:47:54,140 --> 00:47:56,030 Lasă-mă să trec acest jos. 1109 00:47:56,030 --> 00:47:58,430 Deci, ce este MENIUL de asta? 1110 00:47:58,430 --> 00:48:02,430 Aceasta pare a fi uimitor în măsura în care avem acum 1111 00:48:02,430 --> 00:48:06,360 introdus o alternativă la un matrice care nu este atât de limitat 1112 00:48:06,360 --> 00:48:07,780 la o serie de unele dimensiune fixă. 1113 00:48:07,780 --> 00:48:09,380 Ele se pot dezvolta dinamic. 1114 00:48:09,380 --> 00:48:13,220 >> Dar la fel ca le-am vazut in saptamani trecut, nu am primit nimic gratis, 1115 00:48:13,220 --> 00:48:15,740 ca sigur nu e un compromis aici. 1116 00:48:15,740 --> 00:48:18,890 Deci, cu o cu susul unui legat lista, este acest dinamism? 1117 00:48:18,890 --> 00:48:21,590 Acest lucru capacitatea de a dezvolta și sincer, am fi putut face de ștergere 1118 00:48:21,590 --> 00:48:23,570 și am putea reduce după cum este necesar. 1119 00:48:23,570 --> 00:48:24,710 Ce preț plătim? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 De doua ori mai mult spațiu, în primul rând. 1122 00:48:30,340 --> 00:48:34,010 Dacă te uiți la imagine, nu mai sunt eu stocarea o listă de numere întregi. 1123 00:48:34,010 --> 00:48:36,740 Am stocarea o listă de întregi, plus indicii. 1124 00:48:36,740 --> 00:48:38,240 Deci, eu sunt dublarea cantității de spațiu. 1125 00:48:38,240 --> 00:48:40,740 Acum, poate că nu e așa o mare de 4 bytes, 8 octeți, 1126 00:48:40,740 --> 00:48:43,160 dar s-ar putea adăuga cu siguranță pentru seturi mari de date. 1127 00:48:43,160 --> 00:48:45,570 Ce este un alt dezavantaj? 1128 00:48:45,570 --> 00:48:46,070 Da? 1129 00:48:46,070 --> 00:48:48,010 >> Audiența: Trebuie să le traversa-o de-o. 1130 00:48:48,010 --> 00:48:48,760 DAVID MALAN: Da. 1131 00:48:48,760 --> 00:48:50,260 Trebuie să le traversa-o de-o. 1132 00:48:50,260 --> 00:48:53,860 Știi ce, am renunțat la acest super- caracteristică convenabil de suport pătrat 1133 00:48:53,860 --> 00:48:57,240 notație, mai adecvat cunoscut sub numele de acces aleatoriu, 1134 00:48:57,240 --> 00:48:59,280 unde putem sări doar la un element individual 1135 00:48:59,280 --> 00:49:01,470 dar acum, dacă am avut încă voluntari mele de aici, 1136 00:49:01,470 --> 00:49:04,660 dacă am vrut pentru a găsi numărul 22, nu pot doar 1137 00:49:04,660 --> 00:49:06,620 sări la suport ceva ceva. 1138 00:49:06,620 --> 00:49:10,530 Trebuie să se uite peste lista, mult ca exemplele noastre de cautare avansata liniar, 1139 00:49:10,530 --> 00:49:12,260 pentru a găsi numărul 22. 1140 00:49:12,260 --> 00:49:14,340 Deci, se pare că am plătit un preț acolo. 1141 00:49:14,340 --> 00:49:16,430 Dar putem, totuși, rezolva alte probleme. 1142 00:49:16,430 --> 00:49:18,587 >> De fapt, permiteți-mi să introducă doar o pereche de imagini. 1143 00:49:18,587 --> 00:49:20,920 Deci, dacă ați fost în jos pentru a Sală de mese Mather recent, 1144 00:49:20,920 --> 00:49:23,320 vei aminti că lor stive de tăvi de acest fel, 1145 00:49:23,320 --> 00:49:26,300 am împrumutat de la acestea Annenberg înainte de clasă. 1146 00:49:26,300 --> 00:49:28,930 Deci, acest teanc de tăvi, deși, este reprezentativ de fapt 1147 00:49:28,930 --> 00:49:30,860 de o structură de date informatică. 1148 00:49:30,860 --> 00:49:32,910 Există o structură de date în informatică 1149 00:49:32,910 --> 00:49:38,010 cunoscut ca un stack care foarte bine se pretează la exact acest vizuală. 1150 00:49:38,010 --> 00:49:41,380 Deci, dacă fiecare dintre aceste tăvi nu este o tava dar ca un număr și am vrut 1151 00:49:41,380 --> 00:49:45,010 pentru a stoca numere, am ar putea pune o jos aici 1152 00:49:45,010 --> 00:49:48,320 și am putea pune un alt aici, și să continue stivuire numere 1153 00:49:48,320 --> 00:49:53,180 pe partea de sus a unul pe altul, și ceea ce este potențial utile despre acest 1154 00:49:53,180 --> 00:49:55,450 este că ceea ce este implicarea de această structură de date? 1155 00:49:55,450 --> 00:49:58,045 Ce număr pot scoate Primul cel mai convenabil? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Cel mai recent, o pune pe acolo. 1158 00:50:03,030 --> 00:50:06,430 >> Deci, asta este ceea ce am numi în informatică o structură de date LIFO. 1159 00:50:06,430 --> 00:50:08,070 Ultima în, primul ieșit. 1160 00:50:08,070 --> 00:50:10,800 Și vom vedea înainte de mult timp de ce care ar putea fi utilă, dar pentru acum, 1161 00:50:10,800 --> 00:50:12,200 ia în considerare doar de proprietate. 1162 00:50:12,200 --> 00:50:15,158 Și e un fel de prost, dacă credeți despre modul în care sala de mese o face. 1163 00:50:15,158 --> 00:50:17,910 De fiecare dată când tăvi curate și pune cele mai proaspete pe partea de sus, 1164 00:50:17,910 --> 00:50:22,160 ai putea avea un curat anterior dar în cele din urmă foarte murdar și plin de praf 1165 00:50:22,160 --> 00:50:24,360 tava la partea de jos foarte Dacă nu, de fapt 1166 00:50:24,360 --> 00:50:26,820 ajunge la partea de jos a care stack, pentru că doar 1167 00:50:26,820 --> 00:50:29,380 păstra punerea noi și cele curate pe partea de sus a acesteia. 1168 00:50:29,380 --> 00:50:31,840 Același lucru s-ar putea întâmpla într-un supermarket prea. 1169 00:50:31,840 --> 00:50:35,450 Dacă aveți un caz de afișare de lapte și de fiecare dată CVS 1170 00:50:35,450 --> 00:50:37,610 sau oricine devine mai mult lapte, doar împinge tipurile de lapte 1171 00:50:37,610 --> 00:50:39,880 aveți deja în spate și ai pus cele noi în față, 1172 00:50:39,880 --> 00:50:43,088 vei avea unele destul de urât lapte la capătul structurii de date, 1173 00:50:43,088 --> 00:50:46,390 pentru că este întotdeauna în partea de jos sau echivalent este întotdeauna la partea din spate. 1174 00:50:46,390 --> 00:50:50,407 >> Dar există un alt mod de a gândi despre alinierea datelor și, de exemplu, aceasta. 1175 00:50:50,407 --> 00:50:53,490 Daca esti unul din acei oameni care îi place pentru a alinia în afara magazinelor Apple 1176 00:50:53,490 --> 00:50:55,610 atunci când un nou produs vine out, esti, probabil, 1177 00:50:55,610 --> 00:50:58,780 nu folosind un date stivă Structura pentru că 1178 00:50:58,780 --> 00:51:03,070 ar îndepărta oricine altcineva care este garnitură de până la cumpere o nouă jucărie. 1179 00:51:03,070 --> 00:51:06,610 Mai degrabă, esti, probabil, utilizați Ce fel de structură de date 1180 00:51:06,610 --> 00:51:10,050 sau ce fel de sistem în lumea reală? 1181 00:51:10,050 --> 00:51:13,493 Sperăm că este o linie, sau mai mult în mod corespunzător sau mai mult British-cum ar fi, o coadă. 1182 00:51:13,493 --> 00:51:17,700 Și se pare că o coadă este de asemenea un structură de date în informatică, 1183 00:51:17,700 --> 00:51:19,700 dar o coadă are o foarte proprietate diferite. 1184 00:51:19,700 --> 00:51:20,820 Nu e LIFO. 1185 00:51:20,820 --> 00:51:21,990 Ultima în, primul ieșit. 1186 00:51:21,990 --> 00:51:22,800 Doamne ferește. 1187 00:51:22,800 --> 00:51:24,280 Este în schimb FIFO. 1188 00:51:24,280 --> 00:51:26,110 În primul rând, în, primul ieșit. 1189 00:51:26,110 --> 00:51:27,970 Si asta e un lucru bun de dragul corectitudinii " 1190 00:51:27,970 --> 00:51:30,428 cu siguranță atunci când sunteți căptușeală up super-devreme în dimineața. 1191 00:51:30,428 --> 00:51:33,400 Dacă ajungi acolo în primul rând, vă doriți să obțineți mai întâi, de asemenea. 1192 00:51:33,400 --> 00:51:35,880 >> Și astfel toate aceste date structuri, cozile și stive 1193 00:51:35,880 --> 00:51:39,220 și ciorchini de alții, se dovedește te poate gândi la acest lucru ca doar un tablou. 1194 00:51:39,220 --> 00:51:41,820 Aceasta este o matrice, poate o dimensiune fixă ​​de 4, dar ar 1195 00:51:41,820 --> 00:51:44,990 fi un fel de frumos dacă am putea îngrămădi doar tăvi aproape infinit de înalt, dacă ne-am 1196 00:51:44,990 --> 00:51:46,780 au ca multe tăvi sau numere. 1197 00:51:46,780 --> 00:51:48,840 Deci, poate vrem să utiliza o listă legată aici, 1198 00:51:48,840 --> 00:51:51,800 dar compromisul va fi potențial că avem nevoie de mai multă memorie, 1199 00:51:51,800 --> 00:51:55,930 ia un pic mai mult timp, dar am nu limitează înălțimea stivei, 1200 00:51:55,930 --> 00:51:59,550 la fel ca vitrina Mather lui s-ar putea limita dimensiunea stivei, 1201 00:51:59,550 --> 00:52:03,117 și astfel încât acestea sunt decizii de proiectare sau opțiunile disponibile pentru a ne în cele din urmă. 1202 00:52:03,117 --> 00:52:04,950 Deci, cu aceste date structuri, am început 1203 00:52:04,950 --> 00:52:09,360 văzând noi limite superioare potențial asupra a ceea ce anterior a fost super rapid 1204 00:52:09,360 --> 00:52:11,260 și în cazul în care vom pleca off astăzi și în cazul în care 1205 00:52:11,260 --> 00:52:13,200 vom sperăm să ajungem la este miercuri, vom 1206 00:52:13,200 --> 00:52:15,740 începe să se uite la o date structură care ne permite să căuta 1207 00:52:15,740 --> 00:52:18,260 prin date în timp final jurnal din nou. 1208 00:52:18,260 --> 00:52:21,470 Și am văzut că, amintesc, în săptămâna zero, și unul cu căutare binară sau divizare 1209 00:52:21,470 --> 00:52:22,180 și cuceri. 1210 00:52:22,180 --> 00:52:26,240 Vine înapoi și mai bine, Sfântul Graal pentru miercuri 1211 00:52:26,240 --> 00:52:29,510 va fi de a veni cu structură de date care ruleaza cu adevărat 1212 00:52:29,510 --> 00:52:32,070 sau teoretic în constantă de timp, în care 1213 00:52:32,070 --> 00:52:34,760 nu contează cât de multe milioane sau miliarde de lucruri 1214 00:52:34,760 --> 00:52:38,470 avem în structura de date, se va du-ne constantă de timp, poate cu un pas 1215 00:52:38,470 --> 00:52:41,387 sau două etape sau 10 pasi, dar numărul de pași constante 1216 00:52:41,387 --> 00:52:42,970 pentru a căuta prin această structură de date. 1217 00:52:42,970 --> 00:52:46,300 Că într-adevăr va fi Sfântul Graal dar mai mult pe faptul că miercuri. 1218 00:52:46,300 --> 00:52:49,045 Ne mai vedem atunci. 1219 00:52:49,045 --> 00:52:53,704 >> [MUSIC JOC] 1220 00:52:53,704 --> 00:56:08,448