1 00:00:00,000 --> 00:00:03,381 >> [Predvaja glasba] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO PREDVAJANJE] 4 00:00:11,610 --> 00:00:13,640 >> -On Laže. 5 00:00:13,640 --> 00:00:14,380 >> -O čem? 6 00:00:14,380 --> 00:00:17,182 >> Ne vem. 7 00:00:17,182 --> 00:00:19,990 >> Torej kaj vemo? 8 00:00:19,990 --> 00:00:23,145 >> -To Ob 9:15, Ray Santoya bil na bankomatu. 9 00:00:23,145 --> 00:00:23,644 Ja. 10 00:00:23,644 --> 00:00:27,030 Torej, vprašanje je, kaj je delal na 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting 9. milimeter na nekaj. 12 00:00:29,720 --> 00:00:31,540 Mogoče je videl ostrostrelca. 13 00:00:31,540 --> 00:00:33,412 >> -ali Je delal z njim. 14 00:00:33,412 --> 00:00:34,340 >> -Wait. 15 00:00:34,340 --> 00:00:36,200 Pojdi nazaj ena. 16 00:00:36,200 --> 00:00:36,975 >> -Kaj vidiš? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Svoj obraz navzgor celotnem zaslonu. 19 00:00:47,805 --> 00:00:48,680 >> -His Očala. 20 00:00:48,680 --> 00:00:50,060 >> -Ni Je odsev. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -To Baseball ekipa Nuevitas. 23 00:01:02,280 --> 00:01:03,110 To je njihov logo. 24 00:01:03,110 --> 00:01:05,820 >> In on je govoril, da kdor je nosil to jakno. 25 00:01:05,820 --> 00:01:06,670 >> [END PREDVAJANJE] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: V redu. 27 00:01:07,628 --> 00:01:11,210 To je CS50 in to je malo bolj od [neslišno], s katero ste 28 00:01:11,210 --> 00:01:12,890 dabbling s problemom nastaviti štiri. 29 00:01:12,890 --> 00:01:16,606 Danes smo začeli gledati malo bolj Globoko pri teh stvareh, imenovanih kazalci, 30 00:01:16,606 --> 00:01:18,480 ki kljub temu, da je precej Skrivnosten temo, 31 00:01:18,480 --> 00:01:20,813 se izkaže, da se dogaja da je sredstvo, s katerim smo 32 00:01:20,813 --> 00:01:24,320 Lahko začnete graditi in montaža veliko bolj sofisticirane programe. 33 00:01:24,320 --> 00:01:28,150 Ampak mi je uspelo na zadnjo sredo s pomočjo neke claymation prvega. 34 00:01:28,150 --> 00:01:30,190 Torej to, odpoklic, je Binky in smo ga uporabili 35 00:01:30,190 --> 00:01:33,148 da pogled na program, ki ni res kaj zanimivega, 36 00:01:33,148 --> 00:01:34,950 je pa razkrivajo nekaj težav. 37 00:01:34,950 --> 00:01:38,570 Torej, da bi začeli danes, zakaj ne hodimo hitro skozi nekaj teh korakov, 38 00:01:38,570 --> 00:01:41,920 poskusite destilirati v smislu človekovega točno to, kar se dogaja tukaj 39 00:01:41,920 --> 00:01:45,410 in zakaj je to slabo, nato pa preide na in dejansko začeli graditi nekaj 40 00:01:45,410 --> 00:01:46,309 s to tehniko? 41 00:01:46,309 --> 00:01:48,350 Torej, to so bili prvi dve vrstici v tem programu 42 00:01:48,350 --> 00:01:51,340 in v smislu navadnega je, kaj se ti dve vrstici delaš? 43 00:01:51,340 --> 00:01:55,600 Nekdo, ki je razmeroma udobno s tem, kar je izjavil na zaslonu? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Kaj so ti dve vrstici delaš? 46 00:02:00,120 --> 00:02:02,070 To pa še ni vse, da je drugačna od enega tedna, 47 00:02:02,070 --> 00:02:03,611 vendar pa je nekaj novega poseben simbol. 48 00:02:03,611 --> 00:02:04,152 Ja? 49 00:02:04,152 --> 00:02:05,628 Nazaj tam. 50 00:02:05,628 --> 00:02:07,092 >> OBČINSTVO: Razglasitev kazalce? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Ponovi? 52 00:02:08,050 --> 00:02:08,860 OBČINSTVO: Razglasitev kazalce? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: Deklariranje kazalci in dajmo omejite malo več. 54 00:02:11,776 --> 00:02:14,050 OBČINSTVO: [neslišno] naslov x in nato y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: In potem obravnavati. 56 00:02:15,300 --> 00:02:18,550 Torej, še posebej, kaj delamo se bomo o razglasitvi dveh spremenljivk. 57 00:02:18,550 --> 00:02:21,252 Te spremenljivke, čeprav se dogaja biti tipa int zvezdo, ki je 58 00:02:21,252 --> 00:02:23,210 natančneje pomeni gredo za shranjevanje 59 00:02:23,210 --> 00:02:26,450 naslov int, zaporedju, X in Y. 60 00:02:26,450 --> 00:02:27,660 Zdaj obstajajo kakršne koli vrednosti? 61 00:02:27,660 --> 00:02:32,621 Ali obstajajo kakršne koli dejanske naslove v teh dve spremenljivki v tem trenutku? 62 00:02:32,621 --> 00:02:33,120 No. 63 00:02:33,120 --> 00:02:35,030 To je samo tako imenovane smeti vrednosti. 64 00:02:35,030 --> 00:02:38,120 Če ne boste dejansko dodelite spremenljiva, kar je bilo v RAM 65 00:02:38,120 --> 00:02:42,224 prej se dogaja, da zapolni z ničlami in tisti, oba od teh spremenljivk. 66 00:02:42,224 --> 00:02:44,140 Ampak še ne vem, kaj so in da je 67 00:02:44,140 --> 00:02:47,060 bo ključnega pomena, zakaj Binky izgubil glavo prejšnji teden. 68 00:02:47,060 --> 00:02:49,980 >> Torej, to je bil claymation inkarnacija tega 69 00:02:49,980 --> 00:02:53,580 s katerim imate le dve spremenljivki, majhne krožne kosov gline, 70 00:02:53,580 --> 00:02:57,330 da lahko shranite spremenljivke, ampak kot je zaokrožila puščice kažejo, 71 00:02:57,330 --> 00:03:00,640 oni dejansko ne kaže kjerkoli poznano samo po sebi. 72 00:03:00,640 --> 00:03:03,670 Torej smo imeli to linijo, in to je nova prejšnji teden, malloc za spomin 73 00:03:03,670 --> 00:03:07,130 dodelitev, ki je samo fancy način povedal, operacijski sistem, Linux 74 00:03:07,130 --> 00:03:09,750 ali Mac OS ali Windows, hej, daj mi nekaj pomnilnika, 75 00:03:09,750 --> 00:03:11,780 in vse, kar imaš za povedati operacijski sistem 76 00:03:11,780 --> 00:03:14,699 je tisto, ko ga prosi za spomin. 77 00:03:14,699 --> 00:03:16,990 To se ne bo kaj skrbi boš naredil z njim, 78 00:03:16,990 --> 00:03:19,786 vendar si morate povedati delovati sistem, kar s pomočjo knjižnične funkcije malloc. 79 00:03:19,786 --> 00:03:20,286 Ja? 80 00:03:20,286 --> 00:03:21,078 >> OBČINSTVO: Koliko? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Koliko? 82 00:03:21,994 --> 00:03:25,280 Koliko v bajtih, in tako je to, še enkrat, izmišljeno primer, je samo rekel, 83 00:03:25,280 --> 00:03:27,360 daj mi velikost notr. 84 00:03:27,360 --> 00:03:30,550 Zdaj, velikost notr je štiri bajte ali 32 bitov. 85 00:03:30,550 --> 00:03:32,850 Torej je to samo način rekel, hej, operacijski sistem, 86 00:03:32,850 --> 00:03:37,290 dajte mi štiri bajte pomnilnika da sem lahko uporabite na mojem razpolago, 87 00:03:37,290 --> 00:03:40,560 in še posebej, kaj počne malloc povratek v zvezi z 88 00:03:40,560 --> 00:03:41,795 na ta kos štirih bajtov? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 OBČINSTVO: Naslov? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: naslov. 92 00:03:45,901 --> 00:03:47,580 Naslov tega kos štirih bajtov. 93 00:03:47,580 --> 00:03:48,190 Točno tako. 94 00:03:48,190 --> 00:03:51,430 In tako, da je tisto, kar je shranjeno na koncu vx in da je, zakaj smo v resnici ne 95 00:03:51,430 --> 00:03:55,240 zanima me, kaj se je število, ki Naslov je, ali je to ox1 ali OX2 96 00:03:55,240 --> 00:03:57,110 ali nekatere Grobni šestnajstiški naslov. 97 00:03:57,110 --> 00:03:59,850 Pravkar Skrbimo slikovno da je ta spremenljivka x je zdaj 98 00:03:59,850 --> 00:04:01,630 kar kaže na to kos pomnilnika. 99 00:04:01,630 --> 00:04:05,570 Torej puščica predstavlja kazalec, ali natančneje, pomnilnik naslov. 100 00:04:05,570 --> 00:04:09,120 Ampak še enkrat, mi običajno ne skrbi kaj ti dejanski naslovi. 101 00:04:09,120 --> 00:04:11,780 Zdaj, ta linija pravi kaj v smislu navadnega je? 102 00:04:11,780 --> 00:04:14,330 Star x dobi 42 podpičjem. 103 00:04:14,330 --> 00:04:17,390 Kaj to pomeni? 104 00:04:17,390 --> 00:04:18,200 Hočeš iti? 105 00:04:18,200 --> 00:04:20,102 Ne praskajte vratu. 106 00:04:20,102 --> 00:04:22,360 >> SKUPINA: Naslov X na 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Naslov X na 42. 108 00:04:24,300 --> 00:04:25,190 Ne čisto. 109 00:04:25,190 --> 00:04:28,485 Tako blizu, vendar ne povsem, ker tam zvezda, ki je prefixing to x. 110 00:04:28,485 --> 00:04:29,860 Zato moramo poteg malo. 111 00:04:29,860 --> 00:04:31,032 Ja? 112 00:04:31,032 --> 00:04:36,044 >> OBČINSTVO: Vrednost, da je kazalec x se kaže, da je 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 Vrednost, ki je kazalec x kaže, da, recimo, mora biti 42, 115 00:04:40,840 --> 00:04:44,165 ali povedano drugače, zvezdo x pravi, pojdite na kakršnikoli naslov 116 00:04:44,165 --> 00:04:48,340 je x, ali je to 1 Oxford Street ali 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 ali ox1 ali ox33, karkoli da številski naslov, 118 00:04:51,850 --> 00:04:54,380 zvezda x Dereferenciranje x. 119 00:04:54,380 --> 00:04:57,297 Torej, pojdite na ta naslov in nato pa številko 42 tam. 120 00:04:57,297 --> 00:04:59,380 Tako, da bi bila enakovreden način rekel, da je. 121 00:04:59,380 --> 00:05:01,860 Tako, da je vse v redu, potem pa mi bi predstavljajo sliko 122 00:05:01,860 --> 00:05:05,370 takole, ko smo dodali 42 na ta kos štirih 123 00:05:05,370 --> 00:05:09,370 bajti na desni strani, vendar ta vrstica je bilo, kje je šlo narobe 124 00:05:09,370 --> 00:05:11,120 in Binky glava izstrelil nogama na tej točki, 125 00:05:11,120 --> 00:05:15,290 zaradi slabe stvari se dogajajo, ko ste dereference smeti vrednot 126 00:05:15,290 --> 00:05:18,210 ali ste dereference neveljaven kazalci, in rečem neveljavna 127 00:05:18,210 --> 00:05:21,020 ker na tej točki v Zgodba, kaj je notri y? 128 00:05:21,020 --> 00:05:24,440 Kakšna je vrednost y, ki temelji na zadnjih nekaj korakih? 129 00:05:24,440 --> 00:05:25,360 Ja? 130 00:05:25,360 --> 00:05:26,115 Kaj je to? 131 00:05:26,115 --> 00:05:26,990 >> OBČINSTVO: An naslov. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: An naslov. 133 00:05:28,460 --> 00:05:31,910 To bi moral biti naslov ampak sem ga inicializiran? 134 00:05:31,910 --> 00:05:32,800 Torej še nimam. 135 00:05:32,800 --> 00:05:35,430 Torej, kaj je znano, da je tam? 136 00:05:35,430 --> 00:05:37,590 To je samo nekaj smeti vrednost. 137 00:05:37,590 --> 00:05:41,500 To je lahko katera koli naslov od nič do 2 milijardi, če imate dve nastopov RAM-a, 138 00:05:41,500 --> 00:05:44,289 ali nič do 4 milijarde, če ste dobil štiri gigabajte pomnilnika. 139 00:05:44,289 --> 00:05:46,080 To je nekaj smeti vrednost, ampak problem je, 140 00:05:46,080 --> 00:05:48,200 da operacijski sistem, če ni vam ga je dal 141 00:05:48,200 --> 00:05:51,140 da je kos pomnilnika posebej da skušaš iti, 142 00:05:51,140 --> 00:05:54,650 to je običajno dogaja, da povzroči kaj smo videli kot napake segmentacije. 143 00:05:54,650 --> 00:05:57,810 Torej v resnici, kdo od vas, ki imajo boril na težave pri uradnih ur 144 00:05:57,810 --> 00:06:00,393 ali v težavah, ki je bolj običajno s poskuša ugotoviti, 145 00:06:00,393 --> 00:06:02,150 segmentacijo krivda, ki na splošno pomeni, 146 00:06:02,150 --> 00:06:05,017 ste dotika segment pomnilnika, ki ga ne bi smelo biti. 147 00:06:05,017 --> 00:06:07,350 Ste dotika spomin, da operacijski sistem nima 148 00:06:07,350 --> 00:06:10,450 dovoli si na dotik, ali je tako, da greste predaleč v vašem polju 149 00:06:10,450 --> 00:06:12,870 ali že sedaj, ali to je zato, ker ste se dotaknili 150 00:06:12,870 --> 00:06:14,780 pomnilnika, ki je le nekaj smeti vrednost. 151 00:06:14,780 --> 00:06:18,230 >> Torej delaš zvezdicami x tu nekako nedefinirano vedenja. 152 00:06:18,230 --> 00:06:22,030 Nikoli ne bi smeli storiti, ker kvota so, program je le, da bo crash, 153 00:06:22,030 --> 00:06:24,050 ker praviš, pojdite na ta naslov 154 00:06:24,050 --> 00:06:27,000 in nimate pojma, kje da je naslov dejansko je. 155 00:06:27,000 --> 00:06:30,300 Tako operacijski sistem je verjetno bo crash svoj program 156 00:06:30,300 --> 00:06:33,840 kot rezultat in seveda, da je kaj pa se je zgodilo, da Binky. 157 00:06:33,840 --> 00:06:37,210 Torej v končni fazi, Binky določen ta problem s tem. 158 00:06:37,210 --> 00:06:38,909 Torej tega programa je bila sama napačna. 159 00:06:38,909 --> 00:06:41,450 Ampak, če ste nekako korak naprej in namesto da bi izvršitev te vrstice, 160 00:06:41,450 --> 00:06:45,580 y enaka x samo pomeni karkoli naslov je x, prav tako ga v y. 161 00:06:45,580 --> 00:06:48,740 >> In tako slikovno, ki smo jih to predstavlja z dvema puščicama 162 00:06:48,740 --> 00:06:51,570 od x in y je obrnjena na istem mestu. 163 00:06:51,570 --> 00:06:55,760 Torej pomensko, x je enak y, ker obe tistih 164 00:06:55,760 --> 00:07:00,300 shranjujete enako naslov, ergo kaže na 42, 165 00:07:00,300 --> 00:07:04,910 in zdaj, ko rečeš zvezdo y, pojdite na naslov v y, 166 00:07:04,910 --> 00:07:06,790 to je zanimiv stranski učinek. 167 00:07:06,790 --> 00:07:10,320 Torej naslov v y je ista stvar kot naslov v x. 168 00:07:10,320 --> 00:07:15,060 Torej, če ste rekli, pojdite na naslov na y in spremenite vrednost do 13, 169 00:07:15,060 --> 00:07:17,140 kdo drug prizadet? 170 00:07:17,140 --> 00:07:21,100 X, točka D, tako rekoč, sme biti prizadeta kot dobro. 171 00:07:21,100 --> 00:07:24,340 >> In res, kako Nick narisal to sliko v claymation je točno to. 172 00:07:24,340 --> 00:07:28,665 Čeprav sledimo kazalec y, smo se znašli na istem mestu, 173 00:07:28,665 --> 00:07:32,780 in tako, če smo bili za tiskanje od x ali pointee Y-ov, 174 00:07:32,780 --> 00:07:35,720 potem bi videli vrednost 13. 175 00:07:35,720 --> 00:07:37,927 Zdaj pa rečem pointee biti v skladu z videom. 176 00:07:37,927 --> 00:07:39,760 Programerji, da moj znanje, nikoli dejansko 177 00:07:39,760 --> 00:07:42,460 reci pointee, tisti, ki je koničasta 178 00:07:42,460 --> 00:07:44,650 na, toda zaradi doslednosti z video, zavedaš 179 00:07:44,650 --> 00:07:47,520 to je vse, kar je bilo mišljeno v tej situaciji. 180 00:07:47,520 --> 00:07:54,190 Tako da kakršna koli vprašanja o claymation ali kazalci ali malloc samo še? 181 00:07:54,190 --> 00:07:54,850 Ne? 182 00:07:54,850 --> 00:07:55,470 V redu. 183 00:07:55,470 --> 00:07:58,560 >> Torej brez nadaljnje ado, vzemimo si oglejte 184 00:07:58,560 --> 00:08:00,700 v kateri ima ta dejansko niso bili uporabljeni za nekaj časa. 185 00:08:00,700 --> 00:08:03,580 Torej smo imeli to knjižnico CS50 da je dobil vse te funkcije. 186 00:08:03,580 --> 00:08:06,810 Mi smo uporabili GetInt veliko, GetString, Verjetno GetLongLong prej 187 00:08:06,810 --> 00:08:09,840 V mojem PSet eno ali tako, ampak kaj se dejansko dogaja? 188 00:08:09,840 --> 00:08:12,920 No, kaj je na hitro pogledamo Pod pokrovom na programu, ki 189 00:08:12,920 --> 00:08:17,017 navdihuje zakaj Ponujamo vam CS50 dal knjižnica, in seveda, kot prejšnji teden, 190 00:08:17,017 --> 00:08:18,850 smo začeli pri tistih, kolesa usposabljanja off. 191 00:08:18,850 --> 00:08:21,080 Torej je to zdaj urejeno iz Obdukcija kaj 192 00:08:21,080 --> 00:08:23,690 bil je dogajalo znotraj knjižnici CS50, 193 00:08:23,690 --> 00:08:27,250 čeprav bomo zdaj začnejo premikati proč od nje za večino programov. 194 00:08:27,250 --> 00:08:29,460 >> Torej, to je program, imenovan scanf 0. 195 00:08:29,460 --> 00:08:30,510 To je super kratek. 196 00:08:30,510 --> 00:08:33,909 Treba ga je le te vrstice, vendar uvaja funkcijo imenovano scanf 197 00:08:33,909 --> 00:08:36,909 da smo dejansko videli v trenutek znotraj knjižnice CS50, 198 00:08:36,909 --> 00:08:38,600 čeprav v nekoliko drugačni obliki. 199 00:08:38,600 --> 00:08:41,330 Torej ta program na liniji 16 se razglasi spremenljivko x. 200 00:08:41,330 --> 00:08:43,150 Tako mi je dala štiri bajte za notr. 201 00:08:43,150 --> 00:08:45,750 To je bilo pove uporabniku, Število prosim, in potem 202 00:08:45,750 --> 00:08:49,010 To je zanimiva vrstica, ki dejansko povezuje skupaj prejšnji teden 203 00:08:49,010 --> 00:08:49,790 in to. 204 00:08:49,790 --> 00:08:53,230 Scanf, nato pa opazite, da traja format niz, podobno kot printf, 205 00:08:53,230 --> 00:08:57,480 % i pomeni int, potem pa traja Drugi argument, ki izgleda malo 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 To je ampersand x, in da se spomni, smo videli samo enkrat prejšnji teden. 208 00:09:01,880 --> 00:09:03,465 Kaj ampersand x predstavlja? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Kaj ampersand storiti v C? 211 00:09:08,450 --> 00:09:08,950 Ja? 212 00:09:08,950 --> 00:09:10,024 >> OBČINSTVO: Naslov. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Naslov. 214 00:09:11,190 --> 00:09:13,190 Torej je nasprotno upravljavca zvezdicami, 215 00:09:13,190 --> 00:09:17,270 ker je operater zvezda pravi, pojdite na Ta naslov je ampersand operator 216 00:09:17,270 --> 00:09:20,280 pravi, ugotovimo, naslov te spremenljivke, 217 00:09:20,280 --> 00:09:23,530 in zato je to ključnega pomena, saj Namen scanf v življenju 218 00:09:23,530 --> 00:09:26,320 je za skeniranje uporabnikov vhod s tipkovnice, 219 00:09:26,320 --> 00:09:29,970 glede na to, kar on ali ona vrste, nato pa preberite prispevek tega uporabnika 220 00:09:29,970 --> 00:09:32,970 v spremenljivko, vendar smo videli v zadnjih dveh tednih 221 00:09:32,970 --> 00:09:36,080 da je ta funkcija swap, da smo Poskušal truda za izvedbo 222 00:09:36,080 --> 00:09:37,110 Samo zdrobljen. 223 00:09:37,110 --> 00:09:42,470 Spomnimo se, da s funkcijo zamenjave, če smo samo izjavila A in B, kot ints, 224 00:09:42,470 --> 00:09:47,040 nismo uspešno zamenjali dve spremenljivki znotraj zamenjave 225 00:09:47,040 --> 00:09:50,080 ravno tako kot z mlekom in UL, ampak čim prej vrnil swap, 226 00:09:50,080 --> 00:09:55,200 kakšen je bil rezultat v zvezi z za x in y, izvirne vrednote? 227 00:09:55,200 --> 00:09:55,700 Nič. 228 00:09:55,700 --> 00:09:56,200 Ja. 229 00:09:56,200 --> 00:09:59,754 Nič se ni zgodilo, da je čas, ker zamenjave spremeni le svoje lokalne kopije, 230 00:09:59,754 --> 00:10:01,670 kar pomeni, vse ta čas, ko smo imel 231 00:10:01,670 --> 00:10:04,010 bili kratki v argumentih do funkcij, smo 232 00:10:04,010 --> 00:10:05,939 pravkar poteka kopije teh trditev. 233 00:10:05,939 --> 00:10:07,980 To lahko storite s tem karkoli želite z njimi, 234 00:10:07,980 --> 00:10:10,890 ampak oni bodo morali ne Vpliv na prvotne vrednosti. 235 00:10:10,890 --> 00:10:13,650 Torej je to problematično, če vas želite imeti funkcijo, kot scanf 236 00:10:13,650 --> 00:10:17,170 v življenju, katere namen je, da skeniranje uporabnikovo vnosna 237 00:10:17,170 --> 00:10:22,010 in nato izpolnite prazne, tako da rekoč, to pomeni, da dobimo spremenljivko, kot je X 238 00:10:22,010 --> 00:10:25,410 vrednost, ker če bi bil jaz samo prenese X scanf, 239 00:10:25,410 --> 00:10:28,790 Če menite, da je logiko zadnji teden, scanf lahko storite karkoli hoče 240 00:10:28,790 --> 00:10:33,100 s kopijo x, vendar ni mogel trajno spremeniti x, če damo 241 00:10:33,100 --> 00:10:37,120 scanf zemljevid zaklada, tako rekoč, kjer x označuje mesto, s katerim 242 00:10:37,120 --> 00:10:41,860 peljemo v naslovu X, ki scanf more iti tja in dejansko sprememba 243 00:10:41,860 --> 00:10:42,920 vrednost x. 244 00:10:42,920 --> 00:10:45,080 In tako v resnici, vse da ta program ne 245 00:10:45,080 --> 00:10:53,180 če naredim scanf 0, v mojem viru Imenik 5m, da scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot poševnica scanf, število prosim 50, hvala za 50. 247 00:10:57,730 --> 00:11:01,020 >> Torej, to ni vse, da je zanimivo, ampak kaj se dejansko dogaja 248 00:11:01,020 --> 00:11:04,820 je, da je takoj, ko sem poklical scanf tukaj, vrednost x 249 00:11:04,820 --> 00:11:06,410 se trajno spremenile. 250 00:11:06,410 --> 00:11:08,335 Zdaj pa se zdi to lepo in dobro, v resnici pa 251 00:11:08,335 --> 00:11:11,200 Zdi se, kot ne bomo res potrebujejo knjižnica CS50 sploh več. 252 00:11:11,200 --> 00:11:13,960 Na primer, kaj je prost še enkrat tukaj. 253 00:11:13,960 --> 00:11:15,750 Naj ga znova odpreti za sekundo. 254 00:11:15,750 --> 00:11:20,600 Poskusimo številko prosim in namesto da bi rekel 50 kot prej, 255 00:11:20,600 --> 00:11:22,810 kaj je samo reči ne. 256 00:11:22,810 --> 00:11:24,000 OK, to je malo čudno. 257 00:11:24,000 --> 00:11:25,270 V REDU. 258 00:11:25,270 --> 00:11:28,680 In le nekaj neumnosti tukaj. 259 00:11:28,680 --> 00:11:31,170 Torej se ne zdi, da ročaj napačne situacije. 260 00:11:31,170 --> 00:11:33,620 Zato moramo minimalno začetek dodal nekaj napak preverjanje 261 00:11:33,620 --> 00:11:37,460 se prepričajte, da ima uporabnik vnesli v dejanskem številu kot 50 let, 262 00:11:37,460 --> 00:11:40,720 ker očitno tipkanje besed ne zazna kot problematična, 263 00:11:40,720 --> 00:11:42,020 morda pa bi bilo. 264 00:11:42,020 --> 00:11:46,450 >> Oglejmo si te različice zdaj, da je moj poskus reimplement GetString. 265 00:11:46,450 --> 00:11:48,437 Če ima scanf vse to funkcionalnost vgrajeno, 266 00:11:48,437 --> 00:11:51,270 Zato smo bili dabbling z njimi kolesa usposabljanja, kot GetString? 267 00:11:51,270 --> 00:11:55,450 No, tukaj je morda moja preprosta različica GetString 268 00:11:55,450 --> 00:12:00,766 pri čemer je pred tednom dni, morda sem rekel, dajte mi niz in call it buffer. 269 00:12:00,766 --> 00:12:03,390 Danes bom šele začetek rekoč char zvezdo, ki je odpoklic, 270 00:12:03,390 --> 00:12:04,400 to je samo sinonim. 271 00:12:04,400 --> 00:12:06,629 Videti je strašnejši vendar je točno isto stvar. 272 00:12:06,629 --> 00:12:09,420 Torej mi spremenljivo imenovano pufer da se dogaja, da shranite niz, 273 00:12:09,420 --> 00:12:12,780 povej uporabniško niz prosim, in nato, tako kot prej, 274 00:12:12,780 --> 00:12:17,760 poskusimo sposodim to lekcijo scanf % s tem čas, nato pa preide v pufru. 275 00:12:17,760 --> 00:12:19,310 Zdaj, ček hitro sanity. 276 00:12:19,310 --> 00:12:22,120 Zakaj nisem rekel ampersand buffer ta čas? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Sklepamo iz prejšnjega primera. 279 00:12:26,625 --> 00:12:28,000 OBČINSTVO: Char zvezda je kazalec. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Točno, ker je ta čas, char 281 00:12:29,920 --> 00:12:34,080 zvezda je že kazalec, naslov, po definiciji te zvezde, da so tam. 282 00:12:34,080 --> 00:12:37,530 In če scanf pričakuje, naslov, je dovolj samo, da prenese v pufru. 283 00:12:37,530 --> 00:12:39,260 Ne rabim povedati ampersand buffer. 284 00:12:39,260 --> 00:12:42,177 Za radovedne, lahko narediti kaj takega. 285 00:12:42,177 --> 00:12:43,510 To bi imelo drugačen pomen. 286 00:12:43,510 --> 00:12:47,240 To bi vam kazalec na kazalec, ki je pravzaprav 287 00:12:47,240 --> 00:12:50,050 veljaven stvar C, vendar Zdaj, kaj je naj bo enostavno 288 00:12:50,050 --> 00:12:51,750 in obdržati zgodbo dosledni. 289 00:12:51,750 --> 00:12:54,100 Jaz sem le, da bo prehod v hranilnike ter da je pravilna. 290 00:12:54,100 --> 00:12:56,487 Problem, čeprav je to. 291 00:12:56,487 --> 00:12:58,820 Naj gredo naprej in vodijo to Program po njegovi izdelavi. 292 00:12:58,820 --> 00:13:00,902 Naredite scanf 1. 293 00:13:00,902 --> 00:13:02,610 Prekleto, moj prevajalnik je lov mojo napako. 294 00:13:02,610 --> 00:13:04,090 Daj mi eno sekundo. 295 00:13:04,090 --> 00:13:05,460 Jek. 296 00:13:05,460 --> 00:13:06,990 Recimo scanf-1.C. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 V REDU. 299 00:13:11,380 --> 00:13:12,720 Tam gremo. 300 00:13:12,720 --> 00:13:14,280 Rabim ga. 301 00:13:14,280 --> 00:13:16,750 CS50 ID ima različne konfiguracijske nastavitve 302 00:13:16,750 --> 00:13:18,280 da vas ščiti proti sebi. 303 00:13:18,280 --> 00:13:21,300 Potreboval sem onemogočiti tiste, ki jih teče Jek ročno tokrat. 304 00:13:21,300 --> 00:13:22,140 Torej niz prosim. 305 00:13:22,140 --> 00:13:25,560 Grem, da gredo naprej in tip V mojem najljubšem Hello World. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 To ni tisto, kar sem tipkal. 308 00:13:27,700 --> 00:13:29,690 Torej, to je znak kaj pa narobe. 309 00:13:29,690 --> 00:13:33,920 Naj gredo naprej in tip v zelo dolgo vrvico. 310 00:13:33,920 --> 00:13:37,210 Hvala za nično, in ne vem, če bom lahko to sesuje. 311 00:13:37,210 --> 00:13:40,240 Poskusimo malo kopijo paste in videli, če to pomaga. 312 00:13:40,240 --> 00:13:43,290 Samo prilepite veliko tega. 313 00:13:43,290 --> 00:13:47,310 To je definitivno večji niz kot običajno. 314 00:13:47,310 --> 00:13:51,450 Naj samo res pisati. 315 00:13:51,450 --> 00:13:51,950 No. 316 00:13:51,950 --> 00:13:52,650 Prekleto. 317 00:13:52,650 --> 00:13:53,480 Ukaz ni bilo mogoče najti. 318 00:13:53,480 --> 00:13:54,550 Tako da je nepovezana. 319 00:13:54,550 --> 00:13:56,440 To je zato, ker sem prilepili nekaj slabih znakov, 320 00:13:56,440 --> 00:13:59,780 vendar se to izkaže se, ne bo šlo. 321 00:13:59,780 --> 00:14:03,510 >> Poskusimo še enkrat, ker to je bolj zabavno, če bomo dejansko sesuje. 322 00:14:03,510 --> 00:14:09,116 Naj ta tip in zdaj sem bo kopirati res dolg niz 323 00:14:09,116 --> 00:14:10,990 zdaj pa da vidimo, če bomo lahko crash to stvar. 324 00:14:10,990 --> 00:14:14,235 Opazili sem izpuščena prostore in Nove linije in podpičja 325 00:14:14,235 --> 00:14:16,035 in vse funky znakov. 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 In sedaj omrežje je le da počasi. 329 00:14:22,880 --> 00:14:27,460 Držal sem dol Command-V predolgo, je jasno. 330 00:14:27,460 --> 00:14:28,190 Prekleto! 331 00:14:28,190 --> 00:14:29,260 Ukaz ni bilo mogoče najti. 332 00:14:29,260 --> 00:14:29,780 >> V REDU. 333 00:14:29,780 --> 00:14:32,240 No, dejstvo je, kljub temu naslednje. 334 00:14:32,240 --> 00:14:36,910 Torej, kaj se dejansko dogaja o tej izjavi 335 00:14:36,910 --> 00:14:39,240 od char zvezdicami odbojnikom na liniji 16? 336 00:14:39,240 --> 00:14:41,820 Torej, kaj sem že ko sem razglasi kazalec? 337 00:14:41,820 --> 00:14:47,440 Vse sem že je štiri byte vrednost imenuje buffer, ampak tisto, kar je znotraj njega 338 00:14:47,440 --> 00:14:49,540 v tem trenutku? 339 00:14:49,540 --> 00:14:50,930 To je samo nekaj smeti vrednost. 340 00:14:50,930 --> 00:14:54,170 Ker boste kadarkoli razglasi spremenljivko v C, to je samo nekaj smeti vrednost, 341 00:14:54,170 --> 00:14:56,220 in smo začeli spotakniti to realnost. 342 00:14:56,220 --> 00:14:59,720 Zdaj, ko sem povedal, scanf, pojdite na ta naslov 343 00:14:59,720 --> 00:15:01,520 in jih ne glede na vrste uporabnikov v. 344 00:15:01,520 --> 00:15:06,400 Če uporabnik vnese v zdravo world, dobro, kje sem ga dal? 345 00:15:06,400 --> 00:15:07,750 Pufer smeti vrednost. 346 00:15:07,750 --> 00:15:11,510 >> Torej, to je nekako kot puščica ki je obrnjena kdo ve kam. 347 00:15:11,510 --> 00:15:13,880 Morda je to obrnjena prav tukaj, v mojem spominu. 348 00:15:13,880 --> 00:15:16,560 In tako, ko uporabnik vrste v Hello World, 349 00:15:16,560 --> 00:15:22,380 Program poskuša dal Niz Zdravo svet poševnica nazaj 0 350 00:15:22,380 --> 00:15:23,910 s tem, da kos pomnilnika. 351 00:15:23,910 --> 00:15:27,070 Vendar z veliko verjetnostjo, vendar očitno ni 100% verjetnost, 352 00:15:27,070 --> 00:15:30,440 računalnik se bo potem crash program, saj to ni 353 00:15:30,440 --> 00:15:32,490 spomin I je treba dovoliti, da se dotaknete. 354 00:15:32,490 --> 00:15:36,330 Torej, na kratko, je ta program napačna natanko tega razloga. 355 00:15:36,330 --> 00:15:38,070 Jaz sem v bistvu ne delaš, kaj? 356 00:15:38,070 --> 00:15:42,366 Kakšne korake sem izpuščena, prav tako kot Izpustili smo s prvim primerom Binky je? 357 00:15:42,366 --> 00:15:42,866 Ja? 358 00:15:42,866 --> 00:15:43,710 >> OBČINSTVO: dodelitev pomnilnika? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: dodelitev pomnilnika. 360 00:15:45,001 --> 00:15:48,400 Imam dejansko ni dodeljena katerikoli pomnilnik za ta niz. 361 00:15:48,400 --> 00:15:50,270 Tako bomo lahko to popraviti v nekaj načinov. 362 00:15:50,270 --> 00:15:52,700 Ena, lahko ga bo enostavno in v resnici, zdaj si 363 00:15:52,700 --> 00:15:55,116 bodo začeli videti zameglitev prog med kaj 364 00:15:55,116 --> 00:15:58,520 matrika je, kaj je niz je, kaj char zvezda je, kakšna niz znakov 365 00:15:58,520 --> 00:15:59,020 je. 366 00:15:59,020 --> 00:16:02,450 Tukaj je drugi primer vključuje godala in obvestila 367 00:16:02,450 --> 00:16:05,690 Vse sem naredil na spletu 16 je, namesto da bi rekoč 368 00:16:05,690 --> 00:16:09,530 da buffer se bo char zvezda, kazalec na kos pomnilnika, 369 00:16:09,530 --> 00:16:14,057 Bom zelo proaktivno dati Sam pufer za 16 znakov, 370 00:16:14,057 --> 00:16:16,390 in v resnici, če ste seznanjeni z izrazom pufrskih, 371 00:16:16,390 --> 00:16:20,570 Verjetno iz sveta video posnetkov, kjer je video zapufranje, pufersko, 372 00:16:20,570 --> 00:16:21,175 pufrno. 373 00:16:21,175 --> 00:16:22,550 No, kaj je povezava tukaj? 374 00:16:22,550 --> 00:16:24,960 No, Inside YouTubu in notranjost video predvajalniki 375 00:16:24,960 --> 00:16:27,200 običajno je matrika ki je večji od 16. 376 00:16:27,200 --> 00:16:30,340 Morda bi bilo array velikosti enega megabajt, morda 10 megabajtov, 377 00:16:30,340 --> 00:16:34,330 in v tem polju ne brskalnik prenesete cel kup bajtov, 378 00:16:34,330 --> 00:16:37,500 cel kup MB video in video predvajalnik, 379 00:16:37,500 --> 00:16:40,930 YouTube je ali kdo je, se začne branje bajte iz tega niza, 380 00:16:40,930 --> 00:16:43,530 in kadarkoli vidite Beseda zapufranje, pufersko, 381 00:16:43,530 --> 00:16:46,350 to pomeni, da ima igralec prišel do konca tega niza. 382 00:16:46,350 --> 00:16:50,430 Omrežje je tako počasi, da ima ne napolniti array z več bajti 383 00:16:50,430 --> 00:16:55,610 in tako ste iz bitov Za prikaz uporabniku. 384 00:16:55,610 --> 00:16:59,430 >> Torej pufer apt izraz tukaj s tem, da to je samo niz, kos pomnilnika. 385 00:16:59,430 --> 00:17:02,530 In bo to popraviti ker se je izkazalo, 386 00:17:02,530 --> 00:17:07,410 da lahko zdravljenje nizi, kot da so naslovi, čeprav pufer 387 00:17:07,410 --> 00:17:10,710 je samo simbol, to je zaporedje znakov, pufer, 388 00:17:10,710 --> 00:17:14,760 To je koristno za mene, programer, lahko prenese svoje ime po 389 00:17:14,760 --> 00:17:17,079 kot da bi bila kazalec, kot da bi to 390 00:17:17,079 --> 00:17:21,000 so naslov kos pomnilnika za 16 znakov. 391 00:17:21,000 --> 00:17:24,530 Torej, to se pravi, ne morem mimo scanf točno ta beseda 392 00:17:24,530 --> 00:17:30,670 in zdaj, če bi ta program, da scanf 2, pika slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 in tip v zdravo svet, Enter, da time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, kaj se je zgodilo? 395 00:17:37,590 --> 00:17:39,340 String prosim. 396 00:17:39,340 --> 00:17:41,430 Kaj sem naredila narobe? 397 00:17:41,430 --> 00:17:43,800 Zdravo svet, buffer. 398 00:17:43,800 --> 00:17:44,705 Pozdravljen, svet. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, vem, kaj počne. 401 00:17:49,420 --> 00:17:49,920 V REDU. 402 00:17:49,920 --> 00:17:51,628 Torej, to je branju do prvega prostora. 403 00:17:51,628 --> 00:17:55,680 Torej, kaj je goljufija za trenutek in reči sem hotel, da tip nekaj 404 00:17:55,680 --> 00:18:01,408 res dolgo, kot je to že dolgo stavek To je ena, dva, tri, štiri, pet, 405 00:18:01,408 --> 00:18:04,420 šest, sedem, osem, devet, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 V REDU. 407 00:18:05,300 --> 00:18:07,600 To je res dolg stavek. 408 00:18:07,600 --> 00:18:10,710 Torej, ta stavek je daljše od 16 znakov 409 00:18:10,710 --> 00:18:13,670 in tako, ko sem pritisnite tipko Enter, kaj se bo zgodilo? 410 00:18:13,670 --> 00:18:16,940 No, v tem primeru zgodba, sem izjavil buffer 411 00:18:16,940 --> 00:18:22,190 dejansko pa niz z 16 znakov pripravljena iti. 412 00:18:22,190 --> 00:18:27,426 Torej ena, dva, tri, štiri, pet, šest, sedem, osem, devet, 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 Torej 16 znakov, in zdaj, ko sem berejo v nekaj, kot je to že dolgo 415 00:18:34,410 --> 00:18:43,950 stavek, kaj se bo zgodilo, je da bom prebral v to je dolgo 416 00:18:43,950 --> 00:18:49,660 S-E-N-t-E-N = C-E, stavka. 417 00:18:49,660 --> 00:18:52,270 >> Torej, to je namerno slaba stvar, ki sem 418 00:18:52,270 --> 00:18:55,060 voditi pisno onkraj Meje mojega array, 419 00:18:55,060 --> 00:18:56,660 presega meje mojega pufra. 420 00:18:56,660 --> 00:19:00,100 Lahko bi dobil srečen in program bo še naprej teče in ne skrbi, 421 00:19:00,100 --> 00:19:03,450 vendar na splošno, to bo dejansko crash svoj program, 422 00:19:03,450 --> 00:19:06,440 in to je napaka v mojem kodo trenutek stopim 423 00:19:06,440 --> 00:19:08,576 prek meja tega polja, saj sem 424 00:19:08,576 --> 00:19:10,450 Ne vem, če je to nujno bo crash 425 00:19:10,450 --> 00:19:12,120 ali če sem šele tekoč, da bi dobili srečo. 426 00:19:12,120 --> 00:19:15,750 Torej je to problematično, ker v V tem primeru, se zdi, da se delo 427 00:19:15,750 --> 00:19:20,931 in kaj je napeljala usodo tukaj, čeprav IDE zdi tolerirati zelo malo 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Tam gremo. 430 00:19:22,040 --> 00:19:23,240 Končno. 431 00:19:23,240 --> 00:19:26,470 Tako da sem edini, ki lahko to videli. 432 00:19:26,470 --> 00:19:29,630 Tako da sem imel veliko zabave tipkanje ven res dolgo dejanskega frazo 433 00:19:29,630 --> 00:19:32,800 da zagotovo presežena 16 bajtov, ker sem 434 00:19:32,800 --> 00:19:38,050 vnesli v to noro dolge multi-line stavek, nato pa opazil, kaj se je zgodilo. 435 00:19:38,050 --> 00:19:41,110 Program potrudil tiskanje in nato dobil napako segmentacije 436 00:19:41,110 --> 00:19:44,430 in segmentacijo napake je, ko kaj takega zgodi 437 00:19:44,430 --> 00:19:47,650 in operacijski sistem pravi, ne, ne more dotakniti, da je spomin. 438 00:19:47,650 --> 00:19:49,570 Bomo ubili program v celoti. 439 00:19:49,570 --> 00:19:51,180 >> Torej, to se zdi problematično. 440 00:19:51,180 --> 00:19:54,540 Sem izboljšala programov, pri katerih vsaj nekaj spomina, 441 00:19:54,540 --> 00:19:58,000 to, ampak se zdi, da bodo omejili funkcija GetString za pridobivanje 442 00:19:58,000 --> 00:20:00,780 nizi neke končne dolžine 16. 443 00:20:00,780 --> 00:20:04,200 Torej, če želite, da podpirajo več kazni od 16 znakov, 444 00:20:04,200 --> 00:20:04,880 kaj počneš? 445 00:20:04,880 --> 00:20:07,970 No, lahko poveča Velikost tega blažilca do 32 446 00:20:07,970 --> 00:20:09,190 ali da se zdi nekako kratek. 447 00:20:09,190 --> 00:20:12,260 Zakaj ne samo da je 1000, vendar potisnite nazaj. 448 00:20:12,260 --> 00:20:17,100 Kakšen je odziv intuitivno od Samo ne pride do tega problema, tako da 449 00:20:17,100 --> 00:20:20,660 moj buffer večji kot 1.000 znakov? 450 00:20:20,660 --> 00:20:23,470 Z izvajanjem GetString ta način. 451 00:20:23,470 --> 00:20:27,130 Kaj je dobro ali slabo tukaj? 452 00:20:27,130 --> 00:20:28,033 Ja? 453 00:20:28,033 --> 00:20:30,574 OBČINSTVO: Če se veže na veliko prostora in ga ne uporabljajte, 454 00:20:30,574 --> 00:20:33,500 potem ne more prerazporediti ta prostor. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Absolutno. 456 00:20:34,500 --> 00:20:38,480 To je potratno, kolikor če ne dejansko potrebujejo 900 teh bajtov 457 00:20:38,480 --> 00:20:41,057 in vendar ste prosi za 1000 skupaj nekako, 458 00:20:41,057 --> 00:20:44,140 ste pravkar porabijo več pomnilnika na uporabnikov računalnik, kot ga potrebujete, 459 00:20:44,140 --> 00:20:45,740 in navsezadnje nekatere ste že naleteli 460 00:20:45,740 --> 00:20:47,620 v življenju, ko ste teče veliko programov 461 00:20:47,620 --> 00:20:50,470 in oni jedo veliko spomina, To lahko dejansko vpliva na delovanje 462 00:20:50,470 --> 00:20:52,220 in uporabnikova izkušnja na računalniku. 463 00:20:52,220 --> 00:20:56,090 Torej, to je nekako leni rešitev, za prepričani, in obratno, 464 00:20:56,090 --> 00:21:00,140 to ni samo potratna, kar problem še vedno, tudi, če naredim svoj buffer 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Ja? 467 00:21:02,600 --> 00:21:04,475 >> OBČINSTVO: Niz je dolžina 1001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Točno tako. 469 00:21:05,350 --> 00:21:08,280 Če je vaš niz je dolžina 1001, imaš točno isti problem, 470 00:21:08,280 --> 00:21:10,705 in moj argument, jaz bi samo potem bi bilo 2000, 471 00:21:10,705 --> 00:21:12,830 vendar ne veste, v napredovanje, kako velika bi morala biti, 472 00:21:12,830 --> 00:21:16,890 in še, moram sestaviti svoj program pred najemnin ljudje uporabljajo in prenos 473 00:21:16,890 --> 00:21:17,390 ga. 474 00:21:17,390 --> 00:21:21,490 Torej, to je točno vrsta stvari, ki so knjižnice poskuša CS50 475 00:21:21,490 --> 00:21:24,750 da nam pomagate s in bomo samo pogled na nekatere od osnovnega izvajanja 476 00:21:24,750 --> 00:21:29,790 tukaj, ampak to je CS50 pika C. To je datoteka, ki je bil na CS50 IDE 477 00:21:29,790 --> 00:21:31,420 vse te tedne, da ste bili z uporabo. 478 00:21:31,420 --> 00:21:34,280 To je predhodno pripravijo in ste been using samodejno 479 00:21:34,280 --> 00:21:38,780 po naravi ki ima dash L CS50 zastavo z Jek, 480 00:21:38,780 --> 00:21:42,300 ampak če sem se pomaknite navzdol skozi vse te funkcije, tukaj je GetString, 481 00:21:42,300 --> 00:21:44,636 in samo, da vam okus, kaj se dogaja, 482 00:21:44,636 --> 00:21:46,760 Vzemimo hiter pogled na relativna kompleksnost. 483 00:21:46,760 --> 00:21:48,870 To ni zelo dolgo funkcija, vendar nismo 484 00:21:48,870 --> 00:21:52,530 morali razmišljati vsi težko o kako iti okoli dobili strune. 485 00:21:52,530 --> 00:21:55,660 >> Torej, tukaj je moj buffer in jaz očitno inicializacijo NULL. 486 00:21:55,660 --> 00:21:57,990 To seveda je ista stvar kot char zvezda, 487 00:21:57,990 --> 00:22:00,585 vendar sem se odločil v izvajanje knjižnico CS50 488 00:22:00,585 --> 00:22:02,460 da če bomo popolnoma dinamično, 489 00:22:02,460 --> 00:22:05,770 Ne vem v naprej, kako velik od Uporabniki niz bodo želeli priti. 490 00:22:05,770 --> 00:22:08,140 Tako da bom za začetek s samo prazen niz 491 00:22:08,140 --> 00:22:11,507 in bom zgraditi toliko spomin kot moram, da se prilega uporabniško niz 492 00:22:11,507 --> 00:22:13,340 in če nimam dovolj, bom vprašal 493 00:22:13,340 --> 00:22:15,010 operacijski sistem za več pomnilnika. 494 00:22:15,010 --> 00:22:17,510 Grem, da se premaknete svoj niz v večji kos pomnilnika 495 00:22:17,510 --> 00:22:21,847 in jaz grem v javnost ali osvoboditi dovolj velik kos pomnilnika 496 00:22:21,847 --> 00:22:23,680 in smo le, da bo za to iterativno. 497 00:22:23,680 --> 00:22:25,570 >> Torej, hiter pogled, tukaj je samo spremenljivka 498 00:22:25,570 --> 00:22:28,780 s katero bom slediti zmogljivosti mojega pufra. 499 00:22:28,780 --> 00:22:30,071 Koliko bajtov lahko fit? 500 00:22:30,071 --> 00:22:32,070 Tukaj je spremenljivka n z ki grem naprej 501 00:22:32,070 --> 00:22:36,200 tir, koliko bajtov so dejansko varovalni ali da je uporabnik natipkan. 502 00:22:36,200 --> 00:22:39,900 Če ste ni videla tega, vas lahko določite, da se spremenljivka kot int 503 00:22:39,900 --> 00:22:46,370 je nepodpisan, ki je kot že ime pove, pomeni, da je non-negativno, in zakaj bi 504 00:22:46,370 --> 00:22:50,590 Sem kdaj želeli, da sitnost, ki določajo, da je int ni le int, 505 00:22:50,590 --> 00:22:52,540 ampak to je nepodpisani int? 506 00:22:52,540 --> 00:22:55,064 To je nenegativno int. 507 00:22:55,064 --> 00:22:56,355 Kaj [neslišno] pomeni? 508 00:22:56,355 --> 00:22:58,910 >> OBČINSTVO: To je opisovanje znesek pomnilnika, ki se lahko [neslišno]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Ja. 510 00:22:59,660 --> 00:23:03,710 Torej, če rečem, nepodpisana, je to dejansko vam eno malo dodatnega pomnilnika 511 00:23:03,710 --> 00:23:07,440 in zdi nekako neumno, ampak, če vas en bit dodatnim pomnilnikom, ki 512 00:23:07,440 --> 00:23:09,940 pomeni, da imate dvakrat več vrednosti, ki jih lahko predstavljajo, 513 00:23:09,940 --> 00:23:11,570 ker je lahko 0 ali 1. 514 00:23:11,570 --> 00:23:14,660 Torej privzeto, lahko int lahko v grobem negativna 2 milijardi vse tja 515 00:23:14,660 --> 00:23:16,030 do pozitivnega 2 milijardi. 516 00:23:16,030 --> 00:23:18,540 Tisti, ki so veliki razponi, vendar je še vedno nekako potratna 517 00:23:18,540 --> 00:23:21,280 Če vas skrbi le okoli velikosti, ki je samo intuitivno 518 00:23:21,280 --> 00:23:24,620 mora biti non-negativna ali pozitivna ali 0, tudi potem, 519 00:23:24,620 --> 00:23:28,884 zakaj ste zapravljaš 2 milijardi Možne vrednosti za negativne številke 520 00:23:28,884 --> 00:23:30,300 če ste nikoli ne bo za njihovo uporabo? 521 00:23:30,300 --> 00:23:35,350 Torej z besedami nepodpisan, zdaj moj int lahko biti med 0 in približno 4 milijarde. 522 00:23:35,350 --> 00:23:39,280 >> Torej, tukaj je samo int C razlogov ne bomo dobili v pravkar kot 523 00:23:39,280 --> 00:23:42,280 zakaj je to int namesto iz char, ampak tukaj je 524 00:23:42,280 --> 00:23:44,630 bistvo tega, kar se dogaja na, in nekateri od vas 525 00:23:44,630 --> 00:23:48,340 lahko uporabi, na primer, fgetc funkcija tudi v PSet štirih 526 00:23:48,340 --> 00:23:51,580 ali pozneje, bomo videli spet problem nastaviti pet, 527 00:23:51,580 --> 00:23:55,410 fgetc je lepo, ker kot ime vrste, nekako arcanely predlaga, 528 00:23:55,410 --> 00:23:57,940 je funkcija, ki dobi značaj in tako, 529 00:23:57,940 --> 00:24:00,690 kaj je bistveno drugačen o tem, kaj delamo v GetString 530 00:24:00,690 --> 00:24:03,110 se ne bomo s pomočjo scanf na enak način. 531 00:24:03,110 --> 00:24:07,550 Mi smo šele plazi po korak-po-korak več kot karkoli je uporabnik vtipka, 532 00:24:07,550 --> 00:24:10,970 ker smo lahko vedno dodeli enega char, tako da bomo lahko vedno varno 533 00:24:10,970 --> 00:24:15,599 poglej en char naenkrat, in magija začne dogajati tukaj. 534 00:24:15,599 --> 00:24:17,890 Grem, da se pomaknete navzdol Sredi te funkcije 535 00:24:17,890 --> 00:24:20,360 Samo na kratko predstavim to funkcijo. 536 00:24:20,360 --> 00:24:22,670 Podobno kot se je Funkcija malloc, tam je 537 00:24:22,670 --> 00:24:27,740 funkcija realloc kjer realloc upamo si prerazporedi kos pomnilnika 538 00:24:27,740 --> 00:24:29,570 in da je večja ali manjša. 539 00:24:29,570 --> 00:24:33,060 Torej skrajšam zgodbo in s val moje strani za danes, 540 00:24:33,060 --> 00:24:35,620 vem, da to, kar GetString počne je, da je nekako 541 00:24:35,620 --> 00:24:39,720 od čudežno raste ali krči pufra kot uporabnik 542 00:24:39,720 --> 00:24:41,440 vrste v svojem nizu. 543 00:24:41,440 --> 00:24:43,962 >> Torej, če uporabnik vnese kratek niz, ta koda 544 00:24:43,962 --> 00:24:45,920 le namenja dovolj spomin, da se prilega niz. 545 00:24:45,920 --> 00:24:48,086 Če uporabnik drži tipkanje kot sem ga znova in znova storil 546 00:24:48,086 --> 00:24:50,330 in spet, tudi, če je buffer je sprva to velik 547 00:24:50,330 --> 00:24:53,310 in program se zaveda, da Počakajte trenutek, da sem ven iz prostora, 548 00:24:53,310 --> 00:24:55,410 to se dogaja, da se podvoji velikost pufra 549 00:24:55,410 --> 00:24:59,110 in nato podvoji medpomnilnik in koda, ki ne podvojitev, 550 00:24:59,110 --> 00:25:03,170 če gledamo na to tu, to je samo to pameten one-liner. 551 00:25:03,170 --> 00:25:06,830 Niste morda videli to sintakso pred tem, ampak če rečeš zvezda enaka, 552 00:25:06,830 --> 00:25:10,470 to je isto, kot rekoč krat zmogljivosti 2. 553 00:25:10,470 --> 00:25:13,390 Torej je samo ohranja podvojitev kapaciteta pufra 554 00:25:13,390 --> 00:25:17,480 nato pa povedal realloc dati sam, da je veliko več pomnilnika. 555 00:25:17,480 --> 00:25:19,720 >> Zdaj, kot prahi, obstaja so druge funkcije v tukaj 556 00:25:19,720 --> 00:25:23,680 da ne bo videti v vsakem podrobnosti razen pokazati v GetInt, 557 00:25:23,680 --> 00:25:26,150 bomo uporabili GetString v GetInt. 558 00:25:26,150 --> 00:25:28,192 Preverite smo, da to ni null, ki, odpoklic, 559 00:25:28,192 --> 00:25:30,400 je posebna vrednost, ki pomeni nekaj, kar je šlo narobe. 560 00:25:30,400 --> 00:25:31,233 Mi smo iz spomina. 561 00:25:31,233 --> 00:25:32,310 Boljše preverite to. 562 00:25:32,310 --> 00:25:33,710 In bomo vrnili kontrolna vrednost. 563 00:25:33,710 --> 00:25:37,850 Ampak bom odloži do pripomb, kot da zakaj in potem bomo uporabili ta bratranec scanf 564 00:25:37,850 --> 00:25:42,100 imenuje sscanf in se izkaže, da sscanf ali niz scanf, 565 00:25:42,100 --> 00:25:45,310 upamo ste vzeli pogled na linijo, ki je uporabnik vtipka in pustil 566 00:25:45,310 --> 00:25:49,610 analizirati bistveno in kaj sem delaš tukaj se bom povedal sscanf, 567 00:25:49,610 --> 00:25:54,440 analizirali glede ima uporabnik vnesli v in se prepričajte% I, 568 00:25:54,440 --> 00:25:59,250 obstaja celo v njej, in ne bomo priti v danes točno, zakaj tam je tudi 569 00:25:59,250 --> 00:26:03,760 A% c tu, ampak da na kratko omogoča nam odkriti, če je uporabnik natipkan 570 00:26:03,760 --> 00:26:06,050 v nekaj lažnega po številu. 571 00:26:06,050 --> 00:26:11,766 Torej razlog, da GetInt in GetString vam povem, da poskusite znova, poskusite znova, poskusite znova 572 00:26:11,766 --> 00:26:13,640 je zaradi vse da koda smo pisno, 573 00:26:13,640 --> 00:26:17,900 To je nekako videti na vhodu uporabnika pri zagotavljanju, da je v celoti številsko 574 00:26:17,900 --> 00:26:21,700 ali je dejansko v plavajoči Vrednost točke ali podobno, 575 00:26:21,700 --> 00:26:24,233 odvisno od tega, kakšno vrednost delovanje, ki ga uporabljate. 576 00:26:24,233 --> 00:26:25,060 >> Uh. 577 00:26:25,060 --> 00:26:25,710 V REDU. 578 00:26:25,710 --> 00:26:27,592 To je bila zalogaja vendar je poanta tu 579 00:26:27,592 --> 00:26:29,550 da je razlog, da smo imeli ti kolesa usposabljanja o 580 00:26:29,550 --> 00:26:32,880 je zato, ker na najnižji ravni, Obstaja samo toliko stvari, da 581 00:26:32,880 --> 00:26:35,674 more iti narobe, da smo želeli da preemptively ročaj 582 00:26:35,674 --> 00:26:38,090 tiste stvari, zagotovo pa Prvi tedni razreda, 583 00:26:38,090 --> 00:26:42,230 zdaj pa z PSet štirimi in PSet pet in onstran boste videli, da je več k 584 00:26:42,230 --> 00:26:45,570 vi pa tudi, da ste bolj sposobni za reševanje te vrste problemov 585 00:26:45,570 --> 00:26:47,180 sami. 586 00:26:47,180 --> 00:26:51,770 Vsa vprašanja v zvezi GetString ali GetInt? 587 00:26:51,770 --> 00:26:52,630 Ja? 588 00:26:52,630 --> 00:26:55,130 >> OBČINSTVO: Zakaj bi podvojili kapaciteta pufra 589 00:26:55,130 --> 00:26:57,630 ne samo povečuje pa ga je točen znesek? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Dobro vprašanje. 591 00:26:58,100 --> 00:27:00,474 Zakaj bi podvojili zmogljivosti pufra v nasprotju 592 00:27:00,474 --> 00:27:02,800 da samo povečanje z neko konstantno vrednost? 593 00:27:02,800 --> 00:27:03,900 To je bila odločitev, design. 594 00:27:03,900 --> 00:27:08,590 Pravkar smo se odločili, ker se nagiba k malo dražje čas pametno vprašati 595 00:27:08,590 --> 00:27:10,440 operacijski sistem za spomin, nismo 596 00:27:10,440 --> 00:27:13,210 želite končati dobili v situacija za velike godala 597 00:27:13,210 --> 00:27:14,960 da smo spraševali znova in znova OS 598 00:27:14,960 --> 00:27:17,500 in znova in znova v hitro menjavanje za spomin. 599 00:27:17,500 --> 00:27:20,387 Torej smo pravkar odločila, da nekoliko samovoljno, vendar upamo, da upravičeno, 600 00:27:20,387 --> 00:27:22,720 da, veš kaj, dajmo poskusite dobiti pred sebe 601 00:27:22,720 --> 00:27:25,520 in kar naprej jo podvojili, tako da zmanjšujemo količino časa 602 00:27:25,520 --> 00:27:29,010 moramo poklicati malloc ali realloc, vendar skupno sodba 603 00:27:29,010 --> 00:27:31,820 klic v odsotnosti vedoč kaj bi uporabniki želeli vnesti. 604 00:27:31,820 --> 00:27:33,600 Oba načina bi lahko bilo sporno. 605 00:27:33,600 --> 00:27:35,430 Verjetno dobro. 606 00:27:35,430 --> 00:27:39,240 >> Torej, kaj si oglejte na nekaj drugih neželenih učinkov spomina, 607 00:27:39,240 --> 00:27:41,610 stvari, ki lahko gredo narobe in orodja, ki jih lahko 608 00:27:41,610 --> 00:27:43,880 uporabljajo za lov na te vrste napak. 609 00:27:43,880 --> 00:27:47,800 Izkazalo se je, vse vas, čeprav check50 vam ni povedal toliko, 610 00:27:47,800 --> 00:27:50,050 so bili pisno buggy koda od enega tedna, 611 00:27:50,050 --> 00:27:53,630 čeprav so vsi testi check50 so opravil, in tudi če vi in ​​vaš TF 612 00:27:53,630 --> 00:27:56,010 so super prepričani, da koda deluje, kot je bilo predvideno. 613 00:27:56,010 --> 00:27:59,190 Vaša koda je buggy ali pomanjkljiv, da vsi vi, 614 00:27:59,190 --> 00:28:02,540 pri uporabi knjižnice CS50, so pušča spomin. 615 00:28:02,540 --> 00:28:06,040 Ste bili sprašuje operacijski sistem za spomin v večini programov 616 00:28:06,040 --> 00:28:08,850 ki ste jih napisal, ampak ste nikoli dejansko dal nazaj. 617 00:28:08,850 --> 00:28:12,110 Ste jih imenuje GetString in GetInt in GetFloat, 618 00:28:12,110 --> 00:28:15,270 vendar z GetString, ste nikoli poklical unGetString ali Dajte 619 00:28:15,270 --> 00:28:19,890 String Back ali podobno, vendar smo videli da GetString ne dodeliti pomnilnika 620 00:28:19,890 --> 00:28:22,810 s pomočjo knjižnične funkcije malloc ali to Funkcija realloc, ki je pravkar 621 00:28:22,810 --> 00:28:25,670 zelo podobni v duhu, in še, smo bili 622 00:28:25,670 --> 00:28:28,629 prosi operacijski sistem spomin in spomin znova 623 00:28:28,629 --> 00:28:29,670 ampak nikoli ne daje nazaj. 624 00:28:29,670 --> 00:28:33,550 >> Zdaj, kot prahi, se izkaže, da ko program zapre, vse pomnilniku 625 00:28:33,550 --> 00:28:34,870 se samodejno sprostil. 626 00:28:34,870 --> 00:28:36,150 Torej to ni bil velik posel. 627 00:28:36,150 --> 00:28:38,590 To se ne bo prekinil IDE ali počasi stvari navzdol, 628 00:28:38,590 --> 00:28:40,670 ampak ko programi storiti običajno pušča spomin 629 00:28:40,670 --> 00:28:42,170 in oni so tekmovanje v teku za dolgo časa. 630 00:28:42,170 --> 00:28:45,640 Če ste kdaj videli neumnega Little Žoga za plažo v Mac OS ali peščene ure 631 00:28:45,640 --> 00:28:51,160 na operacijskem sistemu Windows, kjer je vrsta upočasni ali razmišljate ali razmišljanje 632 00:28:51,160 --> 00:28:53,770 ali pa samo res začne upočasnila na lezenje, 633 00:28:53,770 --> 00:28:56,960 to bi bilo zelo verjetno bo rezultat spomin razpoka. 634 00:28:56,960 --> 00:28:59,970 Programerji, ki je napisal programska oprema, ki jo uporabljate 635 00:28:59,970 --> 00:29:03,570 vprašajte operacijski sistem za spomin vsakih nekaj minut, vsako uro. 636 00:29:03,570 --> 00:29:05,570 Ampak, če ste tekmovanje v teku programske opreme, tudi če je 637 00:29:05,570 --> 00:29:08,680 zmanjšati na vašem računalniku za več ur ali dni, na koncu, 638 00:29:08,680 --> 00:29:11,980 vas bo morda prosil za več in več spomin in nikoli dejansko uporabo 639 00:29:11,980 --> 00:29:15,180 in tako lahko vaš koda, ali Programi lahko pušča spomin, 640 00:29:15,180 --> 00:29:18,350 in če začneš puščati spomin, tam je manj pomnilnika za druge programe, 641 00:29:18,350 --> 00:29:21,220 in učinek je počasi vse navzdol. 642 00:29:21,220 --> 00:29:23,600 >> Zdaj, to je daleč ena najbolj krute programi 643 00:29:23,600 --> 00:29:26,350 boste imeli priložnosti teči v CS50 kolikor 644 00:29:26,350 --> 00:29:31,650 saj njena proizvodnja je še bolj ezoteričnih kot Jek je ali bi ali katero koli ukaza 645 00:29:31,650 --> 00:29:35,930 Programi linije smo teči prej, vendar na srečo, vgrajeni v svojem izhodu 646 00:29:35,930 --> 00:29:39,810 je nekaj super koristnih nasvetov, ki bo koristno niti za PSet štiri 647 00:29:39,810 --> 00:29:41,510 ali gotovo PSet pet. 648 00:29:41,510 --> 00:29:44,250 Torej valgrind je orodje ki se lahko uporablja za iskanje 649 00:29:44,250 --> 00:29:46,930 za spomin razpoka v vašem programu. 650 00:29:46,930 --> 00:29:48,570 To je relativno preprost za vožnjo. 651 00:29:48,570 --> 00:29:51,420 Zaženete valgrind, nato pa še čeprav je malce verbose, 652 00:29:51,420 --> 00:29:54,440 dash check dash puščanja enak celoti, in nato dot 653 00:29:54,440 --> 00:29:56,320 poševnica in ime vašega programa. 654 00:29:56,320 --> 00:30:00,010 Torej bo valgrind nato zaženite svoj program in na samem koncu vašega programa 655 00:30:00,010 --> 00:30:02,240 teče pred njim zapre in vam daje še en poziv, 656 00:30:02,240 --> 00:30:04,980 to se dogaja, da analizira vaš Program, medtem ko je bilo tekmovanje v teku 657 00:30:04,980 --> 00:30:07,740 in povedal, da si puščajo koli spomin in še bolje, 658 00:30:07,740 --> 00:30:10,610 si dotaknil spomin, da ne pripada tebi? 659 00:30:10,610 --> 00:30:13,700 To ne more ujeti vse, ampak to je zelo dober pri lovljenju večino stvari. 660 00:30:13,700 --> 00:30:19,700 >> Torej, tukaj je primer mojega, ki ima rok Ta program, ki ima teči valgrind, 661 00:30:19,700 --> 00:30:21,470 na program, imenovan spomin, in grem 662 00:30:21,470 --> 00:30:24,730 izpostaviti črte, ki so v končni fazi v interesu nas. 663 00:30:24,730 --> 00:30:27,690 Torej, tam je tudi več motečih da sem izbrisana iz diapozitiva. 664 00:30:27,690 --> 00:30:30,930 Ampak kaj je šele videli, kaj je to Program je sposoben nam povedali. 665 00:30:30,930 --> 00:30:34,800 To je sposoben nam pove stvari kot neveljavno napisati velikosti 4. 666 00:30:34,800 --> 00:30:38,020 Z drugimi besedami, če se dotakneš spomin, Natančneje 4 bajte spomina 667 00:30:38,020 --> 00:30:40,350 da ne bi smeli imeti, valgrind vam lahko povem, da. 668 00:30:40,350 --> 00:30:41,660 Invalid write velikosti 4. 669 00:30:41,660 --> 00:30:43,640 Dotaknil si štiri bajte da ne bi smeli imeti. 670 00:30:43,640 --> 00:30:44,840 Kje si to storila? 671 00:30:44,840 --> 00:30:45,900 To je lepota. 672 00:30:45,900 --> 00:30:50,000 Memory dot c linija 21 je, če vas zasral in to je razlog, zakaj je koristno. 673 00:30:50,000 --> 00:30:53,410 Podobno kot GDB, lahko pomaga vas opozarjajo na dejanske napake. 674 00:30:53,410 --> 00:30:57,170 >> Zdaj, ta je malo bolj verbose, če ne zmedeno. 675 00:30:57,170 --> 00:31:01,307 40 bajtov 1 blokih so vsekakor izgubil v izgubo zapis 1 od 1. 676 00:31:01,307 --> 00:31:02,140 Kaj to pomeni? 677 00:31:02,140 --> 00:31:05,920 No, to samo pomeni, da boste morali za 40 bajtov in nikoli nisi dal nazaj. 678 00:31:05,920 --> 00:31:08,930 Klical si malloc ali ste poklicali GetString in operacijski sistem 679 00:31:08,930 --> 00:31:12,450 vas 40 bajtov, ampak ti je dal nikoli osvobojeni ali sprosti ta pomnilnik, 680 00:31:12,450 --> 00:31:15,400 in biti pošteni, smo nikoli pokazati ste, kako vračati spomin. 681 00:31:15,400 --> 00:31:17,910 Izkazalo se je, da je super preprosto funkcijo imenovano brezplačno. 682 00:31:17,910 --> 00:31:21,170 Traja en argument, stvar želite sprostiti in dati nazaj, 683 00:31:21,170 --> 00:31:23,430 ampak 40 bajtov, očitno, v tem programu 684 00:31:23,430 --> 00:31:27,300 so bili izgubljeni v vrstici 20 spomina dot c. 685 00:31:27,300 --> 00:31:28,650 >> Torej, da vidimo ta program. 686 00:31:28,650 --> 00:31:31,020 To je super neuporabna. 687 00:31:31,020 --> 00:31:33,980 To samo dokazuje, to predvsem napake. 688 00:31:33,980 --> 00:31:34,920 Torej, kaj si zdaj. 689 00:31:34,920 --> 00:31:39,920 Tukaj je glavni in glavni, obvestilo, klici funkcija se imenuje F in se nato vrne. 690 00:31:39,920 --> 00:31:41,550 Torej ni vse tako zanimivo. 691 00:31:41,550 --> 00:31:42,664 Kaj f storiti? 692 00:31:42,664 --> 00:31:44,330 Opazili nisem sitnost s prototipom. 693 00:31:44,330 --> 00:31:46,520 Želel sem, da kodo kot minimalno kot je mogoče. 694 00:31:46,520 --> 00:31:49,530 Zato sem dal f zgoraj glavni in da je v redu, seveda, 695 00:31:49,530 --> 00:31:51,500 za kratke programe, kot je ta. 696 00:31:51,500 --> 00:31:56,910 Torej f ne vrne ničesar in ne ne bo ničesar, vendar pa to storijo. 697 00:31:56,910 --> 00:31:59,620 To izjavlja, podobno kot na primer Binky, 698 00:31:59,620 --> 00:32:02,682 kazalec se imenuje x, ki se dogaja Shranjevanje naslov notr. 699 00:32:02,682 --> 00:32:03,890 Tako, da je leva stran. 700 00:32:03,890 --> 00:32:07,230 V angleščini, kar je desna stran delaš? 701 00:32:07,230 --> 00:32:09,770 Kdorkoli? 702 00:32:09,770 --> 00:32:13,665 Kaj je to za nas? 703 00:32:13,665 --> 00:32:14,651 Ja? 704 00:32:14,651 --> 00:32:16,623 >> OBČINSTVO: [neslišno] krat na velikost notr 705 00:32:16,623 --> 00:32:19,175 ki je 10-krat, da [neslišno] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Dobro in Naj povzamem. 707 00:32:20,800 --> 00:32:25,480 Torej dodeli dovolj prostora za 10 celih ali 10, kaj je velikost int, 708 00:32:25,480 --> 00:32:29,340 to je štiri bajte, torej 10-krat 4 40, tako da je desna stran, ki sem jih 709 00:32:29,340 --> 00:32:33,930 poudarjeno je, dajte mi 40 bajtov in shrani naslov prvega bajta 710 00:32:33,930 --> 00:32:34,940 v x. 711 00:32:34,940 --> 00:32:38,380 In zdaj končno, in tukaj je, kjer Ta program je buggy, kaj je 712 00:32:38,380 --> 00:32:41,540 narobe z linijo 21, ki temelji na tej logiki? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Kaj je narobe z linijo 21? 715 00:32:46,280 --> 00:32:46,780 Ja? 716 00:32:46,780 --> 00:32:49,550 OBČINSTVO: Ne moreš Indeks v x [neslišno]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Ja. 718 00:32:50,300 --> 00:32:52,270 Jaz ne bi kazalo na x, kot je ta. 719 00:32:52,270 --> 00:32:53,850 Torej skladenjsko, da je v redu. 720 00:32:53,850 --> 00:32:56,990 Kaj je lepo je, podobno kot tebi lahko zdravi ime matrike 721 00:32:56,990 --> 00:33:01,080 kot da je to kazalec, podobno lahko zdravljenje kazalec, kot da je 722 00:33:01,080 --> 00:33:06,425 array, in tako sem lahko skladenjsko pravijo x stopnjevanim nekaj, x nosilec i, 723 00:33:06,425 --> 00:33:07,800 vendar 10 je problematično. 724 00:33:07,800 --> 00:33:09,096 Zakaj? 725 00:33:09,096 --> 00:33:10,910 >> OBČINSTVO: Ker to ni notri. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: To ni znotraj te kos pomnilnika. 727 00:33:12,390 --> 00:33:15,306 Kaj je največja vrednost, sem moral se postavi v teh oglatih oklepajih? 728 00:33:15,306 --> 00:33:16,870 9, 0 do 9. 729 00:33:16,870 --> 00:33:18,160 Zaradi ničelne indeksiranje. 730 00:33:18,160 --> 00:33:20,190 Torej 0 do 9 bi bilo v redu. 731 00:33:20,190 --> 00:33:23,960 Nosilec 10 ni dobro in vendar, se spomni, čeprav, vsakič 732 00:33:23,960 --> 00:33:27,017 Zdi se mi, da bi poskušali narediti CS50 IDE crash z vpisom lažnih vrednot, 733 00:33:27,017 --> 00:33:29,100 ne sodelujejo vedno, in res, ste pogosto 734 00:33:29,100 --> 00:33:31,460 srečo samo zato, ker Operacijski sistem ne 735 00:33:31,460 --> 00:33:35,467 opazili, da si vedno tako malo mimo nekaj kos pomnilnika, 736 00:33:35,467 --> 00:33:38,300 ker si ostal v tehnično Vaše segmenta, ampak več o tem 737 00:33:38,300 --> 00:33:40,940 v razredu za operacijske sisteme in tako nekako takole 738 00:33:40,940 --> 00:33:43,000 lahko zelo enostavno iti neopaženo. 739 00:33:43,000 --> 00:33:48,120 Vaš program je nikoli ne bo crash dosledno ampak morda enkrat v nekaj časa. 740 00:33:48,120 --> 00:33:50,610 >> In tako poskusimo valgrind v zvezi s tem, in tukaj je 741 00:33:50,610 --> 00:33:52,870 kjer bomo dobili preobremenjeni z izhodom za trenutek. 742 00:33:52,870 --> 00:34:00,810 Zato poskrbite, pomnilniške ček valgrind uhajanja enak polni dot slash spomin. 743 00:34:00,810 --> 00:34:03,040 In tukaj je, zakaj obljubim to bi preplavijo. 744 00:34:03,040 --> 00:34:05,700 Tukaj je tisto, kar valgrind, tukaj je, kaj programer, nekaj let ago- 745 00:34:05,700 --> 00:34:08,469 odločil, da bi bilo dobro, za izhod izgledal. 746 00:34:08,469 --> 00:34:09,750 Torej, kaj je smisel tega. 747 00:34:09,750 --> 00:34:13,120 Torej vse poti na levem stran brez razloga 748 00:34:13,120 --> 00:34:16,620 je proces ID programa smo samo teči, posebni identifikator 749 00:34:16,620 --> 00:34:18,030 Za program smo pravkar tekel. 750 00:34:18,030 --> 00:34:19,738 Mi črta, ki iz slide, vendar obstaja 751 00:34:19,738 --> 00:34:22,190 je nekaj koristnih informacij tukaj. 752 00:34:22,190 --> 00:34:24,684 >> Naj se pomaknite do samega vrha. 753 00:34:24,684 --> 00:34:25,600 Tukaj je, kjer smo začeli. 754 00:34:25,600 --> 00:34:27,040 Torej, to ni vse, da je veliko moč. 755 00:34:27,040 --> 00:34:30,429 Tukaj je, da je neveljavna write velikosti 4 on line 21. 756 00:34:30,429 --> 00:34:31,760 No, kaj je linija 21? 757 00:34:31,760 --> 00:34:34,500 Linija 21 je bil ravno to in je smiselno 758 00:34:34,500 --> 00:34:37,290 da sem v veljavno pisanje 4 bajte, ker sem 759 00:34:37,290 --> 00:34:40,389 trudijo, da bi to celo, ki je lahko karkoli, 760 00:34:40,389 --> 00:34:42,370 to samo zgodi, da se nič, ampak skušam 761 00:34:42,370 --> 00:34:44,940 da ga na mestu da ne pripada meni. 762 00:34:44,940 --> 00:34:50,900 Poleg tega so tu dol, 40 bajtov v enem Bloki so definitivno izgubili v zapisu 1. 763 00:34:50,900 --> 00:34:56,500 To je zato, ker ko sem klic malloc tukaj, nikoli nisem dejansko prost spomin. 764 00:34:56,500 --> 00:34:58,140 >> Torej, kako lahko to popravimo? 765 00:34:58,140 --> 00:35:02,970 Naj gredo naprej in se malo varnejši in ne 9 tam in pusti me tukaj brezplačno x. 766 00:35:02,970 --> 00:35:04,820 To je nova funkcija za danes. 767 00:35:04,820 --> 00:35:11,520 Če bom zdaj ponovila, da spomin dot poševnica, dajmo teči valgrind o njem še enkrat, 768 00:35:11,520 --> 00:35:14,990 maksimirati moje okno in pritisnite tipko Enter. 769 00:35:14,990 --> 00:35:16,900 Zdaj, to je dobro. 770 00:35:16,900 --> 00:35:19,590 Ti pokopati dobra novica V vse te proizvodnje. 771 00:35:19,590 --> 00:35:20,810 Vse kup blokov ni bilo. 772 00:35:20,810 --> 00:35:23,604 Vrnili se bomo na kakšnem kupu je, vendar ni mogoče uhajanje. 773 00:35:23,604 --> 00:35:25,520 Torej, to je samo še en orodje za vaše kompletom orodja 774 00:35:25,520 --> 00:35:30,220 s katero lahko začnete najti zdaj napake, kot je ta. 775 00:35:30,220 --> 00:35:34,532 >> Ampak poglejmo, kaj več ne more iti narobe tukaj. 776 00:35:34,532 --> 00:35:38,890 Oglejmo prehod zdaj dejansko reševanje problema. 777 00:35:38,890 --> 00:35:42,440 Kot prahi, če bo to razreši malo zmede ali napetosti, 778 00:35:42,440 --> 00:35:43,430 to je zdaj smešno. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Ja. 781 00:35:46,900 --> 00:35:49,040 To je zelo dobro. 782 00:35:49,040 --> 00:35:50,890 Ker kazalci so naslovi in ​​naslovi 783 00:35:50,890 --> 00:35:53,098 so na splošno po dogovoru napisana z šestnajstiški. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, to je zdaj smešno. 785 00:35:54,650 --> 00:35:58,390 Kakorkoli že, tako da je zdaj dejansko rešiti problem. 786 00:35:58,390 --> 00:36:00,840 To je bilo super, super nizko raven doslej, 787 00:36:00,840 --> 00:36:03,950 in bomo lahko dejansko narediti uporabno Stvari s podrobnostmi teh nizki ravni. 788 00:36:03,950 --> 00:36:06,710 >> Zato smo uvedli nekaj tednov Pred pojem matrike. 789 00:36:06,710 --> 00:36:09,177 Množica je bilo lepo, ker je težko očistiti našo kodo 790 00:36:09,177 --> 00:36:11,760 ker če smo želeli napisati Program s številnimi študenti 791 00:36:11,760 --> 00:36:15,270 ali več imen in hiše in dorms in šole in vse to, 792 00:36:15,270 --> 00:36:19,430 bomo lahko shranite vse več čisto znotraj matrike. 793 00:36:19,430 --> 00:36:23,039 Ampak predlagam eno navzdol od matrike doslej. 794 00:36:23,039 --> 00:36:26,080 Tudi če ste ji ni utrpela sami v programu, samo nagonsko, 795 00:36:26,080 --> 00:36:30,870 kaj je slaba stvar o array, morda? 796 00:36:30,870 --> 00:36:32,337 Slišal sem nekaj šumi. 797 00:36:32,337 --> 00:36:34,170 OBČINSTVO: To je težko spreminjanje velikosti. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: To je težko spreminjanje velikosti. 799 00:36:36,128 --> 00:36:38,660 Ne morete spremeniti velikost matrike, v resnici, per 800 00:36:38,660 --> 00:36:43,040 v C. Lahko dodeliti drugo matriko, premakniti vse od starega 801 00:36:43,040 --> 00:36:45,380 v novo, in zdaj imajo nekaj dodatnega prostora, 802 00:36:45,380 --> 00:36:47,469 vendar pa je že ni všeč jezik kot Java ali Python 803 00:36:47,469 --> 00:36:49,760 ali poljubno število drugih jeziki, s katerimi nekateri od vas 804 00:36:49,760 --> 00:36:52,070 bi biti seznanjeni, kjer vas Lahko samo vztrajati dodal stvari 805 00:36:52,070 --> 00:36:53,930 gadosti do konca matrike. 806 00:36:53,930 --> 00:36:57,880 Ko imate niz velikost 6, da je njena velikost, 807 00:36:57,880 --> 00:37:01,970 in toliko, kot je ideja prej ima pufer določene velikosti, 808 00:37:01,970 --> 00:37:05,940 boste morali ugibati izven vrata Kakšno velikost želite, da bi lahko bilo? 809 00:37:05,940 --> 00:37:07,880 Če uganete, prevelika, ste zapravljaš prostor. 810 00:37:07,880 --> 00:37:10,950 Če uganete, premajhna, vam ne more shraniti, da so podatki, vsaj 811 00:37:10,950 --> 00:37:12,940 brez veliko več dela. 812 00:37:12,940 --> 00:37:18,180 >> Torej, danes, hvala za namig, bomo lahko začetek šivi skupaj lastnega meri 813 00:37:18,180 --> 00:37:20,989 podatkovne strukture, in Dejstvo, tukaj je nekaj 814 00:37:20,989 --> 00:37:23,030 da izgleda malo bolj Grobni na prvi pogled, 815 00:37:23,030 --> 00:37:26,440 ampak to je tisto, kar bomo imenovali povezana seznam, in njeno ime nekako povzema 816 00:37:26,440 --> 00:37:26,940 ga. 817 00:37:26,940 --> 00:37:29,550 To je seznam številk, ali V tem primeru, seznam številk, 818 00:37:29,550 --> 00:37:33,480 vendar bi bilo treba seznam karkoli, vendar to je povezano skupaj s pomočjo puščic, 819 00:37:33,480 --> 00:37:36,380 in vzemite ugibati s tem, kar tehnika 820 00:37:36,380 --> 00:37:38,310 bomo mogli skupaj šiv, 821 00:37:38,310 --> 00:37:42,540 nekako kot kokice z nitjo, vezavni izpiše pravokotniki tukaj? 822 00:37:42,540 --> 00:37:43,936 Njegove številke? 823 00:37:43,936 --> 00:37:45,560 Kaj je osnovni jezik funkcija? 824 00:37:45,560 --> 00:37:46,350 >> OBČINSTVO: Kazalec. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Kazalec. 826 00:37:47,308 --> 00:37:51,700 Tako je vsak od teh puščic tukaj predstavlja kazalec ali pa samo naslov. 827 00:37:51,700 --> 00:37:54,590 Torej, z drugimi besedami, če želim za shranjevanje seznam številk, 828 00:37:54,590 --> 00:37:59,040 Ne morem ga shranite, če želim sposobnost, da rastejo in se skrči 829 00:37:59,040 --> 00:38:00,990 moj struktura podatkov v matriki. 830 00:38:00,990 --> 00:38:03,000 Tako da moram imeti malo bolj prefinjena, 831 00:38:03,000 --> 00:38:05,720 ampak obvestilo, da je to slika nekako nakazuje 832 00:38:05,720 --> 00:38:08,650 da, če ste pravkar dobil malo teme povezuje vse skupaj, 833 00:38:08,650 --> 00:38:13,100 Verjetno ni tako težko, da bi prostor vmes dve od teh pravokotnikov 834 00:38:13,100 --> 00:38:16,750 ali dve od teh vozlišč, kot bomo začeti Poklical jih, dal v novo vozlišče, 835 00:38:16,750 --> 00:38:19,547 in nato z nekaj novega nit, samo jarku tri vozlišča skupaj, 836 00:38:19,547 --> 00:38:22,880 prvi, zadnji in ena ki ste jo pravkar vstavi v sredino. 837 00:38:22,880 --> 00:38:26,000 >> In res povezani seznam, v nasprotju z vrsto, je dinamično. 838 00:38:26,000 --> 00:38:27,840 To lahko rastejo in se lahko psihiater in ne boste 839 00:38:27,840 --> 00:38:32,434 morali vedeti, ali skrbi v naprej, kako veliko podatkov ste tekoč za shranjevanje, 840 00:38:32,434 --> 00:38:35,600 vendar se izkaže, da moramo biti malo previdni, o tem, kako izvajati to. 841 00:38:35,600 --> 00:38:39,070 Torej, najprej kaj menijo, kako izvajati ena od teh malih pravokotnikov. 842 00:38:39,070 --> 00:38:40,690 To je preprosto izvajati int. 843 00:38:40,690 --> 00:38:44,000 Pravkar ste rekli int n in nato dobiš 4 bajte za notr, 844 00:38:44,000 --> 00:38:49,089 ampak kako pridem int, ga pokličete n, in potem kazalec, dajmo ga pokličete naslednji. 845 00:38:49,089 --> 00:38:50,880 Mi lahko pokličete njih Stvari kaj hočemo 846 00:38:50,880 --> 00:38:53,590 ampak rabim podatkovno strukturo meri. 847 00:38:53,590 --> 00:38:54,257 Ja? 848 00:38:54,257 --> 00:38:57,020 >> OBČINSTVO: Ampersand [neslišno]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Torej ampersand bomo uporabili za dobil naslov vozlišča potencialno. 850 00:39:00,940 --> 00:39:02,740 Vendar moramo drugo značilnost C z namenom 851 00:39:02,740 --> 00:39:06,700 da mi možnost, da ustvarijo ta običaj pravokotnik, ta običaj 852 00:39:06,700 --> 00:39:08,919 spremenljivka, če hočete, v spomin. 853 00:39:08,919 --> 00:39:09,710 OBČINSTVO: â struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: â struct. 855 00:39:10,626 --> 00:39:14,310 Spomnimo, od prejšnjega tedna, smo uvedli struct, je to razmeroma enostavno ključno besedo 856 00:39:14,310 --> 00:39:16,254 ki nam omogoča, da se stvari, kot je ta. 857 00:39:16,254 --> 00:39:18,420 C ni prišel s podatki struktura imenovana študenta. 858 00:39:18,420 --> 00:39:22,190 Na voljo je z int in float in char in na primer, vendar ne prihajajo z študenta, 859 00:39:22,190 --> 00:39:26,750 vendar smo lahko ustvarili vrsto podatkov študent, struktura študent, s to sintakso 860 00:39:26,750 --> 00:39:27,250 tukaj. 861 00:39:27,250 --> 00:39:28,350 In boste to znova in znova videti. 862 00:39:28,350 --> 00:39:30,426 Torej, ne skrbite pomnjenja ključne besede, 863 00:39:30,426 --> 00:39:33,300 vendar je ključna beseda, ki je pomembno je, Samo dejstvo, da smo rekli struct 864 00:39:33,300 --> 00:39:37,590 in potem smo jo imenovali študenta in v notranjosti študenta je ime in hišo 865 00:39:37,590 --> 00:39:39,390 ali domu in podobno. 866 00:39:39,390 --> 00:39:41,980 >> In zdaj je danes, kaj je predlagala to. 867 00:39:41,980 --> 00:39:45,240 Sem dodal nekaj besed, vendar, če želim za izvajanje te pravokotnik, ki je 868 00:39:45,240 --> 00:39:48,440 dobil tako int in kazalec, veš kaj, jaz sem 869 00:39:48,440 --> 00:39:51,540 dogaja, da razglasi struct imenovano vozlišče. 870 00:39:51,540 --> 00:39:55,630 Jaz sem tudi, znotraj njega, reči da ima vozlišče, ta pravokotnik, int 871 00:39:55,630 --> 00:39:59,730 in imenovali jo bomo n in ima naslednjo kazalec. 872 00:39:59,730 --> 00:40:02,540 In to je malce verbose, ampak če pomislim, 873 00:40:02,540 --> 00:40:07,300 puščice, ki so na sliki pred nekaj trenutki so kakšni podatkovni tip? 874 00:40:07,300 --> 00:40:12,330 Kjer je vsak od teh puščic je obrnjena za katera vrsta strukture podatkov? 875 00:40:12,330 --> 00:40:14,332 To ne kaže samo, da notr per se. 876 00:40:14,332 --> 00:40:16,165 To kaže na Celoten pravokotne stvar 877 00:40:16,165 --> 00:40:18,720 in da pravokotne stvar, smo rekli, se imenuje vozlišče. 878 00:40:18,720 --> 00:40:21,720 In tako smo nekako morali rekurzivno opredeli ta primer 879 00:40:21,720 --> 00:40:26,270 da vozlišče, recimo, bo vseboval int imenovano n 880 00:40:26,270 --> 00:40:31,070 in kazalec imenuje zraven in tip podatkovne strukture za katero 881 00:40:31,070 --> 00:40:35,770 da kazalec točk je očitno bo struct vozlišče. 882 00:40:35,770 --> 00:40:41,550 >> Torej je to zoprno verbose in samo, da je občutljiv, 883 00:40:41,550 --> 00:40:44,100 razlog, zakaj ne moremo samo rekel to, kar odkrito 884 00:40:44,100 --> 00:40:46,860 izgleda veliko bolj berljivo, je zato, ker odpoklic da C prebrati 885 00:40:46,860 --> 00:40:48,710 stvari od zgoraj navzdol, od leve proti desni. 886 00:40:48,710 --> 00:40:54,120 To ni, dokler ne bomo dobili podpičje da dejansko obstaja vozlišče ključno besedo. 887 00:40:54,120 --> 00:40:57,980 Torej, če želimo, da imajo te vrste ciklična sklicevanje notranjosti podatkov 888 00:40:57,980 --> 00:41:02,120 strukturo, moramo to storiti, če je rečemo struct vozlišče na vrhu, ki je 889 00:41:02,120 --> 00:41:06,770 nam daje daljšo pot, ki opisuje to stvar, potem pa znotraj rečemo struct vozlišče, 890 00:41:06,770 --> 00:41:09,560 in nato na zelo zadnji vrstici smo rekli, v redu, C, mimogrede, 891 00:41:09,560 --> 00:41:12,060 samo pokliči vso to prekleto stvar vozlišče in stop 892 00:41:12,060 --> 00:41:14,360 s pomočjo ključnih besed struct celoti. 893 00:41:14,360 --> 00:41:18,030 Torej je to samo neke vrste skladenjska Trik, ki na koncu nam omogoča ustvarjanje 894 00:41:18,030 --> 00:41:21,370 nekaj, kar je videti natanko tako kot je ta. 895 00:41:21,370 --> 00:41:25,010 >> Torej, če predpostavimo, zdaj bomo lahko izvajati ta stvar v C, 896 00:41:25,010 --> 00:41:28,040 Kako nam dejansko začetek prečkajo to? 897 00:41:28,040 --> 00:41:32,360 No, v resnici, vse, kar moramo storiti, je, Ponovil od leve proti desni in samo 898 00:41:32,360 --> 00:41:35,960 vrsta Vstavljanje vozlišča ali izbrišete vozlišč ali iskati stvari, kjerkoli želimo, 899 00:41:35,960 --> 00:41:39,560 ampak za to, gremo naprej in da stvari malo bolj realno, ker ta 900 00:41:39,560 --> 00:41:42,560 je zelo nizko raven doslej. 901 00:41:42,560 --> 00:41:45,700 Bi kdo dobesedno želel biti prvi? 902 00:41:45,700 --> 00:41:46,200 V REDU. 903 00:41:46,200 --> 00:41:47,092 Pridi gor. 904 00:41:47,092 --> 00:41:47,800 Kako ti je ime? 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 Me veseli. 908 00:41:49,998 --> 00:41:50,960 Jaz tudi. 909 00:41:50,960 --> 00:41:52,450 V redu. 910 00:41:52,450 --> 00:41:53,990 In moramo številko 9. 911 00:41:53,990 --> 00:41:55,240 Ni tako dobra kot prva, morda. 912 00:41:55,240 --> 00:41:56,430 OK, številka 9. 913 00:41:56,430 --> 00:41:59,667 Število 17, prosim. 914 00:41:59,667 --> 00:42:01,000 Naj grem nazaj malo dlje. 915 00:42:01,000 --> 00:42:03,980 Številka 22, prosim, in kaj pa dlje nazaj 916 00:42:03,980 --> 00:42:06,344 če vidim nobene roke z vso svetlobo ali ne. 917 00:42:06,344 --> 00:42:08,010 Nekdo, ki se je prostovoljno javil, prav tam. 918 00:42:08,010 --> 00:42:08,968 Ali želite, da pridejo gor? 919 00:42:08,968 --> 00:42:10,450 Vaš podlakti je prisilno gredo gor. 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 se spušča. 923 00:42:15,120 --> 00:42:18,450 Bi še kdo rad forcefully-- Pridi gor. 924 00:42:18,450 --> 00:42:21,030 Dejanska prostovoljec. 925 00:42:21,030 --> 00:42:23,330 >> Torej zelo hitro, če vidva lahko uredite 926 00:42:23,330 --> 00:42:26,550 sami samo rad vozlišča na zaslonu. 927 00:42:26,550 --> 00:42:27,510 Hvala. 928 00:42:27,510 --> 00:42:29,234 In boste 26. 929 00:42:29,234 --> 00:42:30,650 Vse prave in hitre vnose. 930 00:42:30,650 --> 00:42:32,139 Tako da sem David in ste prav? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: In vi ste? 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 Odlično. 940 00:42:37,590 --> 00:42:39,810 Torej, to so naši prostovoljci za danes in gredo naprej 941 00:42:39,810 --> 00:42:43,090 in premik malo na ta način, in samo pojdi naprej in naprej 942 00:42:43,090 --> 00:42:47,024 držite svoje številke, kot ste vi ali vaši Prvi znak in uporaba levo roko, 943 00:42:47,024 --> 00:42:48,940 pojdi naprej in samo izvajanje te puščice, samo 944 00:42:48,940 --> 00:42:51,360 tako da tvoja levica, je dobesedno kaže na kar bi morali poudariti 945 00:42:51,360 --> 00:42:54,610 na, in da si nekaj sobi, tako da bomo lahko vizualno videli svoje roke dejansko 946 00:42:54,610 --> 00:42:58,120 ki kaže, in si lahko samo točko nekako na tleh, je v redu. 947 00:42:58,120 --> 00:43:03,040 >> Torej, tukaj imamo povezan seznam enega, dva, tri, štiri, pet vozlišč sprva 948 00:43:03,040 --> 00:43:05,860 in opazili smo to posebno kazalec na začetku, ki je 949 00:43:05,860 --> 00:43:09,770 Ključ ker moramo slediti celotnega seznama dolžino nekako. 950 00:43:09,770 --> 00:43:13,590 Ti fantje, čeprav oni zapustili na desno, na hrbtni strani v pomnilniku, 951 00:43:13,590 --> 00:43:15,950 lahko dejansko kjerkoli v pomnilniku računalnika. 952 00:43:15,950 --> 00:43:18,240 Torej bi ti fantje lahko stoji kjerkoli na odru 953 00:43:18,240 --> 00:43:20,960 in da je v redu, tako dolgo, kot oni dejansko obrnjena drug od drugega, 954 00:43:20,960 --> 00:43:22,770 ampak, da se stvari čiste in enostavne, da bomo 955 00:43:22,770 --> 00:43:25,728 samo jih pripravijo leve proti desni kot to, vendar bi lahko velike vrzeli 956 00:43:25,728 --> 00:43:26,790 med temi vozlišči. 957 00:43:26,790 --> 00:43:30,710 >> Zdaj pa, če želim, da se dejansko vstaviti nekaj nova vrednost, pojdimo naprej in to storite. 958 00:43:30,710 --> 00:43:33,720 Imamo priložnost zdaj izbrati drugo vozlišče. 959 00:43:33,720 --> 00:43:39,820 Pravijo, začnimo z mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Bi nekdo moti, da malloc? 961 00:43:41,320 --> 00:43:42,280 OK, pridi gor. 962 00:43:42,280 --> 00:43:42,992 Kako ti je ime? 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 V redu. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Pridi gor. 968 00:43:47,450 --> 00:43:51,610 Torej, zdaj se moramo vprašati, algorithmically kjer bomo lahko dal 55. 969 00:43:51,610 --> 00:43:53,610 Torej, vsi vemo, seveda, kjer je verjetno 970 00:43:53,610 --> 00:43:55,401 pripada, če poskušamo da bo to urejeno 971 00:43:55,401 --> 00:43:58,299 in če bi vi vzeli eno korak nazaj, tako da ne padete 972 00:43:58,299 --> 00:43:59,590 faza, to bi bilo super. 973 00:43:59,590 --> 00:44:01,420 Torej dejansko, Rainbow, začeti znova tu z menoj, 974 00:44:01,420 --> 00:44:04,200 saj smo kot računalnik, sedaj lahko glej samo eno spremenljivko naenkrat. 975 00:44:04,200 --> 00:44:05,190 Torej, če gre za prvo vozlišče. 976 00:44:05,190 --> 00:44:07,160 Opazili, da je ni vozlišče, on je samo kazalec, 977 00:44:07,160 --> 00:44:10,270 in da je, zakaj je bil sestavljen, da bo Samo velikost kazalca, ne 978 00:44:10,270 --> 00:44:11,780 eden od teh polnih pravokotnikov. 979 00:44:11,780 --> 00:44:16,650 Torej gremo preveriti na vsakem ponovitev je 55 manj kot 9? 980 00:44:16,650 --> 00:44:17,150 No. 981 00:44:17,150 --> 00:44:19,060 Je 55 manj kot 17? 982 00:44:19,060 --> 00:44:19,720 No. 983 00:44:19,720 --> 00:44:20,800 Manj kot 22? 984 00:44:20,800 --> 00:44:22,020 Manj kot 26? 985 00:44:22,020 --> 00:44:23,390 Manj kot 34? 986 00:44:23,390 --> 00:44:25,890 In zdaj, očitno Mavrični pripada konec. 987 00:44:25,890 --> 00:44:27,270 Torej, da bo jasno, in kaj je bilo vaše ime, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Torej, med Taylorjeva levo roko in roke tukaj mavrica je, 990 00:44:32,510 --> 00:44:38,324 čigar roko je treba opozoriti na kaj v naročite vstaviti 55 na tem seznamu? 991 00:44:38,324 --> 00:44:39,240 Kaj moramo storiti? 992 00:44:39,240 --> 00:44:39,700 Ja? 993 00:44:39,700 --> 00:44:41,140 >> OBČINSTVO: Taylorjeva roko Treba levo točko. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Točno tako. 995 00:44:41,680 --> 00:44:43,800 Torej vstavljanje vozlišče v konec seznama 996 00:44:43,800 --> 00:44:47,140 je zelo preprosta, saj Taylor samo je točka namesto na terenu 997 00:44:47,140 --> 00:44:49,640 ali bomo ga pokličete null, null je nekako odsotnosti 998 00:44:49,640 --> 00:44:51,640 od kazalca ali posebna nič kazalec, da ste 999 00:44:51,640 --> 00:44:53,740 gre izpostaviti z levi roko na Rainbow in nato Rainbow, 1000 00:44:53,740 --> 00:44:55,910 kjer naj bi svojo levo roko verjetno točko? 1001 00:44:55,910 --> 00:44:56,570 Dol. 1002 00:44:56,570 --> 00:45:00,140 To ni dobro, če njena roka je nekako od kaže off tukaj ali nekako koli 1003 00:45:00,140 --> 00:45:00,640 v katero smer. 1004 00:45:00,640 --> 00:45:02,407 To bi veljalo vrednost smeti, 1005 00:45:02,407 --> 00:45:04,240 ampak če ona poudarja, da nekatera znana vrednost, bomo 1006 00:45:04,240 --> 00:45:07,360 call it nič ali null, da je v redu ker imamo čas v tej 1007 00:45:07,360 --> 00:45:09,390 in vemo, seznam je zdaj končana. 1008 00:45:09,390 --> 00:45:11,550 >> Torej, kaj je še relativno enostaven primer? 1009 00:45:11,550 --> 00:45:13,125 Smo lahko malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Pridi gor. 1011 00:45:14,010 --> 00:45:14,782 Kako ti je ime? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Oprosti? 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 V redu. 1017 00:45:17,110 --> 00:45:19,071 Tiffany je malloced z vrednostjo 5. 1018 00:45:19,071 --> 00:45:19,570 Pridi gor. 1019 00:45:19,570 --> 00:45:23,820 Ta je relativno enostavno preveč, vendar kaj menijo, da vrstni red operacij zdaj. 1020 00:45:23,820 --> 00:45:25,820 Bilo je precej enostavno z Taylor konec. 1021 00:45:25,820 --> 00:45:30,302 Število 5 je seveda manj kot 9, in tako imamo Davida, imamo Tiffany, 1022 00:45:30,302 --> 00:45:31,260 in kaj je vaše ime? 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, in David. 1026 00:45:34,300 --> 00:45:36,580 Čigava roka je treba najprej posodobi? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Kaj želite narediti tukaj? 1029 00:45:40,590 --> 00:45:45,244 Tukaj je nekaj možnih načinov, vendar tam je tudi ena ali več napačni poti. 1030 00:45:45,244 --> 00:45:46,620 >> OBČINSTVO: Začnite s skrajno levo. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Začnite z levega. 1032 00:45:47,800 --> 00:45:49,008 Kdo je levi je tukaj potem? 1033 00:45:49,008 --> 00:45:49,700 OBČINSTVO: First. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Torej začeli s prvo in kje ste storili želite posodobiti roke Davidovi biti? 1036 00:45:53,781 --> 00:45:54,780 OBČINSTVO: Proti 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 Torej, David, točka ob petih ali Tiffany tukaj in zdaj? 1039 00:45:59,026 --> 00:46:01,072 >> OBČINSTVO: Tiffany opozarja na 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Popoln, razen Binky je vodja le nekako padel, kajne? 1041 00:46:04,030 --> 00:46:06,820 Ker kaj je narobe z ta slika dobesedno? 1042 00:46:06,820 --> 00:46:08,070 OBČINSTVO: Nič ne kaže. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Nič ni kaže, da Jake zdaj. 1044 00:46:09,945 --> 00:46:13,360 Mi smo dobesedno osiroteli 9 in 17, in ki smo jih dobesedno 1045 00:46:13,360 --> 00:46:18,450 razpoka vse te pomnilnika, saj ga Prva posodobitev Davidovo roko, da je 1046 00:46:18,450 --> 00:46:21,660 v redu, če je pravilno gledala Tiffany zdaj, 1047 00:46:21,660 --> 00:46:25,410 ampak če ni imel eden predvidevanja kažejo na Jake, 1048 00:46:25,410 --> 00:46:27,490 potem smo izgubili celota tega seznama. 1049 00:46:27,490 --> 00:46:28,200 Torej, kaj je razveljaviti. 1050 00:46:28,200 --> 00:46:30,950 Tako da je bila dobra stvar spotakniti ampak dajmo popraviti zdaj. 1051 00:46:30,950 --> 00:46:33,624 Kaj naj naredimo najprej namesto tega? 1052 00:46:33,624 --> 00:46:34,124 Ja? 1053 00:46:34,124 --> 00:46:35,791 >> OBČINSTVO: Tiffany je treba opozoriti na 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: ne morem dobili, da je blizu vas. 1055 00:46:37,582 --> 00:46:38,720 Kdo naj bi kazali na 9? 1056 00:46:38,720 --> 00:46:39,220 >> OBČINSTVO: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: V redu. 1058 00:46:39,390 --> 00:46:41,200 Torej Tiffany morala prva točka na 9. 1059 00:46:41,200 --> 00:46:43,550 Torej bi Tiffany sprejeti na enaki vrednosti 1060 00:46:43,550 --> 00:46:45,820 Davidu, ki se zdi odveč, za trenutek, 1061 00:46:45,820 --> 00:46:48,820 ampak to je v redu, ker zdaj, drugi korak, bomo lahko posodobite Davidovo roko 1062 00:46:48,820 --> 00:46:52,680 opozoriti na Tiffany, in potem, če Pravkar smo nekako čistih stvari 1063 00:46:52,680 --> 00:46:55,740 kot da je to neke vrste pomladi, kot so, zdaj, da je pravilno vstavljanje. 1064 00:46:55,740 --> 00:46:56,700 Tako odlična. 1065 00:46:56,700 --> 00:46:57,970 Torej, zdaj smo skoraj tam. 1066 00:46:57,970 --> 00:47:01,075 Oglejmo vstavite en finale vrednost kot vrednosti 20. 1067 00:47:01,075 --> 00:47:03,010 Če bi lahko malloc eno končno prostovoljca? 1068 00:47:03,010 --> 00:47:04,140 Pridi gor. 1069 00:47:04,140 --> 00:47:06,224 Torej, ta je malo bolj zapleteno. 1070 00:47:06,224 --> 00:47:08,390 Ampak res, koda smo pisanje, čeprav verbalno, 1071 00:47:08,390 --> 00:47:10,610 je tako kot imajo kup na to, če so izpolnjeni pogoji, kajne? 1072 00:47:10,610 --> 00:47:12,318 Imeli smo stanje preverjanje, če spada 1073 00:47:12,318 --> 00:47:13,840 na koncu, morda na začetku. 1074 00:47:13,840 --> 00:47:15,940 Potrebujemo nekakšno zanke najti mesto v sredini. 1075 00:47:15,940 --> 00:47:17,400 Torej, kaj je naredil, da je s tem, kar ti je ime? 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 Me veseli. 1080 00:47:19,368 --> 00:47:20,490 Torej imamo 20. 1081 00:47:20,490 --> 00:47:21,220 Manj kot pet? 1082 00:47:21,220 --> 00:47:21,530 No. 1083 00:47:21,530 --> 00:47:22,160 Manj kot devet? 1084 00:47:22,160 --> 00:47:22,410 No. 1085 00:47:22,410 --> 00:47:23,050 Manj kot 17? 1086 00:47:23,050 --> 00:47:23,550 No. 1087 00:47:23,550 --> 00:47:23,740 V REDU. 1088 00:47:23,740 --> 00:47:25,701 Tukaj je njegova domovina in vaša imena so spet? 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, in? 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 Morali priti do prvega posodobljenega katerih roke? 1096 00:47:32,140 --> 00:47:32,930 >> OBČINSTVO: Eric. 1097 00:47:32,930 --> 00:47:33,429 V REDU. 1098 00:47:33,429 --> 00:47:35,200 Torej, Eric je treba poudariti, kje? 1099 00:47:35,200 --> 00:47:35,930 Ob 22. 1100 00:47:35,930 --> 00:47:36,430 Dobro. 1101 00:47:36,430 --> 00:47:38,180 In zdaj, kaj je naslednje? 1102 00:47:38,180 --> 00:47:40,800 Sue lahko pokažite na Eric in zdaj, če vaju samo 1103 00:47:40,800 --> 00:47:44,077 narediti nekaj prostora, ki je v redu vizualno, zdaj smo naredili vstavljanje. 1104 00:47:44,077 --> 00:47:47,160 Torej, kaj je zdaj preučiti vprašanje, ampak hvala toliko za naše prostovoljce. 1105 00:47:47,160 --> 00:47:48,090 Zelo dobro opravljeno. 1106 00:47:48,090 --> 00:47:50,831 Lahko obdržite tiste, če ti je všeč. 1107 00:47:50,831 --> 00:47:54,140 In imamo lepo poslovilno darilo, če kar bi vsak rad izkoristil stres žogo. 1108 00:47:54,140 --> 00:47:56,030 Naj samo prenese ta dol. 1109 00:47:56,030 --> 00:47:58,430 Torej, kaj je takeaway to? 1110 00:47:58,430 --> 00:48:02,430 To se zdi neverjetno kolikor imamo zdaj 1111 00:48:02,430 --> 00:48:06,360 predstavil alternative Niz, ki se tako ni omejena 1112 00:48:06,360 --> 00:48:07,780 na matriko neke fiksne velikosti. 1113 00:48:07,780 --> 00:48:09,380 Prav tako lahko rastejo dinamično. 1114 00:48:09,380 --> 00:48:13,220 >> Ampak sem podobno kot smo videli v tednih mimo, ne bomo nikoli dobili ničesar zastonj, 1115 00:48:13,220 --> 00:48:15,740 kot gotovo obstaja trade-off tukaj. 1116 00:48:15,740 --> 00:48:18,890 Torej z inflacijskih pritiskov vezavni seznam, je to dinamiko? 1117 00:48:18,890 --> 00:48:21,590 Ta sposobnost, da rastejo in odkrito, smo lahko storili brisanje 1118 00:48:21,590 --> 00:48:23,570 in bi lahko skrči, kot je potrebno. 1119 00:48:23,570 --> 00:48:24,710 Kakšno ceno smo plačal? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dvakrat toliko prostora, najprej. 1122 00:48:30,340 --> 00:48:34,010 Če pogledaš na sliki, ni več sem shranjevanje seznam števil. 1123 00:48:34,010 --> 00:48:36,740 Jaz shranjevanje seznam cela plus kazalci. 1124 00:48:36,740 --> 00:48:38,240 Tako da sem podvoji količino prostora. 1125 00:48:38,240 --> 00:48:40,740 Zdaj, morda to ni tako big deal 4 bajte, 8 bajti, 1126 00:48:40,740 --> 00:48:43,160 vendar bi to vsekakor dodati do velikih podatkovnih nizov. 1127 00:48:43,160 --> 00:48:45,570 Kaj je še ena slaba stran? 1128 00:48:45,570 --> 00:48:46,070 Ja? 1129 00:48:46,070 --> 00:48:48,010 >> OBČINSTVO: Moramo jim prečkala eno-by-one. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Ja. 1131 00:48:48,760 --> 00:48:50,260 Moramo jim prečkala eno-by-one. 1132 00:48:50,260 --> 00:48:53,860 Veš kaj, smo dali gor to super priročno funkcijo kvadratni nosilec 1133 00:48:53,860 --> 00:48:57,240 zapis, bolj pravilno znan kot bralno, 1134 00:48:57,240 --> 00:48:59,280 kjer smo lahko samo skok posameznemu elementu 1135 00:48:59,280 --> 00:49:01,470 zdaj pa če sem še vedno imel moji prostovoljci tukaj, 1136 00:49:01,470 --> 00:49:04,660 če sem hotel, da bi našli Številka 22, ne morem samo 1137 00:49:04,660 --> 00:49:06,620 skok na nosilec nečesa nekaj. 1138 00:49:06,620 --> 00:49:10,530 Moram pogledati preko seznama, veliko kot naši iskanjem primerov linearno, 1139 00:49:10,530 --> 00:49:12,260 poiskati številko 22. 1140 00:49:12,260 --> 00:49:14,340 Tako se zdi, da so plačali ceno tam. 1141 00:49:14,340 --> 00:49:16,430 Vendar smo lahko kljub temu reševanje drugih problemov. 1142 00:49:16,430 --> 00:49:18,587 >> Dejstvo je, naj vam predstavim le nekaj vizualnost. 1143 00:49:18,587 --> 00:49:20,920 Torej, če ste bili do Mather jedilnici pred kratkim, 1144 00:49:20,920 --> 00:49:23,320 boste opozarjajo, da njihova skladovnice pladnjev, kot je ta, 1145 00:49:23,320 --> 00:49:26,300 bomo sposodili teh iz Annenberg pred razredom. 1146 00:49:26,300 --> 00:49:28,930 Torej, to skladovnica pladnjev, čeprav, je zastopnik dejansko 1147 00:49:28,930 --> 00:49:30,860 strukture računalništva podatkov. 1148 00:49:30,860 --> 00:49:32,910 Je podatkovna struktura v računalništvu 1149 00:49:32,910 --> 00:49:38,010 znan kot odvodnik, ki zelo lepo dovzetni za točno to vizualno. 1150 00:49:38,010 --> 00:49:41,380 Torej, če je vsako od teh pladnjev ne pladenj, ampak kot veliko in sem hotel 1151 00:49:41,380 --> 00:49:45,010 za shranjevanje številk, I bi lahko dal eno dol, 1152 00:49:45,010 --> 00:49:48,320 in jaz bi dal še en tukaj, in še naprej zlaganje številk 1153 00:49:48,320 --> 00:49:53,180 na vrhu med seboj, in kar je potencialno koristno o tem 1154 00:49:53,180 --> 00:49:55,450 je, da tisto, kar je bila posledica te strukture podatkov? 1155 00:49:55,450 --> 00:49:58,045 Katerih število morem izvleči Prvi najprikladneje? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Najbolj nedavno en dal tam. 1158 00:50:03,030 --> 00:50:06,430 >> Torej, to je tisto, kar bi nas pokličite računalništva podatkovna struktura LIFO. 1159 00:50:06,430 --> 00:50:08,070 Zadnji noter, prvi ven. 1160 00:50:08,070 --> 00:50:10,800 In bomo videli kmalu, zakaj da bi bilo koristno, vendar za zdaj, 1161 00:50:10,800 --> 00:50:12,200 pomislimo le na premoženje. 1162 00:50:12,200 --> 00:50:15,158 In to je nekako neumno, če menite, o tem, kako jedilnica to počne. 1163 00:50:15,158 --> 00:50:17,910 Vsakič, ko so čisti pladnji in dal svež tisti na vrhu, 1164 00:50:17,910 --> 00:50:22,160 bi lahko imeli prej čisto ampak na koncu je zelo umazana in prašna 1165 00:50:22,160 --> 00:50:24,360 pladenj na samem dnu če vas nikoli dejansko 1166 00:50:24,360 --> 00:50:26,820 priti do dna, da stack, ker vas samo 1167 00:50:26,820 --> 00:50:29,380 obdržati dajanje novih in čiste tisti na vrhu je. 1168 00:50:29,380 --> 00:50:31,840 Ista stvar se lahko zgodi, v supermarketu preveč. 1169 00:50:31,840 --> 00:50:35,450 Če imate vitrini mleka in vsakič CVS 1170 00:50:35,450 --> 00:50:37,610 ali kdor dobi več mleka, ki ste jo pravkar zabil za mleko, 1171 00:50:37,610 --> 00:50:39,880 že imate v hrbtu in si dal nove spredaj, 1172 00:50:39,880 --> 00:50:43,088 boste imeli nekaj zelo grdo mleko na koncu strukture podatkov, 1173 00:50:43,088 --> 00:50:46,390 zato, ker je vedno na dnu ali ekvivalentno je vedno na hrbtu. 1174 00:50:46,390 --> 00:50:50,407 >> Toda obstaja še en način, da razmišljajo o podloga ki gre gor podatke in primer, je to. 1175 00:50:50,407 --> 00:50:53,490 Če ste eden izmed tistih ljudi, ki ima rad line up zunaj trgovin Apple 1176 00:50:53,490 --> 00:50:55,610 ko nov izdelek prihaja ven, ste verjetno 1177 00:50:55,610 --> 00:50:58,780 ne uporabljate podatkov dimnika struktura, saj vas 1178 00:50:58,780 --> 00:51:03,070 bi odtujiti vsakdo drug, ki je podloga ki gre gor za nakup nekaj novo igračo. 1179 00:51:03,070 --> 00:51:06,610 Namesto, da ste verjetno uporabljate kakšne strukture podatkov 1180 00:51:06,610 --> 00:51:10,050 ali kakšen sistem v resničnem svetu? 1181 00:51:10,050 --> 00:51:13,493 Upajmo, da je linija, ali več pravilno ali več britansko-podobno, čakalna vrsta. 1182 00:51:13,493 --> 00:51:17,700 In se izkaže, čakalne vrste, je tudi Struktura podatkov v računalništvu, 1183 00:51:17,700 --> 00:51:19,700 toda čakalna vrsta ima zelo drugačna lastnina. 1184 00:51:19,700 --> 00:51:20,820 To ni LIFO. 1185 00:51:20,820 --> 00:51:21,990 Zadnji noter, prvi ven. 1186 00:51:21,990 --> 00:51:22,800 Bog ne daj. 1187 00:51:22,800 --> 00:51:24,280 To je namesto FIFO. 1188 00:51:24,280 --> 00:51:26,110 Prvi noter, prvi ven. 1189 00:51:26,110 --> 00:51:27,970 In to je dobra stvar za poštenost "zaradi 1190 00:51:27,970 --> 00:51:30,428 Zagotovo, če ste podloga up super zgodaj zjutraj. 1191 00:51:30,428 --> 00:51:33,400 Če prideš tja najprej, ti želijo, da bi dobili najprej kot dobro. 1192 00:51:33,400 --> 00:51:35,880 >> In tako vse te podatke strukture, čakalne vrste in nizov 1193 00:51:35,880 --> 00:51:39,220 in grozde drugih, izkaže vas Lahko pomislite na to kot samo matrike. 1194 00:51:39,220 --> 00:51:41,820 To je niz, morda fiksna velikost 4, vendar pa bi 1195 00:51:41,820 --> 00:51:44,990 se nekako lepo, če bi lahko samo kopičijo Pladnji skoraj neskončno visok, če bomo 1196 00:51:44,990 --> 00:51:46,780 imajo, da je veliko pladnje ali številk. 1197 00:51:46,780 --> 00:51:48,840 Mogoče želimo uporabite povezani seznam tukaj, 1198 00:51:48,840 --> 00:51:51,800 vendar trade-off se bo lahko, da potrebujemo več pomnilnika, 1199 00:51:51,800 --> 00:51:55,930 traja malo več časa, vendar smo ne omejujejo višine dimnika, 1200 00:51:55,930 --> 00:51:59,550 podobno kot vitrina Mather je lahko omejuje velikost dimnika, 1201 00:51:59,550 --> 00:52:03,117 in tako so ti sklepi oblikovanje ali možnosti so na voljo za nas v končni fazi. 1202 00:52:03,117 --> 00:52:04,950 Torej s temi podatki strukture, smo začeli 1203 00:52:04,950 --> 00:52:09,360 videnje nove zgornje meje potencialno o tem, kaj je bilo prej super hitro 1204 00:52:09,360 --> 00:52:11,260 in kjer bomo zapustili off danes in kje 1205 00:52:11,260 --> 00:52:13,200 bomo upam, da pridete do je v sredo, bomo 1206 00:52:13,200 --> 00:52:15,740 začeli iskati po podatkih struktura, ki nam omogoča iskanje 1207 00:52:15,740 --> 00:52:18,260 s pomočjo podatkov v dnevniku času končno spet. 1208 00:52:18,260 --> 00:52:21,470 In videli smo, da se spomnimo, v ničelni tednu in ena z binarnim iskanjem ali razkoraka 1209 00:52:21,470 --> 00:52:22,180 in vladaj. 1210 00:52:22,180 --> 00:52:26,240 Prihaja še nazaj in bolje, sveti gral za to sredo 1211 00:52:26,240 --> 00:52:29,510 bo prišel gor s podatkovna struktura, ki deluje resnično 1212 00:52:29,510 --> 00:52:32,070 ali teoretično konstantna čas, pri čemer 1213 00:52:32,070 --> 00:52:34,760 ni važno koliko milijone ali milijarde stvari 1214 00:52:34,760 --> 00:52:38,470 imamo v strukturi podatkov, bo to nam bo konstantno časa, morda en korak 1215 00:52:38,470 --> 00:52:41,387 ali dva koraka ali 10 korakov, vendar je konstantno število korakov 1216 00:52:41,387 --> 00:52:42,970 iskanje po te strukture podatkov. 1217 00:52:42,970 --> 00:52:46,300 Da bo res lahko sveti gral vendar več o tem v sredo. 1218 00:52:46,300 --> 00:52:49,045 Se vidimo takrat. 1219 00:52:49,045 --> 00:52:53,704 >> [Predvaja glasba] 1220 00:52:53,704 --> 00:56:08,448