1 00:00:00,000 --> 00:00:03,381 >> [Přehrávání hudby] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEOPŘEHRÁVÁNÍ] 4 00:00:11,610 --> 00:00:13,640 >> -Je Lže. 5 00:00:13,640 --> 00:00:14,380 >> -O čem? 6 00:00:14,380 --> 00:00:17,182 >> Já nevím. 7 00:00:17,182 --> 00:00:19,990 >> -Tak Co víme? 8 00:00:19,990 --> 00:00:23,145 >> -To V ​​9:15, Ray Santoya byl u bankomatu. 9 00:00:23,145 --> 00:00:23,644 -To jo. 10 00:00:23,644 --> 00:00:27,030 Takže otázka je, co dělal v 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Č.9 milimetr na něco. 12 00:00:29,720 --> 00:00:31,540 Možná viděl odstřelovače. 13 00:00:31,540 --> 00:00:33,412 >> -Nebo Pracoval s ním. 14 00:00:33,412 --> 00:00:34,340 >> Počkat. 15 00:00:34,340 --> 00:00:36,200 Zpátky o jednu. 16 00:00:36,200 --> 00:00:36,975 >> -Co vidíš? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Jeho tvář plném rozsahu. 19 00:00:47,805 --> 00:00:48,680 >> His brýle. 20 00:00:48,680 --> 00:00:50,060 >> -Je To odraz. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Je To baseballového týmu Nuevitas. 23 00:01:02,280 --> 00:01:03,110 To je jejich logo. 24 00:01:03,110 --> 00:01:05,820 >> -A Mluví se kdo má na sobě tu bundu. 25 00:01:05,820 --> 00:01:06,670 >> [END Přehrávání] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: Dobře. 27 00:01:07,628 --> 00:01:11,210 To je CS50 a to je trochu více ze dne [neslyšitelný], s níž jste 28 00:01:11,210 --> 00:01:12,890 pustily s problémem set čtyři. 29 00:01:12,890 --> 00:01:16,606 Dnes začneme trochu vypadat více hluboce se na tyto věci zvané ukazatele, 30 00:01:16,606 --> 00:01:18,480 který i když je to docela tajemný téma, 31 00:01:18,480 --> 00:01:20,813 Ukazuje se, že to bude být prostředky, které jsme 32 00:01:20,813 --> 00:01:24,320 může začít stavět a montáže mnohem sofistikovanější programy. 33 00:01:24,320 --> 00:01:28,150 Ale my jsme to udělali na poslední středu prostřednictvím nějakého claymation prvního. 34 00:01:28,150 --> 00:01:30,190 Takže to, odvolání, je Binky a my ho použít 35 00:01:30,190 --> 00:01:33,148 aby se podívat na program, který se opravdu dělat nic zajímavého, 36 00:01:33,148 --> 00:01:34,950 ale to přece odhalil několik problémů. 37 00:01:34,950 --> 00:01:38,570 Takže začít dnes, proč chodíme rychle procházet některé z těchto kroků, 38 00:01:38,570 --> 00:01:41,920 se snaží pálit do lidského hlediska je přesně to, co se tady děje 39 00:01:41,920 --> 00:01:45,410 a proč je to špatné, a pak přejít na a skutečně začít budovat něco, 40 00:01:45,410 --> 00:01:46,309 s touto technikou? 41 00:01:46,309 --> 00:01:48,350 Tak to byl první dva řádky v tomto programu 42 00:01:48,350 --> 00:01:51,340 a Laicky řečeno, to, co jsou tyto dva řádky dělají? 43 00:01:51,340 --> 00:01:55,600 Někdo, kdo je přiměřeně komfortní s tím, co je deklarováno na obrazovce? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Jaké jsou tyto dva řádky dělají? 46 00:02:00,120 --> 00:02:02,070 To není všechno, se liší od jednoho týdne, 47 00:02:02,070 --> 00:02:03,611 ale tam je nějaká nová speciální symbol. 48 00:02:03,611 --> 00:02:04,152 To jo? 49 00:02:04,152 --> 00:02:05,628 Tam vzadu. 50 00:02:05,628 --> 00:02:07,092 >> Diváků: Deklarování ukazatele? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: znovu, řekni? 52 00:02:08,050 --> 00:02:08,860 Diváků: Deklarování ukazatele? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: Deklarace ukazatele a pojďme upřesnit to trochu víc. 54 00:02:11,776 --> 00:02:14,050 Diváků: [Neslyšitelné] adresa x a pak y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: A pak se zabývat. 56 00:02:15,300 --> 00:02:18,550 Takže, co konkrétně děláme je deklarujeme dvě proměnné. 57 00:02:18,550 --> 00:02:21,252 Tyto proměnné, ačkoli, jdou být typu int hvězdy, které 58 00:02:21,252 --> 00:02:23,210 konkrétněji znamená, jdou k ukládání 59 00:02:23,210 --> 00:02:26,450 adresu int, respektive, x a y. 60 00:02:26,450 --> 00:02:27,660 Nyní existují nějaké hodnoty? 61 00:02:27,660 --> 00:02:32,621 Existují nějaké skutečné adresy v nich dvě proměnné v tomto okamžiku? 62 00:02:32,621 --> 00:02:33,120 Ne. 63 00:02:33,120 --> 00:02:35,030 Je to jen tzv hodnoty odpadky. 64 00:02:35,030 --> 00:02:38,120 Pokud nemáte skutečně přiřadit variabilní, co bylo v RAM 65 00:02:38,120 --> 00:02:42,224 předtím se chystá vyplnit nulami a ty, obě z těchto proměnných. 66 00:02:42,224 --> 00:02:44,140 Ale my ještě nevíme co jsou a to je 67 00:02:44,140 --> 00:02:47,060 Bude klíčem k proč Binkym ztratil hlavu minulý týden. 68 00:02:47,060 --> 00:02:49,980 >> Tak tohle byl claymation ztělesnění tohoto 69 00:02:49,980 --> 00:02:53,580 kdy máte jen dvě proměnné, malé kruhové kusy hlíny, 70 00:02:53,580 --> 00:02:57,330 které lze ukládat proměnné, ale jako zabalený up šipky naznačují, 71 00:02:57,330 --> 00:03:00,640 oni nejsou ve skutečnosti ukazující kamkoliv o sobě známé. 72 00:03:00,640 --> 00:03:03,670 A tak jsme měli tento řádek, a to byl nový minulý týden, malloc pro paměť 73 00:03:03,670 --> 00:03:07,130 alokace, což je jen ozdobný způsob, jak vyprávění operační systém, Linux 74 00:03:07,130 --> 00:03:09,750 nebo Mac OS nebo Windows, hej, dej mi nějakou paměť, 75 00:03:09,750 --> 00:03:11,780 a vše, co musíte říct, operační systém 76 00:03:11,780 --> 00:03:14,699 je to, co když žádají to pro paměť. 77 00:03:14,699 --> 00:03:16,990 Není to bude jedno, co budeš dělat s tím, 78 00:03:16,990 --> 00:03:19,786 ale musíte říci provozní Systém, co cestou malloc. 79 00:03:19,786 --> 00:03:20,286 To jo? 80 00:03:20,286 --> 00:03:21,078 >> Diváků: Kolik? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Kolik? 82 00:03:21,994 --> 00:03:25,280 Kolik v bytech, a tak, tak se opět neobvyklý způsob příklad, je jen říct, 83 00:03:25,280 --> 00:03:27,360 dej mi velikost int. 84 00:03:27,360 --> 00:03:30,550 Nyní, velikost int čtyři bajtů nebo 32 bitů. 85 00:03:30,550 --> 00:03:32,850 Tak to je jen způsob, jak řka, hej, operační systém, 86 00:03:32,850 --> 00:03:37,290 dej mi čtyři bajtů paměti že mohu použít mám k dispozici, 87 00:03:37,290 --> 00:03:40,560 a zejména, co dělá malloc Přiznání k dani s ohledem 88 00:03:40,560 --> 00:03:41,795 k tomuto kusu čtyři bajty? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 Publikum: Adresa? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: Adresa. 92 00:03:45,901 --> 00:03:47,580 Adresa tohoto kusu čtyř bajtů. 93 00:03:47,580 --> 00:03:48,190 Přesně tak. 94 00:03:48,190 --> 00:03:51,430 A tak to je to, co je uloženo v konečném v x, a to je důvod, proč jsme opravdu nemám 95 00:03:51,430 --> 00:03:55,240 jedno, co je počet, který adresa, ať už je to OX1 nebo OX2 96 00:03:55,240 --> 00:03:57,110 nebo nějaký tajemný hexadecimální adresa. 97 00:03:57,110 --> 00:03:59,850 Jen Staráme obrazově že tato proměnná x je nyní 98 00:03:59,850 --> 00:04:01,630 směřovat k tomuto kusu paměti. 99 00:04:01,630 --> 00:04:05,570 Takže šipka představuje ukazatel, nebo Více specificky, adresa paměti. 100 00:04:05,570 --> 00:04:09,120 Ale opět, my ne typicky jedno co tyto skutečné adresy. 101 00:04:09,120 --> 00:04:11,780 Nyní říká, že tento řádek co v Laicky řečeno? 102 00:04:11,780 --> 00:04:14,330 Hvězda x dostane 42 středník. 103 00:04:14,330 --> 00:04:17,390 Co to znamená? 104 00:04:17,390 --> 00:04:18,200 Chceš jít? 105 00:04:18,200 --> 00:04:20,102 Nepoškrábejte krk. 106 00:04:20,102 --> 00:04:22,360 >> Diváků: Adresa x je na 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Adresa x je na 42. 108 00:04:24,300 --> 00:04:25,190 Ne tak docela. 109 00:04:25,190 --> 00:04:28,485 Tak blízko, ale ne tak docela, protože tam je hvězda, která je prefixu tuto x. 110 00:04:28,485 --> 00:04:29,860 Proto musíme vyladit trochu. 111 00:04:29,860 --> 00:04:31,032 To jo? 112 00:04:31,032 --> 00:04:36,044 >> Diváků: Hodnota, že pointer x ukazuje, je 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 Hodnota, že ukazatel je x ukázal na, řekněme, bude 42, 115 00:04:40,840 --> 00:04:44,165 nebo jinak řečeno, hvězdu x říká, jděte na adresu jakéhokoli 116 00:04:44,165 --> 00:04:48,340 je v x, ať už je to 1 Oxford Ulice nebo 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 nebo OX1 nebo ox33, cokoliv že číselná adresa, 118 00:04:51,850 --> 00:04:54,380 hvězda x je dereferencing x. 119 00:04:54,380 --> 00:04:57,297 Tak jděte na tuto adresu a pak dal číslo 42 tam. 120 00:04:57,297 --> 00:04:59,380 Tak, že by bylo ekvivalent způsob, jak říct, že. 121 00:04:59,380 --> 00:05:01,860 Tak to je vše v pořádku a poté bychom představovat obraz 122 00:05:01,860 --> 00:05:05,370 takto, kde jsme přidali element 42 na tento kus čtyř 123 00:05:05,370 --> 00:05:09,370 bajtů na pravé straně, ale Tato linka byla, kde věci pokazilo 124 00:05:09,370 --> 00:05:11,120 a Binky hlava vyskočila off v tomto bodě, 125 00:05:11,120 --> 00:05:15,290 proto, že špatné věci se stávají, když jste dereference hodnot odpadky 126 00:05:15,290 --> 00:05:18,210 nebo dereference neplatné ukazatele, a já říkám neplatné 127 00:05:18,210 --> 00:05:21,020 protože v tomto bodě příběh, co je uvnitř y? 128 00:05:21,020 --> 00:05:24,440 Jaká je hodnota y na bázi Na posledních několika krocích? 129 00:05:24,440 --> 00:05:25,360 To jo? 130 00:05:25,360 --> 00:05:26,115 Co je to? 131 00:05:26,115 --> 00:05:26,990 >> Diváků: Adresu. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: adresy. 133 00:05:28,460 --> 00:05:31,910 Mělo by se jednat o adresu ale jsem inicializaci to? 134 00:05:31,910 --> 00:05:32,800 Takže mám ještě ne. 135 00:05:32,800 --> 00:05:35,430 Takže to, co je známo, že je tam? 136 00:05:35,430 --> 00:05:37,590 Je to jen nějaký odpad hodnotu. 137 00:05:37,590 --> 00:05:41,500 Mohlo by to být jakákoliv adresa od nuly do 2000000000 pokud máte dva koncerty RAM, 138 00:05:41,500 --> 00:05:44,289 nebo nula až 4000000000, pokud jste dostal čtyři GB paměti RAM. 139 00:05:44,289 --> 00:05:46,080 Je to nějaký odpad hodnota, ale problém je 140 00:05:46,080 --> 00:05:48,200 že operační systém, pokud není vám dal 141 00:05:48,200 --> 00:05:51,140 že kus paměti specificky že se snažíte jít do, 142 00:05:51,140 --> 00:05:54,650 to obecně bude způsobovat to, co jsme viděli jako poruchu segmentaci. 143 00:05:54,650 --> 00:05:57,810 Takže ve skutečnosti, některé z vás, kteří mají bojoval na problémy v úředních hodinách 144 00:05:57,810 --> 00:06:00,393 nebo problémů, které je více obecně se snaží přijít na to, 145 00:06:00,393 --> 00:06:02,150 chyba segmentace, že obecně znamená, 146 00:06:02,150 --> 00:06:05,017 jste dotýká segment paměti, že byste neměli být. 147 00:06:05,017 --> 00:06:07,350 Ty dotýká paměť, která operační systém nemá 148 00:06:07,350 --> 00:06:10,450 nechá vás dotknout, ať už je to tím, že jde příliš daleko ve svém poli 149 00:06:10,450 --> 00:06:12,870 nebo od této chvíle, ať už je to proto, že jste se dotknete 150 00:06:12,870 --> 00:06:14,780 paměť, která prostě nějaký odpad hodnota. 151 00:06:14,780 --> 00:06:18,230 >> Tak dělá hvězda x zde druh nedefinované chování. 152 00:06:18,230 --> 00:06:22,030 Nikdy byste neměli dělat, protože kurzy jsou, program to jen bude k havárii, 153 00:06:22,030 --> 00:06:24,050 protože jste říkal, jděte na tuto adresu 154 00:06:24,050 --> 00:06:27,000 a nemáte tušení, kde že adresa ve skutečnosti je. 155 00:06:27,000 --> 00:06:30,300 Tudíž systém je pravděpodobné spadne svůj program 156 00:06:30,300 --> 00:06:33,840 jako výsledek a opravdu, to je co se tam stalo, aby Binkym. 157 00:06:33,840 --> 00:06:37,210 Takže nakonec, Binky fixní tento problém s tím. 158 00:06:37,210 --> 00:06:38,909 Takže tento program sám byl chybný. 159 00:06:38,909 --> 00:06:41,450 Ale pokud jste nějak kupředu a místo toho spustit tento řádek, 160 00:06:41,450 --> 00:06:45,580 y se rovná x prostě znamená cokoliv adresa je x, také dát ji do y. 161 00:06:45,580 --> 00:06:48,740 >> A tak obrazově, máme reprezentován to s dvěma šipkami 162 00:06:48,740 --> 00:06:51,570 z x a y z ukazující na stejné místo. 163 00:06:51,570 --> 00:06:55,760 Takže sémanticky, x je rovno k y, protože oba tyto 164 00:06:55,760 --> 00:07:00,300 ukládáte stejný adresa, ergo ukázal na 42, 165 00:07:00,300 --> 00:07:04,910 a teď, když říkáte, hvězda y, jděte na adresu v y, 166 00:07:04,910 --> 00:07:06,790 to má zajímavý vedlejší efekt. 167 00:07:06,790 --> 00:07:10,320 Takže adresu v y je totéž jako adresu v x. 168 00:07:10,320 --> 00:07:15,060 Takže pokud jste, že jít na adresu v y a změňte hodnotu na 13, 169 00:07:15,060 --> 00:07:17,140 kdo jiný je ovlivněn? 170 00:07:17,140 --> 00:07:21,100 X, bod D, abych tak řekl, by měly být ovlivněny také. 171 00:07:21,100 --> 00:07:24,340 >> A skutečně, jak se Nick nakreslil tento obrázek v claymation bylo přesně to. 172 00:07:24,340 --> 00:07:28,665 I když jsme sledovat ukazatel y, jsme skončili na stejném místě, 173 00:07:28,665 --> 00:07:32,780 a tak pokud bychom měli k vytištění out X nebo Y je pointee, 174 00:07:32,780 --> 00:07:35,720 pak bychom vidět hodnotu 13. 175 00:07:35,720 --> 00:07:37,927 A teď, říkám pointee být v souladu s videem. 176 00:07:37,927 --> 00:07:39,760 Programátoři, k mému znalosti, vlastně nikdy 177 00:07:39,760 --> 00:07:42,460 řekni slovo pointee, to, co je špičatá 178 00:07:42,460 --> 00:07:44,650 na, ale pro konzistence s videem, realizovat 179 00:07:44,650 --> 00:07:47,520 to je vše, co bylo znamenalo v takové situaci. 180 00:07:47,520 --> 00:07:54,190 Takže jakékoli otázky týkající claymation nebo ukazovátka nebo malloc ještě ne? 181 00:07:54,190 --> 00:07:54,850 Ne? 182 00:07:54,850 --> 00:07:55,470 Dobře. 183 00:07:55,470 --> 00:07:58,560 >> Takže bez dalšího ado, pojďme se podívat 184 00:07:58,560 --> 00:08:00,700 na to, kde to má vlastně byl používán na nějakou dobu. 185 00:08:00,700 --> 00:08:03,580 Takže jsme měli tuto knihovnu CS50 že má všechny tyto funkce. 186 00:08:03,580 --> 00:08:06,810 Použili jsme GetInt hodně, getString, Pravděpodobně GetLongLong dříve 187 00:08:06,810 --> 00:08:09,840 v mém pset jednoho nebo tak, ale co se skutečně děje? 188 00:08:09,840 --> 00:08:12,920 Dobře, pojďme se rychle podívat pod kapotou v programu, který 189 00:08:12,920 --> 00:08:17,017 inspiruje, proč dáváme vám to CS50 knihovna, a dokonce od minulého týdne, 190 00:08:17,017 --> 00:08:18,850 jsme začali brát ty, tréninkové kola off. 191 00:08:18,850 --> 00:08:21,080 Takže toto je nyní seřazena z toho, co posmrtné 192 00:08:21,080 --> 00:08:23,690 má se děje uvnitř knihovny CS50, 193 00:08:23,690 --> 00:08:27,250 i když jsme teď začne pohybovat pryč od toho u většiny programů. 194 00:08:27,250 --> 00:08:29,460 >> Takže tohle je program s názvem scanf 0. 195 00:08:29,460 --> 00:08:30,510 Je to super krátké. 196 00:08:30,510 --> 00:08:33,909 To se prostě musí tyto řádky, ale to zavádí funkci nazvanou scanf 197 00:08:33,909 --> 00:08:36,909 že jsme skutečně uvidí v moment uvnitř knihovny CS50, 198 00:08:36,909 --> 00:08:38,600 i když v trochu jiné podobě. 199 00:08:38,600 --> 00:08:41,330 Takže tento program na řádku 16 je deklarování proměnné x. 200 00:08:41,330 --> 00:08:43,150 Tak mi dej čtyři byty pro int. 201 00:08:43,150 --> 00:08:45,750 Je to už říkal uživatele, číslo, prosím, a poté 202 00:08:45,750 --> 00:08:49,010 To je zajímavé, že linka ve skutečnosti spojuje dohromady minulý týden 203 00:08:49,010 --> 00:08:49,790 a tohle. 204 00:08:49,790 --> 00:08:53,230 Scanf, a pak všimnete, že trvá formát řetězce, stejně jako printf, 205 00:08:53,230 --> 00:08:57,480 % i znamená int, a pak to trvá Druhý argument, který vypadá trochu 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Je to ampersand x, a připomenout, jsme viděli jen jednou minulý týden. 208 00:09:01,880 --> 00:09:03,465 Co ampersand x představuje? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Co ampersand dělat v C? 211 00:09:08,450 --> 00:09:08,950 To jo? 212 00:09:08,950 --> 00:09:10,024 >> Diváků: Adresa. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Adresa. 214 00:09:11,190 --> 00:09:13,190 Takže je to naopak provozovatele hvězdy, 215 00:09:13,190 --> 00:09:17,270 že se provozovatel hvězda říká, jděte na tato adresa, ampersand operátor 216 00:09:17,270 --> 00:09:20,280 říká, zjistit adresa této proměnné, 217 00:09:20,280 --> 00:09:23,530 a proto je tento klíč, protože Účelem scanf v životě 218 00:09:23,530 --> 00:09:26,320 je pro skenování uživatele vstup z klávesnice, 219 00:09:26,320 --> 00:09:29,970 v závislosti na co on nebo ona typy, a pak si přečtěte vstup daného uživatele 220 00:09:29,970 --> 00:09:32,970 do proměnné, ale viděli v posledních dvou týdnech 221 00:09:32,970 --> 00:09:36,080 že tato funkce odkládací, že jsme Snažil snadno implementovat 222 00:09:36,080 --> 00:09:37,110 Jen rozbité. 223 00:09:37,110 --> 00:09:42,470 Připomeňme si, že s funkcí odkládací, pokud bychom prostě prohlásil, A a B, jak ints, 224 00:09:42,470 --> 00:09:47,040 jsme se úspěšně swap dvě proměnné vnitřek swapu 225 00:09:47,040 --> 00:09:50,080 Stejně jako u mléka a Úředním věstníku, ale jakmile odkládací vrátil, 226 00:09:50,080 --> 00:09:55,200 co byl výsledek s ohledem k x a y, původní hodnoty? 227 00:09:55,200 --> 00:09:55,700 Nic. 228 00:09:55,700 --> 00:09:56,200 To jo. 229 00:09:56,200 --> 00:09:59,754 Nic se nestalo, že čas, protože swapy měnit pouze jeho místní kopie, 230 00:09:59,754 --> 00:10:01,670 což znamená, všechny Tentokrát, kdykoli máme 231 00:10:01,670 --> 00:10:04,010 předával v argumentech k funkcím, my jsme 232 00:10:04,010 --> 00:10:05,939 právě procházející kopie těchto argumentů. 233 00:10:05,939 --> 00:10:07,980 Můžete to udělat s tím co chcete s nimi, 234 00:10:07,980 --> 00:10:10,890 ale oni budou mít žádný vliv na původní hodnoty. 235 00:10:10,890 --> 00:10:13,650 Tak to je problematické, pokud vás Chcete mít funkci jako scanf 236 00:10:13,650 --> 00:10:17,170 v životě, jejichž účelem je skenování uživatelského vstupu z klávesnice 237 00:10:17,170 --> 00:10:22,010 a pak vyplnit prázdná místa, tak aby mluvit, to je, dát proměnné, jako je x 238 00:10:22,010 --> 00:10:25,410 hodnotu, protože kdybych byl jen projít x na scanf, 239 00:10:25,410 --> 00:10:28,790 pokud se domníváte, logiku poslední týden, může scanf dělat, co chce 240 00:10:28,790 --> 00:10:33,100 s kopií x, ale to nemohlo trvalou změnu x, pokud dáváme 241 00:10:33,100 --> 00:10:37,120 scanf mapu pokladu, abych tak řekl, kde x označuje místo, přičemž 242 00:10:37,120 --> 00:10:41,860 míjíme v adrese X tak, scanf může jít tam a vlastně změna 243 00:10:41,860 --> 00:10:42,920 hodnota x. 244 00:10:42,920 --> 00:10:45,080 A tak opravdu, vše že tento program dělá 245 00:10:45,080 --> 00:10:53,180 když udělám scanf 0, v mém zdroji 5 m adresář, aby scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot lomítko scanf, číslo prosím 50, díky za 50. 247 00:10:57,730 --> 00:11:01,020 >> Takže to není všechno tak zajímavé, ale co se skutečně děje 248 00:11:01,020 --> 00:11:04,820 je to, že jakmile jsem zavolat scanf tady, hodnotu x 249 00:11:04,820 --> 00:11:06,410 se trvale měnit. 250 00:11:06,410 --> 00:11:08,335 Teď se to zdá pěkné a dobře, a ve skutečnosti je 251 00:11:08,335 --> 00:11:11,200 Zdá se, jako bychom vlastně nepotřebujeme CS50 knihovna vůbec už ne. 252 00:11:11,200 --> 00:11:13,960 Například, pojďme běžet tento více zde jednou. 253 00:11:13,960 --> 00:11:15,750 Dovolte mi, abych ho znovu na vteřinu. 254 00:11:15,750 --> 00:11:20,600 Zkusme číslo, prosím, a místo toho říká, 50 jako předtím, 255 00:11:20,600 --> 00:11:22,810 řekněme, ne. 256 00:11:22,810 --> 00:11:24,000 OK, to je trochu divný. 257 00:11:24,000 --> 00:11:25,270 DOBŘE. 258 00:11:25,270 --> 00:11:28,680 A jen některé nesmysl zde. 259 00:11:28,680 --> 00:11:31,170 Takže to nevypadá, zvládnout chybné situace. 260 00:11:31,170 --> 00:11:33,620 Proto musíme minimálně začátek přidá nějaká chyba v kontrole 261 00:11:33,620 --> 00:11:37,460 aby se ujistil, že má uživatel napsáno v skutečného počtu, jako 50, 262 00:11:37,460 --> 00:11:40,720 protože prý psaní slova není detekován jako problematické, 263 00:11:40,720 --> 00:11:42,020 ale pravděpodobně by mělo být. 264 00:11:42,020 --> 00:11:46,450 >> Podívejme se na tuto verzi nyní to je můj pokus o reimplement getString. 265 00:11:46,450 --> 00:11:48,437 Pokud scanf má tohle všechno funkčnost postavený v roce, 266 00:11:48,437 --> 00:11:51,270 Proto jsme byli pustily s těmito koleček, jako getString? 267 00:11:51,270 --> 00:11:55,450 No, tady je snad moje vlastní jednoduchá verze getString 268 00:11:55,450 --> 00:12:00,766 přičemž před týdnem, možná jsem již uvedl, dej mi řetězec a říkají vyrovnávací paměti. 269 00:12:00,766 --> 00:12:03,390 Dnes, budu začít právě řka: char hvězdu, kterou si vzpomínat, 270 00:12:03,390 --> 00:12:04,400 je to jen synonyma. 271 00:12:04,400 --> 00:12:06,629 Vypadá to děsivější, ale je to přesně to samé. 272 00:12:06,629 --> 00:12:09,420 Tak mi dej proměnnou s názvem vyrovnávací paměti že to bude ukládat řetězec, 273 00:12:09,420 --> 00:12:12,780 řekněte uživatelské řetězec, prosím, a potom, stejně jako předtím, 274 00:12:12,780 --> 00:12:17,760 Zkusme si půjčit této lekci scanf % s tentokrát a předat do vyrovnávací paměti. 275 00:12:17,760 --> 00:12:19,310 Nyní, rychlá kontrola zdravý rozum. 276 00:12:19,310 --> 00:12:22,120 Proč jsem neříkám ampersand vyrovnávací paměti tentokrát? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Vyvodit z předchozího příkladu. 279 00:12:26,625 --> 00:12:28,000 Diváků: Char hvězda je ukazatel. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Přesně tak, protože tentokrát, char 281 00:12:29,920 --> 00:12:34,080 Hvězda je již ukazatel, adresu, podle definice této hvězdy bytí tam. 282 00:12:34,080 --> 00:12:37,530 A pokud scanf očekává adresu, stačí jen projít do vyrovnávací paměti. 283 00:12:37,530 --> 00:12:39,260 Nepotřebuji říkat ampersand vyrovnávací paměti. 284 00:12:39,260 --> 00:12:42,177 Pro zvědavá, mohl byste něco takového. 285 00:12:42,177 --> 00:12:43,510 Měla by mít jiný význam. 286 00:12:43,510 --> 00:12:47,240 To by vám ukazatel na ukazatel, který je vlastně 287 00:12:47,240 --> 00:12:50,050 platný věc C, ale pro Nyní, pojďme aby to jednoduché 288 00:12:50,050 --> 00:12:51,750 a udržet příběh konzistentní. 289 00:12:51,750 --> 00:12:54,100 Já jsem prostě jít projít do vyrovnávací paměti, a to je správné. 290 00:12:54,100 --> 00:12:56,487 Problémem však je toto. 291 00:12:56,487 --> 00:12:58,820 Nech mě jít napřed a spuštění tohoto Program po kompilaci to. 292 00:12:58,820 --> 00:13:00,902 Proveďte scanf 1. 293 00:13:00,902 --> 00:13:02,610 Sakra, moje kompilátoru lov moje chyba. 294 00:13:02,610 --> 00:13:04,090 Dejte mi jednu sekundu. 295 00:13:04,090 --> 00:13:05,460 Řinčení. 296 00:13:05,460 --> 00:13:06,990 Řekněme, že scanf-1.C. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 DOBŘE. 299 00:13:11,380 --> 00:13:12,720 Tam jedeme. 300 00:13:12,720 --> 00:13:14,280 Potřebuji to. 301 00:13:14,280 --> 00:13:16,750 CS50 ID má různé nastavení konfigurace 302 00:13:16,750 --> 00:13:18,280 že vás chrání proti sobě. 303 00:13:18,280 --> 00:13:21,300 Potřeboval jsem vypnout ty by spuštění řinčení ručně této doby. 304 00:13:21,300 --> 00:13:22,140 Takže řetězec prosím. 305 00:13:22,140 --> 00:13:25,560 Chystám se jít dopředu a zadejte v mé oblíbené Hello World. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 To není to, co jsem napsal. 308 00:13:27,700 --> 00:13:29,690 Takže je to svědčí o něco mýlit. 309 00:13:29,690 --> 00:13:33,920 Nech mě jít dopředu a zadejte v opravdu dlouhý řetězec. 310 00:13:33,920 --> 00:13:37,210 Díky za null, a já nevím, pokud budu mít možnost to selhání. 311 00:13:37,210 --> 00:13:40,240 Zkusme trochu kopie vložit, a uvidíme, jestli to pomůže. 312 00:13:40,240 --> 00:13:43,290 Stačí vložit spoustu to. 313 00:13:43,290 --> 00:13:47,310 Je to určitě větší string než obvykle. 314 00:13:47,310 --> 00:13:51,450 Pojďme se jen opravdu napsat. 315 00:13:51,450 --> 00:13:51,950 Ne. 316 00:13:51,950 --> 00:13:52,650 Sakra. 317 00:13:52,650 --> 00:13:53,480 Command not found. 318 00:13:53,480 --> 00:13:54,550 Tak to je nesouvisí. 319 00:13:54,550 --> 00:13:56,440 Je to proto, že jsem vložit některé špatné znaky, 320 00:13:56,440 --> 00:13:59,780 ale to ukáže, nebude fungovat. 321 00:13:59,780 --> 00:14:03,510 >> Zkusme to ještě jednou, protože je to větší zábava, když jsme vlastně jeho zhroucení. 322 00:14:03,510 --> 00:14:09,116 Pojďme napište to a teď jsem bude kopírovat opravdu dlouhý řetězec 323 00:14:09,116 --> 00:14:10,990 a teď uvidíme, jestli budeme může způsobit zhroucení tuto věc. 324 00:14:10,990 --> 00:14:14,235 Všimněte si, jsem vynechal prostory a Nové linky a středníky 325 00:14:14,235 --> 00:14:16,035 a všechny funky znaky. 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 A teď síť právě bytí pomalu. 329 00:14:22,880 --> 00:14:27,460 Držel jsem se Command-V příliš dlouhý, jasně. 330 00:14:27,460 --> 00:14:28,190 Sakra! 331 00:14:28,190 --> 00:14:29,260 Command not found. 332 00:14:29,260 --> 00:14:29,780 >> DOBŘE. 333 00:14:29,780 --> 00:14:32,240 No, jde o to, Nicméně následující. 334 00:14:32,240 --> 00:14:36,910 Takže co se vlastně děje Na tomuto prohlášení 335 00:14:36,910 --> 00:14:39,240 char hvězdy vyrovnávací paměti na řádku 16? 336 00:14:39,240 --> 00:14:41,820 Takže to, co jsem dostat Prohlašuji, když ukazatel? 337 00:14:41,820 --> 00:14:47,440 Všechno Začínám je hodnota čtyř bajtů volal vyrovnávací paměti, ale to, co je uvnitř ní 338 00:14:47,440 --> 00:14:49,540 v současné době? 339 00:14:49,540 --> 00:14:50,930 Je to jen nějaký odpad hodnotu. 340 00:14:50,930 --> 00:14:54,170 Vzhledem k tomu, kdykoli budete deklarovat proměnnou v C, je to jen nějaký odpad hodnota, 341 00:14:54,170 --> 00:14:56,220 a my teď začínáme Podražení této reality. 342 00:14:56,220 --> 00:14:59,720 Teď, když řeknu scanf, jděte na tuto adresu 343 00:14:59,720 --> 00:15:01,520 a dal za jakýchkoliv uživatel zadá. 344 00:15:01,520 --> 00:15:06,400 Pokud se uživatel zadá ve ahoj svět, no, kde mám dát? 345 00:15:06,400 --> 00:15:07,750 Buffer je hodnota odpadky. 346 00:15:07,750 --> 00:15:11,510 >> Takže to je něco jako šíp to je ukázal, kdo ví kde. 347 00:15:11,510 --> 00:15:13,880 Možná, že je to ukázal přímo tady v mé paměti. 348 00:15:13,880 --> 00:15:16,560 A tak, když se uživatel druhy uvedené v hello world, 349 00:15:16,560 --> 00:15:22,380 se program pokusí dát string hello world zpětné lomítko 0 350 00:15:22,380 --> 00:15:23,910 se tím, že kus paměti. 351 00:15:23,910 --> 00:15:27,070 Ale s vysokou pravděpodobností, ale zjevně není 100% pravděpodobnost, 352 00:15:27,070 --> 00:15:30,440 Počítač bude pak pád program protože to není 353 00:15:30,440 --> 00:15:32,490 paměť I by mělo být umožněno na dotek. 354 00:15:32,490 --> 00:15:36,330 Takže ve zkratce, je tento program chybná přesně z tohoto důvodu. 355 00:15:36,330 --> 00:15:38,070 Já zásadně nedělám to, co? 356 00:15:38,070 --> 00:15:42,366 Jaké kroky mám vynechány, stejně jako jsme se vynechat Binkym první příklad? 357 00:15:42,366 --> 00:15:42,866 To jo? 358 00:15:42,866 --> 00:15:43,710 >> Diváků: alokace paměti? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: alokace paměti. 360 00:15:45,001 --> 00:15:48,400 Nemám ve skutečnosti přiděleny jakýkoli paměti pro tento řetězec. 361 00:15:48,400 --> 00:15:50,270 Takže můžeme opravit v několika způsoby. 362 00:15:50,270 --> 00:15:52,700 Jeden z nich, můžeme aby to jednoduché a ve skutečnosti, teď jsi 363 00:15:52,700 --> 00:15:55,116 začnou vidět rozostření z linek mezi tím, co 364 00:15:55,116 --> 00:15:58,520 Pole je, jaký je řetězec, jaká char hvězda je to, co řada znaků 365 00:15:58,520 --> 00:15:59,020 je. 366 00:15:59,020 --> 00:16:02,450 Zde je druhý příklad zahrnující řetězců a oznámení 367 00:16:02,450 --> 00:16:05,690 všechno, co jsem udělal na lince 16 je, místo toho říkat 368 00:16:05,690 --> 00:16:09,530 že vyrovnávací paměť bude char hvězda, ukazatel na kus paměti, 369 00:16:09,530 --> 00:16:14,057 Budu velmi aktivně dát sám sebe jako buffer pro 16 znaků, 370 00:16:14,057 --> 00:16:16,390 a ve skutečnosti, pokud jste obeznámeni s termínem vyrovnávací paměti, 371 00:16:16,390 --> 00:16:20,570 pravděpodobně ze světa videí, kde je video do vyrovnávací paměti, ukládání do vyrovnávací paměti, 372 00:16:20,570 --> 00:16:21,175 ukládání do vyrovnávací paměti. 373 00:16:21,175 --> 00:16:22,550 No, co je tu souvislost? 374 00:16:22,550 --> 00:16:24,960 No, Uvnitř YouTube a uvnitř video přehrávače 375 00:16:24,960 --> 00:16:27,200 obecně je pole to je větší než 16 let. 376 00:16:27,200 --> 00:16:30,340 To by mohlo být pole o velikosti jedné megabajt, možná 10 megabajtů, 377 00:16:30,340 --> 00:16:34,330 a do tohoto pole se váš prohlížeč stáhnout spoustu bytů, 378 00:16:34,330 --> 00:16:37,500 celá parta megabajtů video, a video přehrávač, 379 00:16:37,500 --> 00:16:40,930 YouTube je, nebo ten, kdo to začíná čtení bajtů z tohoto pole, 380 00:16:40,930 --> 00:16:43,530 a kdykoliv vidíte Slovo buffering, ukládání do vyrovnávací paměti, 381 00:16:43,530 --> 00:16:46,350 to znamená, že má hráč dostali na konec tohoto pole. 382 00:16:46,350 --> 00:16:50,430 Síť je tak pomalé, že to nemá naplnil pole s více byty 383 00:16:50,430 --> 00:16:55,610 a tak jste mimo bitů Pro zobrazení pro uživatele. 384 00:16:55,610 --> 00:16:59,430 >> Takže vyrovnávací paměť je výstižný termín zde v tom, že je to jen pole, kus paměti. 385 00:16:59,430 --> 00:17:02,530 A to bude opravit proto, že se ukazuje, 386 00:17:02,530 --> 00:17:07,410 že můžete léčit pole, jako kdyby jsou adresy, i když pufr 387 00:17:07,410 --> 00:17:10,710 je jen symbol, je to posloupnost znaků, pufr, 388 00:17:10,710 --> 00:17:14,760 To je užitečné pro mě, programátor, můžete předat své jméno kolem 389 00:17:14,760 --> 00:17:17,079 jako by se jednalo o ukazatel, jako by to 390 00:17:17,079 --> 00:17:21,000 byly adresa bloku paměti pro 16 znaků. 391 00:17:21,000 --> 00:17:24,530 Takže to má říkat, můžu projít scanf přesně to slovo 392 00:17:24,530 --> 00:17:30,670 a tak teď, když jsem dělat tento program, aby scanf 2, tečka lomítko scanf 2, 393 00:17:30,670 --> 00:17:35,386 a zadejte hello world, Enter, že time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, co se stalo? 395 00:17:37,590 --> 00:17:39,340 String prosím. 396 00:17:39,340 --> 00:17:41,430 Co jsem udělal špatně? 397 00:17:41,430 --> 00:17:43,800 Hello world, vyrovnávací paměti. 398 00:17:43,800 --> 00:17:44,705 Ahoj světe. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ach, já vím, co to dělá. 401 00:17:49,420 --> 00:17:49,920 DOBŘE. 402 00:17:49,920 --> 00:17:51,628 Takže to čte up až do prvního prostoru. 403 00:17:51,628 --> 00:17:55,680 Takže pojďme cheat na chvíli a říkají Chtěl jsem psát něco 404 00:17:55,680 --> 00:18:01,408 opravdu dlouhé, jako je to dlouhá věta to je jedna, dva, tři, čtyři, pět, 405 00:18:01,408 --> 00:18:04,420 šest, sedm, osm, devět, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 DOBŘE. 407 00:18:05,300 --> 00:18:07,600 Je to skutečně dlouhá věta. 408 00:18:07,600 --> 00:18:10,710 Takže tato věta delší než 16 znaků 409 00:18:10,710 --> 00:18:13,670 a tak když jsem stiskněte klávesu Enter, co se bude dít? 410 00:18:13,670 --> 00:18:16,940 No, v tomto případě z příběh, jsem prohlásil, vyrovnávací 411 00:18:16,940 --> 00:18:22,190 ve skutečnosti, že pole s 16 znaky připraven jít. 412 00:18:22,190 --> 00:18:27,426 Takže jeden, dva, tři, čtyři, pět, šest, sedm, osm, devět, 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 Takže 16 postavy, a teď, když jsem číst v něčem, jako je to dlouhá 415 00:18:34,410 --> 00:18:43,950 věta, co se bude dít se že budu číst v tomto je dlouhá 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, věty. 417 00:18:49,660 --> 00:18:52,270 >> Tak tohle je záměrně špatná věc, kterou jsem 418 00:18:52,270 --> 00:18:55,060 udržet psaní za hranice Hranice mého pole, 419 00:18:55,060 --> 00:18:56,660 za hranice mé paměti. 420 00:18:56,660 --> 00:19:00,100 Mohl bych mít štěstí a program bude mít na chod a ne jedno, 421 00:19:00,100 --> 00:19:03,450 ale obecně řečeno, toto bude skutečně dojít k selhání mého programu, 422 00:19:03,450 --> 00:19:06,440 a to je chyba v mém kód v okamžiku, kdy vyjdu 423 00:19:06,440 --> 00:19:08,576 za hranice tohoto pole, protože já 424 00:19:08,576 --> 00:19:10,450 Nevím, jestli je to nutně spadne 425 00:19:10,450 --> 00:19:12,120 nebo jestli jsem jen tak mít štěstí. 426 00:19:12,120 --> 00:19:15,750 Takže to je problematické, protože v Tento případ, nezdá se, že práce 427 00:19:15,750 --> 00:19:20,931 a pojďme se pokoušet osud tady, i když IDE Zdá se, že tolerovat docela dost 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Tam jedeme. 430 00:19:22,040 --> 00:19:23,240 Na závěr. 431 00:19:23,240 --> 00:19:26,470 Takže já jsem jediný, který může vidět. 432 00:19:26,470 --> 00:19:29,630 Tak jsem prostě musel hodně zábavné psaní out opravdu dlouhou skutečné fráze 433 00:19:29,630 --> 00:19:32,800 že to určitě překročila 16 bajtů, protože já 434 00:19:32,800 --> 00:19:38,050 napsaný v této bláznivé dlouhé multi-linka fráze, a Všimněte si, co se stalo. 435 00:19:38,050 --> 00:19:41,110 Program to zkusil tisk a pak se dostal chybu segmentace 436 00:19:41,110 --> 00:19:44,430 a segmentace chyby je, když něčemu takovému dojde, 437 00:19:44,430 --> 00:19:47,650 a operační systém říká, Ne, nemůže dotknout, že paměť. 438 00:19:47,650 --> 00:19:49,570 Chystáme se zabít program úplně. 439 00:19:49,570 --> 00:19:51,180 >> Takže to vypadá problematické. 440 00:19:51,180 --> 00:19:54,540 Já jsem zlepšil programu, který zaručuje mít alespoň část paměti, 441 00:19:54,540 --> 00:19:58,000 ale bude to zdá se, že omezit Funkce GetString k získání 442 00:19:58,000 --> 00:20:00,780 řetězce nějakého konečné délky 16. 443 00:20:00,780 --> 00:20:04,200 Takže pokud chcete podpořit déle věty než 16 znaků, 444 00:20:04,200 --> 00:20:04,880 Co děláte? 445 00:20:04,880 --> 00:20:07,970 No, můžete zvýšit velikost vyrovnávací paměti do 32 446 00:20:07,970 --> 00:20:09,190 nebo že se zdá trochu krátká. 447 00:20:09,190 --> 00:20:12,260 Proč ne my jen aby to 1000, ale tlačit zpět. 448 00:20:12,260 --> 00:20:17,100 Jaká je odpověď intuitivně z Jen vyhnout se tento problém tím, že 449 00:20:17,100 --> 00:20:20,660 můj vyrovnávací paměti větší, stejně jako 1000 znaků? 450 00:20:20,660 --> 00:20:23,470 Realizací getString tímto způsobem. 451 00:20:23,470 --> 00:20:27,130 Co je to tady dobré nebo špatné? 452 00:20:27,130 --> 00:20:28,033 To jo? 453 00:20:28,033 --> 00:20:30,574 Diváků: Pokud svázat až hodně prostoru a nechcete používat, 454 00:20:30,574 --> 00:20:33,500 pak nemůžete přerozdělit ten prostor. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Rozhodně. 456 00:20:34,500 --> 00:20:38,480 Je to plýtvání, pokud, pokud nemáte skutečně potřebují 900 těchto bytů 457 00:20:38,480 --> 00:20:41,057 a přesto žádáte 1000 celkem tak jako tak, 458 00:20:41,057 --> 00:20:44,140 jste právě náročný na paměť počítač uživatele, než je třeba, 459 00:20:44,140 --> 00:20:45,740 a po tom všem, některé jste se již setkali 460 00:20:45,740 --> 00:20:47,620 v životě, že když jste běh spoustu programů 461 00:20:47,620 --> 00:20:50,470 a jedí až velké množství paměti, to může skutečně ovlivnit výkon 462 00:20:50,470 --> 00:20:52,220 a zkušenosti uživatele na počítači. 463 00:20:52,220 --> 00:20:56,090 Tak to je trochu líný řešení, pro jistotu, a naopak, 464 00:20:56,090 --> 00:21:00,140 to není jen plýtvání, jaký problém stále zůstává, i když jsem se, aby můj vyrovnávací paměti 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 To jo? 467 00:21:02,600 --> 00:21:04,475 >> Diváků: Řetězec je délka 1001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Přesně tak. 469 00:21:05,350 --> 00:21:08,280 Pokud je váš řetězec je délka 1001, máte přesně stejný problém, 470 00:21:08,280 --> 00:21:10,705 a mým argumentem, udělal bych to Jen pak 2.000 dělat, 471 00:21:10,705 --> 00:21:12,830 ale nevíte, v předem, jak velký by to mělo být, 472 00:21:12,830 --> 00:21:16,890 a přesto, musím sestavit svůj program předtím, než povolí lidé používají a download 473 00:21:16,890 --> 00:21:17,390 za to. 474 00:21:17,390 --> 00:21:21,490 Tak tohle je přesně ten druh věci, které se knihovna snaží CS50 475 00:21:21,490 --> 00:21:24,750 aby nám pomohli s a my jen pohled na některé z podkladové provádění 476 00:21:24,750 --> 00:21:29,790 tady, ale je to CS50 tečka C. Tato je soubor, který je už na CS50 IDE 477 00:21:29,790 --> 00:21:31,420 všechny tyto týdny, které jste používali. 478 00:21:31,420 --> 00:21:34,280 Je to pre-zkompilovaný a vy jste byla automaticky používat to 479 00:21:34,280 --> 00:21:38,780 podle povahy mající pomlčka L CS50 vlajku s zazvoněním, 480 00:21:38,780 --> 00:21:42,300 ale když jsem se posunout dolů přes všechny tyto funkce, tady je getString, 481 00:21:42,300 --> 00:21:44,636 a jen na vás vzniku chuť, co se děje, 482 00:21:44,636 --> 00:21:46,760 pojďme se rychle podívat na relativní složitost. 483 00:21:46,760 --> 00:21:48,870 Není to super dlouhé funkce, ale my ne 484 00:21:48,870 --> 00:21:52,530 muset přemýšlet o všechno tvrdě jak jít o získání řetězce. 485 00:21:52,530 --> 00:21:55,660 >> Takže tady je moje vyrovnávací paměti a já zřejmě inicializovat ji na hodnotu null. 486 00:21:55,660 --> 00:21:57,990 To, samozřejmě, je totéž jako char hvězda, 487 00:21:57,990 --> 00:22:00,585 ale já jsem se rozhodl v realizaci knihovny CS50 488 00:22:00,585 --> 00:22:02,460 že pokud budeme zcela dynamický, 489 00:22:02,460 --> 00:22:05,770 Nevím předem, jak velkej Uživatelé řetězec budou chtít dostat. 490 00:22:05,770 --> 00:22:08,140 Takže já jdu začít jen s prázdný řetězec 491 00:22:08,140 --> 00:22:11,507 a budu vybudovat tolik paměť as Potřebuji, aby se vešly uživatele řetězec 492 00:22:11,507 --> 00:22:13,340 a jestli nemám dost, jdu se zeptat 493 00:22:13,340 --> 00:22:15,010 operační systém pro více paměti. 494 00:22:15,010 --> 00:22:17,510 Chystám se přesouvat své řetězec do většího kusu paměti 495 00:22:17,510 --> 00:22:21,847 a budu uvolnit nebo osvobodit nedostatečně velký kus paměti 496 00:22:21,847 --> 00:22:23,680 a my jen tak k tomu opakovaně. 497 00:22:23,680 --> 00:22:25,570 >> Tak rychlý pohled, tady je jen proměnná 498 00:22:25,570 --> 00:22:28,780 s níž budu sledovat kapacity mé pufru. 499 00:22:28,780 --> 00:22:30,071 Kolik bytů mohu fit? 500 00:22:30,071 --> 00:22:32,070 Zde je proměnná n s který budu držet 501 00:22:32,070 --> 00:22:36,200 Trať kolik bajtů jsou vlastně v vyrovnávací paměti, nebo že uživatel napsali. 502 00:22:36,200 --> 00:22:39,900 Pokud jste ještě neviděli to předtím, vás můžete určit, že proměnná jako int 503 00:22:39,900 --> 00:22:46,370 je nepodepsaný, který, jak název napovídá, znamená, že je nezáporné, a proč by 504 00:22:46,370 --> 00:22:50,590 Co jsem kdy chtěl obtěžovat specifikující že int není jen int, 505 00:22:50,590 --> 00:22:52,540 ale je to unsigned int? 506 00:22:52,540 --> 00:22:55,064 To je non-negativní int. 507 00:22:55,064 --> 00:22:56,355 Co [neslyšitelné] znamená? 508 00:22:56,355 --> 00:22:58,910 >> Diváků: Je to popisující částku paměti, která může být [neslyšitelných]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Jo. 510 00:22:59,660 --> 00:23:03,710 Takže když řeknu unsigned, je to vlastně která vám jeden bit navíc paměti 511 00:23:03,710 --> 00:23:07,440 a zdá se, trochu hloupé, ale pokud budete mají jeden bit přídavné paměti, že 512 00:23:07,440 --> 00:23:09,940 znamená, že máte dvakrát tolik Hodnoty můžete zastupují, 513 00:23:09,940 --> 00:23:11,570 protože to může být 0 nebo 1. 514 00:23:11,570 --> 00:23:14,660 Takže ve výchozím nastavení, int může být hrubě negativní 2000000000 celou cestu 515 00:23:14,660 --> 00:23:16,030 až do pozitivního 2 miliardy. 516 00:23:16,030 --> 00:23:18,540 Ti, kteří jsou velkými rozsahy, ale je to pořád trochu marnotratný 517 00:23:18,540 --> 00:23:21,280 pokud jste jen o velikosti, která se právě intuitivně 518 00:23:21,280 --> 00:23:24,620 by měla být non-negativní nebo kladné nebo 0, no a pak, 519 00:23:24,620 --> 00:23:28,884 proč jste ztrácíš 2 miliardy Možné hodnoty pro záporných čísel 520 00:23:28,884 --> 00:23:30,300 pokud jste nikdy používat? 521 00:23:30,300 --> 00:23:35,350 Takže tím, že říká nepodepsaný, teď můj int může být mezi 0 a přibližně 4 miliard. 522 00:23:35,350 --> 00:23:39,280 >> Tak tady je jen int C z důvodů, nebudeme se do právě teď jako 523 00:23:39,280 --> 00:23:42,280 proč je to int místo na char, ale tady je 524 00:23:42,280 --> 00:23:44,630 podstata toho, co se děje o, a někteří z vás 525 00:23:44,630 --> 00:23:48,340 by mohly být za použití, například, fgetc fungovat iv pset čtyři 526 00:23:48,340 --> 00:23:51,580 nebo později, budeme ho vidět opět v problému set pět, 527 00:23:51,580 --> 00:23:55,410 fgetc je pěkné, protože jako název druh, druh arcanely napovídá, 528 00:23:55,410 --> 00:23:57,940 je to funkce, která dostane charakter, a tak, 529 00:23:57,940 --> 00:24:00,690 co je zásadně odlišná o tom, co děláme v getString 530 00:24:00,690 --> 00:24:03,110 je, že nepoužíváte scanf stejným způsobem. 531 00:24:03,110 --> 00:24:07,550 Jsme jen plíživé po krok-za-krokem přes co uživatel zadal, 532 00:24:07,550 --> 00:24:10,970 protože můžeme vždy přidělit jeden char, a proto můžeme vždy bezpečně 533 00:24:10,970 --> 00:24:15,599 se na jedné znak v době, a kouzlo začne dít tady. 534 00:24:15,599 --> 00:24:17,890 Chystám se nalistujte prostřední této funkce 535 00:24:17,890 --> 00:24:20,360 Jen stručně představit tuto funkci. 536 00:24:20,360 --> 00:24:22,670 Stejně jako je tu Funkce malloc, je tu 537 00:24:22,670 --> 00:24:27,740 funkce realloc kde realloc vám umožní přerozdělit kus paměti 538 00:24:27,740 --> 00:24:29,570 a dělat to větší nebo menší. 539 00:24:29,570 --> 00:24:33,060 Tak dlouhý příběh krátký as vlna mé ruky pro dnešek, 540 00:24:33,060 --> 00:24:35,620 vím, že to, co getString dělá, je, že to něco 541 00:24:35,620 --> 00:24:39,720 z magicky rostoucí nebo smršťování vyrovnávací paměti jako uživatel 542 00:24:39,720 --> 00:24:41,440 typy ve svém řetězci. 543 00:24:41,440 --> 00:24:43,962 >> Takže v případě, že uživatel zadá krátký řetězec, tento kód 544 00:24:43,962 --> 00:24:45,920 Pouze přiděluje dost paměť, aby se vešly řetězec. 545 00:24:45,920 --> 00:24:48,086 Pokud uživatel stále psát jak jsem to udělal znovu a znovu 546 00:24:48,086 --> 00:24:50,330 a znovu, no, v případě, že vyrovnávací paměť je zpočátku tento velký 547 00:24:50,330 --> 00:24:53,310 a program realizuje, aby počkej, já jsem z vesmíru, 548 00:24:53,310 --> 00:24:55,410 to bude dvojnásobek velikost vyrovnávací paměti 549 00:24:55,410 --> 00:24:59,110 a pak zdvojnásobit velikost vyrovnávací paměti a kód, který dělá zdvojnásobení, 550 00:24:59,110 --> 00:25:03,170 Podíváme-li se na to tady, je to právě tento chytrý jednořádkový. 551 00:25:03,170 --> 00:25:06,830 Je možné, že jste viděli tuto syntaxi předtím, ale když řeknete hvězda rovná, 552 00:25:06,830 --> 00:25:10,470 To je totéž, jako říká časy objemu 2. 553 00:25:10,470 --> 00:25:13,390 Tak to prostě pořád zdvojnásobení kapacita pufru 554 00:25:13,390 --> 00:25:17,480 a pak říkat realloc dát sama o sobě, že mnohem více paměti. 555 00:25:17,480 --> 00:25:19,720 >> A teď, jak stranou, tam jsou další funkce v zde 556 00:25:19,720 --> 00:25:23,680 že nebudeme dívat do detailů jiné než ukázat v GetInt, 557 00:25:23,680 --> 00:25:26,150 používáme getString v GetInt. 558 00:25:26,150 --> 00:25:28,192 Ověříme, že to není null, což, odvolání, 559 00:25:28,192 --> 00:25:30,400 je zvláštní hodnota, která znamená, že se něco pokazilo. 560 00:25:30,400 --> 00:25:31,233 Jsme z paměti. 561 00:25:31,233 --> 00:25:32,310 Lepší zkontrolovat, že. 562 00:25:32,310 --> 00:25:33,710 A my jsme se vrátit hodnotu sentinelové. 563 00:25:33,710 --> 00:25:37,850 Ale budu odložit na připomínky pokud jde o proč a pak jsme se použít tento bratranec scanf 564 00:25:37,850 --> 00:25:42,100 volal sscanf a ukazuje se, že sscanf, nebo řetězec scanf, 565 00:25:42,100 --> 00:25:45,310 vám umožní se podívat na řádku uživatel zadal, a nechat vás 566 00:25:45,310 --> 00:25:49,610 analyzovat je v podstatě, a to, co já jsem tady je Říkám sscanf, 567 00:25:49,610 --> 00:25:54,440 analyzovat bez ohledu má uživatel zadali a ujistěte se, že% i, 568 00:25:54,440 --> 00:25:59,250 je celé číslo v ní, a my ne dostat se do dneška přesně důvod, proč tam je také 569 00:25:59,250 --> 00:26:03,760 A% c tady, ale že v kostce umožňuje us zjistit, zda má uživatel zadané 570 00:26:03,760 --> 00:26:06,050 v něčem falešné za číslem. 571 00:26:06,050 --> 00:26:11,766 Takže důvod, že GetInt a GetString ti k opakování, opakování, opakování 572 00:26:11,766 --> 00:26:13,640 Je to proto, ze všech že kód psali jsme, 573 00:26:13,640 --> 00:26:17,900 Je to trochu dívá na vstupu uživatele V ujistěte se, že je to úplně číselné 574 00:26:17,900 --> 00:26:21,700 nebo je to skutečný floating Bodová hodnota nebo podobně, 575 00:26:21,700 --> 00:26:24,233 V závislosti na tom, jaký hodnotě funkci, kterou používáte. 576 00:26:24,233 --> 00:26:25,060 >> Uff. 577 00:26:25,060 --> 00:26:25,710 DOBŘE. 578 00:26:25,710 --> 00:26:27,592 To bylo sousto ale bod je zde 579 00:26:27,592 --> 00:26:29,550 že důvod, proč jsme měli tato školení kola na 580 00:26:29,550 --> 00:26:32,880 Je tomu tak proto na nejnižší úrovni, tam je jen tolik věcí, které 581 00:26:32,880 --> 00:26:35,674 může jít špatně, že jsme chtěli preventivně zvládnout 582 00:26:35,674 --> 00:26:38,090 tyto věci jistě v nejčasnější týdnů třídy, 583 00:26:38,090 --> 00:26:42,230 ale nyní s pset čtyři a pět a pset za uvidíte, že je to spíš k 584 00:26:42,230 --> 00:26:45,570 vy, ale i vy jste schopnější řešit tyto druhy problémů 585 00:26:45,570 --> 00:26:47,180 sami. 586 00:26:47,180 --> 00:26:51,770 Jakékoliv dotazy týkající getString nebo GetInt? 587 00:26:51,770 --> 00:26:52,630 To jo? 588 00:26:52,630 --> 00:26:55,130 >> Diváků: Proč byste zdvojnásobí kapacita pufru 589 00:26:55,130 --> 00:26:57,630 spíše než jen rostoucí to o přesné částky? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Dobrá otázka. 591 00:26:58,100 --> 00:27:00,474 Proč bychom zdvojnásobit kapacitu pufru, na rozdíl 592 00:27:00,474 --> 00:27:02,800 jen ji zvýšit nějakou konstantní hodnotu? 593 00:27:02,800 --> 00:27:03,900 Bylo rozhodnutí o designu. 594 00:27:03,900 --> 00:27:08,590 Prostě jsme se rozhodli, že proto, že má tendenci být o něco dražší časově se zeptat 595 00:27:08,590 --> 00:27:10,440 operační systém pro paměť, my ne 596 00:27:10,440 --> 00:27:13,210 chtějí nakonec dostat do situace pro velké řetězce 597 00:27:13,210 --> 00:27:14,960 že jsme se ptali znovu a znovu OS 598 00:27:14,960 --> 00:27:17,500 a znovu a znovu Rychlá obměna pro paměť. 599 00:27:17,500 --> 00:27:20,387 Tak jsme se prostě rozhodli, poněkud libovolně, ale doufáme, že rozumně, 600 00:27:20,387 --> 00:27:22,720 že, víte co, pojďme pokusit se dostat před sebe 601 00:27:22,720 --> 00:27:25,520 a jen držet zdvojnásobení to tak, že jsme se minimalizovalo množství časů 602 00:27:25,520 --> 00:27:29,010 musíme zavolat malloc nebo realloc, ale celkem rozsudek 603 00:27:29,010 --> 00:27:31,820 volání v nepřítomnosti vědět co uživatelé chtít psát. 604 00:27:31,820 --> 00:27:33,600 Oba způsoby mohou být diskutabilní. 605 00:27:33,600 --> 00:27:35,430 Pravděpodobně dobře. 606 00:27:35,430 --> 00:27:39,240 >> Takže pojďme se podívat na pár jiných vedlejších účinků paměti, 607 00:27:39,240 --> 00:27:41,610 věci, které se mohou pokazit a nástroje, které vám mohou 608 00:27:41,610 --> 00:27:43,880 používají k zachycení tyto druhy chyb. 609 00:27:43,880 --> 00:27:47,800 Ukazuje se, že vás všechny, i když check50 neřekl ti tolik, 610 00:27:47,800 --> 00:27:50,050 Byly psaní buggy kód od jednoho týdne, 611 00:27:50,050 --> 00:27:53,630 i kdyby všechny check50 testy prošel, a to i v případě, vy a vaše TF 612 00:27:53,630 --> 00:27:56,010 jsou super přesvědčeni, že váš kód funguje, jak bylo zamýšleno. 613 00:27:56,010 --> 00:27:59,190 Váš kód byl kočárek nebo chybná v tom, že všichni z vás, 614 00:27:59,190 --> 00:28:02,540 v pomocí knihovny CS50, Byly netěsní paměti. 615 00:28:02,540 --> 00:28:06,040 Byli jste žádá operační systém pro paměť ve většině programů 616 00:28:06,040 --> 00:28:08,850 jste napsali, ale vy jste vlastně nikdy dal ji zpět. 617 00:28:08,850 --> 00:28:12,110 Vy jste volal GetString a GetInt a GetFloat, 618 00:28:12,110 --> 00:28:15,270 ale s getString, nemáš nikdy volal unGetString nebo Dej 619 00:28:15,270 --> 00:28:19,890 Řetězec Back nebo podobně, ale my jsme viděli že GetString dělá alokovat paměť 620 00:28:19,890 --> 00:28:22,810 prostřednictvím malloc nebo to Funkce realloc, což je jen 621 00:28:22,810 --> 00:28:25,670 velmi podobný v duchu, a přesto jsme byli 622 00:28:25,670 --> 00:28:28,629 žádá operační systém pro paměť a paměť znovu a znovu 623 00:28:28,629 --> 00:28:29,670 ale nikdy dávat to zpátky. 624 00:28:29,670 --> 00:28:33,550 >> A teď, jak stranou, se ukazuje, že když je program ukončen, všechny paměti 625 00:28:33,550 --> 00:28:34,870 je automaticky uvolněna. 626 00:28:34,870 --> 00:28:36,150 Takže to nebyl velký problém. 627 00:28:36,150 --> 00:28:38,590 Nebude to rozbít IDE nebo zpomalují, 628 00:28:38,590 --> 00:28:40,670 Ale když programy se obecně úniku paměti 629 00:28:40,670 --> 00:28:42,170 a oni běží na dlouhou dobu. 630 00:28:42,170 --> 00:28:45,640 Pokud jste někdy viděli stupidní nafukovací míč v Mac OS nebo přesýpací hodiny 631 00:28:45,640 --> 00:28:51,160 v systému Windows, kde je to trochu zpomalení nebo myšlení nebo myšlení 632 00:28:51,160 --> 00:28:53,770 nebo jen opravdu začíná zpomalit na procházení, 633 00:28:53,770 --> 00:28:56,960 Je to velmi pravděpodobně mohlo být výsledkem nevracení paměti. 634 00:28:56,960 --> 00:28:59,970 Programátoři, kteří psali software, který používáte 635 00:28:59,970 --> 00:29:03,570 zeptejte operační systém pro paměť každých pár minut, každou hodinu. 636 00:29:03,570 --> 00:29:05,570 Ale pokud jste běží software, i když je to 637 00:29:05,570 --> 00:29:08,680 minimalizovat ve vašem počítači hodiny nebo dny na konci, 638 00:29:08,680 --> 00:29:11,980 můžete se ptát na víc a víc Paměť a vlastně nikdy používat 639 00:29:11,980 --> 00:29:15,180 a tak váš kód může být, nebo programy by mohly být netěsní paměti, 640 00:29:15,180 --> 00:29:18,350 a pokud začnete úniku paměti, tam je méně paměti pro ostatní programy, 641 00:29:18,350 --> 00:29:21,220 a výsledek je pro zpomalit všechno dolů. 642 00:29:21,220 --> 00:29:23,600 >> Nyní, to je zdaleka jedním z těch nejděsivějších programy 643 00:29:23,600 --> 00:29:26,350 budete mít možnost spustit v CS50, pokud 644 00:29:26,350 --> 00:29:31,650 neboť jeho výkon je ještě více než esoterický řinčet je nebo učinit, nebo některý z příkazu 645 00:29:31,650 --> 00:29:35,930 linka programy Udělali jsme dříve, ale naštěstí, vložené do jeho výstupu 646 00:29:35,930 --> 00:29:39,810 je několik užitečných tipů, které výborný budou užitečné buď pro pset čtyři 647 00:29:39,810 --> 00:29:41,510 nebo rozhodně pset pět. 648 00:29:41,510 --> 00:29:44,250 Takže Valgrind je nástroj , které mohou být použity k vypadat 649 00:29:44,250 --> 00:29:46,930 pro úniky paměti v programu. 650 00:29:46,930 --> 00:29:48,570 Je relativně jednoduché pro spuštění. 651 00:29:48,570 --> 00:29:51,420 Spustit Valgrind a pak, dokonce i když je to trochu upovídaný, 652 00:29:51,420 --> 00:29:54,440 pomlčka únik pomlčka kontrola rovná plné, a poté dot 653 00:29:54,440 --> 00:29:56,320 lomítko a název vašeho programu. 654 00:29:56,320 --> 00:30:00,010 Takže Valgrind pak poběží program a na samém konci svého programu 655 00:30:00,010 --> 00:30:02,240 běh před tím, než ukončí a vám dává další výzvu, 656 00:30:02,240 --> 00:30:04,980 to bude analyzovat váš Program, zatímco to byla spuštěna 657 00:30:04,980 --> 00:30:07,740 a ti jsi úniku jakýkoli paměti a ještě lépe, 658 00:30:07,740 --> 00:30:10,610 jste se dotknete paměť, která nepatřil k vám? 659 00:30:10,610 --> 00:30:13,700 To nemůže chytit všechno, ale je to docela dobrý v chytání většinu věcí. 660 00:30:13,700 --> 00:30:19,700 >> Tak tady je příklad, který má mé běhu tento program, mají běh Valgrind, 661 00:30:19,700 --> 00:30:21,470 na programu s názvem paměť, a já jdu 662 00:30:21,470 --> 00:30:24,730 upozornit na řádky, které jsou nakonec nás zajímají. 663 00:30:24,730 --> 00:30:27,690 Takže tam je ještě více rozptýlení že jsem vymazány ze snímku. 664 00:30:27,690 --> 00:30:30,930 Ale pojďme se prostě vidět, co to Program je schopen nám říká. 665 00:30:30,930 --> 00:30:34,800 To je schopné vyprávět nám věci jako neplatné zápisu o velikosti 4. 666 00:30:34,800 --> 00:30:38,020 Jinými slovy, pokud se dotknete paměť, konkrétně 4 bajtů paměti 667 00:30:38,020 --> 00:30:40,350 že byste neměli mít, Valgrind vám může říct, že. 668 00:30:40,350 --> 00:30:41,660 Neplatný zápis velikosti 4. 669 00:30:41,660 --> 00:30:43,640 Dotkl ses čtyři byty že byste neměli mít. 670 00:30:43,640 --> 00:30:44,840 Kde jsi to udělal? 671 00:30:44,840 --> 00:30:45,900 To je krása. 672 00:30:45,900 --> 00:30:50,000 Paměť dot c linka 21 je místo, kde vás podělal, a to je důvod, proč je to užitečné. 673 00:30:50,000 --> 00:30:53,410 Stejně jako GDB, může pomoci bod, který v aktuálním chyby. 674 00:30:53,410 --> 00:30:57,170 >> Nyní, to je trochu více verbose, ne-li matoucí. 675 00:30:57,170 --> 00:31:01,307 40 bytů v 1 blocích jsou rozhodně ztracen v záznam ztráty 1 z 1. 676 00:31:01,307 --> 00:31:02,140 Co to znamená? 677 00:31:02,140 --> 00:31:05,920 No, to prostě znamená, že jste požádal o 40 bytů a nikdy ji vrátil. 678 00:31:05,920 --> 00:31:08,930 Volal jste malloc nebo jste volal GetString a operační systém 679 00:31:08,930 --> 00:31:12,450 ti dal 40 bytů, ale ty nikdy osvobozen nebo povolený, že paměť, 680 00:31:12,450 --> 00:31:15,400 a být spravedlivý, nikdy jsme se ukázat, , jak se vrátit paměť. 681 00:31:15,400 --> 00:31:17,910 Ukázalo se, že tam je super jednoduchá funkce s názvem zdarma. 682 00:31:17,910 --> 00:31:21,170 Přijímá jeden argument, věc Chcete-li uvolnit nebo vrátit, 683 00:31:21,170 --> 00:31:23,430 ale 40 bytů, zdá se, v tomto programu 684 00:31:23,430 --> 00:31:27,300 byly ztraceny na řádku 20 paměti dot c. 685 00:31:27,300 --> 00:31:28,650 >> Tak uvidíme, tento program. 686 00:31:28,650 --> 00:31:31,020 Je to super k ničemu. 687 00:31:31,020 --> 00:31:33,980 To jen dokazuje, tento konkrétní chybě. 688 00:31:33,980 --> 00:31:34,920 Takže pojďme se podívat. 689 00:31:34,920 --> 00:31:39,920 Zde je hlavní a hlavní, vývěsní, hovory funkce nazvaná f, a pak se vrátí. 690 00:31:39,920 --> 00:31:41,550 Takže není všechno tak zajímavé. 691 00:31:41,550 --> 00:31:42,664 Co f dělat? 692 00:31:42,664 --> 00:31:44,330 Všimněte si, jsem se neobtěžoval s prototypem. 693 00:31:44,330 --> 00:31:46,520 Chtěl jsem, aby kód co nejmenší. 694 00:31:46,520 --> 00:31:49,530 Tak jsem dal f nad hlavní a to je v pořádku, určitě, 695 00:31:49,530 --> 00:31:51,500 pro krátké programy, jako je tento. 696 00:31:51,500 --> 00:31:56,910 Takže f nic nevrací a dělá nebere nic, ale je to to udělat. 697 00:31:56,910 --> 00:31:59,620 To prohlašuje, podobně jako v příkladu binky, 698 00:31:59,620 --> 00:32:02,682 ukazatel s názvem x, co se děje uložit adresu int. 699 00:32:02,682 --> 00:32:03,890 Tak to je levá strana. 700 00:32:03,890 --> 00:32:07,230 V angličtině, co je pravá strana dělá? 701 00:32:07,230 --> 00:32:09,770 Každý, kdo? 702 00:32:09,770 --> 00:32:13,665 Co je to dělá pro nás? 703 00:32:13,665 --> 00:32:14,651 To jo? 704 00:32:14,651 --> 00:32:16,623 >> Diváků: [Neslyšitelné] měří velikost int 705 00:32:16,623 --> 00:32:19,175 což je 10 krát vyšší než [neslyšitelných] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Dobrý, a dovolte mi shrnout. 707 00:32:20,800 --> 00:32:25,480 Takže přidělit dostatečný prostor pro 10 celá čísla nebo 10, co je velikost int, 708 00:32:25,480 --> 00:32:29,340 je to čtyři bajtů, takže 10 krát 4 je 40, takže pravé straně, které jsem 709 00:32:29,340 --> 00:32:33,930 zvýrazněný, je dát mi 40 bajtů a uložit adresu prvního bajtu 710 00:32:33,930 --> 00:32:34,940 do x. 711 00:32:34,940 --> 00:32:38,380 A teď konečně, a tady je místo, kde tento program je buggy, co je 712 00:32:38,380 --> 00:32:41,540 s čárou 21 špatného na základě této logiky? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Co je na řádku 21 v nepořádku? 715 00:32:46,280 --> 00:32:46,780 To jo? 716 00:32:46,780 --> 00:32:49,550 Diváků: Nemůžete index do x [neslyšitelných]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Jo. 718 00:32:50,300 --> 00:32:52,270 Neměla bych index do x, jako je to. 719 00:32:52,270 --> 00:32:53,850 Takže syntakticky, to je v pořádku. 720 00:32:53,850 --> 00:32:56,990 Co je příjemné je, stejně jako vy může léčit název pole 721 00:32:56,990 --> 00:33:01,080 , jako když je to ukazatel, podobně můžete léčit ukazatel, jako když je to 722 00:33:01,080 --> 00:33:06,425 pole, a tak mohu syntakticky říkají x držák něco, x držák i, 723 00:33:06,425 --> 00:33:07,800 ale 10 je problematické. 724 00:33:07,800 --> 00:33:09,096 Proč? 725 00:33:09,096 --> 00:33:10,910 >> Diváků: Protože to není uvnitř. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: To není Uvnitř tohoto kusu paměti. 727 00:33:12,390 --> 00:33:15,306 Jaká je největší hodnota bych měl být uvedení v těch hranatých závorkách? 728 00:33:15,306 --> 00:33:16,870 9, 0 až 9. 729 00:33:16,870 --> 00:33:18,160 Vzhledem k tomu, nulového indexování. 730 00:33:18,160 --> 00:33:20,190 Takže od 0 do 9 bude v pořádku. 731 00:33:20,190 --> 00:33:23,960 Držák 10 není dobrá a ale vzpomínám i když, pokaždé 732 00:33:23,960 --> 00:33:27,017 Připadá mi, že se snaží, aby se CS50 IDE crash zadáním falešných hodnot, 733 00:33:27,017 --> 00:33:29,100 to není vždy spolupracovat, a opravdu, často 734 00:33:29,100 --> 00:33:31,460 štěstí jen proto, že Operační systém není 735 00:33:31,460 --> 00:33:35,467 Všimněte si, že jste někdy tak trochu projít nějaký kus paměti, 736 00:33:35,467 --> 00:33:38,300 proto, že jste zůstal v technicky Váš segmentu, ale o tom více 737 00:33:38,300 --> 00:33:40,940 ve třídě operačních systémů, a tak se něco takového 738 00:33:40,940 --> 00:33:43,000 by mohla velmi snadno uniknou pozornosti. 739 00:33:43,000 --> 00:33:48,120 Váš program se nikdy havárii důsledně ale možná jednou za čas. 740 00:33:48,120 --> 00:33:50,610 >> A tak se pojďme zkusit Valgrind na to, a tady je 741 00:33:50,610 --> 00:33:52,870 kde budeme dostat ohromen na výstupu za okamžik. 742 00:33:52,870 --> 00:34:00,810 Tak, aby nevracení paměti valgrind šek se rovná plné tečka lomítko paměti. 743 00:34:00,810 --> 00:34:03,040 A tady je důvod, proč Slibuji To by přemoci. 744 00:34:03,040 --> 00:34:05,700 Tady je to, co valgrind, tady je to, co programátor, některé roky ago- 745 00:34:05,700 --> 00:34:08,469 rozhodl, že by to byl dobrý nápad pro výstup vypadat. 746 00:34:08,469 --> 00:34:09,750 Takže pojďme smysl tohoto. 747 00:34:09,750 --> 00:34:13,120 A tak celou cestu na levé straně side bezdůvodně 748 00:34:13,120 --> 00:34:16,620 je proces ID programu my stačí spustit, jedinečný identifikátor 749 00:34:16,620 --> 00:34:18,030 pro program jsme právě utekl. 750 00:34:18,030 --> 00:34:19,738 Vypouští jsme, že z šoupátko, ale tam 751 00:34:19,738 --> 00:34:22,190 je několik užitečných informací zde. 752 00:34:22,190 --> 00:34:24,684 >> Pojďme rolovat nahoru až na samý vrchol. 753 00:34:24,684 --> 00:34:25,600 Tady je místo, kde jsme začali. 754 00:34:25,600 --> 00:34:27,040 Takže to není tak moc výstup. 755 00:34:27,040 --> 00:34:30,429 Tady je neplatné write velikosti 4 na řádku 21. 756 00:34:30,429 --> 00:34:31,760 No, co bylo řádku 21? 757 00:34:31,760 --> 00:34:34,500 Linka 21 bylo přesně to a to dává smysl 758 00:34:34,500 --> 00:34:37,290 že jsem v platně psaní 4 bajty, protože jsem 759 00:34:37,290 --> 00:34:40,389 se snaží dát tuto číslo, což může být cokoliv, 760 00:34:40,389 --> 00:34:42,370 to jen se stane být nula, ale snažím 761 00:34:42,370 --> 00:34:44,940 aby ji na místě že nepatří ke mně. 762 00:34:44,940 --> 00:34:50,900 Kromě toho, tady dole, 40 bytů v jednom bloky jsou definitivně ztraceny v záznamu 1. 763 00:34:50,900 --> 00:34:56,500 To proto, že když volám malloc tady, jsem vlastně nikdy uvolnit paměť. 764 00:34:56,500 --> 00:34:58,140 >> Tak jak můžeme opravit? 765 00:34:58,140 --> 00:35:02,970 Nech mě jít dál a být trochu bezpečnější a dělat 9 tam a dovolte mi, abych zde zdarma x. 766 00:35:02,970 --> 00:35:04,820 Toto je nová funkce pro dnešek. 767 00:35:04,820 --> 00:35:11,520 Kdybych teď znovu spustit, aby vzpomínka dot lomítko, pojďme běžet valgrind na to znovu, 768 00:35:11,520 --> 00:35:14,990 maximalizovat okno a stiskněte klávesu Enter. 769 00:35:14,990 --> 00:35:16,900 Teď, je to dobré. 770 00:35:16,900 --> 00:35:19,590 Oni pohřbít dobré zprávy ve všech tohoto výstupu. 771 00:35:19,590 --> 00:35:20,810 Všechny haldy bloky jsou zdarma. 772 00:35:20,810 --> 00:35:23,604 Vrátíme se na to, co haldy je, ale žádná úniky jsou možné. 773 00:35:23,604 --> 00:35:25,520 Takže je to jen další nástrojem pro vaše sadě nářadí 774 00:35:25,520 --> 00:35:30,220 se kterými můžete začít nyní najít chyby, jako to. 775 00:35:30,220 --> 00:35:34,532 >> Ale pojďme se podívat, co více se může pokazit zde. 776 00:35:34,532 --> 00:35:38,890 Pojďme přechod nyní ve skutečnosti řešení problému. 777 00:35:38,890 --> 00:35:42,440 Jako stranou, pokud to bude ulehčit Trochu zmatku nebo napětí, 778 00:35:42,440 --> 00:35:43,430 toto je nyní legrační. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 To jo. 781 00:35:46,900 --> 00:35:49,040 To je docela dobrý. 782 00:35:49,040 --> 00:35:50,890 Vzhledem k tomu, ukazatele jsou adresy a adresy 783 00:35:50,890 --> 00:35:53,098 jsou obecně konvencí psaný s šestnáctkové. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, to je nyní legrační. 785 00:35:54,650 --> 00:35:58,390 Tak či onak, takže pojďme teď ve skutečnosti vyřešit problém. 786 00:35:58,390 --> 00:36:00,840 To byl výborný, extra low-level tak daleko, 787 00:36:00,840 --> 00:36:03,950 a my můžeme vlastně dělat užitečné věci s těmito detaily low-level. 788 00:36:03,950 --> 00:36:06,710 >> Proto jsme zavedli několik týdnů Před pojem pole. 789 00:36:06,710 --> 00:36:09,177 Pole bylo fajn, protože je těžké uklidit náš kód 790 00:36:09,177 --> 00:36:11,760 protože pokud bychom chtěli napsat program s několika studenty 791 00:36:11,760 --> 00:36:15,270 nebo více názvů a domy a dorms a vysoké školy a všechno, 792 00:36:15,270 --> 00:36:19,430 jsme mohli uložit všechno více čistě uvnitř pole. 793 00:36:19,430 --> 00:36:23,039 Ale navrhnout jednu stinnou stránku z pole tak daleko. 794 00:36:23,039 --> 00:36:26,080 I když jste neutrpělo sami v programu, prostě instinktivně, 795 00:36:26,080 --> 00:36:30,870 co je to špatná věc o matici, snad? 796 00:36:30,870 --> 00:36:32,337 Slyšel jsem nějaké mumlání. 797 00:36:32,337 --> 00:36:34,170 Diváků: Je to těžké změnit velikost. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Je to těžké změnit velikost. 799 00:36:36,128 --> 00:36:38,660 Nelze změnit velikost z pole, ve skutečnosti, samo o sobě 800 00:36:38,660 --> 00:36:43,040 v C. můžete přidělit další pole, přesunout vše od starého 801 00:36:43,040 --> 00:36:45,380 do nového, a teď mít nějaký prostor navíc, 802 00:36:45,380 --> 00:36:47,469 ale není to asi tak, jako jazyk jako Java nebo Python 803 00:36:47,469 --> 00:36:49,760 nebo libovolný počet jiné jazyky, se kterými někteří z vás 804 00:36:49,760 --> 00:36:52,070 může být obeznámeni kde na vás stačí držet přidání věci 805 00:36:52,070 --> 00:36:53,930 omrzení na konec pole. 806 00:36:53,930 --> 00:36:57,880 Když máte řadu velikost 6, to je jeho velikost, 807 00:36:57,880 --> 00:37:01,970 a tak stejně jako myšlenka dříve který má vyrovnávací paměť určité velikosti, 808 00:37:01,970 --> 00:37:05,940 musíte uhodnout z brány Jakou velikost chceš, aby to bylo? 809 00:37:05,940 --> 00:37:07,880 Máte-li hádat příliš velký, ztrácíte prostor. 810 00:37:07,880 --> 00:37:10,950 Máte-li hádat příliš malá, vás nemůže uložit, že data, přinejmenším 811 00:37:10,950 --> 00:37:12,940 bez mnohem víc práce. 812 00:37:12,940 --> 00:37:18,180 >> Takže dnes, díky ukazatele, můžeme začátek šití dohromady vlastní vlastní 813 00:37:18,180 --> 00:37:20,989 datové struktury, a fakt, tady je něco, 814 00:37:20,989 --> 00:37:23,030 že vypadá trochu víc mystické na první pohled, 815 00:37:23,030 --> 00:37:26,440 ale to je to, co budeme nazývat připojený Seznam a jeho jméno druh shrnuje 816 00:37:26,440 --> 00:37:26,940 za to. 817 00:37:26,940 --> 00:37:29,550 Je to seznam čísel, nebo tento případ, seznam čísel, 818 00:37:29,550 --> 00:37:33,480 ale může to být seznam čehokoli, ale to je propojeny prostřednictvím šipek, 819 00:37:33,480 --> 00:37:36,380 a jen se hádat s tím, co technika 820 00:37:36,380 --> 00:37:38,310 budeme moci šít dohromady, 821 00:37:38,310 --> 00:37:42,540 něco jako popcorn se závitem, propojené seznamy obdélníky tady? 822 00:37:42,540 --> 00:37:43,936 Její čísla? 823 00:37:43,936 --> 00:37:45,560 Co je základní jazyk funkce? 824 00:37:45,560 --> 00:37:46,350 >> Diváků: Ukazatel. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Ukazatel. 826 00:37:47,308 --> 00:37:51,700 Takže každý z těchto šipek zde reprezentuje ukazatel nebo jen adresa. 827 00:37:51,700 --> 00:37:54,590 Takže jinými slovy, když budu chtít pro uložení seznam čísel, 828 00:37:54,590 --> 00:37:59,040 Nemůžu jen ukládat, pokud chci, schopnost růst a zmenšit 829 00:37:59,040 --> 00:38:00,990 můj struktura dat v poli. 830 00:38:00,990 --> 00:38:03,000 Tak jsem třeba mít trochu více propracovanost, 831 00:38:03,000 --> 00:38:05,720 nevšimnout, že tento obrázek druh naznačuje, 832 00:38:05,720 --> 00:38:08,650 že pokud jste právě dostali malé závity spojovací všechno dohromady, 833 00:38:08,650 --> 00:38:13,100 asi není tak těžké, aby se prostor mezi dvě z těchto obdélníků 834 00:38:13,100 --> 00:38:16,750 nebo dva z těchto uzlů, jak začneme volat, vložte novou uzlu, 835 00:38:16,750 --> 00:38:19,547 a pak s nějakým novým závitem, jen příkop tři uzly dohromady, 836 00:38:19,547 --> 00:38:22,880 první, poslední, a ten, že jste právě vložena do středu. 837 00:38:22,880 --> 00:38:26,000 >> A vskutku spojový seznam, Na rozdíl od pole, je dynamický. 838 00:38:26,000 --> 00:38:27,840 To může růst, a to může zmenšovat a vy ne 839 00:38:27,840 --> 00:38:32,434 musí znát nebo péči předem, jak mnoho dat budete se skladování, 840 00:38:32,434 --> 00:38:35,600 ale ukázalo se, musíme být trochu Dbejte na to, jak to provést. 841 00:38:35,600 --> 00:38:39,070 Takže nejprve uvažujme, jak implementovat jeden z těchto malých obdélníků. 842 00:38:39,070 --> 00:38:40,690 Je to snadné implementovat int. 843 00:38:40,690 --> 00:38:44,000 Stačí říct int N, a získáte 4 bajty pro int, 844 00:38:44,000 --> 00:38:49,089 ale jak to mám dostat int, říkají n, a pak ukazatel, nazvěme to příště. 845 00:38:49,089 --> 00:38:50,880 Mohli bychom zavolat tito věci, cokoli chceme, 846 00:38:50,880 --> 00:38:53,590 ale potřebuji strukturu vlastní data. 847 00:38:53,590 --> 00:38:54,257 To jo? 848 00:38:54,257 --> 00:38:57,020 >> Diváků: Ampersand [Neslyšitelné]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Takže ampersand budeme používat k získat adresu uzlu potenciálně. 850 00:39:00,940 --> 00:39:02,740 Ale my potřebujeme další rysem C za účelem 851 00:39:02,740 --> 00:39:06,700 mi dát schopnost vytvářet Tento zvyk obdélník, tento zvyk 852 00:39:06,700 --> 00:39:08,919 Proměnná chcete-li, v paměti. 853 00:39:08,919 --> 00:39:09,710 Diváků: struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: struct. 855 00:39:10,626 --> 00:39:14,310 Připomeňme, od minulého týdne, jsme zavedli struct, tento poměrně jednoduchý klíčové slovo 856 00:39:14,310 --> 00:39:16,254 že nám umožňuje dělat věci, jako je tento. 857 00:39:16,254 --> 00:39:18,420 C nepřišel s daty strukturu zvanou student. 858 00:39:18,420 --> 00:39:22,190 Dodává se s int a plovákem a char a takový, ale to nepřichází s student, 859 00:39:22,190 --> 00:39:26,750 ale můžeme vytvořit typ studenta dat, struktura student, s touto syntaxí 860 00:39:26,750 --> 00:39:27,250 sem. 861 00:39:27,250 --> 00:39:28,350 A budete vidět znovu a znovu. 862 00:39:28,350 --> 00:39:30,426 Takže se nemusíte bát, memorování klíčová slova, 863 00:39:30,426 --> 00:39:33,300 ale klíčové slovo, které je důležité je, jen to, že jsme si řekli, struct 864 00:39:33,300 --> 00:39:37,590 a pak jsme říkali, že studenta a uvnitř studenta bylo jméno a dům 865 00:39:37,590 --> 00:39:39,390 nebo koleji nebo podobně. 866 00:39:39,390 --> 00:39:41,980 >> A tak teď, dnes pojďme navrhnout tohle. 867 00:39:41,980 --> 00:39:45,240 Přidal jsem pár slov, ale pokud chci k provedení tohoto obdélník, který je 868 00:39:45,240 --> 00:39:48,440 dostal oba int a ukazatel, víte co, já jsem 869 00:39:48,440 --> 00:39:51,540 chystá vyhlásit struct názvem uzlu. 870 00:39:51,540 --> 00:39:55,630 Jsem také, uvnitř ní, řekneš že uzel, tento obdélník, má int 871 00:39:55,630 --> 00:39:59,730 a my budeme nazývat n a to má další ukazatel. 872 00:39:59,730 --> 00:40:02,540 A to je trochu upovídaný, ale pokud si myslíte o tom, 873 00:40:02,540 --> 00:40:07,300 šipky, které byly v obraze před chvílí jsou jakého datového typu? 874 00:40:07,300 --> 00:40:12,330 Tam, kde každý z těchto šipek ukazuje jaký typ datové struktury? 875 00:40:12,330 --> 00:40:14,332 Není to jen proto, aby ukázal int per se. 876 00:40:14,332 --> 00:40:16,165 Je to ukazujíc na Celá věc obdélníkový 877 00:40:16,165 --> 00:40:18,720 a že obdélníkový věc, jsme si řekli, se nazývá uzel. 878 00:40:18,720 --> 00:40:21,720 A tak jsme se trochu muset rekurzivně definovat to, jako 879 00:40:21,720 --> 00:40:26,270 že uzel, řekněme, bude obsahovat int názvem n 880 00:40:26,270 --> 00:40:31,070 a ukazatel s názvem další a druh datové struktury, ke kterému 881 00:40:31,070 --> 00:40:35,770 že ukazatel bodů je zřejmě Bude struct uzlu. 882 00:40:35,770 --> 00:40:41,550 >> Tak tohle je protivně upovídaný a prostě být pedantský, 883 00:40:41,550 --> 00:40:44,100 důvod, proč nemůžeme Jen říkám, což upřímně řečeno 884 00:40:44,100 --> 00:40:46,860 vypadá mnohem čitelnější, Je to proto, připomeňme, že C číst 885 00:40:46,860 --> 00:40:48,710 věci shora dolů, zleva doprava. 886 00:40:48,710 --> 00:40:54,120 Není to až dostaneme středník že uzel klíčové slovo skutečně existuje. 887 00:40:54,120 --> 00:40:57,980 Takže pokud chceme mít tento druh cyklické reference uvnitř data 888 00:40:57,980 --> 00:41:02,120 struktura, musíme to udělat, pokud říkáme struct uzel na vrcholu, který 889 00:41:02,120 --> 00:41:06,770 nám dává delší způsob, jak popsat to věc, pak uvnitř říkáme struct uzel, 890 00:41:06,770 --> 00:41:09,560 a poté na poslední řádek říkáme, v pořádku, C, mimochodem, 891 00:41:09,560 --> 00:41:12,060 stačí zavolat celou ta zatracená věc uzel a zastavit 892 00:41:12,060 --> 00:41:14,360 pomocí klíčového slova struct úplně. 893 00:41:14,360 --> 00:41:18,030 Takže je to jen něco jako syntaktický trik, který nakonec nám umožňuje vytvářet 894 00:41:18,030 --> 00:41:21,370 něco, co vypadá přesně takhle. 895 00:41:21,370 --> 00:41:25,010 >> Takže pokud budeme předpokládat, teď můžeme provádět tuto věc C, 896 00:41:25,010 --> 00:41:28,040 Jak máme vlastně začít pojezdu to? 897 00:41:28,040 --> 00:41:32,360 No, ve skutečnosti, všechno, co musíte udělat, je opakovat zleva doprava a jen 898 00:41:32,360 --> 00:41:35,960 druh vložit uzlů nebo odstranit uzly nebo hledat věci, všude tam, kde chceme, 899 00:41:35,960 --> 00:41:39,560 ale k tomu, pojďme do toho a dělat o něco reálnější věci, protože to 900 00:41:39,560 --> 00:41:42,560 byla mimořádně nízké úrovni tak daleko. 901 00:41:42,560 --> 00:41:45,700 By někdo doslova chtěl být první? 902 00:41:45,700 --> 00:41:46,200 DOBŘE. 903 00:41:46,200 --> 00:41:47,092 Pojď nahoru. 904 00:41:47,092 --> 00:41:47,800 Jak se jmenuješ? 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 Rád tě poznávám. 908 00:41:49,998 --> 00:41:50,960 Já taky. 909 00:41:50,960 --> 00:41:52,450 Dobře. 910 00:41:52,450 --> 00:41:53,990 A my potřebujeme číslo 9. 911 00:41:53,990 --> 00:41:55,240 Ne tak dobrý jako dříve, možná. 912 00:41:55,240 --> 00:41:56,430 OK, číslo 9. 913 00:41:56,430 --> 00:41:59,667 Číslo 17, prosím. 914 00:41:59,667 --> 00:42:01,000 Dovolte mi, abych se vrátit o kousek dál. 915 00:42:01,000 --> 00:42:03,980 Číslo 22, prosím, a Jak se o dál zpět 916 00:42:03,980 --> 00:42:06,344 jestli můžu vidět žádné ruce se všechno světlo, nebo ne. 917 00:42:06,344 --> 00:42:08,010 Někdo se přihlásil právě tam. 918 00:42:08,010 --> 00:42:08,968 Chcete přijít? 919 00:42:08,968 --> 00:42:10,450 Vaše předloktí se násilně stoupá. 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 přichází dolů. 923 00:42:15,120 --> 00:42:18,450 By někdo jiný chtěl forcefully-- Pojď nahoru. 924 00:42:18,450 --> 00:42:21,030 Skutečný dobrovolník. 925 00:42:21,030 --> 00:42:23,330 >> Takže velmi rychle, je-li vy mohl zařídit 926 00:42:23,330 --> 00:42:26,550 sami stejně jako uzly na obrazovce. 927 00:42:26,550 --> 00:42:27,510 Děkuji. 928 00:42:27,510 --> 00:42:29,234 A budete mít 26. 929 00:42:29,234 --> 00:42:30,650 Všechny správné a rychlé úvody. 930 00:42:30,650 --> 00:42:32,139 Takže jsem David a jste také? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: A vy jste? 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 Výborně. 940 00:42:37,590 --> 00:42:39,810 Tak to jsou naši dobrovolníci pro dnes a pokračovat 941 00:42:39,810 --> 00:42:43,090 a posunout trochu to tak, a prostě jít dopředu a držet 942 00:42:43,090 --> 00:42:47,024 holding vaše čísla jako vy nebo váš První známkou a levou rukou, 943 00:42:47,024 --> 00:42:48,940 jděte do toho a prostě realizovat Tyto šipky, jen 944 00:42:48,940 --> 00:42:51,360 tak, aby vaše levá ruka je doslova ukazuje na co byste se měli ukázat 945 00:42:51,360 --> 00:42:54,610 u, a dát si tak, aby nějaké místo můžeme vizuálně vidět ruce vlastně 946 00:42:54,610 --> 00:42:58,120 bodování, a vy můžete jen bod druh u země je v pořádku. 947 00:42:58,120 --> 00:43:03,040 >> Takže tady máme propojeného seznamu jednoho, dva, tři, čtyři, pět uzly zpočátku, 948 00:43:03,040 --> 00:43:05,860 a všimněte si, máme to zvláštní ukazatel na začátku, kdo je 949 00:43:05,860 --> 00:43:09,770 key protože musíme sledovat celé délce seznamu nějak. 950 00:43:09,770 --> 00:43:13,590 Tihle kluci, a to i přesto, že jste opustili doprava, zády k sobě v paměti, 951 00:43:13,590 --> 00:43:15,950 mohou ve skutečnosti být kdekoli V paměti počítače. 952 00:43:15,950 --> 00:43:18,240 Takže tito lidé mohou být stojící kdekoliv na pódiu 953 00:43:18,240 --> 00:43:20,960 a to je v pořádku, tak dlouho, jak oni jsou ve skutečnosti ukazuje na sebe, 954 00:43:20,960 --> 00:43:22,770 ale udržet věci čistý a jednoduchý, budeme 955 00:43:22,770 --> 00:43:25,728 jen kreslit je zleva doprava, jako , ale mohlo by být masivní mezery 956 00:43:25,728 --> 00:43:26,790 mezi těmito uzly. 957 00:43:26,790 --> 00:43:30,710 >> A teď, když chci opravdu vložit některé nová hodnota, pojďme do toho a to udělat. 958 00:43:30,710 --> 00:43:33,720 Máme příležitost teď zvolit jiný uzel. 959 00:43:33,720 --> 00:43:39,820 Řekněme, pojďme začít s mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Nevadilo by je někdo malloc? 961 00:43:41,320 --> 00:43:42,280 OK, pojď nahoru. 962 00:43:42,280 --> 00:43:42,992 Jak se jmenuješ? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Duha. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Duha? 965 00:43:44,050 --> 00:43:44,810 Dobře. 966 00:43:44,810 --> 00:43:46,600 Malloc Duha. 967 00:43:46,600 --> 00:43:47,450 Pojď nahoru. 968 00:43:47,450 --> 00:43:51,610 Takže teď se musíme ptát sami sebe, algoritmicky kde můžeme dát 55. 969 00:43:51,610 --> 00:43:53,610 Takže všichni víme, samozřejmě, kde nejspíš 970 00:43:53,610 --> 00:43:55,401 Patří-li, že se snažíme aby tento seřazena 971 00:43:55,401 --> 00:43:58,299 a pokud by bylo vy mít jednu krok zpět, takže nemáme spadnout 972 00:43:58,299 --> 00:43:59,590 fáze, to by bylo skvělé. 973 00:43:59,590 --> 00:44:01,420 Takže vlastně, Duha, začít znovu tady se mnou, 974 00:44:01,420 --> 00:44:04,200 proto, že jsme jako počítač nyní může vidět pouze jednu proměnnou najednou. 975 00:44:04,200 --> 00:44:05,190 Takže pokud se jedná o první uzel. 976 00:44:05,190 --> 00:44:07,160 Všimněte si, že to není uzel, je to jen ukazatel, 977 00:44:07,160 --> 00:44:10,270 a to je důvod, proč je třeba věnovat se pouze velikost ukazatele, ne 978 00:44:10,270 --> 00:44:11,780 jeden z těchto plných obdélníků. 979 00:44:11,780 --> 00:44:16,650 Takže jdeme zkontrolovat na sebe iterace je 55 méně než 9? 980 00:44:16,650 --> 00:44:17,150 Ne. 981 00:44:17,150 --> 00:44:19,060 Je 55 méně než 17? 982 00:44:19,060 --> 00:44:19,720 Ne. 983 00:44:19,720 --> 00:44:20,800 Méně než 22? 984 00:44:20,800 --> 00:44:22,020 Méně než 26? 985 00:44:22,020 --> 00:44:23,390 Méně než 34? 986 00:44:23,390 --> 00:44:25,890 A tak teď, samozřejmě Duha patří na závěr. 987 00:44:25,890 --> 00:44:27,270 Tak aby bylo jasno, a to, co bylo vaše jméno, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> Taylor: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Takže mezi Taylora Levá ruka a rainbow ruce tady, 990 00:44:32,510 --> 00:44:38,324 jehož rukou je třeba poukázat na to, co v Pro vložení 55 do tohoto seznamu? 991 00:44:38,324 --> 00:44:39,240 Co musíme udělat? 992 00:44:39,240 --> 00:44:39,700 To jo? 993 00:44:39,700 --> 00:44:41,140 >> Diváků: Taylor ruka potřebuje k bodu doleva. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Přesně tak. 995 00:44:41,680 --> 00:44:43,800 Takže vložení uzlu na konec seznamu 996 00:44:43,800 --> 00:44:47,140 je velmi jednoduché, protože právě Taylor má na bod, namísto na zem 997 00:44:47,140 --> 00:44:49,640 nebo budeme nazývat null, null je něco absence 998 00:44:49,640 --> 00:44:51,640 z ukazatele nebo speciální nulový ukazatel, že jste 999 00:44:51,640 --> 00:44:53,740 jít k bodu s vaší levici ruka Rainbow a pak Rainbow, 1000 00:44:53,740 --> 00:44:55,910 kde by měla být vaše doleva ruka pravděpodobně bod? 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Není to dobré, když její ruka je trochu ukazování zde, nebo tak nějak jakékoliv off 1003 00:45:00,140 --> 00:45:00,640 jakým způsobem. 1004 00:45:00,640 --> 00:45:02,407 Které by bylo považováno hodnota odpadky, 1005 00:45:02,407 --> 00:45:04,240 ale když poukazuje na Některé známé hodnoty, budeme 1006 00:45:04,240 --> 00:45:07,360 nazývají nula nebo null, to je v pořádku protože máme termín v tom 1007 00:45:07,360 --> 00:45:09,390 a víme, že seznam je nyní kompletní. 1008 00:45:09,390 --> 00:45:11,550 >> Takže to, co je další poměrně jednoduchý případ? 1009 00:45:11,550 --> 00:45:13,125 Mohli bychom malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Pojď nahoru. 1011 00:45:14,010 --> 00:45:14,782 Jak se jmenuješ? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Je mi to líto? 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 Dobře. 1017 00:45:17,110 --> 00:45:19,071 Tiffany byla malloced s hodnotou 5. 1018 00:45:19,071 --> 00:45:19,570 Pojď nahoru. 1019 00:45:19,570 --> 00:45:23,820 Tohle je relativně snadné taky, ale uvažujme pořadí operací teď. 1020 00:45:23,820 --> 00:45:25,820 Bylo to docela snadné s Taylorem na konci. 1021 00:45:25,820 --> 00:45:30,302 Číslo 5 je samozřejmě menší než 9, a tak máme Davida, máme Tiffany, 1022 00:45:30,302 --> 00:45:31,260 a jaká byla vaše jméno? 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, a David. 1026 00:45:34,300 --> 00:45:36,580 Čí ruka by měly být aktualizovány jako první? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Co chceš dělat? 1029 00:45:40,590 --> 00:45:45,244 Je tu pár možné způsoby, ale tam je také jeden nebo více špatné cesty. 1030 00:45:45,244 --> 00:45:46,620 >> Diváků: Začněte s zcela vlevo. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Začněte zcela vlevo. 1032 00:45:47,800 --> 00:45:49,008 Kdo je tady vlevo pak? 1033 00:45:49,008 --> 00:45:49,700 Diváků: První. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Takže začít s prvním a kam vás Chcete aktualizovat Davidovi ruce být? 1036 00:45:53,781 --> 00:45:54,780 Diváků: Směrem k 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 A tak David, bod v pět nebo Tiffany tady a teď? 1039 00:45:59,026 --> 00:46:01,072 >> Diváků: Tiffany poukazuje na 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Perfect, s výjimkou Binky je Hlava tak nějak spadl, že jo? 1041 00:46:04,030 --> 00:46:06,820 Vzhledem k tomu, co je špatně tento obrázek doslova? 1042 00:46:06,820 --> 00:46:08,070 Diváků: Nic se ukázal. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Nic není ukázal na Jakem teď. 1044 00:46:09,945 --> 00:46:13,360 My jsme doslova osiřelý 9 a 17, a my jsme doslova 1045 00:46:13,360 --> 00:46:18,450 unikly všechny této paměti, protože tím, První aktualizace Davidovu ruku, to je 1046 00:46:18,450 --> 00:46:21,660 pořádku, pokud je to správně ukázal na Tiffany teď, 1047 00:46:21,660 --> 00:46:25,410 ale pokud nikdo měl předvídavost poukázat na Jakea, 1048 00:46:25,410 --> 00:46:27,490 pak jsme ztratili celistvost tohoto seznamu. 1049 00:46:27,490 --> 00:46:28,200 Takže pojďme vrátit zpět. 1050 00:46:28,200 --> 00:46:30,950 Takže to byla dobrá věc, zakopnout ale pojďme napravit nyní. 1051 00:46:30,950 --> 00:46:33,624 Co bychom měli udělat jako první místo? 1052 00:46:33,624 --> 00:46:34,124 To jo? 1053 00:46:34,124 --> 00:46:35,791 >> Diváků: Tiffany by měl ukázat na 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: Nemohu dostat, že blízko k vám. 1055 00:46:37,582 --> 00:46:38,720 Kdo by měl ukázat na 9? 1056 00:46:38,720 --> 00:46:39,220 >> Diváků: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: Dobře. 1058 00:46:39,390 --> 00:46:41,200 Takže Tiffany by První bod na 9. 1059 00:46:41,200 --> 00:46:43,550 Takže Tiffany by měly přijmout na stejnou hodnotu 1060 00:46:43,550 --> 00:46:45,820 Davidovi, který se zdá redundantní na chvíli, 1061 00:46:45,820 --> 00:46:48,820 ale to je v pořádku, protože hned druhý krok, můžeme aktualizovat Davidovu ruku 1062 00:46:48,820 --> 00:46:52,680 poukázat na Tiffany, a pak v případě my tak nějak čisté věci nahoru 1063 00:46:52,680 --> 00:46:55,740 jako by toto je druh jaro-jako, Nyní to je správné vložení. 1064 00:46:55,740 --> 00:46:56,700 Tak vynikající. 1065 00:46:56,700 --> 00:46:57,970 Jsme skoro tam, takže teď máme. 1066 00:46:57,970 --> 00:47:01,075 Pojďme vložte jeden finále hodnota jako hodnota 20. 1067 00:47:01,075 --> 00:47:03,010 Kdybychom mohli malloc jednu závěrečnou dobrovolník? 1068 00:47:03,010 --> 00:47:04,140 Pojď nahoru. 1069 00:47:04,140 --> 00:47:06,224 Tak tohle je trochu složitější. 1070 00:47:06,224 --> 00:47:08,390 Ale vážně, kód jsme psaní, i když slovně, 1071 00:47:08,390 --> 00:47:10,610 je stejně jako mít hromadu ze pokud to podmínky, ne? 1072 00:47:10,610 --> 00:47:12,318 Měli jsme podmínku kontrolovat, zda patří 1073 00:47:12,318 --> 00:47:13,840 na konci, možná na počátku. 1074 00:47:13,840 --> 00:47:15,940 Potřebujeme nějaký druh smyčky najít místo uprostřed. 1075 00:47:15,940 --> 00:47:17,400 Takže pojďme to udělat s Jak se jmenujete? 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 Eriku. 1079 00:47:18,660 --> 00:47:19,368 Rád tě poznávám. 1080 00:47:19,368 --> 00:47:20,490 Takže máme 20. 1081 00:47:20,490 --> 00:47:21,220 Méně než pět? 1082 00:47:21,220 --> 00:47:21,530 Ne. 1083 00:47:21,530 --> 00:47:22,160 Méně než devět? 1084 00:47:22,160 --> 00:47:22,410 Ne. 1085 00:47:22,410 --> 00:47:23,050 Méně než 17? 1086 00:47:23,050 --> 00:47:23,550 Ne. 1087 00:47:23,550 --> 00:47:23,740 DOBŘE. 1088 00:47:23,740 --> 00:47:25,701 On sem patří, a Vaše jména jsou opět? 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, a? 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 Potřebujete, abyste mohli aktualizovat jako první, jejichž ruce? 1096 00:47:32,140 --> 00:47:32,930 >> Diváků: Eric. 1097 00:47:32,930 --> 00:47:33,429 DOBŘE. 1098 00:47:33,429 --> 00:47:35,200 Takže Eric to by měla ukazovat na to, kde? 1099 00:47:35,200 --> 00:47:35,930 Na 22. 1100 00:47:35,930 --> 00:47:36,430 Dobrý. 1101 00:47:36,430 --> 00:47:38,180 A teď, co bude dál? 1102 00:47:38,180 --> 00:47:40,800 Sue pak mohou poukázat na Eric a teď, pokud jste kluci jen 1103 00:47:40,800 --> 00:47:44,077 udělat nějaký prostor, což je v pořádku vizuálně, teď jsme udělali vložení. 1104 00:47:44,077 --> 00:47:47,160 Takže pojďme teď posouzení otázky, ale děkuji moc za naše dobrovolníky. 1105 00:47:47,160 --> 00:47:48,090 Velmi dobře. 1106 00:47:48,090 --> 00:47:50,831 Si můžete nechat ty, pokud se vám líbí. 1107 00:47:50,831 --> 00:47:54,140 A máme krásný dárek na rozloučenou, pokud byste každý rád, aby se stres míček. 1108 00:47:54,140 --> 00:47:56,030 Dovolte mi to projít dolů. 1109 00:47:56,030 --> 00:47:58,430 Takže to, co je stánek s jídlem to? 1110 00:47:58,430 --> 00:48:02,430 To se zdá být úžasná pokud máme nyní 1111 00:48:02,430 --> 00:48:06,360 představil alternativu k Pole, které není tak omezen 1112 00:48:06,360 --> 00:48:07,780 na matici nějakého pevnou velikost. 1113 00:48:07,780 --> 00:48:09,380 Mohou dorůst dynamicky. 1114 00:48:09,380 --> 00:48:13,220 >> Ale podobně jako jsme viděli v týdnech minulost, jsme se nikdy dostat něco zadarmo, 1115 00:48:13,220 --> 00:48:15,740 stejně jako určitě tam je trade-off zde. 1116 00:48:15,740 --> 00:48:18,890 Takže se vzhůru propojeného seznam, je tato dynamika? 1117 00:48:18,890 --> 00:48:21,590 Tato schopnost růst a upřímně řečeno, jsme mohli udělat delete 1118 00:48:21,590 --> 00:48:23,570 a tak bychom mohli zmenšovat podle potřeby. 1119 00:48:23,570 --> 00:48:24,710 Jakou cenu platíme? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dvakrát tolik prostoru, první ze všech. 1122 00:48:30,340 --> 00:48:34,010 Pokud se podíváte na obrázek, už ne jsem ukládání seznam celých čísel. 1123 00:48:34,010 --> 00:48:36,740 Jsem ukládání seznam celá čísla plus ukazatele. 1124 00:48:36,740 --> 00:48:38,240 Takže jsem zdvojnásobení množství prostoru. 1125 00:48:38,240 --> 00:48:40,740 Nyní, možná to není tak velký problém 4 bajtů, 8 bajtů, 1126 00:48:40,740 --> 00:48:43,160 ale mohla by určitě přidat up pro velké soubory dat. 1127 00:48:43,160 --> 00:48:45,570 Co je další nevýhoda? 1128 00:48:45,570 --> 00:48:46,070 To jo? 1129 00:48:46,070 --> 00:48:48,010 >> Diváků: Musíme přejít jim jeden po druhém. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Jo. 1131 00:48:48,760 --> 00:48:50,260 Musíme je projít jeden po druhém. 1132 00:48:50,260 --> 00:48:53,860 Víš co, jsme se vzdali tento super užitečná funkce z hranatých závorkách 1133 00:48:53,860 --> 00:48:57,240 notace, více vhodně známý jako náhodný přístup, 1134 00:48:57,240 --> 00:48:59,280 kde si můžeme jen skok na jednotlivé elementy 1135 00:48:59,280 --> 00:49:01,470 ale teď, když jsem ještě měl moje dobrovolníci zde, 1136 00:49:01,470 --> 00:49:04,660 kdybych chtěl najít číslo 22, nemohu jen 1137 00:49:04,660 --> 00:49:06,620 skočit na držák něco něco. 1138 00:49:06,620 --> 00:49:10,530 Musím se podívat přes seznam, hodně jako lineárně našich vyhledávacích příkladů, 1139 00:49:10,530 --> 00:49:12,260 najít číslo 22. 1140 00:49:12,260 --> 00:49:14,340 Takže se zdá, že zaplatili cenu tam. 1141 00:49:14,340 --> 00:49:16,430 Ale můžeme přesto vyřešit další problémy. 1142 00:49:16,430 --> 00:49:18,587 >> Ve skutečnosti, dovolte mi představit jen pár vizuální. 1143 00:49:18,587 --> 00:49:20,920 Takže pokud jste byli dolů Mather jídelně v poslední době, 1144 00:49:20,920 --> 00:49:23,320 budete připomenout, že jejich stohy zásobníků, jako je tato, 1145 00:49:23,320 --> 00:49:26,300 Půjčili jsme tyto od Annenberg před třídy. 1146 00:49:26,300 --> 00:49:28,930 Takže tento sloupec podložek, i když, je vlastně reprezentativní 1147 00:49:28,930 --> 00:49:30,860 datové struktury počítačové vědy. 1148 00:49:30,860 --> 00:49:32,910 K dispozici je datová struktura v informatice 1149 00:49:32,910 --> 00:49:38,010 známý jako zásobník, který velmi pěkně půjčuje sebe přesně to vizuální. 1150 00:49:38,010 --> 00:49:41,380 Takže pokud každý z těchto zásobníků není zásobník, ale stejně jako řada a já jsem chtěl, 1151 00:49:41,380 --> 00:49:45,010 uložení telefonních čísel, já mohl dát tu jeden dolů, 1152 00:49:45,010 --> 00:49:48,320 a já jsem mohl dát další tady, a pokračovat stohování čísla 1153 00:49:48,320 --> 00:49:53,180 nad sebou, a to, co je potenciálně užitečné o tom 1154 00:49:53,180 --> 00:49:55,450 je to, že to, co je implikace této datové struktury? 1155 00:49:55,450 --> 00:49:58,045 Které číslo můžu vytáhnout První nejvýhodněji? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Nejvíce v současnosti jeden dal tam. 1158 00:50:03,030 --> 00:50:06,430 >> Takže to je to, co bychom nazvali v informatika datová struktura LIFO. 1159 00:50:06,430 --> 00:50:08,070 Last in, first out. 1160 00:50:08,070 --> 00:50:10,800 A uvidíme zanedlouho, proč to by mohlo být užitečné, ale pro tuto chvíli, 1161 00:50:10,800 --> 00:50:12,200 zvaž vlastnost. 1162 00:50:12,200 --> 00:50:15,158 A je to trochu hloupé, pokud si myslíte, o tom, jak ji jídelna dělá. 1163 00:50:15,158 --> 00:50:17,910 Pokaždé, když čisté podnosy a dal nejčerstvější ty na vrcholu, 1164 00:50:17,910 --> 00:50:22,160 Ty by mohly mít dříve čisté ale nakonec velmi špinavé a zaprášené 1165 00:50:22,160 --> 00:50:24,360 zásobník na samém dně Pokud jste nikdy vlastně 1166 00:50:24,360 --> 00:50:26,820 dostat se až na dno, které stack, protože jste právě 1167 00:50:26,820 --> 00:50:29,380 udržet uvedení nové a Čisté ty, na vrcholu toho. 1168 00:50:29,380 --> 00:50:31,840 Stejná věc se může stát v supermarketu příliš. 1169 00:50:31,840 --> 00:50:35,450 Pokud máte vitrínu mléka a pokaždé CVS 1170 00:50:35,450 --> 00:50:37,610 nebo ten, kdo dostane více mléka, stačí strčit mléka 1171 00:50:37,610 --> 00:50:39,880 že již máte na zadní straně a dáte nové vpředu, 1172 00:50:39,880 --> 00:50:43,088 budete mít některé docela ošklivé mléko na konci datové struktury, 1173 00:50:43,088 --> 00:50:46,390 protože je to vždy na dně nebo ekvivalentně to je vždy na zadní straně. 1174 00:50:46,390 --> 00:50:50,407 >> Ale je tu jiný způsob, jak přemýšlet o tom, čekají, až data a například tento. 1175 00:50:50,407 --> 00:50:53,490 Pokud jste jeden z těch lidí, kdo má rád na line up mimo obchodech Apple 1176 00:50:53,490 --> 00:50:55,610 když nový výrobek pochází out, budete pravděpodobně 1177 00:50:55,610 --> 00:50:58,780 bez použití zásobníku dat struktura, protože vás 1178 00:50:58,780 --> 00:51:03,070 by odcizit všichni ostatní, kdo je seřazovat koupit nějakou novou hračku. 1179 00:51:03,070 --> 00:51:06,610 Spíše, budete pravděpodobně používat jaký druh datové struktury 1180 00:51:06,610 --> 00:51:10,050 nebo jaký druh systému v reálném světě? 1181 00:51:10,050 --> 00:51:13,493 Doufejme, že je to čára, nebo více správně nebo více Britové-like, fronta. 1182 00:51:13,493 --> 00:51:17,700 A ukázalo se, fronta je také struktura dat v informatice, 1183 00:51:17,700 --> 00:51:19,700 ale fronta má velmi jiný majetek. 1184 00:51:19,700 --> 00:51:20,820 Není to LIFO. 1185 00:51:20,820 --> 00:51:21,990 Last in, first out. 1186 00:51:21,990 --> 00:51:22,800 Chraň Bůh. 1187 00:51:22,800 --> 00:51:24,280 Je to místo FIFO. 1188 00:51:24,280 --> 00:51:26,110 První dovnitř, první ven. 1189 00:51:26,110 --> 00:51:27,970 A to je dobrá věc na poctivosti "kvůli 1190 00:51:27,970 --> 00:51:30,428 jistě, když jste obložení up Super brzy ráno. 1191 00:51:30,428 --> 00:51:33,400 Pokud se tam dostat jako první, chtějí se dostat ven nejprve stejně. 1192 00:51:33,400 --> 00:51:35,880 >> A tak se všechny z těchto údajů struktury, fronty a komíny 1193 00:51:35,880 --> 00:51:39,220 a svazky jiných, dopadá vás můžete myslet na to jako jen pole. 1194 00:51:39,220 --> 00:51:41,820 Toto je pole, možná pevnou velikost 4, ale to by 1195 00:51:41,820 --> 00:51:44,990 být docela hezké, kdybychom mohli jen hromadu podnosy téměř nekonečně vysoký kdybychom 1196 00:51:44,990 --> 00:51:46,780 mají, že mnoho zásobníky nebo čísla. 1197 00:51:46,780 --> 00:51:48,840 Takže možná chceme použijte propojeného seznamu tady, 1198 00:51:48,840 --> 00:51:51,800 ale trade-off se bude potenciálně, že potřebujeme více paměti, 1199 00:51:51,800 --> 00:51:55,930 zabere trochu více času, ale my neomezují výšku stohu, 1200 00:51:55,930 --> 00:51:59,550 podobně jako Mather v vitríně může omezit velikost stohu, 1201 00:51:59,550 --> 00:52:03,117 a proto se jedná o rozhodnutí návrhu nebo dostupné možnosti k nám nakonec. 1202 00:52:03,117 --> 00:52:04,950 Takže s těmito údaji struktury, jsme začali 1203 00:52:04,950 --> 00:52:09,360 vidění nová horní hranice potenciálně na to, co dříve bylo velmi rychlé 1204 00:52:09,360 --> 00:52:11,260 a kde necháme off ještě dnes a kde 1205 00:52:11,260 --> 00:52:13,200 budeme doufat, že se dostat do je ve středu, budeme 1206 00:52:13,200 --> 00:52:15,740 začít hledat na datech struktura, která nám umožňuje vyhledávat 1207 00:52:15,740 --> 00:52:18,260 prostřednictvím dat v čase konečného znovu přihlásit. 1208 00:52:18,260 --> 00:52:21,470 A my jsme viděli, že, vzpomínám, v týdnu nula a jeden s binární vyhledávání nebo dělení 1209 00:52:21,470 --> 00:52:22,180 a dobýt. 1210 00:52:22,180 --> 00:52:26,240 Je to vrací, a ještě lépe, svatý grál pro tuto středu 1211 00:52:26,240 --> 00:52:29,510 bude přijít s Datová struktura, která běží skutečně 1212 00:52:29,510 --> 00:52:32,070 nebo teoreticky konstantní čas, přičemž 1213 00:52:32,070 --> 00:52:34,760 nezáleží na tom, kolik milióny či miliardy věcí 1214 00:52:34,760 --> 00:52:38,470 máme v datové struktuře, to bude trvat nás konstantní čas, možná jeden krok 1215 00:52:38,470 --> 00:52:41,387 nebo dva kroky, nebo 10 kroků, ale konstantní počet kroků 1216 00:52:41,387 --> 00:52:42,970 prohledávat této struktury dat. 1217 00:52:42,970 --> 00:52:46,300 To samozřejmě bude svatý grál ale o tom ve středu. 1218 00:52:46,300 --> 00:52:49,045 Uvidíme se pak. 1219 00:52:49,045 --> 00:52:53,704 >> [Přehrávání hudby] 1220 00:52:53,704 --> 00:56:08,448