1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Oddiel 5 - Viac Comfortable] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Harvard University] 3 00:00:04,690 --> 00:00:07,250 [To je CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Ako som povedal vo svojom e-mailu, existuje veľa vecí, ktoré môžete použiť 5 00:00:14,250 --> 00:00:17,060 iné ako zariadenie skutočne robiť problémové súbory. 6 00:00:17,060 --> 00:00:19,910 Odporúčame vám to v prístroji len preto, že potom môžeme ľahšie pomôže 7 00:00:19,910 --> 00:00:22,070 a vieme, ako to všetko bude fungovať. 8 00:00:22,070 --> 00:00:26,950 Ale ako jeden príklad, kde si môžete robiť veci, ak, povedzme, nemáte prístup 9 00:00:26,950 --> 00:00:31,570 k spotrebiču, alebo chcete pracovať v suteréne Science Center - 10 00:00:31,570 --> 00:00:33,090 ktoré vlastne majú prístrojom príliš - 11 00:00:33,090 --> 00:00:35,150 Ak chcete pracovať kdekoľvek. 12 00:00:35,150 --> 00:00:42,370 Jedným z príkladov je videli ste / počul SSH? 13 00:00:44,380 --> 00:00:47,780 SSH je v podstate rovnako ako pripojenie k niečomu. 14 00:00:47,780 --> 00:00:51,340 Vlastne, teraz som SSHed do prístroja. 15 00:00:51,340 --> 00:00:54,290 Nikdy som pracovať priamo v prístroji. 16 00:00:55,930 --> 00:01:01,060 Tu je spotrebič, a keď sa pozriete dole tu vidíte túto IP adresu. 17 00:01:01,060 --> 00:01:03,650 Nikdy som pracovať v zariadení samotnom; 18 00:01:03,650 --> 00:01:08,840 Vždy som prísť na iTerm2 okná / terminálovom okne. 19 00:01:08,840 --> 00:01:15,910 Môžete SSH na túto IP adresu, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Pamätám si, že počet veľmi ľahko, pretože je to taký milý vzor. 21 00:01:20,390 --> 00:01:24,920 Ale to bude opýtajte sa ma na moje heslo, a teraz som v spotrebiči. 22 00:01:24,920 --> 00:01:33,060 V podstate, v tomto bode, ak otvoril terminál vo vnútri spotrebiča samotného, 23 00:01:33,060 --> 00:01:36,350 toto rozhranie, ale mali by ste použiť ju, je presne rovnaká 24 00:01:36,350 --> 00:01:40,010 ako rozhranie ja používam tu, ale teraz si SSHed. 25 00:01:42,240 --> 00:01:44,920 Nemusíte sa pripojiť cez SSH na spotrebiče. 26 00:01:44,920 --> 00:01:52,360 Jeden príklad na inom mieste by ste mohli SSH na je, že som si istá, že máte v predvolenom nastavení - 27 00:01:52,360 --> 00:01:55,020 Oh. Väčší. 28 00:01:55,020 --> 00:02:01,130 Všetci z vás by mal mať podľa účtov predvolené FAS na serveroch FAS. 29 00:02:01,130 --> 00:02:06,840 Pre mňa, ja by som SSH rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Je ťa opýtať, že prvýkrát, a poviete áno. 31 00:02:11,610 --> 00:02:15,840 Moje heslo je len bude môj FAS heslo. 32 00:02:15,840 --> 00:02:22,650 A tak teraz, som SSHed na pekné servery, a môžem si robiť, čo chcem tu. 33 00:02:22,650 --> 00:02:28,560 Mnoho tried môžete vziať, rovnako ako 124, budú mať nahráte veci sem 34 00:02:28,560 --> 00:02:30,950 skutočne predložiť svoje problémové sady. 35 00:02:30,950 --> 00:02:34,100 Ale povedať, že nemáte prístup k vášmu prístroju. 36 00:02:34,100 --> 00:02:37,910 Potom môžete robiť veci, ako je tu to bude hovoriť - 37 00:02:37,910 --> 00:02:42,160 To je len naša časť otázok. 38 00:02:42,160 --> 00:02:45,070 To sa vás spýta, ako to urobiť v spotrebiči. 39 00:02:45,070 --> 00:02:47,790 Namiesto toho som si len to na serveri. 40 00:02:47,790 --> 00:02:50,560 Idem k rozbalenie, že. 41 00:02:50,560 --> 00:02:55,670 Problém bude, že ste zvyknutí používať niečo ako gedit 42 00:02:55,670 --> 00:02:58,160 alebo čo vnútri zariadenia. 43 00:02:58,160 --> 00:03:01,830 Nebudete mať, že na FAS serveri. 44 00:03:01,830 --> 00:03:04,110 Je to všetko len bude to textové rozhranie. 45 00:03:04,110 --> 00:03:09,180 Takže by ste mohli buď jeden, skúste sa naučiť textového editora, ktorý oni majú. 46 00:03:09,180 --> 00:03:12,130 Majú Nano. 47 00:03:12,130 --> 00:03:14,990 Nano je zvyčajne veľmi ľahko ovládateľný. 48 00:03:14,990 --> 00:03:19,470 Môžete použiť šípky a zadajte normálne. 49 00:03:19,470 --> 00:03:21,250 Takže to nie je ťažké. 50 00:03:21,250 --> 00:03:24,720 Ak chcete získať naozaj fantázie môžete použiť Emacs, 51 00:03:24,720 --> 00:03:29,850 ktoré som asi nemal otvoriť, pretože ja ani neviem, ako ukončiť Emacs. 52 00:03:29,850 --> 00:03:32,760 Ovládanie X, Control C? Jo. 53 00:03:32,760 --> 00:03:35,310 Alebo môžete použiť Vim, čo je to, čo mám použiť. 54 00:03:35,310 --> 00:03:37,800 A tak to sú vaše možnosti. 55 00:03:37,800 --> 00:03:43,830 Ak nechcete robiť, že môžete tiež, keď sa pozriete na manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Na počítači, môžete pomocou SSH PuTTY, 58 00:03:49,920 --> 00:03:51,940 ktoré budete musieť stiahnuť zvlášť. 59 00:03:51,940 --> 00:03:55,460 Na Macu, stačí Terminal predvolené použitie, alebo si môžete stiahnuť iTerm2, 60 00:03:55,460 --> 00:03:58,490 ktorý je ako pekné, efektné terminálu. 61 00:03:58,490 --> 00:04:03,780 Ak pôjdete do manual.cs50.net uvidíte odkaz na Notepad + +, 62 00:04:03,780 --> 00:04:07,120 čo je to, čo môžete použiť na počítači. 63 00:04:07,120 --> 00:04:13,340 To vám umožní SFTP z Notepad + +, ktorý je v podstate SSH. 64 00:04:13,340 --> 00:04:17,750 Čo to vám umožní urobiť, je upravovať svoje súbory lokálne, 65 00:04:17,750 --> 00:04:20,670 a potom zakaždým, keď chcete uložiť, bude to ušetrí až nice.fas, 66 00:04:20,670 --> 00:04:23,670 kde potom môžete spustiť. 67 00:04:23,670 --> 00:04:26,880 A odpovedá na Mac bude TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Tak to vám umožní urobiť to isté. 69 00:04:28,760 --> 00:04:32,800 To vám umožní upravovať súbory lokálne a uložiť ich do nice.fas, 70 00:04:32,800 --> 00:04:35,730 kde potom môžete spustiť. 71 00:04:35,730 --> 00:04:40,400 Takže ak ste niekedy uviazol bez zariadenia, máte tieto možnosti 72 00:04:40,400 --> 00:04:44,230 na stále robiť svoje problémové sady. 73 00:04:44,230 --> 00:04:48,250 Jeden problém bude, že nebudete mať CS50 knižnicu 74 00:04:48,250 --> 00:04:51,580 pretože nice.fas nemá v predvolenom nastavení majú, že. 75 00:04:51,580 --> 00:04:55,970 Môžete buď stiahnuť CS50 knižnice - 76 00:04:55,970 --> 00:04:58,470 Ja si nemyslím, že je potrebné, aby v tomto bode. 77 00:04:58,470 --> 00:05:03,270 Môžete buď stiahnuť CS50 knižnicu a skopírujte ho do nice.fas, 78 00:05:03,270 --> 00:05:07,450 alebo som si, že v tomto bode nemáme používať už tak ako tak. 79 00:05:07,450 --> 00:05:12,720 Alebo ak áno, môžete v súčasnej dobe ho nahradiť 80 00:05:12,720 --> 00:05:18,480 Implementácia týchto funkcií v CS50 knižnici tak ako tak. 81 00:05:18,480 --> 00:05:21,370 Takže by nemal byť tak veľký obmedzenia. 82 00:05:21,370 --> 00:05:23,710 A to je, že. 83 00:05:26,460 --> 00:05:29,820 >> Vrátim sa do spotrebiča teraz, budeme robiť všetko, čo v spotrebiči. 84 00:05:29,820 --> 00:05:37,510 Pri pohľade na našu sekciu otázok, na začiatku, ako som povedal vo svojom e-mailu, 85 00:05:37,510 --> 00:05:43,620 musíme si pohovoriť o jednej skratke ste sa mali pozerať. 86 00:05:43,620 --> 00:05:51,980 Máme presmerovanie a rúrky a tieto tri otázky. 87 00:05:51,980 --> 00:05:56,070 >> Ak chcete, ktoré prúd sa funkcie ako printf písať v predvolenom nastavení? 88 00:05:56,070 --> 00:05:59,130 Tak stream. Čo je prúd? 89 00:06:06,520 --> 00:06:15,100 Prúd je v podstate taká, že je to len nejaký - 90 00:06:15,100 --> 00:06:21,450 Nie je to ani zdrojom 1s a 0s. 91 00:06:21,450 --> 00:06:24,920 Prúd, ktorý sa pýta na tú je štandardný výstup. 92 00:06:24,920 --> 00:06:27,250 A tak štandardný výstup je prúd, ktorý pri písaní na to, 93 00:06:27,250 --> 00:06:30,940 sa objaví na obrazovke. 94 00:06:30,940 --> 00:06:36,860 Štandardné, tým, že prúd, znamená to, že stačí napísať 1s a 0s k nemu, 95 00:06:36,860 --> 00:06:40,220 a druhý koniec štandardný výstup len číta z tohto prúdu. 96 00:06:40,220 --> 00:06:43,540 Je to len reťazec 1s a 0s. 97 00:06:43,540 --> 00:06:45,570 Môžete písať do vodných tokov, alebo si môžete prečítať z potokov 98 00:06:45,570 --> 00:06:47,950 v závislosti na tom, čo prúd vlastne je. 99 00:06:47,950 --> 00:06:52,800 Zvyšné dva Predvolené toky sú štandardne a štandardné chyby. 100 00:06:52,800 --> 00:06:57,540 Štandardné in je vždy, keď to GetString, je to na vás čaká na vstup veci. 101 00:06:57,540 --> 00:07:01,570 Tak to vás čaká, je to vlastne čaká na štandarde, 102 00:07:01,570 --> 00:07:04,880 čo je naozaj to, čo dostanete, keď zadáte na klávesnici. 103 00:07:04,880 --> 00:07:07,530 Píšete do štandardu palcov 104 00:07:07,530 --> 00:07:10,050 Štandardná chyba je v podstate ekvivalentná štandardný výstup, 105 00:07:10,050 --> 00:07:13,280 ale je to špecializované v tom, že pri tlači na štandardný chybový výstup, 106 00:07:13,280 --> 00:07:16,770 ste mali tlačiť iba chybové správy, ktoré 107 00:07:16,770 --> 00:07:20,200 takže môžete rozlíšiť medzi pravidelnými správami tlačených na obrazovku 108 00:07:20,200 --> 00:07:24,560 proti chybových správ v závislosti na tom, či šli do štandardný výstup alebo štandardnou chybou. 109 00:07:24,560 --> 00:07:28,660 Súbory taky. 110 00:07:28,660 --> 00:07:32,440 Štandardný výstup, štandardný v, a štandardná chyba je len zvláštne prúdy, 111 00:07:32,440 --> 00:07:36,810 ale naozaj akýkoľvek súbor, pri otvorení súboru, to sa stáva prúd bajtov 112 00:07:36,810 --> 00:07:40,740 , Kde môžete len čítať z tohto prúdu. 113 00:07:40,740 --> 00:07:47,770 Tie, pre najviac sa rozdeliť, môže len myslieť súboru ako prúd bajtov. 114 00:07:47,770 --> 00:07:51,190 Takže to, čo toky sa píšu v predvolenom nastavení? Štandardný výstup. 115 00:07:51,190 --> 00:07:56,980 >> Aký je rozdiel medzi> a >>? 116 00:07:58,140 --> 00:08:03,710 Vari niekto sledovať video vopred? Dobre. 117 00:08:03,710 --> 00:08:10,960 > So bude, ako presmerovať do súborov, 118 00:08:10,960 --> 00:08:15,240 a >> bude tiež presmerovať výstup do súboru, 119 00:08:15,240 --> 00:08:17,820 ale je to miesto bude pripojiť k súboru. 120 00:08:17,820 --> 00:08:23,430 Napríklad, povedzme, že som náhodou dict tu, 121 00:08:23,430 --> 00:08:27,020 a jediný veci vnútri dict je mačka, mačka, pes, ryba, pes. 122 00:08:27,020 --> 00:08:31,530 Jeden príkaz, že máte v príkazovom riadku je mačka, 123 00:08:31,530 --> 00:08:34,539 ktorý je len tak vytlačiť to, čo je v súbore. 124 00:08:34,539 --> 00:08:40,679 Takže keď hovorím mačka dict, že to bude tlačiť mačka, mačka, pes, ryba, pes. To je všetko, mačka robí. 125 00:08:40,679 --> 00:08:46,280 To znamená, že pre tlač na štandardný výstup mačka, mačka, pes, ryba, pes. 126 00:08:46,280 --> 00:08:53,240 Keby som namiesto toho chcete presmerovať, že do súboru, môžem použiť> a presmerovať ju na čo je súbor. 127 00:08:53,240 --> 00:08:56,460 Zavolám súbor súbor. 128 00:08:56,460 --> 00:09:00,320 Takže teraz, keď ja ls, uvidím Mám nový súbor s názvom súboru. 129 00:09:00,320 --> 00:09:05,700 A keď som ho otvoríte, bude to mať presne to, čo mačky dal na príkazovom riadku. 130 00:09:05,700 --> 00:09:11,040 Takže teraz keď to urobím znovu, potom to bude presmerovať výstup do súboru, 131 00:09:11,040 --> 00:09:13,930 a budem mať rovnaký presne to. 132 00:09:13,930 --> 00:09:17,910 Takže technicky to úplne nedbala toho, čo sme mali. 133 00:09:17,910 --> 00:09:22,970 A uvidíme, či zmením dict, som vytiahol psa. 134 00:09:22,970 --> 00:09:29,980 Teraz, keď sme sa mačka dict do súboru znova, budeme mať novú verziu s pes odstránené. 135 00:09:29,980 --> 00:09:32,400 Tak to úplne potlačí ho. 136 00:09:32,400 --> 00:09:36,640 Namiesto toho, ak budeme používať >>, bude to pripojiť súbor. 137 00:09:36,640 --> 00:09:40,860 Teraz, otváranie súboru, vidíme, máme len samé tlačenej dvakrát 138 00:09:40,860 --> 00:09:44,920 pretože tam bol raz, potom sme pripojená k originálu. 139 00:09:44,920 --> 00:09:48,130 Tak to je to, čo> a >> robiť. 140 00:09:48,130 --> 00:09:50,580 Má ďalšie sa opýtať - to nie je to opýtať. 141 00:09:50,580 --> 00:09:59,050 >> Druhý, ktorý máme, je <, ktorá, ak> presmeruje štandardný výstup, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Uvidíme, či sa máme príklad. 144 00:10:14,750 --> 00:10:16,930 Dokážem písať jedného naozaj rýchlo. 145 00:10:17,870 --> 00:10:25,700 Poďme sa ľubovoľný súbor, hello.c. 146 00:10:56,060 --> 00:10:59,070 Relatívne jednoduché súboru. 147 00:10:59,070 --> 00:11:03,570 Ja som len na to, reťazec a potom tlač "Hello", čo reťazec som vstúpil bol. 148 00:11:03,570 --> 00:11:07,990 Takže si ahoj a potom. / Hello. 149 00:11:07,990 --> 00:11:10,720 Teraz to výzva, aby som zadať niečo, 150 00:11:10,720 --> 00:11:15,070 čo znamená, že čaká na veci, ktoré majú byť zapísané do štandardu palcov 151 00:11:15,070 --> 00:11:20,450 Takže zadať čo chcem do štandardu dovnútra sme len povedať Ahoj, Rob! 152 00:11:20,450 --> 00:11:23,310 Potom sa tlačí na štandardný výstup Hello, Robe! 153 00:11:23,310 --> 00:11:28,860 Ak to urobím. / Hello a potom presmerovať, 154 00:11:30,740 --> 00:11:34,310 zatiaľ môžete iba presmerovať zo súboru. 155 00:11:34,310 --> 00:11:41,720 Takže keď som dal v nejakom súbore, txt, a dal som Roba, 156 00:11:41,720 --> 00:11:52,300 keď spustím ahoj a potom presmerovať súbor txt do. / hello, to bude hovoriť Hello, Rob! okamžite. 157 00:11:52,300 --> 00:11:57,160 Keď sa prvýkrát dostane do GetString a to čakanie na štandarde v, 158 00:11:57,160 --> 00:12:01,730 štandard v už čaká na klávesnici dát dostať zadaných. 159 00:12:01,730 --> 00:12:05,980 Namiesto toho, sme presmerovaní štandardom pre čítanie zo súboru txt. 160 00:12:05,980 --> 00:12:10,290 A tak to bude čítať zo súboru txt, ktorý je len čiara Rob, 161 00:12:10,290 --> 00:12:13,380 a potom to bude tlačiť Hello, Rob! 162 00:12:13,380 --> 00:12:18,180 A keby som chcel, mohol by som tiež urobiť. / Hello 00:12:21,500 a potom štandardné na to, že je to tlač, ktorý je Ahoj, Robe!, 164 00:12:21,500 --> 00:12:24,700 Môžem presmerovať, že do vlastného súboru. 165 00:12:24,700 --> 00:12:29,790 Ja si len zavolať na súbor hello - nie, nebudem, pretože to je spustiteľný - txt2. 166 00:12:29,790 --> 00:12:40,150 Teraz, txt2 bude mať výstup. / Dobrý deň, 00:12:43,520 >> Otázky? 168 00:12:45,900 --> 00:12:49,090 >> Dobre. Takže tu máme potrubia. 169 00:12:49,090 --> 00:12:53,510 Rúrky sú posledné jednotka presmerovanie. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Myslím, že jeden jednotka presmerovanie, ak je miesto> tie 2>, 171 00:12:58,750 --> 00:13:01,070 že je presmerovanie štandardná chyba. 172 00:13:01,070 --> 00:13:06,280 Takže ak sa niečo na štandardný chybový výstup, dopadlo by to dať do txt2. 173 00:13:06,280 --> 00:13:12,480 Všimnime si ale, či som to 2>, potom je to stále tlače Ahoj, Rob! do príkazového riadku 174 00:13:12,480 --> 00:13:18,600 pretože som len presmerovanie štandardné chybu, ja nie som presmerovanie normu von. 175 00:13:18,600 --> 00:13:22,210 Štandardná chyba a štandardný výstup sa líšia. 176 00:13:24,210 --> 00:13:27,080 Ak by ste chceli, aby skutočne písať na štandardný chybový výstup, 177 00:13:27,080 --> 00:13:35,080 potom by som mohol zmeniť to byť fprintf na stderr. 178 00:13:35,080 --> 00:13:37,850 Takže printf, v predvolenom nastavení, vytlačí na štandardný výstup. 179 00:13:37,850 --> 00:13:41,720 Ak chcem tlačiť na štandardný chybový výstup ručne, potom musím použiť fprintf 180 00:13:41,720 --> 00:13:45,010 a určiť, čo chcem tlačiť. 181 00:13:45,010 --> 00:13:49,720 Ak namiesto toho som fprintf stdout, potom je to v podstate rovnocenné printf. 182 00:13:49,720 --> 00:13:55,530 Ale fprintf na štandardný chybový výstup. 183 00:13:57,790 --> 00:14:03,650 Takže teraz, keď som presmerovať to na txt2, Hello, Rob! stále dostáva vytlačený v príkazovom riadku 184 00:14:03,650 --> 00:14:08,270 pretože je dostať vytlačené na štandardný chybový výstup, a ja som len presmerovanie štandardný výstup. 185 00:14:08,270 --> 00:14:16,420 Keby som teraz presmerovať štandardný chyba, teraz to nedostal tlačený, a txt2 bude Hello, Rob! 186 00:14:16,420 --> 00:14:21,910 Takže teraz, môžete tlačiť skutočné chyby na štandardný chybový výstup 187 00:14:21,910 --> 00:14:24,720 a tlačiť pravidelné správy na štandardný výstup. 188 00:14:24,720 --> 00:14:31,420 A tak pri spustení programu, môžete ho spustiť ako. / Hello tento typ s 2> 189 00:14:31,420 --> 00:14:33,800 tak, aby váš program bude bežať normálne, 190 00:14:33,800 --> 00:14:38,400 ale nejaké chybové správy, ktoré dostanete, môžete zistiť neskôr v protokole chýb, 191 00:14:38,400 --> 00:14:44,500 tak chyby, a potom sa pozrite neskôr a vaše chyby súbor bude mať nejaké chyby, ktoré sa stali. 192 00:14:45,200 --> 00:14:47,540 >> Otázky? 193 00:14:47,540 --> 00:14:58,070 >> Posledný z nich je rúrka, ktorá si môžete myslieť, ako že sa normu z jedného príkazu 194 00:14:58,070 --> 00:15:01,210 , Ktorá je tak štandard ďalšieho príkazu. 195 00:15:01,210 --> 00:15:05,570 Príkladom je echo je príkazový riadok vec 196 00:15:05,570 --> 00:15:11,840 , Ktorý je len tak echo, čo som dal ako svoj argument. Nebudem dať úvodzovky. 197 00:15:11,840 --> 00:15:16,150 Echo bla, bla, bla je len tak tlačiť bla, bla, bla. 198 00:15:16,150 --> 00:15:20,600 Predtým, keď som povedal, že som musel dať Roba do txt súboru 199 00:15:20,600 --> 00:15:28,830 pretože môžem len presmerovať súbory s príponou TXT, miesto, / keď som echo Rob 200 00:15:28,830 --> 00:15:35,520 a potom potrubie je do. / hello, bude to tiež urobiť rovnaký typ veci. 201 00:15:35,520 --> 00:15:39,160 To je v súčasnej dobe výstup tohto príkazu, echo Rob, 202 00:15:39,160 --> 00:15:43,610 a používať to ako vstup pre. / hello. 203 00:15:44,790 --> 00:15:49,560 Môžete si ju predstaviť ako prvý presmerovanie echo Roba do súboru 204 00:15:49,560 --> 00:15:54,160 a potom zadajte do. / hello tohto súboru, ktorý bol práve na výstupe. 205 00:15:54,160 --> 00:15:57,850 Ale to má dočasný súbor z obrázku. 206 00:16:01,890 --> 00:16:04,460 >> Otázky týkajúce sa, že? 207 00:16:04,460 --> 00:16:07,150 >> Ďalšia otázka sa bude týkať tohto. 208 00:16:07,150 --> 00:16:15,310 Čo potrubie môžete použiť na vyhľadanie počet unikátnych mien v súbore s názvom names.txt? 209 00:16:15,310 --> 00:16:24,160 Príkazy budeme chcieť použiť tu sú jedinečné, tak UNIQA, a potom wc. 210 00:16:24,160 --> 00:16:28,840 Môžete to urobiť man UNIQA skutočne pozrieť na to, čo robí, že, 211 00:16:28,840 --> 00:16:34,840 a to len tak filtruje susediace zhodné riadky od vstupu. 212 00:16:34,840 --> 00:16:40,690 A človek wc bude tlačiť znak nového riadku, slovo, a počet bajtov pre každý súbor. 213 00:16:40,690 --> 00:16:43,760 A posledný budeme chcieť použiť je niečo, 214 00:16:43,760 --> 00:16:47,410 ktorý sa bude len trochu riadky súboru txt. 215 00:16:47,410 --> 00:16:58,080 Ak urobím nejaký súbor txt, names.txt, a to Rob, Tommy, Joseph, Tommy, Joseph, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 to, čo chcem urobiť je zistiť počet unikátnych mien v tomto súbore. 217 00:17:03,910 --> 00:17:08,750 Takže to, čo by mala byť odpoveď? >> [Študent] 4. Jo >>. 218 00:17:08,750 --> 00:17:13,780 Malo by byť 4 od Roba, Tommy, Josef, RJ sú iba jedinečné názvy v tomto súbore. 219 00:17:13,780 --> 00:17:20,180 Prvým krokom, keď som jednoducho počet slov na names.txt, 220 00:17:20,180 --> 00:17:24,290 je to vlastne hovorí mi všetko. 221 00:17:24,290 --> 00:17:32,560 To je vlastne tlač - Poďme sa pozrieť, man wc - nové riadky, slová, a byte počet. 222 00:17:32,560 --> 00:17:38,270 Keby som len o vedení, potom som si len urobiť wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Tak to je krok 1. 224 00:17:44,300 --> 00:17:50,510 Ale ja nechcem, aby wc-l names.txt pretože names.txt len ​​obsahuje všetky názvy, 225 00:17:50,510 --> 00:17:54,170 a chcem odfiltrovať žiadne non-jedinečné ty. 226 00:17:54,170 --> 00:18:01,200 Takže ak som to UNIQA names.txt, že nie je úplne daj mi to, čo chcem 227 00:18:01,200 --> 00:18:03,760 pretože duplikované názvy sú stále tam. 228 00:18:03,760 --> 00:18:07,690 Prečo je to? Prečo sa Uniqa nie je robiť to, čo chcem? 229 00:18:07,690 --> 00:18:10,500 [Študent] duplicity nie [nepočuteľné] >> Jo. 230 00:18:10,500 --> 00:18:16,370 Nezabudnite si man stránku pre UNIQA hovorí filtruje susediace zhodné riadky. 231 00:18:16,370 --> 00:18:19,680 Sú spolu nesusedia, takže to nebude filtrovať. 232 00:18:19,680 --> 00:18:31,100 Keby som triediť je prvý, sort names.txt bude dať všetky duplicitné riadky dohromady. 233 00:18:31,100 --> 00:18:34,450 Takže teraz trochu names.txt je. 234 00:18:34,450 --> 00:18:40,550 Budem chcieť, aby ho použiť ako vstup do UNIQA, ktorý je | Uniqa. 235 00:18:40,550 --> 00:18:43,390 To mi dáva Jozefa, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 a chcem ho použiť ako vstup do wc-l, 237 00:18:49,260 --> 00:18:52,740 ktoré sa bude dať mi 4. 238 00:18:52,740 --> 00:18:56,930 Rovnako ako tu sa píše, čo by mohlo potrubia použiť? 239 00:18:56,930 --> 00:19:01,390 Môžete si urobiť veľa vecí, ako pomocou série príkazov 240 00:19:01,390 --> 00:19:05,130 kde použiť výstup z jedného príkazu ako vstup do ďalšieho príkazu. 241 00:19:05,130 --> 00:19:08,780 Môžete si urobiť veľa vecí, veľa chytrých vecí. 242 00:19:08,780 --> 00:19:11,440 >> Otázky? 243 00:19:12,910 --> 00:19:14,600 Dobre. 244 00:19:14,600 --> 00:19:17,880 To je to pre potrubia a presmerovanie. 245 00:19:18,370 --> 00:19:24,090 >> Teraz pôjdeme na skutočné veci, kódovanie stuff. 246 00:19:24,090 --> 00:19:29,100 Vnútri tohto PDF, uvidíte tento príkaz, 247 00:19:29,100 --> 00:19:32,950 a budete chcieť spustiť tento príkaz vo vašom prístroji. 248 00:19:36,240 --> 00:19:42,250 wget je príkaz pre len dostať niečo z internetu, v podstate, 249 00:19:42,250 --> 00:19:45,180 tak wget a to URL. 250 00:19:45,180 --> 00:19:49,110 Ak ste šiel na túto adresu URL v prehliadači, bolo by to stiahnuť tento súbor. 251 00:19:49,110 --> 00:19:52,510 Len som klikol na to, tak to stiahli súbor pre mňa. 252 00:19:52,510 --> 00:19:55,650 Ale písanie wget tejto veci vnútri terminálu 253 00:19:55,650 --> 00:19:58,620 sa práve chystá stiahnuť do svojho terminálu. 254 00:19:58,620 --> 00:20:02,750 Mám section5.zip, a budete chcieť rozbaliť section5.zip, 255 00:20:02,750 --> 00:20:06,520 ktoré sa bude dať vám zložku s názvom section5, 256 00:20:06,520 --> 00:20:11,550 ktorá bude mať všetky súbory sa budeme používať dnes vnútri nej. 257 00:20:33,380 --> 00:20:37,710 Ako súborov tieto programy "názvy napovedajú, že sú trochu buggy, 258 00:20:37,710 --> 00:20:40,990 Takže vašou úlohou je prísť na to, prečo používať gdb. 259 00:20:40,990 --> 00:20:44,560 Má všetky nechať stiahnuť / vedieť, ako sa dostať je k stiahnutiu 260 00:20:44,560 --> 00:20:47,480 do ich zariadenia? Dobre. 261 00:20:47,480 --> 00:20:56,400 >> Beh ./buggy1, bude hovoriť Segmentation fault (core dumpingové), 262 00:20:56,400 --> 00:21:00,500 ktorý zakaždým, keď sa segfault, je to zlá vec. 263 00:21:00,500 --> 00:21:03,810 Za akých okolností by ste si segfault? 264 00:21:03,810 --> 00:21:08,210 [Študent] Nepriamy odkaz nulový ukazovateľ. Jo >>. Takže to je jeden príklad. 265 00:21:08,210 --> 00:21:11,580 Nepriamy odkaz nulový ukazovateľ Budeš sa dostať segfault. 266 00:21:11,580 --> 00:21:16,720 Čo segfault znamená je, že sa dotknete pamäte by ste nemali dotýkať. 267 00:21:16,720 --> 00:21:21,350 Takže dereferencing nulový ukazovateľ sa dotýka adresu 0, 268 00:21:21,350 --> 00:21:28,060 av podstate všetky počítače v súčasnej dobe povedať, že adresa 0 je pamäť, ktorú ste nemali dotýkať. 269 00:21:28,060 --> 00:21:31,920 Takže to je dôvod, prečo dereferencing nulový ukazovateľ výsledkov v segfault. 270 00:21:31,920 --> 00:21:37,210 Ak sa vám stalo, nie je inicializovať ukazovateľ, potom to má na odpadky hodnotu, 271 00:21:37,210 --> 00:21:41,520 a tak pri pokuse o dereferencia to, so všetkou pravdepodobnosťou ste sa dotknete pamäte 272 00:21:41,520 --> 00:21:43,540 že je uprostred ničoho. 273 00:21:43,540 --> 00:21:45,650 Ak sa vám stalo, šťastie a odpadky hodnota 274 00:21:45,650 --> 00:21:48,440 stalo poukázať na niekde na fronte, alebo tak niečo, 275 00:21:48,440 --> 00:21:50,820 potom, keď dereferencia, že ukazovateľ, ktorý ste nebol inicializovaný, 276 00:21:50,820 --> 00:21:52,730 nič pokaziť. 277 00:21:52,730 --> 00:21:55,480 Ale ak je to ukázal na, povedzme, niekde medzi zásobníka a haldy, 278 00:21:55,480 --> 00:21:59,850 alebo je to ukazuje len niekde, že nebol použitý ani programu ešte, 279 00:21:59,850 --> 00:22:02,240 potom ste sa dotknete pamäť, nemali by ste sa dotýkať a segfault. 280 00:22:02,240 --> 00:22:06,370 Ak napísať rekurzívne funkciu, a to recurses príliš mnohokrát 281 00:22:06,370 --> 00:22:08,720 a váš stack rastie príliš veľký a zásobník zrazí do vecí 282 00:22:08,720 --> 00:22:12,270 že by nemal byť kolízie s, ste dotýka pamäti by ste nemali dotýkať, 283 00:22:12,270 --> 00:22:14,810 takže segfault. 284 00:22:14,810 --> 00:22:17,010 To je to, čo segfault je. 285 00:22:17,010 --> 00:22:21,810 >> Je to tiež z rovnakého dôvodu, že ak máte reťazec v tvare - 286 00:22:21,810 --> 00:22:23,930 Poďme sa vrátiť k predchádzajúcemu programu. 287 00:22:23,930 --> 00:22:28,530 Vo hello.c--ja len tak, aby sa niečo iné. 288 00:22:28,530 --> 00:22:33,770 char * s = "hello world!"; 289 00:22:33,770 --> 00:22:42,310 Ak mám použiť * s = niečo alebo s [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 tak, aby ahoj,. / hello, prečo sa to segfault? 291 00:22:48,410 --> 00:22:51,250 Prečo sa to segfault? 292 00:22:55,660 --> 00:22:57,890 Čo by ste očakávať, že sa stane? 293 00:22:57,890 --> 00:23:06,640 Ak som printf ("% s \ n", s); čo by ste očakávať, že bude tlačiť? 294 00:23:06,640 --> 00:23:09,930 [Študent] X ahoj. Jo >>. 295 00:23:09,930 --> 00:23:15,140 Problém je, že pri deklarovaní reťazec, ako je tento, 296 00:23:15,140 --> 00:23:18,190 s je ukazovateľ, ktorý pôjde na stack, 297 00:23:18,190 --> 00:23:25,880 a čo s ukazuje na to je reťazec, ktorý je obsiahnutý v neprepisovateľné pamäti. 298 00:23:25,880 --> 00:23:30,560 Takže len podľa mena, len pre čítanie pamäte, mali by ste mať predstavu 299 00:23:30,560 --> 00:23:33,010 , Že ak sa pokúsite zmeniť to, čo je v read-only pamäte, 300 00:23:33,010 --> 00:23:36,670 robíte niečo, čo by nemal robiť s pamäťou a segfault. 301 00:23:36,670 --> 00:23:45,360 To je vlastne veľký rozdiel medzi char * s a char s []. 302 00:23:45,360 --> 00:23:48,790 Takže char s [], teraz tento reťazec sa bude klásť na zásobníku, 303 00:23:48,790 --> 00:23:53,960 a zásobník je len na čítanie, čo znamená, že by to malo fungovať úplne v poriadku. 304 00:23:55,500 --> 00:23:57,370 A to robí. 305 00:23:57,370 --> 00:24:06,250 Pamätajte si, že keď som si char * s = "hello world!", S sám je na zásobníku 306 00:24:06,250 --> 00:24:10,390 ale s bodmi niekam inam, a že niekde inde sa stane, že len na čítanie. 307 00:24:10,390 --> 00:24:15,640 Ale char s [] je jednoducho niečo, na zásobníku. 308 00:24:17,560 --> 00:24:21,760 Takže to je ďalší príklad segfault deje. 309 00:24:21,760 --> 00:24:27,820 >> Videli sme, že ./buggy1 vyústila v segfault. 310 00:24:27,820 --> 00:24:31,810 Teoreticky, nemali by ste sa pozrieť na buggy1.c okamžite. 311 00:24:31,810 --> 00:24:35,170 Namiesto toho sa pozrieme na to cez gdb. 312 00:24:35,170 --> 00:24:37,750 Všimnite si, že keď sa dostanete Segmentation fault (core dumpingové), 313 00:24:37,750 --> 00:24:40,850 si stiahni súbor sem volal jadro. 314 00:24:40,850 --> 00:24:45,200 Ak by sme ls-l, uvidíme, že jadro je obvykle docela veľký súbor. 315 00:24:45,200 --> 00:24:51,580 To je počet bajtov v súbore, takže to vyzerá, že je to 250-niečo kilobajtov. 316 00:24:51,580 --> 00:24:56,120 Dôvodom je, že to, čo core dump je v skutočnosti 317 00:24:56,120 --> 00:25:01,410 je, keď váš program havaruje, stav pamäti programu 318 00:25:01,410 --> 00:25:05,230 len dostane skopírovať a vložiť do tohto súboru. 319 00:25:05,230 --> 00:25:07,270 To dostane vyhodený do tohto súboru. 320 00:25:07,270 --> 00:25:13,060 Tento program, zatiaľ čo bol spustený, sa stalo mať využitie pamäti asi 250 kb, 321 00:25:13,060 --> 00:25:17,040 a tak to je to, čo dostal kopačky do tohto súboru. 322 00:25:17,040 --> 00:25:23,630 Teraz sa môžete pozrieť na tomto súbore, ak budeme robiť gdb buggy1 jadro. 323 00:25:23,630 --> 00:25:30,130 Môžeme jednoducho gdb buggy1, a že bude len spustenie gdb pravidelne, 324 00:25:30,130 --> 00:25:33,800 pomocou buggy1 ako jeho vstupný súbor. 325 00:25:33,800 --> 00:25:38,260 Ale ak si gdb buggy1 jadro, potom je to konkrétne ide naštartovať gdb 326 00:25:38,260 --> 00:25:40,330 pri pohľade na tento základný súbor. 327 00:25:40,330 --> 00:25:45,560 A hovoríte buggy1 znamená gdb vie, že jadro súboru pochádza z buggy1 programu. 328 00:25:45,560 --> 00:25:49,580 Takže gdb buggy1 jadro bude okamžite priniesť nám 329 00:25:49,580 --> 00:25:52,060 kde program stalo ukončiť. 330 00:25:57,720 --> 00:26:02,340 Vidíme tu Program ukončený signálom 11, Segmentation fault. 331 00:26:02,340 --> 00:26:10,110 Sme sa ocitli na rad zhromaždenie, ktoré pravdepodobne nie je príliš užitočné. 332 00:26:10,110 --> 00:26:15,360 Ale ak zadáte BT alebo backtrace, že to bude funkcia 333 00:26:15,360 --> 00:26:19,430 ktorý nám dáva zoznam našich aktuálnych zásobníka snímok. 334 00:26:19,430 --> 00:26:23,150 Tak backtrace. Vyzerá to, že máme len dve stack rámy. 335 00:26:23,150 --> 00:26:26,310 Prvý z nich je naša hlavná rámec frontu, 336 00:26:26,310 --> 00:26:29,810 a druhý je zásobník rám pre túto funkciu, ktorá sa stane, že je v, 337 00:26:29,810 --> 00:26:34,440 ktorý vyzerá ako máme iba montážny kód. 338 00:26:34,440 --> 00:26:38,050 Tak poďme späť do našej hlavnej funkcie, 339 00:26:38,050 --> 00:26:42,300 a to, že môžeme urobiť rámik 1, a myslím, že môžeme tiež urobiť dolu, 340 00:26:42,300 --> 00:26:45,160 ale skoro nikdy to dole - alebo nahor. Jo. 341 00:26:45,160 --> 00:26:50,710 Hore a dole. Až vám prináša jednu zásobníka snímku, dole sa dostanete dole zásobníka rám. 342 00:26:50,710 --> 00:26:53,240 Mám vo zvyku nikdy použiť. 343 00:26:53,240 --> 00:26:59,120 Len som konkrétne povedať, rám 1, ktorá je ísť do rámu s označením 1. 344 00:26:59,120 --> 00:27:01,750 Rám 1 bude, aby nás do hlavného zásobníka rámu, 345 00:27:01,750 --> 00:27:05,570 a hovorí, že tu na riadok kódu sme náhodou byť. 346 00:27:05,570 --> 00:27:07,950 Ak by sme chceli ešte pár riadkov kódu, môžeme povedať zoznamu, 347 00:27:07,950 --> 00:27:11,280 a že sa to nám všetkým riadky kódu okolo neho. 348 00:27:11,280 --> 00:27:13,360 Linka sa segfaulted na to 6: 349 00:27:13,360 --> 00:27:17,360 if (strcmp ("CS50 skaly", ArGV [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Ak to nie je zrejmé ešte, môžete si ho rovno odtiaľ len tým, že myslí, prečo je segfaulted. 351 00:27:24,130 --> 00:27:28,800 Ale môžeme si to ešte o krok ďalej a povedať, "Prečo by ArGV [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Poďme tlač ArGV [1], a vyzerá to, že je to 0x0, ktorý je nulový ukazovateľ. 353 00:27:38,830 --> 00:27:44,750 Sme strcmping CS50 skaly a NULL, a tak že to bude segfault. 354 00:27:44,750 --> 00:27:48,280 A prečo je ArGV [1] null? 355 00:27:48,640 --> 00:27:51,280 [Študent] Pretože sme nemali dať žiadne argumenty príkazového riadku. 356 00:27:51,280 --> 00:27:53,390 Jo. Nechceli sme dať žiadne argumenty príkazového riadku. 357 00:27:53,390 --> 00:27:58,460 Takže ./buggy1 len bude mať ArGV [0] bude ./buggy1. 358 00:27:58,460 --> 00:28:02,100 To nebude mať ArGV [1], tak, že to bude segfault. 359 00:28:02,100 --> 00:28:07,450 Ale ak, namiesto toho som robiť len CS50, že to bude hovoriť Získate D 360 00:28:07,450 --> 00:28:09,950 pretože to je to, čo má urobiť. 361 00:28:09,950 --> 00:28:15,240 Pri pohľade na buggy1.c, to má tlačiť "Dostanete D" - 362 00:28:15,240 --> 00:28:20,820 Ak ArGV [1] nie je "CS50 skaly", "Dostanete D", inak "Tu získate!" 363 00:28:20,820 --> 00:28:25,660 Takže ak chceme, musíme to porovnať ako pravdivé, 364 00:28:25,660 --> 00:28:28,710 , Čo znamená, že je v porovnaní s 0. 365 00:28:28,710 --> 00:28:31,100 Takže ArGV [1] musí byť "CS50 skaly". 366 00:28:31,100 --> 00:28:35,660 Ak chcete urobiť, že na príkazovom riadku, budete musieť použiť \ uniknúť priestor. 367 00:28:35,660 --> 00:28:41,690 Takže CS50 \ skaly a dostanete A! 368 00:28:41,690 --> 00:28:44,060 Ak nechcete robiť spätné lomítko, prečo to nefunguje? 369 00:28:44,060 --> 00:28:47,190 [Študent] Je to dva rôzne argumenty. Jo >>. 370 00:28:47,190 --> 00:28:52,540 ArGV [1] bude CS50, a ArGV [2] bude skaly. Dobre. 371 00:28:52,540 --> 00:28:56,470 >> Teraz ./buggy2 bude segfault znovu. 372 00:28:56,470 --> 00:29:01,880 Namiesto otvorenia sa svojej hlavnej súboru, budeme len otvoriť buggy2 priamo, 373 00:29:01,880 --> 00:29:05,000 tak gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Teraz, keď sme len spustiť náš program, potom to bude hovoriť Program prijímaného signálu SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 ktorý je segfault signál, a to je miesto, kde sa stalo stalo. 376 00:29:15,530 --> 00:29:21,250 Pri pohľade na naše backtrace, vidíme, že sme boli vo funkcii oh_no, 377 00:29:21,250 --> 00:29:23,900 ktorý bol povolaný funkcie Dinky, ktorý bol nazývaný pomocou funkcie Binkym, 378 00:29:23,900 --> 00:29:26,460 ktorý bol povolaný hlavné. 379 00:29:26,460 --> 00:29:31,680 Môžeme tiež vidieť argumenty týchto funkcií. 380 00:29:31,680 --> 00:29:34,680 Argument bezvýznamné a Binky bola 1. 381 00:29:34,680 --> 00:29:44,390 Ak by sme zozname funkciu oh_no, vidíme, že oh_no je len to, char ** S = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "BOOM"; 383 00:29:47,410 --> 00:29:50,330 Prečo by to zlyhanie? 384 00:29:54,330 --> 00:29:58,380 [Študent] Nemôžete dereferencia null ukazovateľ? Jo >>. 385 00:29:58,380 --> 00:30:06,090 To je len hovorí s je NULL, bez ohľadu na to, ak sa to stane, že je char **, 386 00:30:06,090 --> 00:30:12,070 ktoré, v závislosti na tom, ako interpretovať to, mohlo by to byť ukazovateľ na ukazovateľ na reťazec 387 00:30:12,070 --> 00:30:15,550 alebo pole reťazcov. 388 00:30:15,550 --> 00:30:21,430 Je to s je NULL, takže * s je dereferencing nulový ukazovateľ, 389 00:30:21,430 --> 00:30:24,800 a tak to bude pád. 390 00:30:24,800 --> 00:30:27,540 To je jeden z najrýchlejších spôsobov, ako môžete prípadne segfault. 391 00:30:27,540 --> 00:30:31,300 Je to jednoducho prehlasuje, že nulový ukazovateľ a okamžite segfaulting. 392 00:30:31,300 --> 00:30:34,570 To je to, čo oh_no robí. 393 00:30:34,570 --> 00:30:43,400 Ak pôjdeme do jednej snímky, potom budeme dostať do funkcie, ktorá je volaná oh_no. 394 00:30:43,400 --> 00:30:44,830 Musím to urobiť, aby sa. 395 00:30:44,830 --> 00:30:48,610 Ak nezadáte príkaz a vy jednoducho stlačiť Enter znova, 396 00:30:48,610 --> 00:30:52,350 to bude len opakovať predchádzajúci príkaz, ktorý ste spustili. 397 00:30:52,350 --> 00:30:56,610 Sme v ráme 1. 398 00:30:56,610 --> 00:31:04,650 Výpis tohto rámu, tu vidíme, je naša funkcia. 399 00:31:04,650 --> 00:31:08,520 Môžete hit zoznam znovu, alebo si môžete urobiť zoznam 20 a bude obsahovať viac. 400 00:31:08,520 --> 00:31:13,640 Funkcia dinky hovorí, že ak je aj 1, potom prejdite na funkciu oh_no, 401 00:31:13,640 --> 00:31:15,960 iný ísť do Slinky funkciu. 402 00:31:15,960 --> 00:31:18,700 A my vieme, aj je 1, pretože sme sa ocitli na tu 403 00:31:18,700 --> 00:31:22,560 že dinky bola volaná s argumentom 1. 404 00:31:22,560 --> 00:31:27,560 Alebo môžete jednoducho vytlačiť aj, a to bude hovoriť aj je 1. 405 00:31:27,560 --> 00:31:33,770 Sme v súčasnej dobe v Dinky, a ideme ak do ďalšieho snímku, vieme, že skončíš v Binkym. 406 00:31:33,770 --> 00:31:36,600 Up. Teraz sme v Binkym. 407 00:31:36,600 --> 00:31:41,340 Výpis túto funkciu - zoznam z pred pol ma prerušil - 408 00:31:41,340 --> 00:31:52,670 Začalo to ako keď som je 0, potom budeme hovoriť, že oh_no, inak volajte hezoučký. 409 00:31:52,670 --> 00:31:57,000 Vieme, že som bol 1, tak to je volané hezoučký. 410 00:31:57,000 --> 00:32:05,030 A teraz sme späť v hlavnom, a hlavné je len bude int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 To je len tak, aby vám náhodné číslo, ktoré je buď 0, 1, alebo 2. 412 00:32:08,790 --> 00:32:12,780 Bude to hovoriť Binky s týmto číslom, a to vráti 0. 413 00:32:12,780 --> 00:32:16,700 Pri pohľade na to, 414 00:32:16,700 --> 00:32:19,880 len prechádzky programu ručne bez spustenia okamžite, 415 00:32:19,880 --> 00:32:25,400 by ste nastaviť bod zlomu na hlavné, čo znamená, že keď sme sa spustiť program 416 00:32:25,400 --> 00:32:31,020 váš program beží až kým nenarazí na bod prerušenia. 417 00:32:31,020 --> 00:32:35,450 Takže spustenie programu, bude to bežať a potom to bude hit hlavné funkcie a zastaviť beh. 418 00:32:35,450 --> 00:32:44,700 Teraz sme vo vnútri hlavnej, a krok, alebo vedľa sa chystá priviesť nás na ďalší riadok kódu. 419 00:32:44,700 --> 00:32:47,050 Môžete to urobiť krok alebo ďalšie. 420 00:32:47,050 --> 00:32:51,800 Biť ďalší, teraz som bol nastavený na rand ()% 3, a tak môžeme vytlačiť hodnotu i, 421 00:32:51,800 --> 00:32:55,280 a to bude hovoriť aj je 1. 422 00:32:55,280 --> 00:32:58,110 Teraz to záleží, či budeme používať nasledujúce alebo krok. 423 00:32:58,110 --> 00:33:01,000 Myslím, že by na tom záležalo v predchádzajúcom, ale budeme chcieť použiť ďalšie. 424 00:33:01,000 --> 00:33:06,000 Ak budeme používať krok, sme krok do funkcie, čo znamená, že pozrieť sa na skutočné veci 425 00:33:06,000 --> 00:33:07,940 , Čo sa deje vo vnútri Binkym. 426 00:33:07,940 --> 00:33:10,510 Ak sa používajú nasledujúce, potom to znamená prejsť funkciu 427 00:33:10,510 --> 00:33:14,070 a jednoducho ísť na ďalší riadok kódu v našej hlavnej funkcie. 428 00:33:14,070 --> 00:33:17,900 Práve tu na tejto trati, bol som na miesto, kde sa hovorí rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 keby som to urobil krok, bolo by to ísť do realizácie rand 430 00:33:21,320 --> 00:33:25,110 a pozrieť sa na to, čo sa tam deje, a ja som mohol šliapnuť pomocou funkcie rand. 431 00:33:25,110 --> 00:33:26,920 Ale ja sa nestarám o funkciu rand. 432 00:33:26,920 --> 00:33:30,190 Ja len chcem ísť na ďalší riadok kódu v hlavnej, tak som použiť ďalší. 433 00:33:30,190 --> 00:33:35,800 Ale teraz som to stará o Binky funkciu, takže chcem, aby krok do toho. 434 00:33:35,800 --> 00:33:37,730 Teraz som v Binkym. 435 00:33:37,730 --> 00:33:42,040 Prvý riadok kódu je povedať if (i == 0), som o krok, 436 00:33:42,040 --> 00:33:44,930 vidíme, skončí na Dinky. 437 00:33:44,930 --> 00:33:51,620 Ak sme zoznam vecí, vidíme, že čítal je i = 0. 438 00:33:51,620 --> 00:33:55,470 i nie je rovné 0, tak to šlo do iného stavu, 439 00:33:55,470 --> 00:33:59,540 ktorá sa bude volať Dinky (i). 440 00:33:59,540 --> 00:34:04,030 Môžete sa zmiasť. 441 00:34:04,030 --> 00:34:07,380 Ak stačí sa pozrieť na týchto tratiach priamo, možno si myslíte, že if (i == 0), 442 00:34:07,380 --> 00:34:10,800 v poriadku, potom som urobil krok, a teraz som na Dinky (i), 443 00:34:10,800 --> 00:34:14,120 si môže myslieť, že musí znamenať i = 0, alebo tak niečo. 444 00:34:14,120 --> 00:34:18,980 Nie Ide o to, že vie, že môže prilepiť priamo na riadok Dinky (i). 445 00:34:18,980 --> 00:34:23,300 Vzhľadom k tomu, aj nie je 0, je ďalším krokom nebude končiť na ostatnému. 446 00:34:23,300 --> 00:34:26,239 Else nie je položka, že to bude zastaviť na. 447 00:34:26,239 --> 00:34:31,570 Je to jednoducho ísť na ďalší riadok môže skutočne spustiť, čo je hezoučký (i). 448 00:34:31,570 --> 00:34:36,090 Vstup do Dinky (i), uvidíme, či (i == 1). 449 00:34:36,090 --> 00:34:42,670 Vieme, i = 1, takže keď sme krok, vieme, že skončíme v oh_no 450 00:34:42,670 --> 00:34:46,489 pretože i = 1 volá funkciu oh_no, ktoré môžete vstúpiť do, 451 00:34:46,489 --> 00:34:52,969 ktorý sa bude nastavenie char ** s = NULL a okamžite "BOOM". 452 00:34:54,270 --> 00:34:59,690 A potom vlastne sa pozerať na vykonávanie buggy2, 453 00:34:59,690 --> 00:35:04,590 to, aj sa len na to, náhodné číslo - 0, 1, alebo 2 - volanie Binky, 454 00:35:04,590 --> 00:35:10,610 ktorá keď sa aj 0 volá oh_no, inde to volá hezoučký, ktorý príde sem. 455 00:35:10,610 --> 00:35:18,100 Ak aj je 1, výzva oh_no, inak volajte Slinky, ktorý príde sem, 456 00:35:18,100 --> 00:35:20,460 ak je aj 2, volajte oh_no. 457 00:35:20,460 --> 00:35:24,720 Neviem ani, že existuje spôsob, ako - 458 00:35:24,720 --> 00:35:30,030 Má niekto vidí spôsob, ako robiť to program, ktorý nebude segfault? 459 00:35:30,030 --> 00:35:37,530 Pretože ak som niečo chýba, ak je aj 0, budete okamžite segfault, 460 00:35:37,530 --> 00:35:41,250 inak idete do funkcie, ktorá, ak aj je 1 ste segfault, 461 00:35:41,250 --> 00:35:44,540 inak idete do funkcie, ak je aj 2 si segfault. 462 00:35:44,540 --> 00:35:46,810 Takže bez ohľadu na to, čo robíte, budete segfault. 463 00:35:46,810 --> 00:35:52,380 >> Myslím, že jeden spôsob, ako sa uvádza, že by miesto toho robil char ** S = NULL, 464 00:35:52,380 --> 00:35:55,610 môžete malloc priestor pre tento reťazec. 465 00:35:55,610 --> 00:36:04,230 Mohli by sme urobiť malloc (sizeof) - sizeof čo? 466 00:36:09,910 --> 00:36:15,190 [Študent] (char) * 5? >> Znamená to nezdá správne? 467 00:36:15,190 --> 00:36:21,060 Ja som za predpokladu, že to bude fungovať, ak som vlastne bežal, ale to nie je to, čo som hľadal. 468 00:36:24,400 --> 00:36:32,940 Pozrite sa na typ s Dodajme, int *, takže int * x. 469 00:36:32,940 --> 00:36:35,600 Ja by som to malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Alebo keď som chcel pole 5, by som to (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Čo keď mám int **? 472 00:36:46,260 --> 00:36:49,140 Čo by som malloc? 473 00:36:49,140 --> 00:36:53,510 [Študent] Veľkosť ukazovatele. Jo >>. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Rovnaká vec sa tu. 475 00:36:56,960 --> 00:37:01,280 Chcem (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 To bude prideliť priestor pre ukazovateľ, ktorý ukazuje na "BOOM". 477 00:37:12,840 --> 00:37:15,330 Nepotrebujem prideliť priestor pre "BOOM" sám 478 00:37:15,330 --> 00:37:17,210 pretože to je v podstate ekvivalentná tomu, čo som povedal predtým 479 00:37:17,210 --> 00:37:20,870 char * x = "BOOM". 480 00:37:20,870 --> 00:37:27,950 "BOOM" už existuje. Stáva sa, že existujú v read-only oblasti pamäte. 481 00:37:27,950 --> 00:37:35,200 Ale to už existuje, čo znamená, že tento riadok kódu, ak S je char **, 482 00:37:35,200 --> 00:37:43,900 potom * s je char * a vy nastavenie tohto char * poukázať na "BOOM". 483 00:37:43,900 --> 00:37:50,040 Ak by som chcel kopírovať "BOOM" do s, potom budem musieť prideliť priestor pre s 484 00:37:55,170 --> 00:38:03,900 Urobím * s = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Prečo 5? 486 00:38:06,210 --> 00:38:10,860 Prečo nie 4? Vyzerá to, že "BOOM" je 4 znaky. >> [Študent] null znak. 487 00:38:10,860 --> 00:38:14,580 Jo. Všetky vaše reťazcov budú potrebovať null charakter. 488 00:38:14,580 --> 00:38:23,590 Teraz môžem urobiť niečo ako strčí - Aká je funkcia pre kopírovanie reťazca? 489 00:38:23,590 --> 00:38:28,520 [Študent] CPY? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 muž strcpy. 491 00:38:36,120 --> 00:38:39,590 Takže strcpy alebo strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy je trochu bezpečnejšie, pretože môžete presne špecifikovať, koľko znakov, 493 00:38:43,410 --> 00:38:46,190 ale tu to nevadí, pretože vieme. 494 00:38:46,190 --> 00:38:50,340 Takže strcpy a pozrieť sa do argumentov. 495 00:38:50,340 --> 00:38:53,100 Prvý argument je náš cieľ. 496 00:38:53,100 --> 00:38:56,770 Druhý argument je naším zdrojom. 497 00:38:56,770 --> 00:39:10,310 Budeme kopírovať do nášho cieľového * S ukazovateľ "BOOM". 498 00:39:10,310 --> 00:39:19,820 Prečo by si to chcete urobiť s strcpy miesto práve to, čo sme mali predtým 499 00:39:19,820 --> 00:39:22,800 z * s = "BOOM"? 500 00:39:22,800 --> 00:39:28,630 K dispozícii je dôvod, prečo budete chcieť urobiť, ale čo je to dôvod? 501 00:39:28,630 --> 00:39:31,940 [Študent] Ak chcete niečo zmeniť v "BOOM". Jo >>. 502 00:39:31,940 --> 00:39:37,950 Teraz môžem urobiť niečo ako s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 pretože s bodmi do haldy a že priestor na halde, ktorá je ukazuje na 504 00:39:48,190 --> 00:39:52,320 je ukazovateľ na ďalšie miesta na halde, ktorá je ukladanie "BOOM". 505 00:39:52,320 --> 00:39:55,150 Takže to kópia "boom" je uložený v halde. 506 00:39:55,150 --> 00:39:58,780 Tam sú technicky dve kópie "boom" v našom programe. 507 00:39:58,780 --> 00:40:03,500 Tam je prvý, ktorý sa práve daný touto "BOOM" reťazcová konštanta, 508 00:40:03,500 --> 00:40:09,250 a druhú kópiu "BOOM", strcpy vytvoril kópiu "BOOM". 509 00:40:09,250 --> 00:40:13,100 Ale kópie "boom" je uložený na halde, a haldy máte možnosť zmeniť. 510 00:40:13,100 --> 00:40:17,250 Halda je len na čítanie, tak to znamená, že s [0] 511 00:40:17,250 --> 00:40:20,500 sa chystá nechať zmeniť hodnotu "BOOM". 512 00:40:20,500 --> 00:40:23,130 Bude to nechať zmeniť tieto znaky. 513 00:40:23,130 --> 00:40:26,640 >> Otázky? 514 00:40:27,740 --> 00:40:29,290 Dobre. 515 00:40:29,290 --> 00:40:35,500 >> Poďme sa pozrieť na buggy3, poďme gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Sme len spustiť a vidíme, sa segfault. 517 00:40:39,840 --> 00:40:46,550 Ak by sme backtrace, tam sú len dve funkcie. 518 00:40:46,550 --> 00:40:52,970 Ak by sme išli do našej hlavnej funkcie, vidíme, že segfaulted na tomto riadku. 519 00:40:52,970 --> 00:41:00,180 Takže len pri pohľade na tento riadok, for (int riadok = 0; fgets toto nie je rovný NULL; 520 00:41:00,180 --> 00:41:03,770 linka + +). 521 00:41:03,770 --> 00:41:08,010 Naša predchádzajúcu snímku bol nazývaný _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Uvidíte, že šarža vstavaných funkcií C, 523 00:41:10,720 --> 00:41:15,350 že keď sa dostanete segfault, bude naozaj záhadné názvy funkcií 524 00:41:15,350 --> 00:41:18,090 podobné _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Ale že sa to súvisí s týmto fgets výzvy. 526 00:41:21,770 --> 00:41:25,850 Niekde sem dovnútra, sme segfaulting. 527 00:41:25,850 --> 00:41:30,340 Ak sa pozrieme na argumenty fgets, môžeme tlačiť vyrovnávacej pamäte. 528 00:41:30,340 --> 00:41:41,180 Poďme vytlačiť ako - Oh, nie. 529 00:41:48,980 --> 00:41:51,900 Tlač nebude fungovať presne tak, ako chcem, aby to. 530 00:41:55,460 --> 00:41:58,000 Poďme sa pozrieť na aktuálny program. 531 00:42:02,200 --> 00:42:09,640 Buffer je pole znakov. Je to postava pole 128 znakov. 532 00:42:09,640 --> 00:42:14,980 Takže keď hovorím tlač buffer, že to bude tlačiť tie 128 znakov, 533 00:42:14,980 --> 00:42:18,300 ktorá Myslím, že je to, čo sa očakáva. 534 00:42:18,300 --> 00:42:21,390 Čo som hľadal, je vytlačiť adresu vyrovnávacej pamäte, 535 00:42:21,390 --> 00:42:23,680 ale to nie je naozaj mi veľa. 536 00:42:23,680 --> 00:42:30,770 Takže keď som sa náhodou povedať, tu x buffer, ukazuje mi 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 ktoré, ak si pamätáte z minulosti alebo nejakého bodu, Oxbffff inklinuje byť stack-ish región. 538 00:42:38,690 --> 00:42:46,020 Zásobník má tendenciu začať niekde tesne pod 0xc000. 539 00:42:46,020 --> 00:42:51,890 Len tým, že vidí túto adresu, ja viem, že vyrovnávacej pamäte sa deje na zásobníku. 540 00:42:51,890 --> 00:43:04,500 Reštartovanie môj program, spustite, up, miernenie sme videli, bolo túto postupnosť znakov 541 00:43:04,500 --> 00:43:06,530 ktoré sú do značnej miery zmysel. 542 00:43:06,530 --> 00:43:12,270 Potom tlače súboru, čo to súbor vyzerá? 543 00:43:15,120 --> 00:43:17,310 [Študent] Null. Jo >>. 544 00:43:17,310 --> 00:43:22,610 Súbor je z * typ súboru, takže je to ukazovateľ, 545 00:43:22,610 --> 00:43:26,610 a hodnota tohto ukazovateľa je nulový. 546 00:43:26,610 --> 00:43:33,240 Takže fgets sa pokúsi čítať z tohto ukazovateľa v nepriamym spôsobom, 547 00:43:33,240 --> 00:43:37,320 ale aby sa prístup k tomuto ukazovateľ, že má k dereferencia to. 548 00:43:37,320 --> 00:43:40,550 Alebo, aby sa prístup, čo by malo byť smerujúce, to dereferences IT. 549 00:43:40,550 --> 00:43:43,810 Takže to dereferencing nulový ukazovateľ, a to segfault chýb. 550 00:43:46,600 --> 00:43:48,730 Mohol som znova ho tam. 551 00:43:48,730 --> 00:43:52,170 Ak zrušíme v našom hlavnom bode a spustiť, 552 00:43:52,170 --> 00:43:57,320 prvý riadok kódu je char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 To by malo docela veľký náznak toho, prečo tento program zlyhá. 554 00:44:00,870 --> 00:44:06,080 Písanie vedľa ma privádza na ďalší riadok, kde som otvoriť tento súbor, 555 00:44:06,080 --> 00:44:11,140 a potom som okamžite dostať do našej línie, kde kedysi som zasiahla ďalší, bude to segfault. 556 00:44:11,140 --> 00:44:16,880 Má niekto chcel vyhodiť dôvod, prečo by sme mohli byť segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Študent] Súbor neexistuje. Jo >>. 558 00:44:19,130 --> 00:44:22,250 To má byť náznak 559 00:44:22,250 --> 00:44:29,570 že ak ste otvorení súboru je nutné skontrolovať, či súbor skutočne existuje. 560 00:44:29,570 --> 00:44:31,510 Tak tu, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Keď sme fopen súboru pre čítanie, potom sme potrebné hovoriť 562 00:44:34,700 --> 00:44:45,870 if (súbor == NULL) a hovoriť printf ("Súbor neexistuje!" 563 00:44:45,870 --> 00:44:56,340 alebo - ešte lepšie - filename); return 1; 564 00:44:56,340 --> 00:45:00,300 Takže teraz sme skontrolovať, či je to NULL 565 00:45:00,300 --> 00:45:03,930 ako v skutočnosti pokračovanie a snaží sa čítať z tohto súboru. 566 00:45:03,930 --> 00:45:08,800 Môžeme prerobiť to jednoducho vidieť, že to funguje. 567 00:45:11,020 --> 00:45:14,970 Mal som v úmysle zahrnúť nový riadok. 568 00:45:21,090 --> 00:45:25,290 Takže teraz nonexistent.txt neexistuje. 569 00:45:26,890 --> 00:45:30,040 Vždy by ste mali skontrolovať pre tento druh veci. 570 00:45:30,040 --> 00:45:33,870 Vždy by ste mali skontrolovať, či fopen vráti NULL. 571 00:45:33,870 --> 00:45:38,170 Vždy by ste mali skontrolovať, aby sa ubezpečil, že malloc nevráti NULL, 572 00:45:38,170 --> 00:45:41,410 inak by ste segfault. 573 00:45:42,200 --> 00:45:45,930 >> Teraz buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Beh. Hádam, že je to čaká na vstup alebo prípadne nekonečné slučky. 575 00:45:58,440 --> 00:46:01,870 Áno, je to nekonečné slučky. 576 00:46:01,870 --> 00:46:05,560 Tak buggy4. Vyzerá to, že sme nekonečné slučky. 577 00:46:05,560 --> 00:46:12,590 Môžeme rozdeliť na hlavnej, spustite náš program. 578 00:46:12,590 --> 00:46:20,180 V gdb, tak dlho, ako skratka použiť je jednoznačná 579 00:46:20,180 --> 00:46:23,420 alebo špeciálne skratky, ktoré poskytujú pre vás, 580 00:46:23,420 --> 00:46:29,020 potom môžete použiť n na použitie nabudúce namiesto toho, aby musel písať v budúcom celú cestu. 581 00:46:29,020 --> 00:46:33,730 A teraz, keď som udrel n raz, môžem len stlačte Enter ďalej ďalšie 582 00:46:33,730 --> 00:46:36,640 namiesto toho, aby museli zasiahnuť n Enter, n Enter, n Enter. 583 00:46:36,640 --> 00:46:44,630 Vyzerá to, že som v nejakej slučke for, že je nastavenie pole [i] na 0. 584 00:46:44,630 --> 00:46:50,510 Vyzerá to, že som nikdy vypadla z toho pre slučky. 585 00:46:50,510 --> 00:46:54,780 Keby som tlače i, tak som ich 2, potom pôjdem ďalej. 586 00:46:54,780 --> 00:46:59,250 Budem tlačiť aj, i je 3, potom pôjdem ďalej. 587 00:46:59,250 --> 00:47:05,360 Budem tlačiť i a i je 3. Ďalšie, tlač i, i je 4. 588 00:47:05,360 --> 00:47:14,520 Vlastne, tlač sizeof (pole), takže veľkosť poľa je 20. 589 00:47:16,310 --> 00:47:32,870 Ale vyzerá to, že tam je nejaký osobitný gdb príkaz pre prechod až sa niečo stane. 590 00:47:32,870 --> 00:47:37,620 Je to ako nastavenie podmienku na hodnote premennej. Ale ja neviem, čo to je. 591 00:47:37,620 --> 00:47:44,100 Takže ak budeme pokračovať - 592 00:47:44,100 --> 00:47:47,120 Čo si hovoril? Čo ste vychovávať? 593 00:47:47,120 --> 00:47:50,500 [Študent] Má zobrazí aj pridať - >> Jo. Takže zobrazí aj vám môže pomôcť. 594 00:47:50,500 --> 00:47:54,530 Ak by sme len zobraziť i, bude to dať sem, čo hodnota i je 595 00:47:54,530 --> 00:47:56,470 takže nemám ju vytlačiť zakaždým. 596 00:47:56,470 --> 00:48:02,930 Ak budeme len ďalej vedľa, vidíme 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5. 597 00:48:02,930 --> 00:48:08,530 Niečo sa deje strašne zle, a ja sa nastaví na 0. 598 00:48:13,330 --> 00:48:22,220 Pri pohľade na buggy4.c, vidíme všetko, čo sa stane, je int pole [5]; 599 00:48:22,220 --> 00:48:26,200 for (i = 0; i <= sizeof (array); i + +) 600 00:48:26,200 --> 00:48:28,550 array [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Čo vidíme, že je to zle? 602 00:48:31,390 --> 00:48:39,480 Ako náznak, keď som robil gdb buggy4 - poďme rozbiť hlavné, run - 603 00:48:39,480 --> 00:48:45,980 Ja som print sizeof (pole) len preto, aby videli, čo je stav, kedy by som si mal konečne vypuknúť. 604 00:48:47,690 --> 00:48:51,100 Kde to som? Som utekal? 605 00:48:51,100 --> 00:48:54,280 Som nepriznal ešte. 606 00:48:54,280 --> 00:48:58,680 Takže tlač sizeof (pole), a to 20, 607 00:48:58,680 --> 00:49:06,690 ktorého sa očakáva, pretože moje pole je veľkosti 5 a je to z 5 celých čísel, 608 00:49:06,690 --> 00:49:12,410 takže celá vec by mala byť 5 * sizeof (int) bytov, ak sizeof (int) tendencia k 4. 609 00:49:12,410 --> 00:49:14,780 Takže sizeof (pole) je 20. 610 00:49:14,780 --> 00:49:17,420 Čo by to mohlo byť? 611 00:49:17,420 --> 00:49:21,720 [Študent] deleno sizeof (int). >> Jo, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Vyzerá to, že je tu ešte jeden problém. Myslím, že by to malo byť len < 613 00:49:30,630 --> 00:49:36,960 pretože je to docela hodně vždy 00:49:44,860 Teraz sa poďme zamyslieť, prečo bol tento skutočne zlomené. 615 00:49:44,860 --> 00:49:53,370 Má niekto uhádne, prečo bol aj obnoviť 0 až každej iterácii slučky? 616 00:50:01,300 --> 00:50:09,350 Jediné vnútri tu, že sa deje, je, že pole [i] je nastavený na hodnotu 0. 617 00:50:09,350 --> 00:50:15,350 Takže nejako, tento riadok kódu je príčinou nášho int i byť nastavená na 0. 618 00:50:16,730 --> 00:50:23,130 [Študent] Mohlo by to byť preto, že je to naliehavé pamäť tejto časti aj 619 00:50:23,130 --> 00:50:27,970 keď si myslia, že je to ďalší prvok poľa? >> [Bowden] Áno. 620 00:50:27,970 --> 00:50:33,880 Keď ideme po skončení nášho poľa, 621 00:50:33,880 --> 00:50:39,870 nejako, že priestor, ktorý sme prepísanie je prepísanie hodnoty i 622 00:50:39,870 --> 00:50:48,030 A tak keď sa pozrieme do buggy4, rozbiť hlavné, beh, 623 00:50:48,030 --> 00:50:53,120 Poďme vytlačiť adresu i 624 00:50:53,120 --> 00:50:57,280 Vyzerá to, že to bffff124. 625 00:50:57,280 --> 00:51:03,930 Teraz poďme vytlačiť adresu pole [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Čo [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11c, 120. array [5] je bfff124. 629 00:51:14,530 --> 00:51:26,990 Takže pole [5] má rovnakú adresu ako ja, čo znamená, že pole [5], je i 630 00:51:26,990 --> 00:51:30,720 Ak majú rovnakú adresu, sú jedno a to isté. 631 00:51:30,720 --> 00:51:38,410 Takže keď sme sa pole [5] na 0, ktorú vytvárame aj na 0. 632 00:51:38,410 --> 00:51:46,070 A ak si myslíte, že o tom, pokiaľ ide o zásobníka, 633 00:51:46,070 --> 00:51:55,590 int i je deklarovaný ako prvý, čo znamená, že som sa dostane určitý priestor na zásobníku. 634 00:51:55,590 --> 00:52:04,730 Potom array [5] je pridelené, tak potom 20 bytov sú prideľované na zásobníku. 635 00:52:04,730 --> 00:52:08,400 Takže aj dostane pridelené prvý, potom týchto 20 bytov si pridelené. 636 00:52:08,400 --> 00:52:11,400 Tak som sa deje priamo pred poľa, 637 00:52:11,400 --> 00:52:19,230 a kvôli tomu, ako, ako som povedal minulý týždeň, ak je to technicky stack rastie dolu, 638 00:52:19,230 --> 00:52:28,520 keď index do poľa, sú zaručené sme, že 0. pozície v poli 639 00:52:28,520 --> 00:52:31,970 vždy sa stane pred prvom mieste v poli. 640 00:52:31,970 --> 00:52:35,900 To je druh, ako som nakreslil minulý týždeň. 641 00:52:35,900 --> 00:52:42,210 Všimnite si, že v spodnej časti máme adresu 0 a na vrchole sme adresu Max. 642 00:52:42,210 --> 00:52:44,880 Zásobník je vždy rastie dolu. 643 00:52:48,100 --> 00:52:53,500 Povedzme, že sme sa rozdeliť i 644 00:52:53,500 --> 00:52:59,680 Sme alokovať integer aj, čo znamená, povedzme, že sa tu celé číslo aj dostane pridelené. 645 00:52:59,680 --> 00:53:06,420 Potom sme prideliť našu ponuku 5 celých čísel, čo znamená, že pod tým, 646 00:53:06,420 --> 00:53:11,230 pretože zásobník rastie dole, dostať pridelené tých 5 celé čísla. 647 00:53:11,230 --> 00:53:15,900 Ale pretože, ako pole pracovať, to zaručuje, že sme prvé pozície v poli 648 00:53:15,900 --> 00:53:22,260 má vždy adresu menší ako druhý vec v poli. 649 00:53:22,260 --> 00:53:28,270 Takže array poloha 0 musí vždy stáť prvý v pamäti, 650 00:53:28,270 --> 00:53:30,700 vzhľadom k tomu, polia pozíciu 1 má stať potom, čo 651 00:53:30,700 --> 00:53:33,310 a pole pozície 2 sa stane po tom, 652 00:53:33,310 --> 00:53:37,900 čo znamená, že pole v polohe 0 by sa stalo, niekde tu dole, 653 00:53:37,900 --> 00:53:40,690 Pole pozície 1 by sa stalo, že vyššie 654 00:53:40,690 --> 00:53:45,530 pretože pohybujúce sa rozumie vyššia adresy, pretože maximálna adresa je tu. 655 00:53:45,530 --> 00:53:50,490 Takže pole [0] sa tu, array [1] tu, array [2] tu, array [3] tu. 656 00:53:50,490 --> 00:53:55,620 Všimnite si, ako pred tým, ako pridelí celé číslo aj po celú cestu až sem, 657 00:53:55,620 --> 00:54:01,040 ako sme sa presunúť ďalej a ďalej do nášho poľa, sme stále bližšie a bližšie k nášmu celé číslo i 658 00:54:01,040 --> 00:54:07,640 To len tak sa stane, že pole [5], čo je o jednu pozíciu nad naše polia, 659 00:54:07,640 --> 00:54:13,010 je presne tam, kde celé číslo aj stalo ktoré majú byť pridelené. 660 00:54:13,010 --> 00:54:16,920 Tak to je miesto, kde sme sa náhodou biť priestor na zásobníku 661 00:54:16,920 --> 00:54:21,680 , Ktorá bola pridelená pre celočíselné aj, a my sme nastavení, ktoré sa 0. 662 00:54:21,680 --> 00:54:26,160 >> To je, ako to funguje. Otázky? Jo. 663 00:54:26,160 --> 00:54:30,710 [Študent] To nevadí. Dobre. 664 00:54:30,710 --> 00:54:33,090 [Študent] Ako sa vyhnúť týmto druh chyby? 665 00:54:33,090 --> 00:54:41,190 Tieto druh chyby? Nepoužívajte C ako programovací jazyk. 666 00:54:41,190 --> 00:54:45,840 Používajte jazyk, ktorý má pole medze kontroly. 667 00:54:45,840 --> 00:54:55,900 Tak dlho, ako ste opatrní, stačí, aby sa zabránilo ísť za hranice svojho poľa. 668 00:54:55,900 --> 00:54:58,300 [Študent] Tak tu, keď sme išli okolo hranice svojho poľa - 669 00:54:58,300 --> 00:55:01,840 [Bowden] To je miesto, kde sa veci začnú zle. >> [Študent] Oh, dobre. 670 00:55:01,840 --> 00:55:05,730 Tak dlho, ako si pobyt v pamäti pridelenej pre polia, že si v poriadku. 671 00:55:05,730 --> 00:55:12,400 Ale C robí žiadnu kontrolu chýb. Ak to urobím pole [1000], bude to s radosťou len zmeniť nech sa stane čokoľvek - 672 00:55:12,400 --> 00:55:16,500 Ide to na začiatku poľa, potom ide 1000 postavenie po a nastaví na hodnotu 0. 673 00:55:16,500 --> 00:55:20,000 To nerobí žiadnu kontrolu, že oh, to nie je v skutočnosti mať 1000 vecí v ňom. 674 00:55:20,000 --> 00:55:22,750 1000 je ďaleko za to, čo som mala byť zmena, 675 00:55:22,750 --> 00:55:26,940 vzhľadom k tomu, Java alebo niečo dostanete ponuku z indexu Bounds 676 00:55:26,940 --> 00:55:29,820 alebo index out of Bounds výnimky. 677 00:55:29,820 --> 00:55:33,950 To je dôvod, prečo mnoho jazykoch vyššej úrovne majú tieto veci 678 00:55:33,950 --> 00:55:37,340 kde keď idete za hranice poľa, sa vám to nepodarí 679 00:55:37,340 --> 00:55:40,070 takže nie je možné meniť veci z pod vami 680 00:55:40,070 --> 00:55:42,590 a potom sa veci ísť oveľa horšie, než len dostať výnimku 681 00:55:42,590 --> 00:55:44,940 hovorí, že ste šiel za koniec poľa. 682 00:55:44,940 --> 00:55:50,970 [Študent] A tak sme mali iba zmenil <= len > [Bowden] Jo. 683 00:55:50,970 --> 00:55:54,800 To by malo byť 00:55:59,560 pretože sizeof (pole) je 20, ale chceme len 5. >> [Študent] Právo. 685 00:55:59,560 --> 00:56:04,060 Ďalšie otázky? Dobre. 686 00:56:04,060 --> 00:56:07,380 >> [Študent] Mám dotaz. Jo >>. 687 00:56:07,380 --> 00:56:16,440 [Študent] Aký je skutočný pole premenná? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Ako čo je pole? 689 00:56:20,000 --> 00:56:24,930 Array sám je symbolom. 690 00:56:24,930 --> 00:56:31,490 Je to práve adresa začiatku 20 bajtov, ktoré sme odkazujúcich. 691 00:56:31,490 --> 00:56:38,070 Môžete si ju predstaviť ako ukazovateľ, ale je to konštanta ukazovateľ. 692 00:56:38,070 --> 00:56:44,140 Akonáhle sa veci zhromaždené, premenná pole už neexistuje. 693 00:56:44,140 --> 00:56:48,210 [Študent] Tak ako to zistiť veľkosť poľa? 694 00:56:48,210 --> 00:56:54,130 Veľkosť poľa sa odkazuje na veľkosť tohto bloku, ktorý tento symbol odkazuje. 695 00:56:54,130 --> 00:57:01,240 Keď som urobiť niečo ako printf ("% p \ n", pole); 696 00:57:01,240 --> 00:57:05,140 poďme spustiť. 697 00:57:12,960 --> 00:57:15,530 Čo som práve urobil zle? 698 00:57:15,530 --> 00:57:19,220 Array "array" vyhlásil tu. 699 00:57:20,820 --> 00:57:23,200 Oh, tu. 700 00:57:23,200 --> 00:57:31,250 Rinčať je šikovný, a to sa stane si, že som vyhlásil poľa ako 5 elementov 701 00:57:31,250 --> 00:57:34,540 ale ja som indexovanie do polohy 1000. 702 00:57:34,540 --> 00:57:38,450 To môže urobiť, pretože to sú len konštanty. 703 00:57:38,450 --> 00:57:43,370 To môže ísť len tak ďaleko, všimol si, že budem mimo hranice poľa. 704 00:57:43,370 --> 00:57:46,880 Všimnime si ale predtým, keď sme mali aj byť nesprávne, 705 00:57:46,880 --> 00:57:51,040 nemožno presne určiť, koľko hodnôt by som si mohol vziať na, 706 00:57:51,040 --> 00:57:55,540 tak to nemôže stanoviť, že som šiel za koniec poľa. 707 00:57:55,540 --> 00:57:59,430 To je len zvonenie je šikovný. 708 00:57:59,430 --> 00:58:03,340 >> Ale teraz robiť buggy4. Takže čo iného robím zle? 709 00:58:03,340 --> 00:58:05,970 Implicitne prehlasuje knižničný funkcie "printf". 710 00:58:05,970 --> 00:58:14,960 Budem chcieť, aby # include . 711 00:58:14,960 --> 00:58:18,710 Dobre. Teraz beží buggy4. 712 00:58:18,710 --> 00:58:24,840 Tlač hodnotu poľa ako ja tu, potlač ako ukazovateľ 713 00:58:24,840 --> 00:58:30,060 postery niečo, čo vyzerá takto - bfb8805c - čo je asi adresa 714 00:58:30,060 --> 00:58:33,450 že je v zásobníku-ish regiónu. 715 00:58:33,450 --> 00:58:41,820 Pole sám je ako ukazovateľ, ale nie je to skutočný ukazovateľ, 716 00:58:41,820 --> 00:58:45,410 pretože bežný ukazovateľ môžeme zmeniť. 717 00:58:45,410 --> 00:58:54,700 Pole je len nejaká konštanta. V 20 blokov pamäti kto na adrese 0xbfb8805c. 718 00:58:54,700 --> 00:59:09,020 Takže bfb8805c prostredníctvom tejto adrese +20- alebo myslím -20 - 719 00:59:09,020 --> 00:59:17,400 je všetky pamäte pridelené pre toto pole. 720 00:59:17,400 --> 00:59:20,350 Array, je premenná sama nie je uložené kdekoľvek. 721 00:59:20,350 --> 00:59:27,660 Keď ste zostavovaní, kompilátor - Hand Wave na to - 722 00:59:27,660 --> 00:59:33,060 ale kompilátor bude len používať, ak vie, pole sa. 723 00:59:33,060 --> 00:59:36,090 Vie, kde toto pole začína, 724 00:59:36,090 --> 00:59:40,910 a tak to môže vždy len robiť veci, pokiaľ ide o kompenzácie od tohto začiatku. 725 00:59:40,910 --> 00:59:43,960 To nepotrebuje premennú sám reprezentovať poľa. 726 00:59:43,960 --> 00:59:53,730 Ale keď som niečo také int * p = pole; teraz p je ukazovateľ, ktorý ukazuje na tomto poli, 727 00:59:53,730 --> 00:59:57,830 a teraz p vlastne neexistuje v zásobníku. 728 00:59:57,830 --> 01:00:01,950 Som voľná zmeniť ks. Môžem p = malloc. 729 01:00:01,950 --> 01:00:06,500 Tak to pôvodne zamerala na pole, teraz to ukazuje na nejaký priestor na halde. 730 01:00:06,500 --> 01:00:09,620 Nemôžem pole = malloc. 731 01:00:09,620 --> 01:00:13,710 Ak zvonenie je šikovný, bude to na mňa kričať hneď bat. 732 01:00:17,000 --> 01:00:21,430 Vlastne, som si celkom istý, gcc by to taky. 733 01:00:21,430 --> 01:00:25,010 Takže typ poľa "int [5]" nie je prevoditeľná. 734 01:00:25,010 --> 01:00:28,040 Nemôžete priradiť niečo typu poľa 735 01:00:28,040 --> 01:00:30,500 pretože pole je len konštantný. 736 01:00:30,500 --> 01:00:34,760 Je to symbol, ktorý odkazuje táto 20 bytov. Nemôžem to zmeniť. 737 01:00:34,760 --> 01:00:37,690 >> [Študent] A, kde je veľkosť poľa uložená? 738 01:00:37,690 --> 01:00:40,670 [Bowden] To nie je uložené kdekoľvek. Je to, keď je to kompiláciu. 739 01:00:40,670 --> 01:00:46,310 Takže, kde je veľkosť poľa uložené? 740 01:00:46,310 --> 01:00:51,870 Môžete použiť iba sizeof (pole) vo vnútri funkcie, ktorá pole je deklarovaná sám. 741 01:00:51,870 --> 01:01:03,150 Takže keď urobím nejakú funkciu, foo, a ja (int array []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (pole)); 743 01:01:10,450 --> 01:01:21,330 a potom sem zavolám foo (array); 744 01:01:21,330 --> 01:01:24,840 vnútri tejto funkcie - poďme ho spustiť. 745 01:01:34,200 --> 01:01:36,840 To je zvonenie je šikovný znovu. 746 01:01:36,840 --> 01:01:43,890 To mi hovorí, že sizeof na pole parametra funkcie 747 01:01:43,890 --> 01:01:46,690 vráti veľkosť "int * '. 748 01:01:46,690 --> 01:01:55,150 To by bolo chybou, ak to nie je to, čo som chcel aby sa to stalo. 749 01:01:55,150 --> 01:01:58,960 Poďme skutočne vypnúť Werror. 750 01:02:14,950 --> 01:02:17,590 Varovanie. Varovania sú v poriadku. 751 01:02:17,590 --> 01:02:19,960 To bude ešte zostaviť tak dlho, ako to má varovanie. 752 01:02:19,960 --> 01:02:22,910 . / A.out bude tlačiť 4. 753 01:02:22,910 --> 01:02:28,650 Varovanie, ktorý bol vytvorený, je jasným ukazovateľom toho, čo sa stalo. 754 01:02:28,650 --> 01:02:34,120 Tento int pole je len tak tlačiť sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Aj keď som dal ponuku [5] tu, je to stále len tak tlačiť sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Takže akonáhle odovzdáte ho do funkcie, rozdiel medzi poľami a ukazovatele 757 01:02:47,440 --> 01:02:49,670 neexistuje. 758 01:02:49,670 --> 01:02:52,640 To sa stane, že pole, ktorý bol vyhlásený na zásobníku, 759 01:02:52,640 --> 01:02:58,300 ale akonáhle sme sa prejsť túto hodnotu, že 0xbf bla, bla, bla do tejto funkcie, 760 01:02:58,300 --> 01:03:03,350 potom tento ukazovateľ ukazuje na danom poli na zásobníku. 761 01:03:03,350 --> 01:03:08,310 Takže to znamená, že sizeof platí len vo funkcii, ktorá poľa bola vyhlásená, 762 01:03:08,310 --> 01:03:11,230 čo znamená, že keď sa zostavovaní túto funkciu, 763 01:03:11,230 --> 01:03:17,330 Pri zvonení prechádza tejto funkcie, to vidí pole je int pole o veľkosti 5. 764 01:03:17,330 --> 01:03:20,640 Takže potom to vidí sizeof (pole). No, to je 20. 765 01:03:20,640 --> 01:03:26,440 To je vlastne, ako sizeof funguje v podstate takmer vo všetkých prípadoch. 766 01:03:26,440 --> 01:03:31,150 Sizeof nie je funkcia, je to operátor. 767 01:03:31,150 --> 01:03:33,570 Nemusíte volať sizeof funkciu. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), bude kompilátor len prekladať ktoré až 4. 769 01:03:41,480 --> 01:03:43,700 Máš to? Dobre. 770 01:03:43,700 --> 01:03:47,520 >> [Študent] Tak v čom je rozdiel medzi sizeof (pole) v hlavnej a foo? 771 01:03:47,520 --> 01:03:52,840 To je preto, že hovoríte, že sizeof (pole), čo je z * typ int, 772 01:03:52,840 --> 01:03:57,120 vzhľadom k tomu, polia tu dole nemá * typu int, je to int pole. 773 01:03:57,120 --> 01:04:04,540 >> [Študent] Takže ak ste mali parameter v poli [] namiesto int * pole, 774 01:04:04,540 --> 01:04:09,230 by znamenalo, že by ste mohli ešte zmeniť pole, pretože teraz je to ukazovateľ? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Like this? >> [Študent] Jo. Môžete zmeniť pole vo funkcii teraz? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Dalo by sa zmeniť pole v oboch prípadoch. 777 01:04:18,420 --> 01:04:23,130 V oboch týchto prípadoch si budete môcť povedať, array [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Študent] Ale môžete si pole prejdite na niečo iné? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Jo. V oboch prípadoch - >> [študentka] Jo. 780 01:04:30,230 --> 01:04:38,410 [Bowden] Rozdiel medzi pole [] a int * pole, tam nie je nikto. 781 01:04:38,410 --> 01:04:42,570 Môžete tiež získať nejaké viacrozmerné pole tu 782 01:04:42,570 --> 01:04:47,050 pre niektoré pohodlné syntaxe, ale je to stále len ukazovateľ. 783 01:04:47,050 --> 01:04:56,400 To znamená, že som si môže robiť, pole = malloc (sizeof (int)), a teraz ukazujú niekam inam. 784 01:04:56,400 --> 01:04:59,610 Ale rovnako ako, ako to funguje navždy a vždy, 785 01:04:59,610 --> 01:05:03,210 Zmenou tohto poľa tým, že ho upozorniť na niečo iné 786 01:05:03,210 --> 01:05:07,570 nemení toto pole tu dole, pretože je to kópia argumentu, 787 01:05:07,570 --> 01:05:10,780 to nie je ukazovateľ na tento argument. 788 01:05:10,780 --> 01:05:16,070 A skutočne, rovnako ako ďalšie znamenie, že je to presne to isté - 789 01:05:16,070 --> 01:05:21,100 sme už videli, čo tlačiarenský pole - 790 01:05:21,100 --> 01:05:31,410 čo keby sme vytlačiť adresu poľa alebo adresu na adresu poľa 791 01:05:31,410 --> 01:05:36,290 buď z nich? 792 01:05:41,770 --> 01:05:45,220 Poďme ignorovať tento jeden. 793 01:05:48,140 --> 01:05:51,660 Dobre. To je v poriadku. Je to teraz beží. / A.out. 794 01:05:51,660 --> 01:06:00,220 Potlač pole, potom tlač adresu poľa, sú jedno a to isté. 795 01:06:00,220 --> 01:06:02,870 Array jednoducho neexistuje. 796 01:06:02,870 --> 01:06:08,190 To vie, kedy tlačíte pole, tlačíte na symbol, ktorý odkazuje na tých 20 bajtov. 797 01:06:08,190 --> 01:06:11,940 Tlač adresu poľa, dobre, pole neexistuje. 798 01:06:11,940 --> 01:06:17,200 To nemá adresu, tak to jednoducho vytlačí adresu týchto 20 bajtov. 799 01:06:20,820 --> 01:06:28,150 Akonáhle budete kompilovať dole, ako v kompilované buggy4. / A.out, 800 01:06:28,150 --> 01:06:30,340 poľa je neexistujúce. 801 01:06:30,340 --> 01:06:33,640 Ukazovatele existujú. Pole nie. 802 01:06:34,300 --> 01:06:38,060 Bloky pamäte predstavuje pole stále existujú, 803 01:06:38,060 --> 01:06:43,270 ale premenná poľa a premenné tohto typu neexistujú. 804 01:06:46,260 --> 01:06:50,270 Tí sú ako z hlavných rozdielov medzi poľami a ukazovatele 805 01:06:50,270 --> 01:06:55,590 sú, akonáhle urobíte volanie funkcie, nie je tam žiadny rozdiel. 806 01:06:55,590 --> 01:07:00,460 Ale vo vnútri funkcie, ktoré polia má vyhlásenie, sizeof pracuje odlišne 807 01:07:00,460 --> 01:07:05,190 pretože tlačíte veľkosť blokov namiesto veľkosti typu, 808 01:07:05,190 --> 01:07:08,950 a môžete ho zmeniť, pretože je to symbol. 809 01:07:08,950 --> 01:07:14,370 Tlač vec a adresu veci vytlačí rovnakú vec. 810 01:07:14,370 --> 01:07:18,480 A to je celkom veľa to. 811 01:07:18,480 --> 01:07:20,820 [Študent] Mohli by ste povedať, že ešte raz? 812 01:07:21,170 --> 01:07:24,170 Možno som niečo uniklo. 813 01:07:24,170 --> 01:07:29,260 Tlač poľa a adresa poľa vypíše to isté, 814 01:07:29,260 --> 01:07:33,180 vzhľadom k tomu, ak tlačíte ukazovateľ oproti adresu ukazovatele, 815 01:07:33,180 --> 01:07:36,010 jedna vec vytlačí adresu toho, čo ste ukázal, 816 01:07:36,010 --> 01:07:40,360 iný vytlačí adresu ukazovateľom na zásobníku. 817 01:07:40,360 --> 01:07:47,040 Môžete zmeniť ukazovateľ, nemôžete zmeniť pole symbol. 818 01:07:47,740 --> 01:07:53,270 A sizeof ukazovateľ bude tlačiť veľkosť tohto ukazovateľa typu. 819 01:07:53,270 --> 01:07:57,470 Takže int * p sizeof (p) sa bude tlačiť 4, 820 01:07:57,470 --> 01:08:04,110 ale int array [5] print sizeof (pole), bude k tlači 20. 821 01:08:04,110 --> 01:08:07,480 [Študent] Tak int array [5] sa vytlačí 20? Áno >>. 822 01:08:07,480 --> 01:08:13,300 Preto vnútri buggy4 keď to bolo sizeof (pole) 823 01:08:13,300 --> 01:08:16,660 to bolo robil aj <20, čo nie je to, čo sme chceli. 824 01:08:16,660 --> 01:08:20,880 Chceme aj <5. >> [Študent] Dobre. 825 01:08:20,880 --> 01:08:25,569 [Bowden] A potom, akonáhle začnete prechádzať v funkciami, 826 01:08:25,569 --> 01:08:34,340 keby sme int * p = array; 827 01:08:34,340 --> 01:08:39,779 vnútri tejto funkcie, môžeme v podstate použiť p a polia v presne rovnakým spôsobom, 828 01:08:39,779 --> 01:08:43,710 okrem problému sizeof a meniace problém. 829 01:08:43,710 --> 01:08:49,810 Ale p [0] = 1, je rovnaký ako porekadlo pole [0] = 1; 830 01:08:49,810 --> 01:08:55,600 A akonáhle hovoríme foo (array), alebo foo (p); 831 01:08:55,600 --> 01:08:59,760 vnútri funkcie foo, to je rovnaký hovor dvakrát. 832 01:08:59,760 --> 01:09:03,350 Nie je žiadny rozdiel medzi týmito dvoma hovormi. 833 01:09:07,029 --> 01:09:11,080 >> Všetci dobre na to? Dobre. 834 01:09:14,620 --> 01:09:17,950 Máme 10 minút. 835 01:09:17,950 --> 01:09:28,319 >> Budeme sa snažiť dostať sa cez tento program Hacker Typer, 836 01:09:28,319 --> 01:09:32,350 tento web, ktorý vyšiel v minulom roku alebo tak niečo. 837 01:09:34,149 --> 01:09:41,100 Je to proste má byť, ako píšete náhodne, a to vytlačí - 838 01:09:41,100 --> 01:09:46,729 Či súbor sa to stane, že v zásobníku sa, ako to vyzerá píšete. 839 01:09:46,729 --> 01:09:52,069 Vyzerá to ako nejaký druh operačného systému kódu. 840 01:09:53,760 --> 01:09:56,890 To je to, čo chceme realizovať. 841 01:10:08,560 --> 01:10:11,690 Mali by ste mať binárny spustiteľný názvom hacker_typer 842 01:10:11,690 --> 01:10:14,350 ktorý berie v jedinom argumente, súbor "hacker typu." 843 01:10:14,350 --> 01:10:16,480 Spustenie spustiteľný by vyčistiť obrazovku 844 01:10:16,480 --> 01:10:20,850 a potom vytlačiť jeden znak z odovzdaný v súbore zakaždým, keď užívateľ stlačí kláves. 845 01:10:20,850 --> 01:10:24,990 Takže bez ohľadu na kľúč stlačení, mal by vyhodiť a namiesto toho vytlačí znak zo súboru 846 01:10:24,990 --> 01:10:27,810 že je argument. 847 01:10:29,880 --> 01:10:34,350 Budem celkom veľa povedať, čo veci budeme potrebovať vedieť, sú. 848 01:10:34,350 --> 01:10:36,440 Ale chceme sa pozrieť na knižnicu termios. 849 01:10:36,440 --> 01:10:44,840 Nikdy som používal tento knižnicu v celom mojom živote, tak to má veľmi minimálny účely. 850 01:10:44,840 --> 01:10:48,610 Ale to bude knižnica môžeme použiť vyhodiť znak, ktorý hit 851 01:10:48,610 --> 01:10:52,390 keď píšete do štandardu palcov 852 01:10:56,970 --> 01:11:05,840 Takže hacker_typer.c, a budeme chcieť, aby # include . 853 01:11:05,840 --> 01:11:12,870 Pri pohľade na manuálové stránke pre termios - ja hádať, že je to terminál OS alebo tak niečo - 854 01:11:12,870 --> 01:11:16,240 Ja neviem, ako to čítať. 855 01:11:16,240 --> 01:11:21,040 Pri pohľade na to, že hovorí, že aj na tieto 2 súbory, takže budeme robiť, že. 856 01:11:37,620 --> 01:11:46,820 >> Prvá vec, ktorú ako prvý, chceme, aby sa v jedinom argumente, ktorý je súbor by sme mali otvoriť. 857 01:11:46,820 --> 01:11:52,420 Tak čo chcem robiť? Ako môžem skontrolovať, či mám jediný argument? 858 01:11:52,420 --> 01:11:56,480 [Študent] Ak argc rovná ju. >> [Bowden] Jo. 859 01:11:56,480 --> 01:12:21,250 Takže if (argc = 2!) Printf ("Použitie:% s [súbor otvoriť]"). 860 01:12:21,250 --> 01:12:32,750 Takže teraz, keď spustím to bez udania druhý argument - oh, potrebujem novú linku - 861 01:12:32,750 --> 01:12:36,240 uvidíte, že hovorí použitie:. / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 a potom druhý argument by mal byť súbor chcem otvoriť. 863 01:12:58,430 --> 01:13:01,260 Teraz, čo mám robiť? 864 01:13:01,260 --> 01:13:08,490 Chcem čítať z tohto súboru. Ako som čítal zo súboru? 865 01:13:08,490 --> 01:13:11,920 [Študent] môžete otvoriť ako prvý. Jo >>. 866 01:13:11,920 --> 01:13:15,010 Tak fopen. Čo fopen vyzerá? 867 01:13:15,010 --> 01:13:22,980 [Študent] súboru. >> [Bowden] súboru bude ArGV [1]. 868 01:13:22,980 --> 01:13:26,110 [Študent] A potom to, čo chcete robiť s tým, aby - >> [Bowden] Jo. 869 01:13:26,110 --> 01:13:28,740 Takže ak ste si spomenúť, mohol by si urobiť muž fopen, 870 01:13:28,740 --> 01:13:32,960 kde to bude const char * path, kde path je meno súboru, 871 01:13:32,960 --> 01:13:34,970 const char * mode. 872 01:13:34,970 --> 01:13:38,660 Ak ste náhodou nepamätáte, čo je režim, potom sa môžete pozrieť na režim. 873 01:13:38,660 --> 01:13:44,660 Vnútri manuálových stránok, znak lomítko je to, čo môžete použiť na vyhľadanie veci. 874 01:13:44,660 --> 01:13:49,790 Tak som typ / režim vyhľadávania pre režim. 875 01:13:49,790 --> 01:13:57,130 n a N sú to, čo môžete použiť na prechádzanie vyhľadávania zápasov. 876 01:13:57,130 --> 01:13:59,800 Tu sa hovorí, že body argumentov režimu na reťazec 877 01:13:59,800 --> 01:14:01,930 začína s jedným z nasledujúcich postupností. 878 01:14:01,930 --> 01:14:06,480 Takže r, Open textový súbor pre čítanie. To je to, čo chceme robiť. 879 01:14:08,930 --> 01:14:13,210 Pre čítanie, a chcem uložiť, že. 880 01:14:13,210 --> 01:14:18,720 Vec bude FILE *. Teraz, čo chcem robiť? 881 01:14:18,720 --> 01:14:21,200 Dajte mi chvíľku. 882 01:14:28,140 --> 01:14:30,430 Dobre. Teraz, čo chcem robiť? 883 01:14:30,430 --> 01:14:32,940 [Študent] Skontrolujte, či je to NULL. >> [Bowden] Jo. 884 01:14:32,940 --> 01:14:38,690 Zakaždým, keď otvoríte súbor, uistite sa, že ste úspešne schopný otvoriť. 885 01:14:58,930 --> 01:15:10,460 >> Teraz chcem urobiť, aby termios veci tam, kde chcem najprv prečítať moje súčasné nastavenie 886 01:15:10,460 --> 01:15:14,050 a zachrániť tých, do niečoho, potom chcem zmeniť svoje nastavenie 887 01:15:14,050 --> 01:15:19,420 vyhodiť ľubovoľný znak, ktorý som typ, 888 01:15:19,420 --> 01:15:22,520 a potom chcem aktualizovať tieto nastavenia. 889 01:15:22,520 --> 01:15:27,250 A potom na konci programu, chcem zmeniť späť na svoje pôvodné nastavenia. 890 01:15:27,250 --> 01:15:32,080 Takže struct bude typových termios, a budem chcieť dva ty. 891 01:15:32,080 --> 01:15:35,600 Prvý z nich bude moja current_settings, 892 01:15:35,600 --> 01:15:42,010 a potom to bude moja hacker_settings. 893 01:15:42,010 --> 01:15:48,070 Po prvé, budem chcieť uložiť svoje aktuálne nastavenia, 894 01:15:48,070 --> 01:15:53,790 potom budem chcieť aktualizovať hacker_settings, 895 01:15:53,790 --> 01:16:01,570 a potom ako na konci svojho programu, chcem sa vrátiť na aktuálne nastavenie. 896 01:16:01,570 --> 01:16:08,660 Takže uloženie aktuálne nastavenie, tak, že funguje, my man termios. 897 01:16:08,660 --> 01:16:15,810 Vidíme, že máme túto int tcsetattr, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Minul som v termios struct svojim ukazovateľ. 899 01:16:22,960 --> 01:16:30,640 Spôsob, akým to bude vyzerať, je - I've už zabudli, čo funkcia bola volaná. 900 01:16:30,640 --> 01:16:34,930 Skopírujte a vložte ju. 901 01:16:39,150 --> 01:16:45,500 Takže tcgetattr, potom chcem odovzdať v struct, že som uloženie informácií v, 902 01:16:45,500 --> 01:16:49,650 ktorá sa bude current_settings, 903 01:16:49,650 --> 01:16:59,120 a prvý argument je deskriptor súboru pre vec, ktorú chcem uložiť atribúty. 904 01:16:59,120 --> 01:17:04,360 Čo popisovač súboru je je ako kedykoľvek otvorte súbor, dostane popisovač súboru. 905 01:17:04,360 --> 01:17:14,560 Keď som fopen ArGV [1], sa dostane popisovač súboru, ktorý ste odkazujúce 906 01:17:14,560 --> 01:17:16,730 zakaždým, keď chcete čítať alebo do nej zapisovať. 907 01:17:16,730 --> 01:17:19,220 To nie je deskriptor súboru chcem používať tu. 908 01:17:19,220 --> 01:17:21,940 K dispozícii sú tri deskriptory súborov, ktoré máte v predvolenom nastavení, 909 01:17:21,940 --> 01:17:24,310 ktoré sú štandardné v, štandardný výstup a štandardné chyba. 910 01:17:24,310 --> 01:17:29,960 V predvolenom nastavení, myslím, že je to štandard v je 0, štandardný výstup je 1 a štandardná odchýlka je 2. 911 01:17:29,960 --> 01:17:33,980 Takže to, čo chcem zmeniť nastavenia? 912 01:17:33,980 --> 01:17:37,370 Chcem zmeniť nastavenie, keď som trafil postavu, 913 01:17:37,370 --> 01:17:41,590 Chcem, aby to hodiť, že charakter preč namiesto tlače na obrazovku. 914 01:17:41,590 --> 01:17:45,960 Čo potok - štandard v, štandardný výstup, alebo štandardné chybou - 915 01:17:45,960 --> 01:17:52,050 reaguje na veci, keď som typ na klávesnici? >> [Študent] Štandardné a >> Jo. 916 01:17:52,050 --> 01:17:56,450 Tak som si buď urobiť 0, alebo môžem urobiť stdin. 917 01:17:56,450 --> 01:17:59,380 Začínam sa current_settings z normy a 918 01:17:59,380 --> 01:18:01,720 >> Teraz chcem aktualizovať tieto nastavenia, 919 01:18:01,720 --> 01:18:07,200 takže prvý budem kopírovať do hacker_settings, čo moji current_settings sú. 920 01:18:07,200 --> 01:18:10,430 A ako structs práce je, že bude len kopírovať. 921 01:18:10,430 --> 01:18:14,510 To skopíruje všetky polia, ako by ste očakávali. 922 01:18:14,510 --> 01:18:17,410 >> Teraz chcem aktualizovať niektoré z polí. 923 01:18:17,410 --> 01:18:21,670 Pri pohľade na termios, by ste si prečítať cez veľa to 924 01:18:21,670 --> 01:18:24,110 len aby videl, čo by ste chceli hľadať, 925 01:18:24,110 --> 01:18:28,210 ale príznaky budete chcieť hľadať, sú echo, 926 01:18:28,210 --> 01:18:33,110 tak ECHO znaky Echo vstupné. 927 01:18:33,110 --> 01:18:37,710 Najprv chcem nastaviť - I've už zabudli, čo sú polia. 928 01:18:45,040 --> 01:18:47,900 To je to, čo struct vyzerá. 929 01:18:47,900 --> 01:18:51,060 Takže vstupné režimy myslím, že chceme zmeniť. 930 01:18:51,060 --> 01:18:54,210 My sa pozrieme na riešenie, aby sa ubezpečil, že je to to, čo chceme zmeniť. 931 01:19:04,060 --> 01:19:12,610 Chceme zmeniť lflag, aby sa zabránilo nutnosti prezrieť všetky tieto. 932 01:19:12,610 --> 01:19:14,670 Chceme zmeniť miestne režimy. 933 01:19:14,670 --> 01:19:17,710 Budete musieť prečítať tento celú vec pochopiť, kde všetko patrí 934 01:19:17,710 --> 01:19:19,320 že chceme zmeniť. 935 01:19:19,320 --> 01:19:24,120 Ale je to vo vnútri miestnych režimov, kde budeme chcieť zmeniť. 936 01:19:27,080 --> 01:19:33,110 Takže hacker_settings.cc_lmode je to, čo sa volá. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 To je miesto, kde sme sa dostali do bitovej operátormi. 939 01:19:52,280 --> 01:19:54,860 Sme trochu oneskorene, ale my pôjdeme cez to naozaj rýchlo. 940 01:19:54,860 --> 01:19:56,600 To je miesto, kde sme sa dostali do operátormi bitovej, 941 01:19:56,600 --> 01:19:59,950 kde Myslím, že som povedal, jeden čas dávno, že pri každom spustení zaoberajúce sa vlajkami, 942 01:19:59,950 --> 01:20:03,370 budete používať bitového súčinu prevádzkovateľovi veľa. 943 01:20:03,370 --> 01:20:08,240 Každý bit vo vlajke zodpovedá nejaké správanie. 944 01:20:08,240 --> 01:20:14,090 Tak tu, tento príznak má veľa rôznych vecí, kde všetci z nich znamenať niečo iné. 945 01:20:14,090 --> 01:20:18,690 Ale to, čo chcem urobiť, je jednoducho vypnúť bit, ktorý zodpovedá ECHO. 946 01:20:18,690 --> 01:20:25,440 Takže zase, že vypnutie robím & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 Vlastne si myslím, že je to ako TECHO, alebo tak niečo. Idem len skontrolovať znova. 948 01:20:30,110 --> 01:20:34,050 Môžem termios to. Je to len ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO sa bude jeden bit. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO bude znamenať všetky bity sú nastavené na 1, čo znamená, že všetky príznaky sú nastavené na hodnotu true 951 01:20:44,230 --> 01:20:47,140 s výnimkou ECHO bit. 952 01:20:47,140 --> 01:20:53,830 Tým končí moje miestne príznaky s tým, to znamená všetky príznaky, ktoré sú v súčasnej dobe nastavené na hodnotu true 953 01:20:53,830 --> 01:20:56,520 bude stále nastavená na hodnotu true. 954 01:20:56,520 --> 01:21:03,240 Ak je moja ECHO príznak nastavený na true, potom je to nutne nastavená na hodnotu false na ECHO vlajky. 955 01:21:03,240 --> 01:21:07,170 Takže tento riadok kódu len vypne ECHO vlajkou. 956 01:21:07,170 --> 01:21:16,270 Ďalšie riadky kódu, budem len skopírovať v záujme času a potom je vysvetliť. 957 01:21:27,810 --> 01:21:30,180 V roztoku, povedal 0. 958 01:21:30,180 --> 01:21:33,880 Je to asi lepšie explicitne povedať stdin. 959 01:21:33,880 --> 01:21:42,100 >> Všimnite si, že som tiež robil ECHO | icanon tu. 960 01:21:42,100 --> 01:21:46,650 Icanon sa vzťahuje k niečomu samostatné, čo znamená, že kanonické režimu. 961 01:21:46,650 --> 01:21:50,280 Čo kánonický režim znamená, je obvykle, keď píšete z príkazového riadku, 962 01:21:50,280 --> 01:21:54,670 štandard v nespracováva nič, kým nenarazíte nový riadok. 963 01:21:54,670 --> 01:21:58,230 Takže, keď to GetString, zadajte veľa vecí, potom hit nový riadok. 964 01:21:58,230 --> 01:22:00,590 To je, keď je to poslal normy palcov 965 01:22:00,590 --> 01:22:02,680 To je predvolené. 966 01:22:02,680 --> 01:22:05,830 Keď som vypnúť kánonickú režim, hneď každý jednotlivý znak stlačíte 967 01:22:05,830 --> 01:22:10,910 je to, čo dostane spracovávané, čo je zvyčajne trochu zle, pretože je to pomalý spracovať tieto veci, 968 01:22:10,910 --> 01:22:14,330 čo je dôvod, prečo je dobré, aby sa zmiernili do celých riadkov. 969 01:22:14,330 --> 01:22:16,810 Ale chcem každá postava má byť spracované 970 01:22:16,810 --> 01:22:18,810 pretože nechcem, aby na mňa počkať zasiahnuť nový riadok 971 01:22:18,810 --> 01:22:21,280 pred spracováva všetky znaky som písať. 972 01:22:21,280 --> 01:22:24,760 Toto vypne kánonickú režim. 973 01:22:24,760 --> 01:22:31,320 Toto jednoducho znamená, keď v skutočnosti spracováva znaky. 974 01:22:31,320 --> 01:22:35,830 To znamená, že spracovanie je okamžite, akonáhle som písanie, spracovať. 975 01:22:35,830 --> 01:22:42,510 A to je funkcia, ktorá je aktualizácia svoje nastavenia pre štandardné v, 976 01:22:42,510 --> 01:22:45,480 a TCSA prostriedky to urobiť práve teraz. 977 01:22:45,480 --> 01:22:50,310 Ďalšie možnosti sú počkať, až všetko, čo je v súčasnej dobe na toku je spracovaný. 978 01:22:50,310 --> 01:22:52,030 To naozaj nezáleží. 979 01:22:52,030 --> 01:22:56,920 Práve teraz meniť moje nastavenie je všetko, čo je v súčasnej dobe v hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Myslím, že som ju nazval hacker_settings, tak sa poďme zmeniť. 981 01:23:09,610 --> 01:23:13,500 Zmena všetko hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Teraz na konci nášho programu budeme chcieť vrátiť 983 01:23:16,870 --> 01:23:20,210 na to, čo je v súčasnej dobe vo vnútri normal_settings, 984 01:23:20,210 --> 01:23:26,560 ktorý sa bude len vyzerať ako & normal_settings. 985 01:23:26,560 --> 01:23:30,650 Všimnite si, som sa nezmenil žiadny z mojich normal_settings od pôvodne dostať ju. 986 01:23:30,650 --> 01:23:34,520 Potom len zmeniť späť, odovzdám späť na konci. 987 01:23:34,520 --> 01:23:38,390 To bolo aktualizácie. Dobre. 988 01:23:38,390 --> 01:23:43,900 >> Teraz vnútri tu budem vysvetľovať kód v záujme času. 989 01:23:43,900 --> 01:23:46,350 To nie je tak moc code. 990 01:23:50,770 --> 01:24:03,750 Vidíme čítame znak zo súboru. Hovorili sme, že f 991 01:24:03,750 --> 01:24:07,850 Teraz si môže človek fgetc, ale ako fgetc bude fungovať 992 01:24:07,850 --> 01:24:11,910 je len to bude vráti znak, ktorý ste práve prečítali, alebo EOF, 993 01:24:11,910 --> 01:24:15,680 ktorý zodpovedá konci súboru alebo nejaké chyby deje. 994 01:24:15,680 --> 01:24:19,900 Sme slučky, naďalej čítať znak zo súboru, 995 01:24:19,900 --> 01:24:22,420 kým sme došli znakov čítať. 996 01:24:22,420 --> 01:24:26,650 A zatiaľ čo my robíme to, že budeme čakať na jeden znak z normy palcov 997 01:24:26,650 --> 01:24:29,090 Zakaždým si niečo písať v príkazovom riadku, 998 01:24:29,090 --> 01:24:32,820 že číta v charakteru od štandardu a 999 01:24:32,820 --> 01:24:38,330 Potom putchar sa práve chystá dať char čítame tu zo súboru na štandardný výstup. 1000 01:24:38,330 --> 01:24:42,890 Môžete muž putchar, ale je to len uvedenie na štandardný výstup, je to tlač, že charakter. 1001 01:24:42,890 --> 01:24:51,600 Dalo by sa tiež len to, printf ("% c", c); Rovnaký nápad. 1002 01:24:53,330 --> 01:24:56,670 To bude robiť väčšinu našej práce. 1003 01:24:56,670 --> 01:25:00,300 >> Posledná vec, ktorú budeme chcieť urobiť, je len fclose náš súbor. 1004 01:25:00,300 --> 01:25:03,310 Ak nechcete fclose, že je to k pretečeniu pamäte. 1005 01:25:03,310 --> 01:25:06,680 Chceme fclose súbor sme pôvodne otvorený, a myslím, že je to ono. 1006 01:25:06,680 --> 01:25:13,810 Urobíme Ak to, že som už nejaké problémy. 1007 01:25:13,810 --> 01:25:17,260 Poďme sa pozrieť,. 1008 01:25:17,260 --> 01:25:19,960 Čo to sťažujú? 1009 01:25:19,960 --> 01:25:30,220 Predpokladaný "int", ale argument je typu "struct _IO_FILE *". 1010 01:25:36,850 --> 01:25:39,370 Uvidíme, či to funguje. 1011 01:25:45,210 --> 01:25:53,540 Povolený len v C99. Augh. Dobre, aby hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Teraz sme sa dostali ďalšie užitočné popisy. 1013 01:25:57,760 --> 01:25:59,900 Takže použitie nelegálnej identifikátor "normal_settings". 1014 01:25:59,900 --> 01:26:04,170 Nevolal som, že normal_settings. Nazval som ju current_settings. 1015 01:26:04,170 --> 01:26:12,090 Takže poďme zmeniť všetko. 1016 01:26:17,920 --> 01:26:21,710 Teraz okolo argument. 1017 01:26:26,290 --> 01:26:29,500 Budem túto 0 zatiaľ. 1018 01:26:29,500 --> 01:26:36,720 Dobre. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Tiež som vyčistiť obrazovku na začiatku. 1020 01:26:39,590 --> 01:26:42,960 Ale môžete sa pozrieť na posledný problém, aby videl, ako ich vymazať obrazovku. 1021 01:26:42,960 --> 01:26:45,160 Je to jednoducho tlače niektoré znaky 1022 01:26:45,160 --> 01:26:47,210 zatiaľ čo toto je to, čo chcem robiť. 1023 01:26:47,210 --> 01:26:48,900 Dobre. 1024 01:26:48,900 --> 01:26:55,280 A premýšľať o tom, prečo to musela byť 0 namiesto štandardného vstupu, 1025 01:26:55,280 --> 01:27:00,560 , Ktorá by mala byť # vymedziť 0, 1026 01:27:00,560 --> 01:27:03,890 to sa sťažuje, že - 1027 01:27:13,150 --> 01:27:19,360 Ako keď som povedal, že je to popisovače súborov, ale potom máte tiež svoj súbor *, 1028 01:27:19,360 --> 01:27:23,210 popisovač súboru je len jeden integer, 1029 01:27:23,210 --> 01:27:26,970 vzhľadom k tomu, FILE * má veľa vecí s ním spojené. 1030 01:27:26,970 --> 01:27:30,380 Dôvod, prečo sme potrebné hovoriť 0 namiesto štandardného vstupu 1031 01:27:30,380 --> 01:27:37,480 je to, že stdin je FILE *, ktorý poukazuje na to, čo je odkazovanie na deskriptor súboru 0. 1032 01:27:37,480 --> 01:27:45,070 Takže aj tu, keď som si fopen (ArGV [1], začínam si súbor * späť. 1033 01:27:45,070 --> 01:27:51,180 Ale niekde v tom súbore * je vec zodpovedajúce deskriptor súboru pre daný súbor. 1034 01:27:51,180 --> 01:27:57,430 Ak sa pozriete na manuálové stránke pre otvorené, takže myslím, že budete musieť urobiť človek 3 open - Nie - 1035 01:27:57,430 --> 01:27:59,380 man 2 open - jo. 1036 01:27:59,380 --> 01:28:06,250 Ak sa pozriete na stránky pre otvorenú, otvorený je ako nižšie úrovne fopen, 1037 01:28:06,250 --> 01:28:09,350 a je to vráti aktuálne popisovač súboru. 1038 01:28:09,350 --> 01:28:12,050 fopen robí veľa vecí na vrchole otvorené, 1039 01:28:12,050 --> 01:28:17,640 ktoré namiesto vrátenia len, že deskriptor súboru vráti a celú súboru * ukazovateľ 1040 01:28:17,640 --> 01:28:20,590 vnútri ktorej je náš malý deskriptor súboru. 1041 01:28:20,590 --> 01:28:25,020 Takže štandard sa vzťahuje na veci FILE *, 1042 01:28:25,020 --> 01:28:29,120 vzhľadom k tomu, 0 odkazuje len na štandarde deskriptora súboru v sebe. 1043 01:28:29,120 --> 01:28:32,160 >> Otázky? 1044 01:28:32,160 --> 01:28:35,930 [Smiech] prehnal, že. 1045 01:28:35,930 --> 01:28:39,140 Dobrá. Skončili sme. [Smiech] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]