1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Dobře, vítej zpět. 3 00:00:12,580 --> 00:00:13,290 Toto je CS50. 4 00:00:13,290 --> 00:00:15,130 To je začátek týdne sedm. 5 00:00:15,130 --> 00:00:18,890 Takže je to nějakou dobu, tak jsem si myslel, že bych se vichřice turné, kde jsme 6 00:00:18,890 --> 00:00:20,760 přestali a kde jsme teď bude. 7 00:00:20,760 --> 00:00:23,310 >> Takže to, co tady může mít způsobilo nějaké úzkosti na prvním místě. 8 00:00:23,310 --> 00:00:27,680 Ale doufejme, že začínáš aklimatizovat, co to znamená tady - 9 00:00:27,680 --> 00:00:32,670 hvězdička představuje ukazatel, který je jen to, co ve více laicky řečeno? 10 00:00:32,670 --> 00:00:33,400 Takže je to adresa. 11 00:00:33,400 --> 00:00:35,490 >> Takže je to adresa něco v paměti. 12 00:00:35,490 --> 00:00:38,260 A začali jsme Sloupněte vrstvy Před pár týdny, věci jako 13 00:00:38,260 --> 00:00:41,800 GetString a jiné takové funkce Celou tu dobu byli návratu 14 00:00:41,800 --> 00:00:46,010 Adresy věcí v paměti, jako adresa prvního znaku 15 00:00:46,010 --> 00:00:46,990 některé sekvence. 16 00:00:46,990 --> 00:00:50,360 >> Tak jsme také představil Valgrind, které začnete používat tohoto problému 17 00:00:50,360 --> 00:00:53,380 nastavit, a to zejména pro další problém nastavit stejně. 18 00:00:53,380 --> 00:00:54,980 A valgrind co dělá pro nás? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Kontroluje úniky paměti, a to také kontroluje za zneužití paměti. 21 00:01:01,020 --> 00:01:05,890 >> Je možné, s určitou pravděpodobností, zjistit, zda Váš kód bude dotýkat paměť 22 00:01:05,890 --> 00:01:07,100 že to prostě neměl. 23 00:01:07,100 --> 00:01:10,410 Takže ne nutně únik, ale pokud přesahují hranice některých 24 00:01:10,410 --> 00:01:14,730 pole, a vy vlastně běží Valgrind a vyvolat takové chování při 25 00:01:14,730 --> 00:01:17,870 valgrind běží v programu je běžící uvnitř ní, dostanete 26 00:01:17,870 --> 00:01:21,460 zprávy, jako je tato - "neplatný psát velikost 4 ", což připomínají pár 27 00:01:21,460 --> 00:01:25,880 týdny znamenalo, že jsem měl náhodou jako na jeden int příliš daleko 28 00:01:25,880 --> 00:01:27,250 za hranice pole. 29 00:01:27,250 --> 00:01:30,790 A tak velikost 4 zde znamená velikost této konkrétní int. 30 00:01:30,790 --> 00:01:35,260 >> Tak se ujištění v tom, že Valgrind je výstup ve formátu tom, 31 00:01:35,260 --> 00:01:36,170 je prostě otřesné. 32 00:01:36,170 --> 00:01:40,180 Je to opravdu těžké vidět skrz nepořádek na zajímavé informace. 33 00:01:40,180 --> 00:01:42,910 Takže to, co jsme udělali tady je jen ukázka některé z několika více 34 00:01:42,910 --> 00:01:43,850 zajímavé linky. 35 00:01:43,850 --> 00:01:46,760 Ale uvědomit, že 80% je Valgrind Výstup bude trochu 36 00:01:46,760 --> 00:01:47,650 rozptýlení. 37 00:01:47,650 --> 00:01:52,820 >> Stačí se podívat na vzory, jako jsou tyto - neplatné pravdu, neplatné číst, 40 bajtů 38 00:01:52,820 --> 00:01:56,690 a určitý počet bloků jsou určitě ztratil, klíčová slova, jako je to. 39 00:01:56,690 --> 00:02:01,920 A co budete vidět snad je nějaký druh stopy, jakou funkci 40 00:02:01,920 --> 00:02:03,340 chyba je vlastně palců 41 00:02:03,340 --> 00:02:07,195 V tomto případě je tady, v tom, co řada můj kód byl zřejmě chyba? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 v souboru nazvaném memory.c, který byl příklad jsme si hráli se 44 00:02:14,130 --> 00:02:14,890 v té době. 45 00:02:14,890 --> 00:02:16,460 Takže to asi není v malloc. 46 00:02:16,460 --> 00:02:18,630 To bylo pravděpodobně v mém kódu místo. 47 00:02:18,630 --> 00:02:20,910 Tak uvidíme to ještě jednou a znovu zanedlouho. 48 00:02:20,910 --> 00:02:24,080 >> Takže scanf, to přišlo až v roce pár formulářů tak daleko. 49 00:02:24,080 --> 00:02:26,410 Viděli jsme sscanf krátce. 50 00:02:26,410 --> 00:02:28,330 To bylo něco, co řada jste skočil do ve vaší 51 00:02:28,330 --> 00:02:29,535 Přípravy na kvíz. 52 00:02:29,535 --> 00:02:33,130 A scanf je vlastně to, co CS50 knihovna se používá pod 53 00:02:33,130 --> 00:02:36,560 kapuce pro docela nějaký čas, aby získat vstup od uživatele. 54 00:02:36,560 --> 00:02:40,420 >> Například, když jsem přejít na CS50 Spotřebič tady, dovolte mi otevřít 55 00:02:40,420 --> 00:02:45,315 Například dnes se tomu říká scanf-0.c A je super jednoduché. 56 00:02:45,315 --> 00:02:46,590 Je to jen pár řádků kódu. 57 00:02:46,590 --> 00:02:50,880 Ale je to opravdu ukazuje, jak GetInt pracuje celou dobu. 58 00:02:50,880 --> 00:02:54,710 >> V tomto programu zde, v souladu 16 Všimněte si, že jsem deklarovat int. 59 00:02:54,710 --> 00:02:57,270 Takže žádné ukazatele, nic magického tam, jen int. 60 00:02:57,270 --> 00:03:00,330 Pak v řádku 17, jsem výzvu uživatel na číslo, prosím. 61 00:03:00,330 --> 00:03:02,930 Pak na konci roku 18, já používám scanf zde. 62 00:03:02,930 --> 00:03:06,910 A já uvedeno, něco jako printf, že jsem očekával citát 63 00:03:06,910 --> 00:03:08,110 konec citátu procent i.. 64 00:03:08,110 --> 00:03:10,920 >> Tak i procenta, samozřejmě, označuje int. 65 00:03:10,920 --> 00:03:14,580 Nevšimnout, co druhý argument scanf je. 66 00:03:14,580 --> 00:03:17,350 Jak byste popsal druhý Argument se po čárce? 67 00:03:17,350 --> 00:03:19,450 Co je to? 68 00:03:19,450 --> 00:03:20,670 >> Je to adresa x. 69 00:03:20,670 --> 00:03:25,490 Což je výhodné proto, že tím, že scanf s adresou X, co 70 00:03:25,490 --> 00:03:29,560 který zmocní tuto funkci dělat? 71 00:03:29,560 --> 00:03:33,010 Nejen tam, ale i to, co? 72 00:03:33,010 --> 00:03:34,060 >> Proveďte změnu na něj. 73 00:03:34,060 --> 00:03:38,080 Vzhledem k tomu, můžete tam jít, je to trochu jako mapy na místo v paměti. 74 00:03:38,080 --> 00:03:41,900 A tak dlouho, jak si zajistit scanf nebo nějaká funkce se takové mapy, že 75 00:03:41,900 --> 00:03:45,840 funkce může tam jít, a to nejen podívejte se na hodnotu, ale také to může 76 00:03:45,840 --> 00:03:49,670 změna této hodnoty, což je užitečné, pokud smysl života scanf je 77 00:03:49,670 --> 00:03:53,060 skenování vstup od uživatele, a to konkrétně z klávesnice. 78 00:03:53,060 --> 00:03:57,830 A f označuje formátovaný, stejně jako printf, f označuje formátovaný 79 00:03:57,830 --> 00:03:58,930 řetězec, který chcete vytisknout. 80 00:03:58,930 --> 00:04:04,430 >> Takže ve zkratce, tato linka 18 jednoduše říká, snažím číst int od uživatele 81 00:04:04,430 --> 00:04:10,420 klávesnice a uložit do x, u co se stane, adresa x žít na. 82 00:04:10,420 --> 00:04:14,860 A pak konečně, linka 19 jen říká, díky za int, v tomto případě. 83 00:04:14,860 --> 00:04:15,940 >> Tak mě nech jít dál a dělat to. 84 00:04:15,940 --> 00:04:18,570 Tak, aby scanf 0. 85 00:04:18,570 --> 00:04:20,130 Nech mě jít dopředu a zoom palců 86 00:04:20,130 --> 00:04:22,960 Půjdu a spustit to s tečky lomítko scanf 0. 87 00:04:22,960 --> 00:04:24,020 Číslo, prosím? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Díky za padesát. 90 00:04:25,730 --> 00:04:27,270 Takže je to docela jednoduché. 91 00:04:27,270 --> 00:04:28,160 >> Teď, co se nedělá? 92 00:04:28,160 --> 00:04:29,940 Není to dělá spoustu z kontroly chyb. 93 00:04:29,940 --> 00:04:33,000 Například, když nebudu spolupracovat, a já nemám zadání čísla, ale 94 00:04:33,000 --> 00:04:37,860 Místo toho jsem napsat něco jako "ahoj" to je prostě divné. 95 00:04:37,860 --> 00:04:41,130 A tak jedna z věcí, CS50 Knihovna byla pro nás dělá pro některé 96 00:04:41,130 --> 00:04:43,440 Čas je to, že reprompting a reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Opakování fráze odvolání bylo v cs50.c, a to je důvod, proč v GetInt 98 00:04:49,320 --> 00:04:51,670 knihovna CS50 je vlastně celá banda linek dlouho, protože jsme 99 00:04:51,670 --> 00:04:53,190 kontrola hloupé věci, jako je tento. 100 00:04:53,190 --> 00:04:55,730 Věděli uživatel nedal us, ve skutečnosti, int? 101 00:04:55,730 --> 00:04:57,910 Věděli on nebo ona nám něco jako písmeno z abecedy? 102 00:04:57,910 --> 00:05:01,410 Pokud ano, chceme zjistit že a křičet na ně. 103 00:05:01,410 --> 00:05:03,915 >> Ale věci se dostat mnohem zajímavější V tomto dalším příkladu. 104 00:05:03,915 --> 00:05:09,840 Když jdu do scanf-1.C, co je ten věc, která je zásadní změna v 105 00:05:09,840 --> 00:05:11,135 Další příklad? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Já používám char *, samozřejmě, místo int. 108 00:05:16,010 --> 00:05:19,210 >> Tak to je zajímavé, protože char *, vzpomínám, je opravdu jen 109 00:05:19,210 --> 00:05:20,190 totéž jako řetězec. 110 00:05:20,190 --> 00:05:23,840 Takže to vypadá, možná to je super jednoduchá realizace getString. 111 00:05:23,840 --> 00:05:26,010 Ale já jsem stáhl vrstvy na CS50 knihovny, takže jsem 112 00:05:26,010 --> 00:05:27,550 volání této char * teď. 113 00:05:27,550 --> 00:05:30,070 Takže pojďme se podívat, kde, pokud kdekoliv, jdeme špatně. 114 00:05:30,070 --> 00:05:30,840 >> Řádek 17 - 115 00:05:30,840 --> 00:05:33,950 Bych znovu, prosím, dej mi něco, V tomto případě, řetězec. 116 00:05:33,950 --> 00:05:37,940 A pak na dalším řádku, volám scanf, znovu dávat to formátovací kód, 117 00:05:37,940 --> 00:05:39,310 ale tentokrát s procent. 118 00:05:39,310 --> 00:05:41,900 A pak tentokrát jsem dávat to buffer. 119 00:05:41,900 --> 00:05:43,550 >> Nyní nevšiml, nejsem s použitím ampersand. 120 00:05:43,550 --> 00:05:47,120 Ale proč je to, že pravděpodobně v pořádku tady? 121 00:05:47,120 --> 00:05:49,760 Protože to, co je vyrovnávací paměť už? 122 00:05:49,760 --> 00:05:50,770 Je to již ukazatel. 123 00:05:50,770 --> 00:05:51,650 Je to už adresu. 124 00:05:51,650 --> 00:05:54,510 >> A nechť je to slovo "zmást", dovolte mi, abych jen zavolat, že je, například, pro 125 00:05:54,510 --> 00:05:55,050 jednoduchost. 126 00:05:55,050 --> 00:05:58,250 Ale já jsem to nazval proto, že v bufferu Obecně platí, programování, pokud máte 127 00:05:58,250 --> 00:06:02,130 kus paměti, který řetězec skutečně jen je, že můžete říkat vyrovnávací paměti. 128 00:06:02,130 --> 00:06:04,460 Je to místo pro ukládání informací. 129 00:06:04,460 --> 00:06:07,400 >> Podobně jako věci, jako je YouTube, kdy oni ukládání do vyrovnávací paměti, abych tak řekl, že 130 00:06:07,400 --> 00:06:10,270 jen znamená, že je stahování kousky od internetu a jejich ukládání v 131 00:06:10,270 --> 00:06:14,160 místní pole, místní kus paměti, které můžete sledovat jej později bez 132 00:06:14,160 --> 00:06:16,830 je skákání nebo visí na si při hraní zpátky. 133 00:06:16,830 --> 00:06:20,930 >> Takže je tu problém i když, protože Říkám scanf lze očekávat, že 134 00:06:20,930 --> 00:06:22,320 řetězec od uživatele. 135 00:06:22,320 --> 00:06:24,410 Tady je adresa kus paměti. 136 00:06:24,410 --> 00:06:26,180 Dej to retezec. 137 00:06:26,180 --> 00:06:31,230 Proč je to, že vázaný dát nám potíže, i když? 138 00:06:31,230 --> 00:06:33,490 >> Co je to? 139 00:06:33,490 --> 00:06:35,510 Smím přístup že část paměti? 140 00:06:35,510 --> 00:06:36,250 Víte, já nevím. 141 00:06:36,250 --> 00:06:39,210 Protože má vyrovnávací paměť byla inicializována k něčemu? 142 00:06:39,210 --> 00:06:39,820 Ne tak docela. 143 00:06:39,820 --> 00:06:43,090 A tak to, co jsme byli volání odpadky hodnota, která 144 00:06:43,090 --> 00:06:44,040 není formální slovo. 145 00:06:44,040 --> 00:06:49,200 To prostě znamená, že nemám ponětí, co bitů jsou uvnitř ze čtyř bajtů 146 00:06:49,200 --> 00:06:51,240 Jsem vymezila jako vyrovnávací paměť. 147 00:06:51,240 --> 00:06:52,450 >> Jsem nezavolal malloc. 148 00:06:52,450 --> 00:06:53,940 Určitě jsem nezavolal GetString. 149 00:06:53,940 --> 00:06:56,380 Takže kdo ví, co je vlastně vnitřní vyrovnávací paměti? 150 00:06:56,380 --> 00:07:00,550 A přesto říká scanf naslepo, tam a dejte, co uživatel napsal. 151 00:07:00,550 --> 00:07:04,460 >> Takže to, co je pravděpodobně způsobí v našem kódu, pokud se jej spustit? 152 00:07:04,460 --> 00:07:05,700 Pravděpodobně segfault. 153 00:07:05,700 --> 00:07:07,970 Možná ne, ale asi segfault. 154 00:07:07,970 --> 00:07:10,620 A já říkám, možná ne, protože někdy vy, někdy 155 00:07:10,620 --> 00:07:11,380 nemusíte dostat segfault. 156 00:07:11,380 --> 00:07:14,280 Někdy prostě štěstí, ale to však bude 157 00:07:14,280 --> 00:07:15,340 chyba v našem programu. 158 00:07:15,340 --> 00:07:17,060 >> Tak mě nech jít do toho a sestavit to. 159 00:07:17,060 --> 00:07:18,280 Chystám se to udělat ze staré školy způsobem. 160 00:07:18,280 --> 00:07:23,825 Takže zvonění pomlčka 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Jejda, příliš staré školy. 162 00:07:24,720 --> 00:07:26,550 Pojďme se podívat. 163 00:07:26,550 --> 00:07:28,440 Kde jsem jít? 164 00:07:28,440 --> 00:07:29,700 Oh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, děkuji - 167 00:07:35,130 --> 00:07:36,930 Uložit, OK - 168 00:07:36,930 --> 00:07:37,690 velmi stará škola. 169 00:07:37,690 --> 00:07:38,900 Dobře, je to už nějaký čas. 170 00:07:38,900 --> 00:07:41,720 >> Tak jsem právě uložili soubor po by to dočasné 171 00:07:41,720 --> 00:07:42,700 změnit před chvílí. 172 00:07:42,700 --> 00:07:46,090 A teď jsem si ji pořídil ručně Clang. 173 00:07:46,090 --> 00:07:49,500 A teď budu pokračovat a spusťte scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String prosím. 175 00:07:50,290 --> 00:07:51,600 Budu psát v "ahoj". 176 00:07:51,600 --> 00:07:54,070 >> A teď, právě tady, upřímně řečeno, printf Můžete je trochu nepříjemné. 177 00:07:54,070 --> 00:07:56,020 Není to vlastně bude segfault v tomto případě. 178 00:07:56,020 --> 00:07:59,860 Printf je trochu zvláštní, protože je to tak super, že běžně používané 179 00:07:59,860 --> 00:08:03,570 printf podstatě dělá nám laskavost a realizace, 180 00:08:03,570 --> 00:08:04,830 že to není platný ukazatel. 181 00:08:04,830 --> 00:08:09,080 Dovolte mi, abych to na sebe jen vytisknout v závorkách null, a to i 182 00:08:09,080 --> 00:08:13,340 i když to není nutně to, co jsme sami očekávali. 183 00:08:13,340 --> 00:08:16,940 >> Tak jsme si to moc jednoduše vyvolat segfault s tím, ale je jasné, toto 184 00:08:16,940 --> 00:08:18,600 není chování jsem chtěl. 185 00:08:18,600 --> 00:08:19,800 Takže to, co je jednoduché řešení? 186 00:08:19,800 --> 00:08:25,650 No, scanf-2, dovolte mi navrhnout, aby místo vlastně jen přidělování 187 00:08:25,650 --> 00:08:30,100 char *, nech mě být trochu chytřejší to, a dovolte mi, abych přidělit vyrovnávací paměť 188 00:08:30,100 --> 00:08:32,940 jako posloupnost 16 znaků. 189 00:08:32,940 --> 00:08:34,200 >> Tak jsem si to v několika směrech. 190 00:08:34,200 --> 00:08:35,610 Mohl bych absolutně použít malloc. 191 00:08:35,610 --> 00:08:38,980 Ale můžu vrátit do týdne dvou, kdy Jen jsem potřeboval spoustu 192 00:08:38,980 --> 00:08:39,620 znaků. 193 00:08:39,620 --> 00:08:40,860 Je to jen pole. 194 00:08:40,860 --> 00:08:44,870 Takže dovolte mi, abych místo předefinovat vyrovnávací paměti se pole 16 znaků. 195 00:08:44,870 --> 00:08:47,340 >> A teď, když jsem se projít buffer - 196 00:08:47,340 --> 00:08:49,940 a to je něco, co my ne mluvit v týdnu dvě - 197 00:08:49,940 --> 00:08:53,730 ale můžete léčit matici jako když je to adresa. 198 00:08:53,730 --> 00:08:56,390 Technicky vzato, jak jsme viděli, jsou trochu jinak. 199 00:08:56,390 --> 00:09:01,290 Ale scanf nebude vadit, když si ji přenést název pole, protože to, co 200 00:09:01,290 --> 00:09:05,030 Zvonění udělá pro nás je v podstatě léčbě název tohoto pole jako 201 00:09:05,030 --> 00:09:08,280 adresa bloku 16 bajtů. 202 00:09:08,280 --> 00:09:09,550 >> Tak to je lepší. 203 00:09:09,550 --> 00:09:12,110 To znamená, že nyní mohu snad proveďte následující kroky. 204 00:09:12,110 --> 00:09:16,800 Dovolte mi, abych se vzdálíte na chvíli dělat, aby scanf-2, zkompilovaný OK. 205 00:09:16,800 --> 00:09:19,390 Nyní mi dovolte se dostal lomítko scanf-2. 206 00:09:19,390 --> 00:09:22,430 String prosím. "Dobrý den." A Zdálo se, že tentokrát nevyšla. 207 00:09:22,430 --> 00:09:26,020 >> Ale může někdo navrhnout scénář , ve kterém se nemusí ještě fungovat? 208 00:09:26,020 --> 00:09:28,550 Jo? 209 00:09:28,550 --> 00:09:30,640 Něco delší než 16 znaků. 210 00:09:30,640 --> 00:09:32,020 A skutečně, můžeme být trochu přesnější. 211 00:09:32,020 --> 00:09:36,540 Něco delší než 15 znaků, protože ve skutečnosti musíme mít na paměti, 212 00:09:36,540 --> 00:09:39,920 že musíme, že zpětné lomítko nula implicitně na konci řetězce, 213 00:09:39,920 --> 00:09:42,950 který je stranou scanf, typicky postarat se o pro nás. 214 00:09:42,950 --> 00:09:46,210 >> Takže dovolte mi, abych něco takového - 215 00:09:46,210 --> 00:09:48,040 Někdy se můžeme jen nechat to takhle. 216 00:09:48,040 --> 00:09:50,630 OK, takže jsme teď vyvolané naše segmentace chyba. 217 00:09:50,630 --> 00:09:51,000 Proč? 218 00:09:51,000 --> 00:09:54,940 Protože jsem napsal více než 15 postavy, a tak máme vlastně 219 00:09:54,940 --> 00:09:58,280 dotkl vzpomínka, že jsem vlastně neměl. 220 00:09:58,280 --> 00:10:00,180 >> Takže to, co je opravdu řešení tady? 221 00:10:00,180 --> 00:10:02,210 No, co když budeme potřebovat delší řetězec? 222 00:10:02,210 --> 00:10:03,960 No, možná, aby to 32 bajtů. 223 00:10:03,960 --> 00:10:05,160 No, a co když to není dost dlouho? 224 00:10:05,160 --> 00:10:06,040 Jak se o 64 bytů? 225 00:10:06,040 --> 00:10:07,080 Co když to není dost dlouho? 226 00:10:07,080 --> 00:10:09,640 Jak asi 128 nebo 200 bajtů? 227 00:10:09,640 --> 00:10:12,660 Co je opravdu řešení zde obecný případ, pokud nebudeme vědět, 228 00:10:12,660 --> 00:10:14,460 předem, co uživatel bude psát? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Je to jen trochu velké osina v zadku, Abych byl upřímný, což je důvod, proč 231 00:10:23,050 --> 00:10:29,050 CS50 knihovna má několik desítek řádků kód, který společně realizovat 232 00:10:29,050 --> 00:10:32,390 GetString řetězec tak, že nemáme vědět předem, co 233 00:10:32,390 --> 00:10:33,430 uživatel bude psát. 234 00:10:33,430 --> 00:10:37,370 Zejména, když se podíváte zpátky na cs50.c před dvěma týdny, uvidíte 235 00:10:37,370 --> 00:10:40,480 že GetString vlastně dělá nelze použít scanf tímto způsobem. 236 00:10:40,480 --> 00:10:43,720 Spíše to přečte jeden znak najednou. 237 00:10:43,720 --> 00:10:46,010 >> Protože jedna pěkná věc, o čtení jednoho znaku je můžeme 238 00:10:46,010 --> 00:10:48,490 zajistit, abychom se vždy mít alespoň jeden char. 239 00:10:48,490 --> 00:10:51,740 Mohu jen prohlásit char, a pak se Tyto skutečně krůčky k právě 240 00:10:51,740 --> 00:10:54,380 číst jeden znak na čas z klávesnice. 241 00:10:54,380 --> 00:10:58,240 A potom, co uvidíte GetString dělá, je pokaždé, když se vyčerpá, 242 00:10:58,240 --> 00:11:02,280 řekněme, 16 bajtů paměti, používá malloc nebo bratranec, po němž 243 00:11:02,280 --> 00:11:06,810 alokovat více paměti, kopírování starý paměti do nového, a pak plazil 244 00:11:06,810 --> 00:11:09,900 spolu, jak jeden znak v době, a když se spustí z toho 245 00:11:09,900 --> 00:11:13,370 kus paměti, hodí ho, drapáky větší kus paměti, kopíruje starý 246 00:11:13,370 --> 00:11:14,750 do nových a opakování. 247 00:11:14,750 --> 00:11:18,480 A je to opravdu bolest skutečně implementovat něco tak jednoduchého jako 248 00:11:18,480 --> 00:11:19,710 jak vstup od uživatele. 249 00:11:19,710 --> 00:11:21,090 >> Takže můžete použít scanf. 250 00:11:21,090 --> 00:11:22,430 Můžete použít i jiné podobné funkce. 251 00:11:22,430 --> 00:11:25,420 A spousta učebnic a on-line Příklady dělat, ale všichni jsou 252 00:11:25,420 --> 00:11:27,210 náchylné k problémům, jako je tento. 253 00:11:27,210 --> 00:11:29,550 A nakonec, jak se segfault je docela otravné. 254 00:11:29,550 --> 00:11:30,680 Není to dobré pro uživatele. 255 00:11:30,680 --> 00:11:33,560 >> Ale v nejhorším případě, co dělá je zásadně dát svůj 256 00:11:33,560 --> 00:11:37,160 kód hrozí? 257 00:11:37,160 --> 00:11:39,250 Nějaký druh útoku, potenciálně. 258 00:11:39,250 --> 00:11:41,680 Mluvili jsme o jednom takovém útoku - přetékání stack. 259 00:11:41,680 --> 00:11:44,660 Ale obecně, pokud máte povoleno přetečení vyrovnávací paměti, jako my 260 00:11:44,660 --> 00:11:48,070 Před pár týdny se jen psaní více než "ahoj" na zásobníku, budete 261 00:11:48,070 --> 00:11:52,330 může skutečně převzít, případně, počítače, nebo alespoň se na údaje, které 262 00:11:52,330 --> 00:11:53,510 nepatří k vám. 263 00:11:53,510 --> 00:11:55,970 >> Takže ve zkratce, to je důvod, proč jsme těchto koleček. 264 00:11:55,970 --> 00:11:59,090 Ale teď, začneme si je sundat, jak naše programy již nepotřebujete, 265 00:11:59,090 --> 00:12:00,610 nutně, vstup od uživatele. 266 00:12:00,610 --> 00:12:03,960 Ale v případě problému nastavit šest, váš vstup bude pocházet z velké 267 00:12:03,960 --> 00:12:07,520 slovník soubor s některými 150 liché tisíc slov. 268 00:12:07,520 --> 00:12:10,330 >> Takže nebudete muset starat o uživatele libovolný vstup. 269 00:12:10,330 --> 00:12:13,720 Dáme vám některé předpoklady o tomto souboru. 270 00:12:13,720 --> 00:12:20,340 Jakékoliv dotazy týkající se ukazatelů nebo scanf nebo vstup uživatele obecně? 271 00:12:20,340 --> 00:12:24,450 >> Dobře, takže rychlý pohled a pak na jednom koncové téma před dvěma týdny. 272 00:12:24,450 --> 00:12:28,590 A to byl tento pojem z struct. 273 00:12:28,590 --> 00:12:34,180 Ne, že by - tato představa struct, což bylo to, co? 274 00:12:34,180 --> 00:12:35,430 Co struct udělat pro nás? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definovat - 277 00:12:39,860 --> 00:12:41,710 Cože? 278 00:12:41,710 --> 00:12:42,820 Definujte typ proměnné. 279 00:12:42,820 --> 00:12:44,410 Tak nějak. 280 00:12:44,410 --> 00:12:46,180 Jsme vlastně kombinací dvou témat. 281 00:12:46,180 --> 00:12:49,510 Takže s typedef, můžeme připomenout, že deklarovat typ vlastní, stejně jako 282 00:12:49,510 --> 00:12:51,500 synonymum jako řetězec pro char *. 283 00:12:51,500 --> 00:12:56,200 Ale s použitím typedef struct a můžeme vytvořit skutečně vlastních datových struktur. 284 00:12:56,200 --> 00:12:59,600 >> Například, když jsem se vrátit do gedit Zde jen na chvíli, a já jdu do toho 285 00:12:59,600 --> 00:13:08,230 a udělat něco jako, dovolte mi, abych ušetřit to jako, řekněme, structs.c 286 00:13:08,230 --> 00:13:10,840 dočasně, já jsem prostě jít jít dopředu a patří 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main neplatné. 288 00:13:14,360 --> 00:13:18,960 A pak tady, předpokládám, že chci napsat program, který ukládá 289 00:13:18,960 --> 00:13:21,840 více studentů z více domy, například. 290 00:13:21,840 --> 00:13:24,430 Je to jako registrarial databáze nějakého druhu. 291 00:13:24,430 --> 00:13:29,550 >> Takže když budu potřebovat název jednoho studenta, jsem mohl udělat něco jako char * jméno, 292 00:13:29,550 --> 00:13:31,570 a já udělám něco jako - 293 00:13:31,570 --> 00:13:34,410 skutečnosti, využijme CS50 knihovnu jen na chvíli, aby se tento 294 00:13:34,410 --> 00:13:38,380 trochu jednodušší, takže můžeme půjčit ty desítky řádků kódu. 295 00:13:38,380 --> 00:13:39,340 A řekněme, aby to jednoduché. 296 00:13:39,340 --> 00:13:42,610 Budeme to řetězec, a teď GetString. 297 00:13:42,610 --> 00:13:47,420 >> Takže tvrdím, teď, když jsem uložené jméno nějakého studenta, a dům 298 00:13:47,420 --> 00:13:50,240 nějaký student, jednoduše pomocí proměnných jako my av prvním týdnu. 299 00:13:50,240 --> 00:13:52,370 Ale předpokládejme, že bych chtěl, aby podporovaly více studentů. 300 00:13:52,370 --> 00:13:58,460 Dobře, takže moje instinkty jsou k tomu string name2 dostane GetString, řetězec 301 00:13:58,460 --> 00:14:01,370 house2 dostane GetString. 302 00:14:01,370 --> 00:14:05,850 A pak naše třetí student, pojďme jméno3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Dobře, takže je to snad zarážející, vy jako druh hloupý, 304 00:14:09,170 --> 00:14:11,580 protože tento proces je ve skutečnosti nikdy skončí, a je to jen tak 305 00:14:11,580 --> 00:14:13,130 aby můj kód vypadat hůř a horší a horší. 306 00:14:13,130 --> 00:14:14,810 Ale řešili jsme to taky v týdnu dva. 307 00:14:14,810 --> 00:14:19,450 Jaké bylo naše relativně čisté řešení když jsme měli více proměnných 308 00:14:19,450 --> 00:14:23,580 stejného typu dat, které se všechny týkají, ale Nechtěli jsme to úděsný nepořádek 309 00:14:23,580 --> 00:14:26,870 podobně pojmenovaných proměnných? 310 00:14:26,870 --> 00:14:30,060 Co jsme udělali místo? 311 00:14:30,060 --> 00:14:31,260 >> Takže myslím, že jsem slyšel několik míst. 312 00:14:31,260 --> 00:14:32,590 Měli jsme celou řadu. 313 00:14:32,590 --> 00:14:37,110 Chcete-li více instancí něco, co kdybychom to všechno vyčistit 314 00:14:37,110 --> 00:14:39,540 a jen říct, dej mi Pole s názvem jména? 315 00:14:39,540 --> 00:14:41,640 >> A teď pojďme pevný kód 3. 316 00:14:41,640 --> 00:14:44,450 A pak mi dej ještě řadu volal domů, a dovolte mi, abych na 317 00:14:44,450 --> 00:14:45,800 nyní těžko kód 3. 318 00:14:45,800 --> 00:14:49,220 A já jsem masivně uklidila nepořádek, který jsem právě vytvořili. 319 00:14:49,220 --> 00:14:52,400 Teď jsem stále pevně zakódovány 3, ale i 3 může dynamicky pocházejí z 320 00:14:52,400 --> 00:14:54,350 Uživatel nebo argv, nebo podobně. 321 00:14:54,350 --> 00:14:55,720 Tak to už je čistší. 322 00:14:55,720 --> 00:15:00,100 >> Ale co to nepříjemné na tom je, že Nyní, i když název je jaksi 323 00:15:00,100 --> 00:15:02,280 zásadně spojena s studenta dům - 324 00:15:02,280 --> 00:15:04,720 je to student, který opravdu chtějí reprezentovat - 325 00:15:04,720 --> 00:15:08,080 Nyní mám dvě pole, která jsou rovnoběžné v tom smyslu, že jsou 326 00:15:08,080 --> 00:15:13,930 stejné velikosti a jména držák 0 Pravděpodobně se mapuje na domy držáku 0, 327 00:15:13,930 --> 00:15:16,600 a jména držák 1 mapy domů na držák 1. 328 00:15:16,600 --> 00:15:19,280 Jinými slovy, že studentské žije v ten dům, a že ostatní studenti 329 00:15:19,280 --> 00:15:20,530 žije v tomto druhém domě. 330 00:15:20,530 --> 00:15:23,720 Ale určitě by to mohlo být udělal ještě čistěji. 331 00:15:23,720 --> 00:15:24,990 >> No, je to možné, ve skutečnosti. 332 00:15:24,990 --> 00:15:28,730 A nech mě jít dopředu a otevřete nahoru structs.h, a budete 333 00:15:28,730 --> 00:15:31,130 viz tento nápad zde. 334 00:15:31,130 --> 00:15:34,905 Všimněte si, že jsem použil typedef, jak jste zmínil před chvílí na prohlašujeme, že náš 335 00:15:34,905 --> 00:15:35,570 vlastní datový typ. 336 00:15:35,570 --> 00:15:39,660 Ale já jsem vždy používal tuhle jiné klíčové slovo tzv. struct, který mi dává nový 337 00:15:39,660 --> 00:15:40,790 datové struktury. 338 00:15:40,790 --> 00:15:43,980 >> A to datová struktura Tvrdím se děje mít dvě věci uvnitř 339 00:15:43,980 --> 00:15:47,060 to - řetězec s názvem jméno a řetězec s názvem dům. 340 00:15:47,060 --> 00:15:49,820 A jméno jdu dát Tato datová struktura bude 341 00:15:49,820 --> 00:15:51,005 být nazýván studentem. 342 00:15:51,005 --> 00:15:54,030 Mohl bych říkat, co chci, ale sémanticky, aby 343 00:15:54,030 --> 00:15:55,810 smysl pro mě, v mé mysli. 344 00:15:55,810 --> 00:15:59,160 >> Takže teď, když otevřu lepší verzi programu jsem začal psát 345 00:15:59,160 --> 00:16:00,390 tam, dovolte mi přejít na začátek. 346 00:16:00,390 --> 00:16:03,190 A je tu několik dalších řádků kódu zde, ale dovolte mi zaměřit se na 347 00:16:03,190 --> 00:16:04,160 v okamžiku, kdy na jednoho. 348 00:16:04,160 --> 00:16:07,790 Já jsem prohlásil, konstantní zvané studenty a pevně zakódovány 3 nyní. 349 00:16:07,790 --> 00:16:11,110 Ale teď, všimněte si, jak čisté můj kód začíná dostat. 350 00:16:11,110 --> 00:16:15,030 >> V souladu 22 Prohlašuji, Řada studentů. 351 00:16:15,030 --> 00:16:18,760 A zjistíte, že žák je zřejmě nyní datový typ. 352 00:16:18,760 --> 00:16:23,360 Vzhledem k tomu, v horní části tohoto souboru, oznámení Uvedl jsem, že hlavičkový soubor 353 00:16:23,360 --> 00:16:24,820 že jsem vytáhl před chvílí. 354 00:16:24,820 --> 00:16:28,820 A že hlavičkový soubor prostě musel tato definice studenta. 355 00:16:28,820 --> 00:16:32,470 >> Takže teď jsem vytvořil své vlastní údaje Typ že autoři let C 356 00:16:32,470 --> 00:16:33,890 Před nemyslel předem. 357 00:16:33,890 --> 00:16:34,570 Ale žádný problém. 358 00:16:34,570 --> 00:16:35,870 Mohu to udělat sám. 359 00:16:35,870 --> 00:16:39,050 Tak tohle je pole s názvem studenti, každý, jehož členové 360 00:16:39,050 --> 00:16:41,100 je student strukturu. 361 00:16:41,100 --> 00:16:44,270 A chci, aby tři z nich v poli. 362 00:16:44,270 --> 00:16:46,030 >> A teď, co dělá zbytek tohoto programu dělat? 363 00:16:46,030 --> 00:16:47,550 Potřeboval jsem něco trochu svévolné. 364 00:16:47,550 --> 00:16:51,450 Takže z on-line 24 kupředu, I iterovat od 0 do 3. 365 00:16:51,450 --> 00:16:54,000 Pak jsem se dotáže uživatele jméno studenta. 366 00:16:54,000 --> 00:16:56,110 A pak jsem použít getString jako předtím. 367 00:16:56,110 --> 00:16:59,410 Pak jsem požádat o studenta domu, a používám getString jako předtím. 368 00:16:59,410 --> 00:17:01,780 >> Ale Oznámení zadávacího řízení - relativně nový kus syntaxe - 369 00:17:01,780 --> 00:17:07,010 Pořád indexu i-tého studenta, ale jak to mám dostat na konkrétních údajů 370 00:17:07,010 --> 00:17:08,354 pole uvnitř struct? 371 00:17:08,354 --> 00:17:11,770 No, co je zřejmě nový kus syntaxe? 372 00:17:11,770 --> 00:17:13,339 Je to jen operátor tečky. 373 00:17:13,339 --> 00:17:14,510 >> Jsme opravdu viděli předtím. 374 00:17:14,510 --> 00:17:17,819 Viděli jste to v Pset pět, pokud jste skočil již s bitmapovými soubory. 375 00:17:17,819 --> 00:17:22,372 Ale tečka znamená jen uvnitř tohoto struct nebo více polí, dát tečku 376 00:17:22,372 --> 00:17:24,510 název, nebo mi dot dům. 377 00:17:24,510 --> 00:17:28,690 To znamená jít dovnitř na struct a dostat ty konkrétní oblasti. 378 00:17:28,690 --> 00:17:30,200 >> Co zbytek tohoto programu dělat? 379 00:17:30,200 --> 00:17:31,190 To není všechno, sexy. 380 00:17:31,190 --> 00:17:34,640 Všimněte si, že jsem přecházet od 0 do 3 znovu, a já jsem jednoduše vytvořit English 381 00:17:34,640 --> 00:17:40,500 fráze jako tak, a tak je v takové a takový dům, předáním dot název od 382 00:17:40,500 --> 00:17:43,320 i-tý student a jejich dům také. 383 00:17:43,320 --> 00:17:47,560 >> A pak konečně, teď začneme dostat anální o tom, teď, když jsme 384 00:17:47,560 --> 00:17:49,580 obeznámeni s tím, co malloc a další funkce byly 385 00:17:49,580 --> 00:17:50,570 dělal celou tu dobu. 386 00:17:50,570 --> 00:17:54,220 Proč musím osvobodit i jméno a dům, i když jsem 387 00:17:54,220 --> 00:17:56,960 nevolal malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString udělal. 389 00:17:58,020 --> 00:18:00,930 A to bylo malé špinavé tajemství pro několik týdnů, ale má GetString 390 00:18:00,930 --> 00:18:03,530 byl únik paměti v celé umístit všechny semestr tak daleko. 391 00:18:03,530 --> 00:18:05,990 A konečně valgrand ukazují nám to. 392 00:18:05,990 --> 00:18:10,730 >> Ale není to velký problém, protože vím, že mohu jednoduše uvolnit jméno 393 00:18:10,730 --> 00:18:15,750 a dům, i když technicky, aby je super, super bezpečný, měl bych být 394 00:18:15,750 --> 00:18:17,890 dělat nějaké kontroly chyb zde. 395 00:18:17,890 --> 00:18:19,040 Jaké jsou vaše instinkty ti? 396 00:18:19,040 --> 00:18:22,480 Co bych měl být kontrola než jsem se uvolnit, co je 397 00:18:22,480 --> 00:18:25,470 řetězec, který aka char *? 398 00:18:25,470 --> 00:18:33,460 >> Měl jsem opravdu kontrolovat, zda studenti držák i tečka název není 399 00:18:33,460 --> 00:18:34,840 rovna null. 400 00:18:34,840 --> 00:18:40,400 Pak to bude v pořádku jít dopředu a zdarma že ukazatel, a stejné nebo jiné 401 00:18:40,400 --> 00:18:41,160 také jedním z nich. 402 00:18:41,160 --> 00:18:46,860 Pokud studenti držák i tečka dům není roven null, teď bude chránit 403 00:18:46,860 --> 00:18:52,520 o roh případu, ve kterém GetString vrátí něco jako null. 404 00:18:52,520 --> 00:18:57,310 A my jsme viděli před chvílí, printf bude chránit nás tady jen říkám, 405 00:18:57,310 --> 00:18:58,990 null, která bude vypadat divně. 406 00:18:58,990 --> 00:19:02,340 Ale aspoň to nebude segfault, jak jsme viděli. 407 00:19:02,340 --> 00:19:05,990 >> No, dovolte mi udělat jednu věc zde. struct-0 je trochu hloupé programu 408 00:19:05,990 --> 00:19:09,700 protože jsem zadat všechny tyto údaje, a pak je to jednou ztratil program končí. 409 00:19:09,700 --> 00:19:10,940 Ale nechte mě jít dál a dělat to. 410 00:19:10,940 --> 00:19:12,830 Dovolte mi, abych terminálu Okno trochu větší. 411 00:19:12,830 --> 00:19:17,000 Dovolte mi, abych Struktury-1, což je nová verze tohoto. 412 00:19:17,000 --> 00:19:18,520 >> Budu přiblížit trochu. 413 00:19:18,520 --> 00:19:21,620 A teď mi dovolte běžet tečku lomítko struct-1. 414 00:19:21,620 --> 00:19:22,590 Jméno studenta - 415 00:19:22,590 --> 00:19:31,500 David Mather, pojďme dělat Rob Kirkland, pojďme Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Co je zajímavější je nyní Oznámení zadávacího řízení - 417 00:19:33,650 --> 00:19:35,540 a já jen vím to, protože Napsal jsem program - 418 00:19:35,540 --> 00:19:38,930 existuje soubor se na můj současný adresář s názvem students.csv. 419 00:19:38,930 --> 00:19:40,420 Někteří z vás mohli vidět nich v reálném světě. 420 00:19:40,420 --> 00:19:42,980 >> Co je to CSV souboru? 421 00:19:42,980 --> 00:19:44,170 Hodnot oddělených čárkou. 422 00:19:44,170 --> 00:19:46,670 Je to něco jako chudý člověk je Verze souboru aplikace Excel. 423 00:19:46,670 --> 00:19:50,580 Je to tabulka řádků a sloupců, které můžete otevřít v programu, jako je Excel, 424 00:19:50,580 --> 00:19:51,800 nebo čísla v počítači Mac. 425 00:19:51,800 --> 00:19:55,180 >> A když otevřu tento soubor zde na gedit, Oznámení zadávacího řízení - a čísla tam nejsou. 426 00:19:55,180 --> 00:19:57,360 To je jen gedit vyprávění mi čísla řádků. 427 00:19:57,360 --> 00:19:59,740 Všimněte si na prvním řádku tohoto Soubor je David a Mather. 428 00:19:59,740 --> 00:20:01,450 Další řádek je Rob čárka Kirkland. 429 00:20:01,450 --> 00:20:04,170 A třetí řádek je Lauren čárka Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Takže to, co jsem vytvořil? 431 00:20:05,480 --> 00:20:09,580 Já jsem teď napsal program v C, který účinně mohou vytvářet tabulky 432 00:20:09,580 --> 00:20:11,840 který lze otevřít v program, jako je Excel. 433 00:20:11,840 --> 00:20:15,520 Ne vše, co přesvědčivý soubor dat, ale Pokud máte mnohem větší kusy 434 00:20:15,520 --> 00:20:18,440 údaje, které jste skutečně chcete manipulovat a dělat grafy a 435 00:20:18,440 --> 00:20:21,260 jako, to je asi jedna způsob, jak vytvořit tato data. 436 00:20:21,260 --> 00:20:25,370 Navíc, CSVŠ jsou skutečně výborný společné jen pro ukládání dat jednoduchých - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, například, pokud se dostanete ceny akcií prostřednictvím svých tzv. 438 00:20:28,940 --> 00:20:33,180 API, bezplatná služba, která vám umožní získat aktuální up-to-aktuální zásoby 439 00:20:33,180 --> 00:20:35,650 citace pro podniky, které aby údaje v roce 440 00:20:35,650 --> 00:20:37,800 Super jednoduchý formát CSV. 441 00:20:37,800 --> 00:20:39,380 >> Tak jak to uděláme? 442 00:20:39,380 --> 00:20:42,530 No nevšiml, většina z tohoto programu je téměř stejný. 443 00:20:42,530 --> 00:20:46,870 Povšimněme si ale tady dole, spíše než tisk Studenti ven, na lince 35 444 00:20:46,870 --> 00:20:51,040 kupředu, tvrdím, že šetřím studenti na disk, takže ukládání souboru. 445 00:20:51,040 --> 00:20:53,630 >> Tak zjistíte jsem prohlásil soubor * - 446 00:20:53,630 --> 00:20:57,260 Nyní, to je druh anomálie v C. Z nějakého důvodu je soubor všech čepice, 447 00:20:57,260 --> 00:21:00,690 který není jako většina ostatních typů dat v C. Ale to je vestavěný 448 00:21:00,690 --> 00:21:02,320 datový typ, FILE *. 449 00:21:02,320 --> 00:21:05,900 A já deklarovat ukazatel na soubor, je to, jak si můžete myslet, že. 450 00:21:05,900 --> 00:21:08,070 >> fopen znamená otevřený soubor. 451 00:21:08,070 --> 00:21:09,470 Jaky soubor, který chcete otevřít? 452 00:21:09,470 --> 00:21:12,620 Chci otevřít soubor, který budu libovolně volat students.csv. 453 00:21:12,620 --> 00:21:14,480 Bych mohl zavolat, že něco chci. 454 00:21:14,480 --> 00:21:15,200 >> A pak se hádat. 455 00:21:15,200 --> 00:21:18,960 Co druhý argument na fopen asi znamená? 456 00:21:18,960 --> 00:21:21,480 Jasně, w pro zápis, by být r pro čtení. 457 00:21:21,480 --> 00:21:24,120 Je tu pro append, pokud Chcete přidat řádky a ne 458 00:21:24,120 --> 00:21:25,200 přepsat celou věc. 459 00:21:25,200 --> 00:21:28,005 >> Ale já jen chci, aby tento soubor vytvořit jednou, takže budu používat citační konec citátu w. 460 00:21:28,005 --> 00:21:31,880 A vím, že jen z přečtení dokumentace, nebo manuálové stránky. 461 00:21:31,880 --> 00:21:35,100 Pokud soubor není null - jinými slovy, pokud se nic nepovedlo se - 462 00:21:35,100 --> 00:21:37,820 dovolte mi, abych iteraci Studenti 0-3. 463 00:21:37,820 --> 00:21:40,410 >> A teď zjistíte, že je něco někdy tak trochu jinak 464 00:21:40,410 --> 00:21:42,110 o linka 41 zde. 465 00:21:42,110 --> 00:21:42,960 Není to printf. 466 00:21:42,960 --> 00:21:46,530 Je to fprintf pro soubor printf. 467 00:21:46,530 --> 00:21:47,790 Takže to bude zapisovat do souboru. 468 00:21:47,790 --> 00:21:48,860 Který soubor? 469 00:21:48,860 --> 00:21:53,630 , Jejíž ukazatel zadáte jako první argument. 470 00:21:53,630 --> 00:21:55,940 >> Pak jsme se určit formátovací řetězec. 471 00:21:55,940 --> 00:21:59,660 Pak jsme se určit, jaký řetězec chceme připojit na první procent s, a 472 00:21:59,660 --> 00:22:04,320 pak další proměnná nebo druhý procent s. 473 00:22:04,320 --> 00:22:06,760 Pak jsme zavřete soubor s fclose. 474 00:22:06,760 --> 00:22:09,380 Pak jsem uvolnit paměť jako dříve, i když Bych se měl vrátit a přidat 475 00:22:09,380 --> 00:22:10,540 Některé kontroly na NULL. 476 00:22:10,540 --> 00:22:12,090 >> A je to. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose mi dává schopnost vytvářet textové soubory. 478 00:22:16,960 --> 00:22:19,640 Nyní uvidíte v problému pět set, která zahrnuje obrazy, budete používat 479 00:22:19,640 --> 00:22:20,990 binární soubory místo. 480 00:22:20,990 --> 00:22:24,200 Ale podstatnější je, že myšlenka je stejná, i když funkce, budete 481 00:22:24,200 --> 00:22:28,710 jsou vidět trochu jinak. 482 00:22:28,710 --> 00:22:32,580 >> Takže vichřice turné, ale budete mít příliš obeznámeni se souborem I/O-- 483 00:22:32,580 --> 00:22:34,960 vstup a výstup - s Pset pět. 484 00:22:34,960 --> 00:22:38,607 A případné otázky počáteční základy tady? 485 00:22:38,607 --> 00:22:39,857 Jo? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Co když se pokusíte uvolnit nulovou hodnotu? 488 00:22:43,710 --> 00:22:48,880 Věřím, že pokud se dostal zdarma trochu více uživatelsky přívětivé, můžete 489 00:22:48,880 --> 00:22:49,890 potenciálně segfault. 490 00:22:49,890 --> 00:22:54,160 Absolvování je null, je špatné, protože já ne věří zdarma obtěžuje zkontrolovat, pro vás, 491 00:22:54,160 --> 00:22:57,330 , protože by mohly být považovány za odpady času na to udělat sám pro 492 00:22:57,330 --> 00:22:59,022 všichni na světě. 493 00:22:59,022 --> 00:23:00,590 Dobrá otázka, ačkoli. 494 00:23:00,590 --> 00:23:04,300 >> Dobře, takže tento druh dostane nám zajímavé téma. 495 00:23:04,300 --> 00:23:07,010 Téma problémového souboru pět je forenzní. 496 00:23:07,010 --> 00:23:08,420 Alespoň to je část z problémového souboru. 497 00:23:08,420 --> 00:23:12,030 Forenzní obecně se odkazuje na využití informací, které mohou nebo 498 00:23:12,030 --> 00:23:14,110 nesmí byly odstraněny záměrně. 499 00:23:14,110 --> 00:23:18,680 A tak mě napadlo, že vám rychle chuť toho, co se skutečně děje na všech 500 00:23:18,680 --> 00:23:21,230 tentokrát pod kapuce počítače. 501 00:23:21,230 --> 00:23:23,960 >> Například, pokud máte uvnitř vašeho notebook nebo stolní počítač, 502 00:23:23,960 --> 00:23:28,040 pevný disk, je to buď mechanické zařízení, které vlastně točí - 503 00:23:28,040 --> 00:23:31,650 je tu kruhové věci zvané mísy které vypadají docela líbí, co jsem 504 00:23:31,650 --> 00:23:34,540 jen měl na obrazovce zde, i když je to stále stará škola. 505 00:23:34,540 --> 00:23:37,370 Jedná se o tři a půl palce pevný disk. 506 00:23:37,370 --> 00:23:40,070 A tři a půl palce odkazuje na se té věci, když ji nainstalovat 507 00:23:40,070 --> 00:23:40,890 v počítači. 508 00:23:40,890 --> 00:23:44,890 >> Mnoho z vás ve vašich notebooků nyní mají polovodičové disky nebo SSD, 509 00:23:44,890 --> 00:23:46,260 které nemají žádné pohyblivé části. 510 00:23:46,260 --> 00:23:49,170 Jsou spíš jako RAM a méně jako tato mechanická zařízení. 511 00:23:49,170 --> 00:23:51,450 Ale myšlenky jsou stále stejné, jistě, které se vztahují 512 00:23:51,450 --> 00:23:52,790 na problém nastavit pět. 513 00:23:52,790 --> 00:23:57,400 >> A pokud si myslíte, že teď pevný disk představuje, že kruh, který 514 00:23:57,400 --> 00:23:58,930 Budu kreslit jako tohle. 515 00:23:58,930 --> 00:24:02,290 Když vytvoříte soubor v počítači, ať už je to SSD, nebo v 516 00:24:02,290 --> 00:24:06,610 V tomto případě, starší školní pevný disk, tento soubor obsahuje více bitů. 517 00:24:06,610 --> 00:24:10,510 Řekněme, že je to 0 a 1, celá parta 0s a 1s. 518 00:24:10,510 --> 00:24:11,660 Tak tohle je můj celý pevný disk. 519 00:24:11,660 --> 00:24:13,225 To je zřejmě docela velký soubor. 520 00:24:13,225 --> 00:24:18,080 A to je s použitím až 0s a 1s na to část fyzické talíři. 521 00:24:18,080 --> 00:24:19,750 >> No, co je to fyzická část? 522 00:24:19,750 --> 00:24:25,310 No, ukázalo se, že na pevném disku, alespoň z tohoto typu, že je 523 00:24:25,310 --> 00:24:27,340 Tyto malinké magnetických částic. 524 00:24:27,340 --> 00:24:32,630 A oni mají v zásadě na sever a jižní póly k nim, takže pokud 525 00:24:32,630 --> 00:24:35,710 zase jeden z těchto magnetických částic tímto způsobem, dalo by se říct, že je to 526 00:24:35,710 --> 00:24:36,720 představuje 1. 527 00:24:36,720 --> 00:24:39,340 A jestli je to vzhůru nohama na jih do sever, dalo by se říct, že je to 528 00:24:39,340 --> 00:24:40,390 představuje 0. 529 00:24:40,390 --> 00:24:43,660 >> Takže v reálném fyzickém světě, je to jak byste mohli představovat něco 530 00:24:43,660 --> 00:24:45,670 binární stav 0 a 1.. 531 00:24:45,670 --> 00:24:46,720 Tak to je vše, je soubor. 532 00:24:46,720 --> 00:24:49,300 Je tu celá parta magnetické částice, které jsou v jejich tímto způsobem, nebo 533 00:24:49,300 --> 00:24:51,920 Tímto způsobem se vytváří vzory na 0s a 1s. 534 00:24:51,920 --> 00:24:56,760 >> Ale to dopadá když soubor uložíte, některé informace je uložena odděleně. 535 00:24:56,760 --> 00:25:00,000 Takže to je stolek, adresář, abych tak řekl. 536 00:25:00,000 --> 00:25:05,810 A já budu nazývat název sloupce a Zavolám tomto sloupci umístění. 537 00:25:05,810 --> 00:25:08,850 >> A já řeknu, předpokládám, to je můj životopis. 538 00:25:08,850 --> 00:25:14,050 Můj resume.doc je uložen na umístění, řekněme 123. 539 00:25:14,050 --> 00:25:15,390 Vždycky jsem jít na toto číslo. 540 00:25:15,390 --> 00:25:18,810 Ale stačí říct, že stejně jako v paměti RAM, můžete si vzít pevný disk 541 00:25:18,810 --> 00:25:22,350 to je gigabyte nebo 200GB nebo terabyte a můžete 542 00:25:22,350 --> 00:25:23,750 počet všech bytů. 543 00:25:23,750 --> 00:25:26,480 Můžete očíslovat všechny kusy 8 bitů. 544 00:25:26,480 --> 00:25:29,030 >> Takže budeme říkat, že to 123 je umístění. 545 00:25:29,030 --> 00:25:32,070 Takže tento adresář uvnitř svého provozu Systém si pamatuje, že moje 546 00:25:32,070 --> 00:25:34,250 životopis je na místě 123 |. 547 00:25:34,250 --> 00:25:36,850 Ale to bude zajímavé, když Odstranění souboru. 548 00:25:36,850 --> 00:25:37,820 >> Tak například - 549 00:25:37,820 --> 00:25:40,790 a naštěstí, většina světa je chytil na to - co se stane, když 550 00:25:40,790 --> 00:25:45,040 můžete přetáhnout soubor do vašeho Mac OS koše nebo vaše Windows Koš? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Jaký je účel toho docílit? 553 00:25:50,510 --> 00:25:53,860 Je to samozřejmě, jak se zbavit souboru ale co akt přetažením 554 00:25:53,860 --> 00:25:57,550 pád do koše nebo se obraťte na Koš dělat na počítači? 555 00:25:57,550 --> 00:25:59,230 >> Absolutně nic, opravdu. 556 00:25:59,230 --> 00:26:00,320 Je to jen jako složky. 557 00:26:00,320 --> 00:26:01,800 Je to speciální složka, to je jisté. 558 00:26:01,800 --> 00:26:04,460 Ale to vlastně soubor smazat? 559 00:26:04,460 --> 00:26:06,780 >> No, ne, protože někteří z vás asi byli jako, oh sakra, ty ne 560 00:26:06,780 --> 00:26:07,420 neznamená to udělat. 561 00:26:07,420 --> 00:26:09,130 Takže dvakrát kliknete Koš nebo Koš. 562 00:26:09,130 --> 00:26:11,630 Jsi tropil kolem a vy jste zpět soubor pouhým přetažením 563 00:26:11,630 --> 00:26:12,110 odtamtud. 564 00:26:12,110 --> 00:26:14,420 Tak jasně, že to není nutně odstranění. 565 00:26:14,420 --> 00:26:15,990 >> OK, ty jsi chytřejší než to. 566 00:26:15,990 --> 00:26:18,860 Víte, že právě jeho přetažením do Koš nebo Koš, neznamená, 567 00:26:18,860 --> 00:26:19,930 jste vyprazdňování koše. 568 00:26:19,930 --> 00:26:24,110 Takže jdete do menu a říkáte Empty Trash nebo Vysypat koš. 569 00:26:24,110 --> 00:26:25,360 Poté, co se stane? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Jo, tak to je odstraněn víc. 572 00:26:32,530 --> 00:26:37,660 Ale všechno, co se děje, je to. 573 00:26:37,660 --> 00:26:45,350 Počítač zapomene, kde resume.doc bylo. 574 00:26:45,350 --> 00:26:47,400 >> Ale to, co se nezměnila zřejmě na obrázku? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Bity, 0s a 1s, že tvrdím, jsou na místě nějaké fyzické aspektu 577 00:26:55,570 --> 00:26:56,280 hardware. 578 00:26:56,280 --> 00:26:57,110 Jsou tam pořád. 579 00:26:57,110 --> 00:26:58,930 Je to jen má počítač zapomněl, co oni jsou. 580 00:26:58,930 --> 00:27:03,160 >> Takže je to v podstatě osvobodil souboru bitů tak, aby mohly být znovu použity. 581 00:27:03,160 --> 00:27:06,940 Ale ne, dokud vytvořit více souborů, a další soubory a další soubory 582 00:27:06,940 --> 00:27:12,150 pravděpodobnostně, které 0s a 1s, tyto magnetické částice, se znovu, 583 00:27:12,150 --> 00:27:16,220 vzhůru nebo pravé strany, aby pro další soubory, 0 a 1S. 584 00:27:16,220 --> 00:27:17,980 >> Takže máte toto okno času. 585 00:27:17,980 --> 00:27:19,860 A není to o předvídatelné délka, opravdu. 586 00:27:19,860 --> 00:27:22,240 Záleží na velikosti pevného pohon a kolik souborů, které máte a 587 00:27:22,240 --> 00:27:23,490 jak rychle si nové. 588 00:27:23,490 --> 00:27:27,050 Ale je to okno, během které tento soubor je stále dokonale 589 00:27:27,050 --> 00:27:27,770 nenahrazují. 590 00:27:27,770 --> 00:27:31,050 >> Takže pokud jste někdy použít programy jako McAfee nebo Norton zkusit obnovit 591 00:27:31,050 --> 00:27:35,680 údaje, všechny dělají se snaží obnovit tuto tzv. adresář 592 00:27:35,680 --> 00:27:37,340 zjistit, kde váš soubor je. 593 00:27:37,340 --> 00:27:40,605 A někdy Norton a budou říkat, soubor je 93% obnovitelná. 594 00:27:40,605 --> 00:27:42,020 No, co to znamená? 595 00:27:42,020 --> 00:27:45,690 To prostě znamená, že nějaký jiný soubor shodou okolností nakonec skončil, řekněme, 596 00:27:45,690 --> 00:27:48,920 ty kousky z vašeho původního souboru. 597 00:27:48,920 --> 00:27:51,950 >> Takže to, co je ve skutečnosti podílí na obnovu dat? 598 00:27:51,950 --> 00:27:55,720 No, pokud nemáte něco jako Norton pre-nainstalovány na vašem počítači, 599 00:27:55,720 --> 00:27:59,510 nejlepší, co můžete udělat, je dívat se někdy na celý pevný disk hledá 600 00:27:59,510 --> 00:28:00,510 vzory bitů. 601 00:28:00,510 --> 00:28:05,350 A jedním z témat problémového souboru pět je, že budete hledat 602 00:28:05,350 --> 00:28:09,570 ekvivalent pevného disku, forenzní Obraz Compact Flash kartu z 603 00:28:09,570 --> 00:28:13,660 digitální fotoaparát, hledá 0s a 1s, které obvykle s vysokou 604 00:28:13,660 --> 00:28:16,720 pravděpodobnost, představují začátek JPEG obraz. 605 00:28:16,720 --> 00:28:21,120 >> A vy můžete získat tyto snímky podle za předpokladu, když vidím tento model 606 00:28:21,120 --> 00:28:24,380 bitů na forenzní obraz s vysoká pravděpodobnost, že označí 607 00:28:24,380 --> 00:28:25,650 začátek ve formátu JPEG. 608 00:28:25,650 --> 00:28:29,520 A když vidím stejný vzorec znovu, které pravděpodobně počátkem 609 00:28:29,520 --> 00:28:32,440 další JPEG, a další JPEG a další JPEG. 610 00:28:32,440 --> 00:28:34,970 A obvykle je to jak obnova dat bude fungovat. 611 00:28:34,970 --> 00:28:37,870 Co je hezké o JPEG je i přesto, formát souboru je sám o sobě poněkud 612 00:28:37,870 --> 00:28:44,400 složité, počátek každé takové Soubor je vlastně docela identifikovatelný 613 00:28:44,400 --> 00:28:47,370 a jednoduché, jak uvidíte, pokud jste tak již neučinili. 614 00:28:47,370 --> 00:28:50,270 >> Takže pojďme se blíže podívat pod kapuce, aby se přesně to, co bylo 615 00:28:50,270 --> 00:28:53,360 děje, a co to 0s a 1s jsou, aby vám trochu více 616 00:28:53,360 --> 00:28:55,330 kontext pro tento konkrétní úkol. 617 00:28:55,330 --> 00:28:55,510 >> [PŘEHRÁVÁNÍ] 618 00:28:55,510 --> 00:28:58,700 >> -Kde je váš počítač ukládá většinu jeho trvalá data. 619 00:28:58,700 --> 00:29:03,390 K tomu, aby údaje cestuje z RAM spolu se softwarovými signály, které říkají, 620 00:29:03,390 --> 00:29:06,110 pevný disk, jak ukládat tato data. 621 00:29:06,110 --> 00:29:09,410 Na pevném disku obvody překládat tyto signály do napětí 622 00:29:09,410 --> 00:29:10,870 výkyvy. 623 00:29:10,870 --> 00:29:14,970 Tito, podle pořadí, kontrola pevného disku pohyblivé části, některé z mála 624 00:29:14,970 --> 00:29:17,910 pohyblivé části zůstaly v moderní výpočetní. 625 00:29:17,910 --> 00:29:22,130 >> Některé ze signálů ovládání motoru které se točí pokovená talíře. 626 00:29:22,130 --> 00:29:25,470 Vaše data jsou ve skutečnosti uložena na těchto mís. 627 00:29:25,470 --> 00:29:28,610 Ostatní signály přesunout čtení / zápis hlavy ke čtení nebo 628 00:29:28,610 --> 00:29:30,710 zapisovat data na plotnách. 629 00:29:30,710 --> 00:29:35,450 Toto zařízení tak přesné, že člověk vlasy by neprošel ani mezi 630 00:29:35,450 --> 00:29:37,280 hlavy a předení talíře. 631 00:29:37,280 --> 00:29:40,316 Přesto to všechno funguje v úžasné rychlosti. 632 00:29:40,316 --> 00:29:40,660 >> [END PŘEHRÁVÁNÍ] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: mírné přiblížení teď hlouběji na to, co je 634 00:29:42,190 --> 00:29:44,360 vlastně na těchto mís. 635 00:29:44,360 --> 00:29:44,720 >> [PŘEHRÁVÁNÍ] 636 00:29:44,720 --> 00:29:47,660 >> -Pojďme se podívat na to, co jsme právě viděl jako ve zpomaleném filmu. 637 00:29:47,660 --> 00:29:51,710 Když krátký elektrický impulz je zaslána čtecí / zapisovací hlavy, pokud proletí 638 00:29:51,710 --> 00:29:54,650 na malé elektromagnetické pro zlomek vteřiny. 639 00:29:54,650 --> 00:29:58,970 Magnet vytváří pole, které změní polarita malý, malý 640 00:29:58,970 --> 00:30:02,850 část kovových částic, které Srst každý talíř povrch. 641 00:30:02,850 --> 00:30:05,940 >> Vzor řada z nich malý, platí-up oblasti na disku 642 00:30:05,940 --> 00:30:08,470 představuje jeden bit data v binární číslo 643 00:30:08,470 --> 00:30:10,530 používaný systém počítače. 644 00:30:10,530 --> 00:30:13,775 Nyní, v případě, že proud je zaslána jedním ze způsobů přes čtecí / zapisovací hlavy plochu 645 00:30:13,775 --> 00:30:15,970 je polarizované v jednom směru. 646 00:30:15,970 --> 00:30:17,950 V případě, že proud je odeslána do opačný směr, 647 00:30:17,950 --> 00:30:19,930 polarizace je obráceno. 648 00:30:19,930 --> 00:30:22,370 >> Jak získat data z pevného disku? 649 00:30:22,370 --> 00:30:24,090 Jen zvrácení procesu. 650 00:30:24,090 --> 00:30:26,550 Tak, že je to, že částice na disku že se proud v 651 00:30:26,550 --> 00:30:27,960 čtecí / zapisovací hlavy v pohybu. 652 00:30:27,960 --> 00:30:30,700 Dejte dohromady miliony těchto zmagnetizované segmenty, a 653 00:30:30,700 --> 00:30:32,160 máte soubor. 654 00:30:32,160 --> 00:30:36,060 >> Nyní může kusů v jednom souboru být roztroušeny po celém disku, 655 00:30:36,060 --> 00:30:39,970 mísy, něco jako ten nepořádek papírů na stole. 656 00:30:39,970 --> 00:30:43,500 Takže Speciální, extra soubor udržuje o tom, kde co je. 657 00:30:43,500 --> 00:30:45,985 Copak Přejete si měli něco takového? 658 00:30:45,985 --> 00:30:46,470 >> [END PŘEHRÁVÁNÍ] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, pravděpodobně ne. 660 00:30:47,820 --> 00:30:52,070 Tak kolik z vás Vyrůstal s nimi? 661 00:30:52,070 --> 00:30:53,970 OK, tak je to méně a méně ruce každý rok. 662 00:30:53,970 --> 00:30:56,550 Ale jsem rád, že jste alespoň obeznámeni s nimi, protože to a naše vlastní 663 00:30:56,550 --> 00:31:00,520 Kniha demo, bohužel, umírají velmi pomalé smrti zde známosti. 664 00:31:00,520 --> 00:31:04,010 >> Ale to je to, co jsem, alespoň v roce vysoké školy, který se používá pro zálohování použití. 665 00:31:04,010 --> 00:31:08,110 A bylo to úžasné, protože mohl uložit na 1,4 MB. 666 00:31:08,110 --> 00:31:08,930 Tento disk. 667 00:31:08,930 --> 00:31:12,260 A to byla vysoká hustota provedení, jak je uvedeno na HD, který má 668 00:31:12,260 --> 00:31:14,240 znamená před dnešními HD videa. 669 00:31:14,240 --> 00:31:16,400 >> Standardní hustota byla 800KB. 670 00:31:16,400 --> 00:31:18,640 A než to, že tam bylo 400 kilobyte disky. 671 00:31:18,640 --> 00:31:23,120 A než to, že tam bylo 5 a 1/4 palcové disky, které byly skutečně disketa, 672 00:31:23,120 --> 00:31:25,680 a trochu širší a vyšší než tyto věci zde. 673 00:31:25,680 --> 00:31:29,150 Ale můžete skutečně vidět tzv. floppy aspekt z těchto disků. 674 00:31:29,150 --> 00:31:32,630 >> A funkčně, jsou ve skutečnosti dost podobné pevných disků na 675 00:31:32,630 --> 00:31:33,570 Alespoň to typ. 676 00:31:33,570 --> 00:31:37,270 Opět SSD v novějších počítačů pracovat trochu jinak. 677 00:31:37,270 --> 00:31:41,530 Ale pokud budete pohybovat, že malý kovový výstupek, můžete skutečně vidět malý cookie, 678 00:31:41,530 --> 00:31:42,560 nebo talíř. 679 00:31:42,560 --> 00:31:43,830 >> Není to kov, jako je tento. 680 00:31:43,830 --> 00:31:46,000 Tohle je vlastně nějaký levnější plast. 681 00:31:46,000 --> 00:31:46,750 A můžete trochu třást IT. 682 00:31:46,750 --> 00:31:50,310 A ty jsi děvka jen setřít některé počet bitů nebo magnetických částic 683 00:31:50,310 --> 00:31:51,220 z tohoto disku. 684 00:31:51,220 --> 00:31:52,710 >> Takže naštěstí, nic na něm. 685 00:31:52,710 --> 00:31:55,790 Pokud to, co je v cestě - a pokrytí vaše oči a ti svého souseda - 686 00:31:55,790 --> 00:31:58,865 můžete jen tak vytáhnout to Celý plášť off takhle. 687 00:31:58,865 --> 00:32:01,900 Ale je to trochu jaro, a tak se si vědom, že na vlastní oči. 688 00:32:01,900 --> 00:32:03,620 Takže nyní máte opravdu disketu. 689 00:32:03,620 --> 00:32:07,090 >> A co je pozoruhodné o tom je, že stejně jako je to 690 00:32:07,090 --> 00:32:10,830 malé zastoupení větší pevný disk, tyto věci jsou super, 691 00:32:10,830 --> 00:32:11,590 Super jednoduché. 692 00:32:11,590 --> 00:32:15,170 Pokud sevřete spodní něj teď, že kovová věc je pryč, a kůra 693 00:32:15,170 --> 00:32:20,990 je otevřené, všechno tam je, je dva kusy plsti a tzv. diskety 694 00:32:20,990 --> 00:32:22,930 s kusem kovu na vnitřní straně. 695 00:32:22,930 --> 00:32:25,990 >> A tam jde polovina mého disku je obsah. 696 00:32:25,990 --> 00:32:27,540 Tam jde další polovina z nich. 697 00:32:27,540 --> 00:32:31,375 Ale to je vše, co se točí uvnitř počítače v dávných. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> A opět, aby to do souvislostí, jak velká je nejvíce ze svého 700 00:32:38,310 --> 00:32:39,560 pevné disky v těchto dnech? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 GB, terabajtových, možná počítač desktop, 2 TB, 3 703 00:32:46,230 --> 00:32:47,630 TB, 4 TB, ne? 704 00:32:47,630 --> 00:32:52,480 To je jeden megabajt, dávat nebo brát, které ani vhodný typický MP3 705 00:32:52,480 --> 00:32:55,310 anymore v těchto dnech, nebo některé podobné hudební soubor. 706 00:32:55,310 --> 00:32:59,500 >> Tak trochu suvenýr pro vás dnes, a také pomoci souvislostí, co 707 00:32:59,500 --> 00:33:03,570 budeme brát za samozřejmost nyní v problému pět set. 708 00:33:03,570 --> 00:33:04,820 To jsou jen na vás, aby. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Dovolte mi tedy přechod, kde bude výdaje na další Pset stejně. 711 00:33:13,370 --> 00:33:18,470 Takže jsme se nastavit tuto stránku - ach, pár oznámení rychle. 712 00:33:18,470 --> 00:33:21,730 >> Tento pátek, pokud chcete přidat CS50 na oběd, jít na obvyklém místě, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 A konečný projekt - 715 00:33:25,100 --> 00:33:28,520 takže dle osnov, jsme zaslali Závěrečný projekt specifikace již. 716 00:33:28,520 --> 00:33:31,410 Uvědomte si, že to neznamená, že je to způsobeno zejména brzy. 717 00:33:31,410 --> 00:33:33,990 Je vyslán, opravdu, jen proto, aby vy o tom přemýšlet. 718 00:33:33,990 --> 00:33:37,620 A opravdu, super významný procento z vás bude řešit 719 00:33:37,620 --> 00:33:40,780 závěrečných prací na materiálu, který jsme se ani nedostal na ve třídě, 720 00:33:40,780 --> 00:33:42,730 ale bude již příští týden. 721 00:33:42,730 --> 00:33:45,530 >> Všimněte si však, že spec volá po několik různých složek 722 00:33:45,530 --> 00:33:46,190 závěrečný projekt. 723 00:33:46,190 --> 00:33:49,590 První z nich, během několika týdnů, je pre-návrh, docela neformální e-mail 724 00:33:49,590 --> 00:33:52,760 Váš TF mu říct, nebo to, co jste přemýšlet o tom, pro svůj projekt, s 725 00:33:52,760 --> 00:33:53,650 žádný závazek. 726 00:33:53,650 --> 00:33:56,710 Návrh bude váš konkrétní závazek, řekl, tady je to, co 727 00:33:56,710 --> 00:33:57,770 Chtěl bych udělat pro můj projekt. 728 00:33:57,770 --> 00:33:58,250 Co si myslíte? 729 00:33:58,250 --> 00:33:58,650 Příliš velké? 730 00:33:58,650 --> 00:33:59,145 Příliš malý? 731 00:33:59,145 --> 00:34:00,330 Je to zvládnutelné? 732 00:34:00,330 --> 00:34:02,230 A vidíte, spec pro více informací. 733 00:34:02,230 --> 00:34:05,060 >> Pár týdnů poté, co je stav Zpráva, která je podobně 734 00:34:05,060 --> 00:34:08,260 neformální e-mail k vašemu TF říci, jak pozadu jste v posledním 735 00:34:08,260 --> 00:34:12,360 realizace projektu, po němž následuje CS50 Hackathon, které každý 736 00:34:12,360 --> 00:34:17,520 je pozván, která bude událost od 20:00 Na jeden večer až do 07:00 737 00:34:17,520 --> 00:34:19,150 AM příští ráno. 738 00:34:19,150 --> 00:34:22,560 Pizza, jak jsem mohla uvedeny v týdnu nula, bude Wil podává v 21:00, 739 00:34:22,560 --> 00:34:24,120 Čínské jídlo v 01:00. 740 00:34:24,120 --> 00:34:27,929 A pokud jste ještě vzhůru v 05:00, Vezmeme vás na IHOP k snídani. 741 00:34:27,929 --> 00:34:31,310 >> Takže Hackathon je jeden z více nezapomenutelné zážitky ve třídě. 742 00:34:31,310 --> 00:34:35,290 Pak provedení, což se projevuje i pak vrcholný CS50 veletrhu. 743 00:34:35,290 --> 00:34:38,070 Více informací o všech těchto v příštích týdnech. 744 00:34:38,070 --> 00:34:40,739 >> Ale vraťme se k něčemu old school - 745 00:34:40,739 --> 00:34:41,920 opět, pole. 746 00:34:41,920 --> 00:34:45,040 Takže pole bylo hezké, protože řeší problémy, jako jsme viděli jen 747 00:34:45,040 --> 00:34:49,290 Před chvílí se studentskými struktur jak se trochu vymkla kontrole, kdybychom 748 00:34:49,290 --> 00:34:52,405 chcete mít student, jeden, student, dva Student tři, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 některé libovolný počet studentů. 750 00:34:54,400 --> 00:34:58,850 >> Takže pole, před několika týdny, Přiletěl a vyřešit všechny naše problémy, že není 751 00:34:58,850 --> 00:35:03,340 ví předem, kolik věcí některých typů bychom mohli chtít. 752 00:35:03,340 --> 00:35:07,390 A my jsme viděli, že struct nám může pomoci dále organizovat náš kód a udržet 753 00:35:07,390 --> 00:35:11,660 koncepčně podobných proměnných, jako je jméno a dům, dohromady, aby se 754 00:35:11,660 --> 00:35:15,570 Můžete s nimi zacházet jako s jedním subjektem, vnitřní z nichž jsou menší kousky. 755 00:35:15,570 --> 00:35:17,810 >> Ale pole mají některé nevýhody. 756 00:35:17,810 --> 00:35:19,780 Jaké jsou některé nevýhody jsme se setkali 757 00:35:19,780 --> 00:35:22,320 s poli tak daleko? 758 00:35:22,320 --> 00:35:23,450 Co je to? 759 00:35:23,450 --> 00:35:28,130 Pevná velikost - takže i když si možná možné přidělit paměť pro 760 00:35:28,130 --> 00:35:32,310 pole, až budete vědět, kolik studentů máte, kolik znaků máte 761 00:35:32,310 --> 00:35:35,460 od uživatele, jakmile jste přiděleny pole, jste trochu maloval 762 00:35:35,460 --> 00:35:36,740 si do kouta. 763 00:35:36,740 --> 00:35:40,600 >> Protože nemůžete vložit nové prvky do středu pole. 764 00:35:40,600 --> 00:35:43,660 Nemůžete vložit více prvků na konci pole. 765 00:35:43,660 --> 00:35:47,750 Opravdu, musíte se uchýlit k vytvoření zcela nové pole, jak jsme diskutovali, 766 00:35:47,750 --> 00:35:49,320 kopírování starého do nového. 767 00:35:49,320 --> 00:35:52,610 A opět, že je bolest hlavy, která GetString se zabývá pro vás. 768 00:35:52,610 --> 00:35:56,170 >> Ale znovu, nemůžete ani vložit něco do středu pole 769 00:35:56,170 --> 00:35:58,200 v případě, že rychlost není zcela naplněn. 770 00:35:58,200 --> 00:36:03,010 Například, je-li toto pole zde o velikosti šest má pouze pět věcí v něm, 771 00:36:03,010 --> 00:36:06,080 No, stačí připnout něco na konec. 772 00:36:06,080 --> 00:36:08,200 Ale co když chcete vložit něco do středu 773 00:36:08,200 --> 00:36:11,280 pole, i když by to mohlo mít pět z šesti věcí v něm? 774 00:36:11,280 --> 00:36:14,250 >> No, co jsme dělali, když jsme měli všichni našich lidských dobrovolníků na pódiu v 775 00:36:14,250 --> 00:36:15,110 týdnů minulosti? 776 00:36:15,110 --> 00:36:18,710 Pokud bychom chtěli dát někoho tady, a to buď tito lidé, jak přesunout 777 00:36:18,710 --> 00:36:22,540 způsobem, nebo tito lidé, jak přesunout způsobem, a který se stal drahé. 778 00:36:22,540 --> 00:36:26,950 Přesun lidí uvnitř Pole skončil sečtením a kalkulace 779 00:36:26,950 --> 00:36:31,240 nám čas, a proto mnoho z našich n čtvercový doby chodu jako vložení druhu, pro 780 00:36:31,240 --> 00:36:32,550 instance, v nejhorším případě. 781 00:36:32,550 --> 00:36:36,520 Takže pole jsou skvělé, ale musíte předem vědět, jak velký chcete mít. 782 00:36:36,520 --> 00:36:38,030 >> Takže OK, tady je řešení. 783 00:36:38,030 --> 00:36:43,860 Pokud nemám vědět předem, kolik Studenti bych mohl mít, a vím, že jednou 784 00:36:43,860 --> 00:36:47,870 Rozhodl jsem se, i když, jsem uvízl s tím mnoho studentů, proč ne Vždycky jsem si 785 00:36:47,870 --> 00:36:51,740 přidělit dvakrát tolik místa jak jsem si myslet, budu potřebovat? 786 00:36:51,740 --> 00:36:54,450 Není to rozumné řešení? 787 00:36:54,450 --> 00:36:58,240 >> Realisticky, nemyslím si, že jsme bude potřebovat více než 50 sloty 788 00:36:58,240 --> 00:37:02,190 v poli pro střední velikostní třídy, tak ať to prostě sehnat. 789 00:37:02,190 --> 00:37:07,040 Udělám 100 slotů v mém poli, jen takže rozhodně můžeme získat 790 00:37:07,040 --> 00:37:10,330 počet studentů očekávám, že být v některých středně velké třídy. 791 00:37:10,330 --> 00:37:14,320 Tak proč ne jen zaokrouhlit nahoru a přidělit více paměti, obvykle na poli 792 00:37:14,320 --> 00:37:16,290 než si myslíte, že budete ještě potřebovat? 793 00:37:16,290 --> 00:37:20,190 Co je to jednoduchá pushback k tomuto nápadu? 794 00:37:20,190 --> 00:37:21,440 >> Vy jste jen ztrácíš paměť. 795 00:37:21,440 --> 00:37:25,350 Doslova každý program, který pak napsat je třeba používat dvakrát tolik paměti, kolik 796 00:37:25,350 --> 00:37:26,680 budete skutečně potřebovat. 797 00:37:26,680 --> 00:37:28,990 A to prostě nemá pocit, zvláště elegantní řešení. 798 00:37:28,990 --> 00:37:31,990 Kromě toho, je to jen snižuje pravděpodobnost problému. 799 00:37:31,990 --> 00:37:35,300 Pokud se vám stalo, že populární kurz jeden semestr a máte 101 800 00:37:35,300 --> 00:37:39,610 studenti, váš program je stále zásadně čelí stejnému problému. 801 00:37:39,610 --> 00:37:44,280 >> Takže naštěstí, je tu řešení tento inzerát všechny naše problémy v podobě 802 00:37:44,280 --> 00:37:46,790 datových struktur, které jsou složitější, než ty, které 803 00:37:46,790 --> 00:37:47,970 jsme viděli doposud. 804 00:37:47,970 --> 00:37:50,530 To tvrdím, je propojený seznam. 805 00:37:50,530 --> 00:37:51,920 Toto je seznam čísel - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, a 34 - 807 00:37:54,970 --> 00:38:00,120 , které jsou navzájem propojeny prostřednictvím z toho, co jsem kresleny jako šipky. 808 00:38:00,120 --> 00:38:03,580 >> Jinými slovy, kdybych chtěl reprezentovat pole, jsem mohl dělat 809 00:38:03,580 --> 00:38:04,910 něco takového. 810 00:38:04,910 --> 00:38:07,310 A já dám to na stropě za chvíli. 811 00:38:07,310 --> 00:38:09,970 Co jsem mohl udělat - 812 00:38:09,970 --> 00:38:12,520 Dobrý den, v pohodě. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Nový počítač tady, jasný - 815 00:38:17,360 --> 00:38:18,090 v pohodě. 816 00:38:18,090 --> 00:38:21,730 >> Takže když mám tato čísla v poli - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 ne nutně v měřítku. 819 00:38:30,530 --> 00:38:33,730 Dobře, takže tady je moje pole - 820 00:38:33,730 --> 00:38:34,980 ach můj bože. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Dobře, takže tady je moje pole. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Ach můj bože. 825 00:38:45,050 --> 00:38:48,820 >> [Smích] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Předstírat. 827 00:38:49,440 --> 00:38:52,330 Je to příliš mnoho úsilí vrátit a opravit to, takže - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Takže máme tuto řadu 9, 17, 22, 26, a 34. 830 00:38:57,650 --> 00:39:00,260 Pro ty z vás, můžete vidět chybou, jsem udělal, 831 00:39:00,260 --> 00:39:00,830 tady to je. 832 00:39:00,830 --> 00:39:04,490 >> Takže tvrdím, že je to velmi efektivní řešení. 833 00:39:04,490 --> 00:39:07,310 Jsem přidělen tolik jako ints Potřebuji - jeden, dva, tři, 834 00:39:07,310 --> 00:39:09,100 čtyři, pět, nebo šest - 835 00:39:09,100 --> 00:39:11,660 a já jsem pak uloženy na čísla Uvnitř tohoto pole. 836 00:39:11,660 --> 00:39:15,220 Ale předpokládám, pak chci vložit hodnota jako číslo 8? 837 00:39:15,220 --> 00:39:16,100 No, pokud to jde? 838 00:39:16,100 --> 00:39:18,530 Dejme tomu, že chcete vložit číslo jako 20. 839 00:39:18,530 --> 00:39:19,790 No, pokud to jde? 840 00:39:19,790 --> 00:39:23,160 Někde uprostřed, nebo č. 35, musí jít 841 00:39:23,160 --> 00:39:24,010 někde na konci. 842 00:39:24,010 --> 00:39:25,320 Ale já jsem všechno z vesmíru. 843 00:39:25,320 --> 00:39:29,120 >> A tak to je zásadní výzvou polí, která jsou řešení. 844 00:39:29,120 --> 00:39:32,280 Jsem tvrdil před chvílí, getString tento problém řeší. 845 00:39:32,280 --> 00:39:37,380 Pokud chcete vložit šestina číslo do tohoto pole, to, co je alespoň jedna 846 00:39:37,380 --> 00:39:40,090 Řešení můžete opřít o jisté, stejně jako my s getString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Co je to? 849 00:39:46,030 --> 00:39:48,190 >> No, aby to větší je snadněji řekne, než udělá. 850 00:39:48,190 --> 00:39:52,810 Nemůžeme nutně pole větší, ale co můžeme dělat? 851 00:39:52,810 --> 00:39:56,570 Vytvořte nové pole, které je větší, o velikosti 6, nebo možná velikost 10, pokud chceme 852 00:39:56,570 --> 00:40:00,490 dostat se před věcmi, a pak zkopírujte staré pole do nové, a pak 853 00:40:00,490 --> 00:40:01,680 uvolnit staré pole. 854 00:40:01,680 --> 00:40:05,770 >> Ale co je to doba chodu se tohoto procesu? 855 00:40:05,770 --> 00:40:09,870 Je to velký O n, protože kopírování je to bude stát nějaké jednotky 856 00:40:09,870 --> 00:40:13,480 čas, takže není tak ideální, pokud máme přidělit nové pole, které se děje 857 00:40:13,480 --> 00:40:15,610 konzumovat dvakrát tolik paměti pouze dočasně. 858 00:40:15,610 --> 00:40:16,660 Zkopírujte staré do nové - 859 00:40:16,660 --> 00:40:18,800 Myslím, že je to jen bolest hlavy, která je opět důvod, proč jsme psali 860 00:40:18,800 --> 00:40:19,920 GetString pro vás. 861 00:40:19,920 --> 00:40:21,380 >> Takže to, co bychom mohli dělat místo toho? 862 00:40:21,380 --> 00:40:25,000 No, a co když naše datová struktura ve skutečnosti má mezery v něm? 863 00:40:25,000 --> 00:40:30,790 Dejme tomu, že jsem si odpočinout svého cíle s souvislé kusy paměti, kde 9 864 00:40:30,790 --> 00:40:34,500 se nachází přímo u 17, který je přímo u 22, a tak dále. 865 00:40:34,500 --> 00:40:39,570 >> A předpokládám, že 9 může být tady v RAM a 17 může být tady v paměti RAM, 866 00:40:39,570 --> 00:40:40,990 a 22 mohou být tady v RAM. 867 00:40:40,990 --> 00:40:43,610 Jinými slovy, nepotřebuji je i zády k sobě ještě. 868 00:40:43,610 --> 00:40:47,850 Jen musím nějak navléknout jehlu přes každou z těchto čísel, nebo každý 869 00:40:47,850 --> 00:40:51,010 z těchto uzlů, jako zavoláme obdélníky, jak jsem je nakreslil, na 870 00:40:51,010 --> 00:40:55,670 Vzpomínám si, jak se dostat na poslední jako uzel od té první. 871 00:40:55,670 --> 00:40:59,940 >> Takže to, co je programová konstrukce Viděli jsme docela nedávno, se kterými jsem 872 00:40:59,940 --> 00:41:03,030 mohou realizovat toto vlákno, nebo tažené zde se kterým mohu 873 00:41:03,030 --> 00:41:05,430 provedení těchto šipek? 874 00:41:05,430 --> 00:41:06,500 Takže ukazatele, ne? 875 00:41:06,500 --> 00:41:09,560 Kdybych přidělit nejen int, ale uzel - a 876 00:41:09,560 --> 00:41:10,810 uzel, Chci jen říct kontejneru. 877 00:41:10,810 --> 00:41:12,900 A vizuálně, myslím obdélník. 878 00:41:12,900 --> 00:41:16,420 Takže uzel zřejmě nutné obsahuje dvě hodnoty - 879 00:41:16,420 --> 00:41:21,490 int sám, a pak, jak vyplývá z Spodní polovina obdélníku, 880 00:41:21,490 --> 00:41:23,010 dostatek prostoru pro int. 881 00:41:23,010 --> 00:41:26,130 >> Takže stačí myslet dopředu zde jak velký je tento uzel, tento 882 00:41:26,130 --> 00:41:27,170 nádoba otázku? 883 00:41:27,170 --> 00:41:29,250 Kolik bajtů pro int? 884 00:41:29,250 --> 00:41:31,310 Pravděpodobně 4, je-li to jako obvykle. 885 00:41:31,310 --> 00:41:33,270 A pak, kolik bajtů pro ukazatele? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Takže ukažte tento obal nebo tento uzel je bude 8-byte struktury. 888 00:41:37,940 --> 00:41:41,760 Jo, a to je šťastná náhoda, že jsme právě představil tento pojem 889 00:41:41,760 --> 00:41:44,400 struct nebo konstrukce C. 890 00:41:44,400 --> 00:41:48,890 >> Takže tvrdím, že chci udělat krok k této sofistikovanější 891 00:41:48,890 --> 00:41:52,560 implementace seznamu čísel, na spojový seznam čísel, musím udělat 892 00:41:52,560 --> 00:41:56,920 trochu více přemýšlet dopředu a prohlásit nejen int, ale struct 893 00:41:56,920 --> 00:41:58,620 že zavolám, konvenčně zde uzel. 894 00:41:58,620 --> 00:42:01,630 Mohli bychom říkat, co chceme, ale uzel bude tematicky hodně 895 00:42:01,630 --> 00:42:03,560 z věcí, začneme hledat teď. 896 00:42:03,560 --> 00:42:06,480 >> Uvnitř tohoto uzlu je int n. 897 00:42:06,480 --> 00:42:09,350 A pak tato syntaxe, trochu divné na první pohled - 898 00:42:09,350 --> 00:42:12,960 struct node * další. 899 00:42:12,960 --> 00:42:16,900 No obrazově, co to je? 900 00:42:16,900 --> 00:42:21,000 , Že je spodní polovina obdélník, který jsme viděli 901 00:42:21,000 --> 00:42:22,730 před chvílí. 902 00:42:22,730 --> 00:42:27,600 >> Ale proč to říkám struct uzel * jak protilehlý k jen uzlu *? 903 00:42:27,600 --> 00:42:31,370 Vzhledem k tomu, že pokud ukazatel ukazuje na jiném uzlu, je to jen 904 00:42:31,370 --> 00:42:32,760 adresa uzlu. 905 00:42:32,760 --> 00:42:35,630 To je v souladu s tím, co máme diskutovali o ukazatele tak daleko. 906 00:42:35,630 --> 00:42:39,690 Ale proč, když tvrdím, je tato struktura tzv. uzel, musím říci, struct 907 00:42:39,690 --> 00:42:42,660 uzel tady uvnitř? 908 00:42:42,660 --> 00:42:43,190 >> Přesně tak. 909 00:42:43,190 --> 00:42:46,490 Je to jakýsi stupidní reality C. Typedef, abych tak řekl, nemá 910 00:42:46,490 --> 00:42:47,220 nestalo. 911 00:42:47,220 --> 00:42:48,510 C je super doslovný. 912 00:42:48,510 --> 00:42:51,050 To zní kódový vrchol na dolů, zleva doprava. 913 00:42:51,050 --> 00:42:54,930 A dokud nenarazí že středník na Sečteno a podtrženo, hádej co ne 914 00:42:54,930 --> 00:42:57,590 existovat jako datový typ? 915 00:42:57,590 --> 00:42:59,060 Uzel, cituji konec citátu uzel. 916 00:42:59,060 --> 00:43:03,050 >> Ale protože kompletnější prohlášení jsem na prvním řádku - 917 00:43:03,050 --> 00:43:05,340 typedef struct uzel - 918 00:43:05,340 --> 00:43:08,790 , protože to bylo dřív, než Složené závorky, to je něco jako 919 00:43:08,790 --> 00:43:11,800 pre-vzdělávání zvonění to, že jste Víte co, dejte mi struct 920 00:43:11,800 --> 00:43:13,570 tzv. struct uzel. 921 00:43:13,570 --> 00:43:16,270 Upřímně řečeno, nemám rád nazývat věci pravými struct uzel, uzel struct všechny 922 00:43:16,270 --> 00:43:17,090 po celém mém kódu. 923 00:43:17,090 --> 00:43:20,660 Ale budu používat jen jednou, jen uvnitř, takže mohu efektivně 924 00:43:20,660 --> 00:43:25,010 vytvořit jakýsi cyklický odkaz, není ukazatel na sebe sama o sobě, ale 925 00:43:25,010 --> 00:43:29,400 ukazatel na druhou stejného typu. 926 00:43:29,400 --> 00:43:32,330 >> Tak se ukazuje, že na datové struktury jako je toto, tam je málo 927 00:43:32,330 --> 00:43:34,470 operace, které by mohly být zajímat nás. 928 00:43:34,470 --> 00:43:37,460 Mohli bychom vložit do seznamu, jako je tento. 929 00:43:37,460 --> 00:43:39,850 Mohli bychom odstranit ze seznamu, jako je tato. 930 00:43:39,850 --> 00:43:43,490 Mohli bychom vyhledávat v seznamu pro hodnoty, nebo obecněji, traverz. 931 00:43:43,490 --> 00:43:46,410 A traverz je jen fantazie způsob říká začátek na levé straně a přesunout všechny 932 00:43:46,410 --> 00:43:47,650 úplně doprava. 933 00:43:47,650 --> 00:43:52,640 >> A upozornění, i když to o něco více sofistikované datové struktury, ať 934 00:43:52,640 --> 00:43:56,510 já navrhuji, abychom si půjčit některé z myšlenky v posledních dvou týdnech a 935 00:43:56,510 --> 00:43:58,410 implementovat funkci s názvem hledat takhle. 936 00:43:58,410 --> 00:44:01,360 Bude to vrátí hodnotu true nebo false, což znamená, ano, nebo 937 00:44:01,360 --> 00:44:03,390 no, n je v seznamu. 938 00:44:03,390 --> 00:44:05,960 Druhým argumentem je ukazatel na samotný seznam, aby 939 00:44:05,960 --> 00:44:07,920 ukazatel na uzel. 940 00:44:07,920 --> 00:44:10,350 >> Všechno, co budu do té doby dělat, je prohlásit, dočasné proměnné. 941 00:44:10,350 --> 00:44:12,730 Nazveme to PTR konvence, pro ukazatel. 942 00:44:12,730 --> 00:44:15,220 A já přiřadit je rovna na začátku seznamu. 943 00:44:15,220 --> 00:44:16,680 >> A teď si všimněte while. 944 00:44:16,680 --> 00:44:20,640 Tak dlouho, jak ukazatel není rovno na hodnotu null, jdu zkontrolovat. 945 00:44:20,640 --> 00:44:24,520 Je ukazatel šipka n rovno n, který byl schválen v roce? 946 00:44:24,520 --> 00:44:26,410 A čekat minutu - nový kus syntaxe. 947 00:44:26,410 --> 00:44:29,324 Co je šipka najednou? 948 00:44:29,324 --> 00:44:30,574 Jo? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Přesně tak. 951 00:44:34,810 --> 00:44:38,860 Takže zatímco před pár minutami jsme použili tečkové notaci pro přístup k co 952 00:44:38,860 --> 00:44:43,080 uvnitř struct, je-li proměnná jste není struct 953 00:44:43,080 --> 00:44:47,420 sama o sobě, ale ukazatel na struct, naštěstí kus syntaxi, která 954 00:44:47,420 --> 00:44:48,620 Konečně je intuitivní smysl. 955 00:44:48,620 --> 00:44:52,360 Šipka znamená následovat ukazatel, jako naše šípy obvykle znamená 956 00:44:52,360 --> 00:44:56,570 obrazově a přejděte na Datové pole uvnitř. 957 00:44:56,570 --> 00:44:59,700 Takže šipka je totéž jako tečka, ale jej použít, když máte ukazatel. 958 00:44:59,700 --> 00:45:05,270 >> Tak jen shrnout pak, v případě, že pole n uvnitř struct tzv. ukazatel 959 00:45:05,270 --> 00:45:07,760 rovná se rovná n, vrátí hodnotu true. 960 00:45:07,760 --> 00:45:11,970 Jinak tento řádek zde - ukazatel rovná ukazatel další. 961 00:45:11,970 --> 00:45:17,540 Takže co to dělá, oznámení, je-li I V současné době ukázal na struct 962 00:45:17,540 --> 00:45:21,430 obsahující 9 a 9 není číslo Hledám - předpokládám, Hledám 963 00:45:21,430 --> 00:45:22,830 pro n se rovná 50 - 964 00:45:22,830 --> 00:45:25,930 Chystám se aktualizovat dočasný ukazatel nemluvě v tomto uzlu 965 00:45:25,930 --> 00:45:31,190 už ne, ale ukazatel šipku vedle, což bude, aby mě tady. 966 00:45:31,190 --> 00:45:34,270 >> Teď jsem si uvědomil, je vichřice úvod. 967 00:45:34,270 --> 00:45:37,380 Ve středu budeme vlastně dělat to s některými lidmi a některé další 968 00:45:37,380 --> 00:45:38,900 Kód pomalejším tempem. 969 00:45:38,900 --> 00:45:42,990 Ale uvědomit, budeme nyní dělat naše data složitější struktury, aby naše 970 00:45:42,990 --> 00:45:45,780 algoritmy mohou získat efektivnější, což bude podmínkou pro 971 00:45:45,780 --> 00:45:50,500 pset šest, když načteme do opět ti, 150.000 slov, ale potřebují k tomu, aby 972 00:45:50,500 --> 00:45:55,650 efektivně, a ideálně, vytvářet program, který běží pro naše uživatele není 973 00:45:55,650 --> 00:46:00,460 lineární, a to v n na druhou, ale v konstantní čas, v ideálu. 974 00:46:00,460 --> 00:46:02,300 >> Uvidíme se ve středu. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: Na další CS50, David zapomene na své základní případ. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: A to je, jak posílat textové zprávy s C. Co - 977 00:46:12,770 --> 00:46:14,020 >> [VARIOUS textovou zprávu Zvuky oznámení] 978 00:46:14,020 --> 00:46:19,734