1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Sehemu ya 5 - Zaidi Starehe] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Chuo Kikuu cha Harvard] 3 00:00:04,690 --> 00:00:07,250 [Hii ni CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Kama nilivyosema katika barua pepe yangu, kuna mambo mengi unaweza kutumia 5 00:00:14,250 --> 00:00:17,060 nyingine kuliko appliance kwa kweli kufanya seti tatizo. 6 00:00:17,060 --> 00:00:19,910 Tunapendekeza ya kufanya hivyo katika appliance sababu tu basi tunaweza kwa urahisi zaidi kukusaidia 7 00:00:19,910 --> 00:00:22,070 na tunajua jinsi kila kitu ni kwenda kufanya kazi. 8 00:00:22,070 --> 00:00:26,950 Lakini kama mfano mmoja wa ambapo unaweza kufanya mambo kama, kusema, wewe hawana 9 00:00:26,950 --> 00:00:31,570 kwa appliance au unataka kazi katika basement Center Sayansi - 10 00:00:31,570 --> 00:00:33,090 ambayo kwa kweli wana appliance pia - 11 00:00:33,090 --> 00:00:35,150 kama unataka kufanya kazi mahali popote. 12 00:00:35,150 --> 00:00:42,370 Mfano mmoja ni umeona / sikia SSH? 13 00:00:44,380 --> 00:00:47,780 SSH kimsingi ni kama tu kuungana na kitu. 14 00:00:47,780 --> 00:00:51,340 Kweli, sasa hivi mimi nina SSHed katika appliance. 15 00:00:51,340 --> 00:00:54,290 Mimi kamwe kazi moja kwa moja katika appliance. 16 00:00:55,930 --> 00:01:01,060 Hapa ni appliance, na kama wewe kuangalia chini hapa unaweza kuona hii anwani ya IP. 17 00:01:01,060 --> 00:01:03,650 Mimi kamwe kazi katika appliance yenyewe; 18 00:01:03,650 --> 00:01:08,840 Mimi daima kuja juu na dirisha iTerm2 dirisha / terminal. 19 00:01:08,840 --> 00:01:15,910 Unaweza SSH kwa anwani hiyo IP, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Nakumbuka kwamba idadi urahisi sana kwa sababu ni mfano kama nice. 21 00:01:20,390 --> 00:01:24,920 Lakini hilo kuuliza mimi kwa password yangu, na sasa mimi niko katika appliance. 22 00:01:24,920 --> 00:01:33,060 Kimsingi, katika hatua hii, kama wewe ni kufungua terminal ndani ya appliance yenyewe, 23 00:01:33,060 --> 00:01:36,350 interface hii, hata hivyo ungependa kutumia hiyo, ni sawa 24 00:01:36,350 --> 00:01:40,010 kama interface mimi nina kutumia zaidi ya hapa lakini sasa uko SSHed. 25 00:01:42,240 --> 00:01:44,920 Huna kwa SSH kwa appliance. 26 00:01:44,920 --> 00:01:52,360 Mfano mmoja wa mahali pengine unaweza SSH kwa ni nina uhakika pretty una by default - 27 00:01:52,360 --> 00:01:55,020 Oh. Kubwa. 28 00:01:55,020 --> 00:02:01,130 Wote wa unapaswa kuwa na akaunti FAS default kwenye seva FAS. 29 00:02:01,130 --> 00:02:06,840 Kwa maana mimi, napenda SSH kwa rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Ni kwenda kuuliza kwamba mara ya kwanza, na wewe kusema ndiyo. 31 00:02:11,610 --> 00:02:15,840 Password yangu ni kwenda tu kuwa FAS yangu password. 32 00:02:15,840 --> 00:02:22,650 Na hivyo sasa, mimi nina SSHed servrar nzuri, na mimi siwezi kufanya kitu chochote nataka hapa. 33 00:02:22,650 --> 00:02:28,560 mengi ya madarasa unaweza kuchukua, kama 124, ni kwenda na wewe upload stuff kwa hapa 34 00:02:28,560 --> 00:02:30,950 kwa kweli kuwasilisha tatizo seti yako. 35 00:02:30,950 --> 00:02:34,100 Lakini kusema huna upatikanaji wa appliance yako. 36 00:02:34,100 --> 00:02:37,910 Basi unaweza kufanya mambo, kama hapa, atasema - 37 00:02:37,910 --> 00:02:42,160 Hii ni sehemu yetu ya maswali. 38 00:02:42,160 --> 00:02:45,070 Ni kuuliza wewe kufanya hivyo katika appliance. 39 00:02:45,070 --> 00:02:47,790 Badala yake mimi itabidi kufanya hivyo kwenye seva. 40 00:02:47,790 --> 00:02:50,560 Mimi naenda unzip kwamba. 41 00:02:50,560 --> 00:02:55,670 tatizo ni kwenda kuwa kuwa wewe ni kutumika kwa kutumia kitu kama gedit 42 00:02:55,670 --> 00:02:58,160 au chochote ndani ya appliance. 43 00:02:58,160 --> 00:03:01,830 Wewe hutaenda kuwa na kwamba katika server FAS. 44 00:03:01,830 --> 00:03:04,110 Ni wote kwenda tu kuwa hii interface textual. 45 00:03:04,110 --> 00:03:09,180 Hivyo unaweza aidha moja, kujaribu kujifunza mhariri Nakala kwamba hawana wana. 46 00:03:09,180 --> 00:03:12,130 Wao wana Nano. 47 00:03:12,130 --> 00:03:14,990 Nano ni kawaida pretty rahisi kutumia. 48 00:03:14,990 --> 00:03:19,470 Unaweza kutumia mishale yako na aina ya kawaida. 49 00:03:19,470 --> 00:03:21,250 Basi hiyo ni si ngumu. 50 00:03:21,250 --> 00:03:24,720 Kama unataka kupata kweli dhana unaweza kutumia Emacs, 51 00:03:24,720 --> 00:03:29,850 ambayo mimi pengine haipaswi kuwa kufunguliwa kwa sababu mimi si hata kujua jinsi ya kuifunga Emacs. 52 00:03:29,850 --> 00:03:32,760 Document X, Udhibiti C? Yeah. 53 00:03:32,760 --> 00:03:35,310 Au unaweza kutumia VIM, ambayo ni nini mimi kutumia. 54 00:03:35,310 --> 00:03:37,800 Na hivyo wale ni chaguzi yako. 55 00:03:37,800 --> 00:03:43,830 Kama hutaki kufanya hivyo, unaweza pia, kama ukiangalia manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Juu ya PC, unaweza kutumia SSH putty, 58 00:03:49,920 --> 00:03:51,940 ambayo wewe ni kwenda na download tofauti. 59 00:03:51,940 --> 00:03:55,460 Mac, unaweza tu na default Terminal matumizi au unaweza kushusha iTerm2, 60 00:03:55,460 --> 00:03:58,490 ambayo ni kama Terminal nice, dhana. 61 00:03:58,490 --> 00:04:03,780 Kama wewe kwenda manual.cs50.net utaona zilizounganishwa na Notepad + +, 62 00:04:03,780 --> 00:04:07,120 ambayo ni nini unaweza kutumia PC. 63 00:04:07,120 --> 00:04:13,340 Ni inakuwezesha SFTP kutoka Notepad + +, ambayo kimsingi ni SSH. 64 00:04:13,340 --> 00:04:17,750 Nini hii basi wewe kufanya ni kuhariri faili yako ndani ya nchi, 65 00:04:17,750 --> 00:04:20,670 na kisha kila unataka kuwaokoa, itakuwa ila kwa nice.fas, 66 00:04:20,670 --> 00:04:23,670 ambapo unaweza kisha kukimbia nao. 67 00:04:23,670 --> 00:04:26,880 Na sawa juu ya Mac ni kwenda kuwa TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Hivyo inakuwezesha kufanya kitu kimoja. 69 00:04:28,760 --> 00:04:32,800 Ni inakuwezesha kuhariri faili ndani ya nchi na kuwaokoa nice.fas, 70 00:04:32,800 --> 00:04:35,730 ambapo unaweza kisha kukimbia nao. 71 00:04:35,730 --> 00:04:40,400 Hivyo kama wewe ni milele kukwama bila appliance, una chaguzi hizi 72 00:04:40,400 --> 00:04:44,230 bado kufanya tatizo seti yako. 73 00:04:44,230 --> 00:04:48,250 Tatizo moja ni itakuwa kwamba wewe si kwenda kuwa na maktaba CS50 74 00:04:48,250 --> 00:04:51,580 kwa sababu nice.fas haina na default kuwa na kwamba. 75 00:04:51,580 --> 00:04:55,970 Unaweza ama download maktaba CS50 - 76 00:04:55,970 --> 00:04:58,470 Sidhani mimi haja ya kuwa katika hatua hii. 77 00:04:58,470 --> 00:05:03,270 Unaweza ama download maktaba CS50 na nakala yake juu ya nice.fas, 78 00:05:03,270 --> 00:05:07,450 au nadhani katika hatua hii sisi si kutumia tena anyway. 79 00:05:07,450 --> 00:05:12,720 Au kama sisi kufanya, unaweza kwa muda kuwa badala yake pamoja na 80 00:05:12,720 --> 00:05:18,480 utekelezaji wa majukumu katika maktaba CS50 anyway. 81 00:05:18,480 --> 00:05:21,370 Ili isiwe kwamba mengi ya kizuizi. 82 00:05:21,370 --> 00:05:23,710 Na kwamba ni kwamba. 83 00:05:26,460 --> 00:05:29,820 >> Nitakwenda nyuma appliance sasa, tutaweza kufanya kila kitu katika appliance. 84 00:05:29,820 --> 00:05:37,510 Kuangalia sehemu yetu ya maswali, mwanzoni, kama nilivyosema katika barua pepe yangu, 85 00:05:37,510 --> 00:05:43,620 sisi kuwa na majadiliano kuhusu moja mfupi walipaswa kukesha. 86 00:05:43,620 --> 00:05:51,980 Tuna imetuma Mabomba & na maswali haya matatu. 87 00:05:51,980 --> 00:05:56,070 >> Ambayo mkondo gani kazi kama printf kuandika na default? 88 00:05:56,070 --> 00:05:59,130 Hivyo mkondo. Nini ni mkondo? 89 00:06:06,520 --> 00:06:15,100 mkondo ni kimsingi kama ni baadhi tu - 90 00:06:15,100 --> 00:06:21,450 Si hata chanzo cha 1s na sekunde 0. 91 00:06:21,450 --> 00:06:24,920 mkondo ni kuuliza kwa hapa ni kiwango nje. 92 00:06:24,920 --> 00:06:27,250 Na hivyo kiwango nje ni mkondo kwamba wakati wewe kuandika hayo, 93 00:06:27,250 --> 00:06:30,940 inaonekana kwenye screen. 94 00:06:30,940 --> 00:06:36,860 Nje ya kiwango, na mkondo, ina maana wewe andika tu 1s na sekunde 0 kwa hiyo, 95 00:06:36,860 --> 00:06:40,220 na mwisho mwingine wa nje ya kiwango tu anayesoma kutoka mkondo huo. 96 00:06:40,220 --> 00:06:43,540 Ni kamba tu ya 1s na sekunde 0. 97 00:06:43,540 --> 00:06:45,570 Unaweza kuandika kwa mito au unaweza kusoma kutoka katika mikondo 98 00:06:45,570 --> 00:06:47,950 kutegemea na nini mkondo kweli ni. 99 00:06:47,950 --> 00:06:52,800 wengine wawili default mito ni ya kiwango katika upotofu na kiwango. 100 00:06:52,800 --> 00:06:57,540 Darasa katika wakati wowote ni huna GetString, ni kusubiri kwa wewe stuff pembejeo. 101 00:06:57,540 --> 00:07:01,570 Hivyo ni kusubiri kwa ajili yenu, ni kweli kusubiri juu ya kiwango katika, 102 00:07:01,570 --> 00:07:04,880 ambayo ni kweli nini kupata pale unapoandika kwenye keyboard. 103 00:07:04,880 --> 00:07:07,530 Wewe ni kuandika katika kiwango in 104 00:07:07,530 --> 00:07:10,050 Kosa la kimsingi ni sawa na nje ya kiwango, 105 00:07:10,050 --> 00:07:13,280 lakini ni maalumu katika kwamba wakati magazeti ya hitilafu ya kiwango, 106 00:07:13,280 --> 00:07:16,770 wewe ni walidhani tu magazeti ujumbe wa makosa kwa kuwa 107 00:07:16,770 --> 00:07:20,200 hivyo unaweza kutofautisha kati ya ujumbe wa mara kwa mara kuchapishwa kwa screen 108 00:07:20,200 --> 00:07:24,560 dhidi ya makosa ujumbe kutegemea kama walikwenda kwa kiwango nje au kosa standard. 109 00:07:24,560 --> 00:07:28,660 Files pia. 110 00:07:28,660 --> 00:07:32,440 Darasa la nje, kiwango katika, na makosa ya hali ni tu maalum ya mito, 111 00:07:32,440 --> 00:07:36,810 lakini kwa kweli faili yoyote, wakati wa kufungua faili, inakuwa mkondo ya ka 112 00:07:36,810 --> 00:07:40,740 ambapo unaweza kusoma tu kutoka mkondo huo. 113 00:07:40,740 --> 00:07:47,770 Wewe, kwa sehemu kubwa, unaweza kufikiria tu ya faili kama mkondo wa bytes. 114 00:07:47,770 --> 00:07:51,190 Basi nini mito gani wao kuandika na default? Darasa la nje. 115 00:07:51,190 --> 00:07:56,980 >> Nini tofauti kati ya> na >>? 116 00:07:58,140 --> 00:08:03,710 Je mtu yeyote kuangalia video ya zamani? Sawa. 117 00:08:03,710 --> 00:08:10,960 > Ni kwenda kuwa jinsi redirect katika files, 118 00:08:10,960 --> 00:08:15,240 na >> pia kwenda kwingine pato katika files, 119 00:08:15,240 --> 00:08:17,820 lakini ni badala ya kwenda append na faili. 120 00:08:17,820 --> 00:08:23,430 Kwa mfano, hebu kusema mimi kutokea kwa kuwa Dict haki hapa, 121 00:08:23,430 --> 00:08:27,020 na mambo tu ndani ya Dict ni paka, paka, mbwa, samaki, mbwa. 122 00:08:27,020 --> 00:08:31,530 Amri moja kuwa una mstari amri ni paka, 123 00:08:31,530 --> 00:08:34,539 ambayo ni kwenda tu na magazeti nini katika faili. 124 00:08:34,539 --> 00:08:40,679 Hivyo wakati mimi kusema paka Dict, ni kwenda magazeti paka, paka, mbwa, samaki, mbwa. Hiyo paka wote gani. 125 00:08:40,679 --> 00:08:46,280 Hiyo ina maana kwamba ni kuchapishwa kwa kiwango nje paka, paka, mbwa mbwa, samaki,. 126 00:08:46,280 --> 00:08:53,240 Kama mimi badala wanataka redirect kwamba faili, naweza kutumia> na REDIRECT kwa chochote faili ni. 127 00:08:53,240 --> 00:08:56,460 Mimi nitakuita faili faili. 128 00:08:56,460 --> 00:09:00,320 Hivyo sasa kama mimi ls, mimi utaona nina faili mpya iitwayo faili. 129 00:09:00,320 --> 00:09:05,700 Na kama mimi kufungua it up, itakuja kuwa na nini hasa paka kuweka katika mstari amri. 130 00:09:05,700 --> 00:09:11,040 Hivyo sasa kama mimi kufanya hivyo tena, basi ni kwenda kwingine pato katika faili, 131 00:09:11,040 --> 00:09:13,930 na mimi naenda kuwa sawa exact kitu. 132 00:09:13,930 --> 00:09:17,910 Basi kitaalam, kabisa overrode nini tulikuwa. 133 00:09:17,910 --> 00:09:22,970 Na tutaweza kuona kama mimi kubadili Dict, mimi alichukua nje mbwa. 134 00:09:22,970 --> 00:09:29,980 Sasa kama sisi paka Dict katika faili tena, tunakwenda na toleo mpya na mbwa kuondolewa. 135 00:09:29,980 --> 00:09:32,400 Hivyo kabisa yanapewa kipaumbele hilo. 136 00:09:32,400 --> 00:09:36,640 Badala yake, kama sisi kutumia >>, ni kwenda append faili. 137 00:09:36,640 --> 00:09:40,860 Sasa, kufungua faili, tunaona tuna tu kitu kimoja kuchapishwa mara mbili 138 00:09:40,860 --> 00:09:44,920 sababu ilikuwa huko mara moja, kisha sisi umeongezewa awali. 139 00:09:44,920 --> 00:09:48,130 Hivyo kwamba ni nini> na >> kufanya. 140 00:09:48,130 --> 00:09:50,580 Je moja ijayo kuuliza - Haina kuuliza kuhusu hilo. 141 00:09:50,580 --> 00:09:59,050 >> nyingine moja kwamba tuna ni <, ambayo kama> redirects nje ya kiwango, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Hebu angalia kama tuna mfano. 144 00:10:14,750 --> 00:10:16,930 Siwezi kuandika moja mziki haraka. 145 00:10:17,870 --> 00:10:25,700 Hebu kuchukua faili yoyote, hello.c. 146 00:10:56,060 --> 00:10:59,070 Kiasi moja kwa moja faili. 147 00:10:59,070 --> 00:11:03,570 Mimi tu kupata kamba na kisha kuchapisha "Hello" lolote string mimi tu aliingia mara. 148 00:11:03,570 --> 00:11:07,990 Hivyo kufanya hujambo na kisha /. Hello. 149 00:11:07,990 --> 00:11:10,720 Sasa ni uvuvio yangu kuingia kitu, 150 00:11:10,720 --> 00:11:15,070 ambayo ina maana ni kusubiri juu ya mambo kuwa aliingia katika kiwango in 151 00:11:15,070 --> 00:11:20,450 Basi ingieni chochote mimi nataka katika kiwango in Sisi ni tu kwenda kusema Hello, Rob! 152 00:11:20,450 --> 00:11:23,310 Basi ni uchapishaji kwa kiwango nje Hello, Rob! 153 00:11:23,310 --> 00:11:28,860 Kama mimi kufanya. / Hujambo na kisha kuelekeza, 154 00:11:30,740 --> 00:11:34,310 kwa sasa unaweza tu REDIRECT kutoka faili. 155 00:11:34,310 --> 00:11:41,720 Hivyo kama mimi kuweka katika baadhi ya SVG, txt, na mimi kuweka Rob, 156 00:11:41,720 --> 00:11:52,300 kama mimi kukimbia hujambo na kisha kuelekeza txt faili katika. / hello, ni kwenda kusema Hello, Rob! mara moja. 157 00:11:52,300 --> 00:11:57,160 Wakati kwanza anapata GetString na ni kusubiri juu ya kiwango katika, 158 00:11:57,160 --> 00:12:01,730 kiwango katika ni tena kusubiri kwenye keyboard kwa data kupata aliingia. 159 00:12:01,730 --> 00:12:05,980 Badala yake, tuna itaelekezwa kiwango katika kusoma kutoka txt faili. 160 00:12:05,980 --> 00:12:10,290 Na hivyo ni kwenda kusoma kutoka txt SVG, ambayo ni haki Rob line, 161 00:12:10,290 --> 00:12:13,380 na kisha itakuja magazeti Hello, Rob! 162 00:12:13,380 --> 00:12:18,180 Na kama alitaka, mimi naweza pia kufanya / hujambo 00:12:21,500 na kisha kiwango kwamba uchapishaji ni, ambayo ni Hello, Rob!, 164 00:12:21,500 --> 00:12:24,700 Naweza kuelekeza kwamba ndani ya faili yake mwenyewe. 165 00:12:24,700 --> 00:12:29,790 Mimi itabidi kuwaita faili hujambo - hakuna, mimi si, kwa sababu hiyo ni executable - txt2. 166 00:12:29,790 --> 00:12:40,150 Sasa, txt2 ataenda kuwa na pato la. / Hujambo 00:12:43,520 >> Maswali? 168 00:12:45,900 --> 00:12:49,090 >> Sawa. Hivyo basi hapa tuna bomba. 169 00:12:49,090 --> 00:12:53,510 Mabomba ni kitengo cha mwisho cha redirection. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Nadhani moja zaidi kitengo cha redirection ni kama badala ya> kufanya 2>, 171 00:12:58,750 --> 00:13:01,070 hiyo imetuma makosa ya hali. 172 00:13:01,070 --> 00:13:06,280 Hivyo kama kitu akaenda makosa ya hali, ingekuwa si kupata kuweka ndani ya txt2. 173 00:13:06,280 --> 00:13:12,480 Lakini taarifa kama mimi kufanya 2>, basi ni bado uchapishaji Hello, Rob! kwa mstari amri 174 00:13:12,480 --> 00:13:18,600 kwa sababu mimi nina tu imetuma makosa ya hali, mimi nina haielekezi kiwango nje. 175 00:13:18,600 --> 00:13:22,210 Kiwango makosa na nje ya kiwango ni tofauti. 176 00:13:24,210 --> 00:13:27,080 Kama alitaka kweli kuandika makosa ya hali, 177 00:13:27,080 --> 00:13:35,080 basi mimi naweza kubadili hili kuwa fprintf kwa stderr. 178 00:13:35,080 --> 00:13:37,850 Hivyo printf, kwa default, prints kwa nje standard. 179 00:13:37,850 --> 00:13:41,720 Kama mimi nataka magazeti kwa makosa ya hali manually, basi nina kutumia fprintf 180 00:13:41,720 --> 00:13:45,010 na bayana nini nataka magazeti kwa. 181 00:13:45,010 --> 00:13:49,720 Kama badala sikuwa stdout fprintf, basi, kwamba kimsingi ni sawa na printf. 182 00:13:49,720 --> 00:13:55,530 Lakini kwa kosa fprintf standard. 183 00:13:57,790 --> 00:14:03,650 Hivyo sasa, ikiwa mimi redirect hii katika txt2, Hello, Rob! bado kupata kuchapishwa katika mstari amri 184 00:14:03,650 --> 00:14:08,270 tangu ni kupata kuchapishwa kwa makosa ya hali na mimi nina tu imetuma kiwango nje. 185 00:14:08,270 --> 00:14:16,420 Kama mimi sasa redirect makosa ya hali, sasa hawakuwa kupata kuchapishwa, na txt2 ni kwenda kuwa Hello, Rob! 186 00:14:16,420 --> 00:14:21,910 Hivyo sasa, unaweza print yako makosa halisi kwa makosa ya hali 187 00:14:21,910 --> 00:14:24,720 na magazeti yako ujumbe wa mara kwa mara nje ya kiwango. 188 00:14:24,720 --> 00:14:31,420 Na hivyo wakati wewe kuendesha programu yako, unaweza kukimbia kama /. Hujambo aina hii na 2> 189 00:14:31,420 --> 00:14:33,800 hivyo kwamba programu yako ni kwenda kukimbia kwa kawaida, 190 00:14:33,800 --> 00:14:38,400 lakini ujumbe wa makosa yoyote kwamba kupata unaweza kuangalia baadaye katika upotofu logi yako, 191 00:14:38,400 --> 00:14:44,500 hivyo makosa, na kisha kuangalia baadaye na makosa yako faili itakuwa na makosa yoyote yaliyotokea. 192 00:14:45,200 --> 00:14:47,540 >> Maswali? 193 00:14:47,540 --> 00:14:58,070 >> moja ya mwisho ni bomba, ambayo unaweza kufikiria kama kuchukua kiwango kutoka amri moja 194 00:14:58,070 --> 00:15:01,210 na kuifanya ya kiwango katika amri ya pili. 195 00:15:01,210 --> 00:15:05,570 mfano hapa ni mwangwi ni mstari amri kitu 196 00:15:05,570 --> 00:15:11,840 kwamba ni kwenda tu echo chochote mimi kuweka kama hoja yake. Mimi sitaweza quotes. 197 00:15:11,840 --> 00:15:16,150 Echo blah, blah, blah ni kwenda tu na magazeti blah, blah, blah. 198 00:15:16,150 --> 00:15:20,600 Kabla ya hapo, mimi nina alisema alikuwa na kuweka ndani ya Rob faili txt 199 00:15:20,600 --> 00:15:28,830 sababu naweza tu redirect files txt, badala yake, / kama mimi echo Rob 200 00:15:28,830 --> 00:15:35,520 na kisha bomba ndani / hello, ambayo pia kufanya aina moja ya kitu.. 201 00:15:35,520 --> 00:15:39,160 Hii ni kuchukua pato la amri hii, echo Rob, 202 00:15:39,160 --> 00:15:43,610 na kutumia kama pembejeo kwa /. hello. 203 00:15:44,790 --> 00:15:49,560 Unaweza kufikiria kama kwanza redirect echo Rob katika faili 204 00:15:49,560 --> 00:15:54,160 na kisha kuyaingiza katika faili. / hujambo kwamba mara tu outputted. 205 00:15:54,160 --> 00:15:57,850 Lakini itachukua muda faili nje ya picha. 206 00:16:01,890 --> 00:16:04,460 >> Maswali juu ya hilo? 207 00:16:04,460 --> 00:16:07,150 >> Swali la pili ni kwenda kuhusisha hii. 208 00:16:07,150 --> 00:16:15,310 Nini bomba unaweza kutumia ili kupata idadi ya majina ya kipekee katika faili inayoitwa names.txt? 209 00:16:15,310 --> 00:16:24,160 amri tunakwenda wanataka kutumia hapa ni ya kipekee, hivyo uniq, na kisha WC. 210 00:16:24,160 --> 00:16:28,840 Unaweza kufanya mtu uniq kwa kweli kuangalia nini kwamba gani, 211 00:16:28,840 --> 00:16:34,840 na ni kwenda tu kwa chujio mistari karibu vinavyolingana kutoka pembejeo. 212 00:16:34,840 --> 00:16:40,690 Na mtu WC ni kwenda magazeti newline, neno, na makosa Byte kwa kila faili. 213 00:16:40,690 --> 00:16:43,760 Na moja ya mwisho tunakwenda wanataka kutumia ni aina ya, 214 00:16:43,760 --> 00:16:47,410 ambayo ni kwenda tu aina ya mistari ya faili txt. 215 00:16:47,410 --> 00:16:58,080 Kama mimi kufanya baadhi ya faili txt, names.txt, na ni Rob, Tommy, Joseph, Tommy, Joseph, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 nini nataka kufanya hapa ni kupata idadi ya majina ya kipekee katika faili hii. 217 00:17:03,910 --> 00:17:08,750 Hivyo kile lazima jibu kuwa? >> [Mwanafunzi] 4. >> Yeah. 218 00:17:08,750 --> 00:17:13,780 Ni lazima 4 tangu Rob, Tommy, Joseph, RJ ni pekee tu majina katika faili hii. 219 00:17:13,780 --> 00:17:20,180 hatua ya kwanza, kama mimi tu kufanya neno juu ya kuhesabu names.txt, 220 00:17:20,180 --> 00:17:24,290 hii ni kweli akiniambia kila kitu. 221 00:17:24,290 --> 00:17:32,560 Hii ni kweli uchapishaji - basi s kuona, mtu WC - newlines, maneno na kuhesabu Byte. 222 00:17:32,560 --> 00:17:38,270 Kama mimi tu huduma ya juu mistari, naweza tu kufanya WC-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Basi hiyo ni hatua ya 1. 224 00:17:44,300 --> 00:17:50,510 Lakini mimi sitaki names.txt WC-l kwa sababu tu ina names.txt majina yote, 225 00:17:50,510 --> 00:17:54,170 na mimi nataka kuchuja wale yoyote yasiyo ya kipekee. 226 00:17:54,170 --> 00:18:01,200 Hivyo kama mimi kufanya uniq names.txt, kwamba hana kabisa nipe nini nataka 227 00:18:01,200 --> 00:18:03,760 kwa sababu majina duplicated bado kuna. 228 00:18:03,760 --> 00:18:07,690 Kwa nini? Kwa nini uniq si kufanya nipendavyo? 229 00:18:07,690 --> 00:18:10,500 [Mwanafunzi] marudio si [inaudible] >> Yeah. 230 00:18:10,500 --> 00:18:16,370 Kumbuka ukurasa mtu kwa uniq anasema mistari chujio vinavyolingana karibu. 231 00:18:16,370 --> 00:18:19,680 Hawako karibu, hivyo itakuwa si kuchuja yao. 232 00:18:19,680 --> 00:18:31,100 Kama mimi aina yao ya kwanza, aina names.txt ni kwenda kuweka mistari yote duplicate pamoja. 233 00:18:31,100 --> 00:18:34,450 Hivyo sasa ni kwamba aina names.txt. 234 00:18:34,450 --> 00:18:40,550 Mimi nina kwenda kutaka kutumia kama pembejeo kwa uniq, ambayo ni | uniq. 235 00:18:40,550 --> 00:18:43,390 Anipaye Joseph, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 na mimi nataka kuwa matumizi kama pembejeo kwa WC-l, 237 00:18:49,260 --> 00:18:52,740 ambayo ni kwenda nipe 4. 238 00:18:52,740 --> 00:18:56,930 Kama inavyosema hapa, nini bomba unaweza kutumia? 239 00:18:56,930 --> 00:19:01,390 Unaweza kufanya mambo mengi kama vile kutumia mfululizo wa amri 240 00:19:01,390 --> 00:19:05,130 ambapo matumizi pato kutoka amri moja kama mchango wa amri ya pili. 241 00:19:05,130 --> 00:19:08,780 Unaweza kufanya mambo mengi, mengi ya mambo wajanja. 242 00:19:08,780 --> 00:19:11,440 >> Maswali? 243 00:19:12,910 --> 00:19:14,600 Sawa. 244 00:19:14,600 --> 00:19:17,880 Hiyo ni kwa ajili ya mabomba na redirection. 245 00:19:18,370 --> 00:19:24,090 >> Sasa tunaenda kwenye mambo halisi, stuff coding. 246 00:19:24,090 --> 00:19:29,100 Ndani ya hii PDF, utaona amri hii, 247 00:19:29,100 --> 00:19:32,950 na wewe utakuwa unataka kukimbia amri hii katika appliance yako. 248 00:19:36,240 --> 00:19:42,250 wget ni amri kwa ajili tu ya kupata kitu kutoka mtandao, kimsingi, 249 00:19:42,250 --> 00:19:45,180 hivyo wget na hii URL. 250 00:19:45,180 --> 00:19:49,110 Kama wewe akaenda URL hiki katika kivinjari chako, ingekuwa download kwamba faili. 251 00:19:49,110 --> 00:19:52,510 Mimi tu clicked juu yake, hivyo ni kupakuliwa faili kwa ajili yangu. 252 00:19:52,510 --> 00:19:55,650 Lakini kuandika wget ya kitu ndani ya terminal 253 00:19:55,650 --> 00:19:58,620 ni kwenda tu kwa kushusha ni ndani ya terminal yako. 254 00:19:58,620 --> 00:20:02,750 Nina section5.zip, na utasikia wanataka unzip section5.zip, 255 00:20:02,750 --> 00:20:06,520 ambayo ni kwenda kukupa folder aitwaye section5, 256 00:20:06,520 --> 00:20:11,550 ambayo ni kwenda wote wa files tunakwenda kutumia leo ndani yake. 257 00:20:33,380 --> 00:20:37,710 Kama faili programu hizi 'majina kupendekeza, wao uko Buggy kidogo, 258 00:20:37,710 --> 00:20:40,990 hivyo lengo lako ni kwa takwimu kwa nini kutumia gdb. 259 00:20:40,990 --> 00:20:44,560 Je, kila mtu kuwa wao kupakuliwa / kujua jinsi ya kupata yao kupakuliwa 260 00:20:44,560 --> 00:20:47,480 katika appliance zao? Sawa. 261 00:20:47,480 --> 00:20:56,400 >> Mbio ./buggy1, itakuwa kusema Mkato kosa (msingi kutupwa), 262 00:20:56,400 --> 00:21:00,500 ambayo wakati wowote kupata segfault, ni kitu mbaya. 263 00:21:00,500 --> 00:21:03,810 Chini ya mazingira gani unayoipata segfault? 264 00:21:03,810 --> 00:21:08,210 [Mwanafunzi] Dereferencing pointer null. >> Yeah. Hivyo kwamba ni mfano mmoja. 265 00:21:08,210 --> 00:21:11,580 Dereferencing pointer null utaenda kupata segfault. 266 00:21:11,580 --> 00:21:16,720 Nini segfault njia ni wewe ni kugusa kumbukumbu unapaswa kuwa kugusa. 267 00:21:16,720 --> 00:21:21,350 Hivyo dereferencing pointer null ni kugusa anuani 0, 268 00:21:21,350 --> 00:21:28,060 na kimsingi, kila kompyuta siku hizi wanasema kwamba anuani 0 ni kumbukumbu unapaswa kuwa kugusa. 269 00:21:28,060 --> 00:21:31,920 Hivyo ndiyo sababu dereferencing matokeo pointer null katika segfault. 270 00:21:31,920 --> 00:21:37,210 Wakati wewe kutokea si initialize pointer, basi ina thamani ya takataka, 271 00:21:37,210 --> 00:21:41,520 na hivyo wakati wewe kujaribu dereference hivyo, katika uwezekano wote wewe ni kugusa kumbukumbu 272 00:21:41,520 --> 00:21:43,540 kwamba katika katikati ya pa. 273 00:21:43,540 --> 00:21:45,650 Kama kutokea kwa kupata bahati na thamani ya takataka 274 00:21:45,650 --> 00:21:48,440 kilichotokea kwa uhakika na mahali fulani kwenye stack au kitu, 275 00:21:48,440 --> 00:21:50,820 basi wakati wewe dereference kwamba pointer, ambayo wewe si initialized, 276 00:21:50,820 --> 00:21:52,730 hakuna kitu kwenda vibaya. 277 00:21:52,730 --> 00:21:55,480 Lakini kama ni akizungumzia, kusema, mahali fulani kati ya stack na chungu, 278 00:21:55,480 --> 00:21:59,850 au ni akizungumzia tu mahali fulani kwamba haijawahi kutumika kwa mpango wako bado, 279 00:21:59,850 --> 00:22:02,240 basi wewe ni kugusa kumbukumbu unapaswa kuwa kugusa na wewe segfault. 280 00:22:02,240 --> 00:22:06,370 Wakati kuandika kazi ya kujirudia na recurses mara nyingi sana 281 00:22:06,370 --> 00:22:08,720 na stack yenu inakua kubwa mno na collides stack katika mambo 282 00:22:08,720 --> 00:22:12,270 kwamba ni lazima kuwa colliding na, wewe ni kugusa kumbukumbu unapaswa kuwa na kugusa, 283 00:22:12,270 --> 00:22:14,810 hivyo segfault. 284 00:22:14,810 --> 00:22:17,010 Hiyo ni nini segfault ni. 285 00:22:17,010 --> 00:22:21,810 >> Ni sababu hiyo hiyo pia kwamba kama una kamba kama - 286 00:22:21,810 --> 00:22:23,930 hebu kwenda nyuma ya mpango uliopita. 287 00:22:23,930 --> 00:22:28,530 Katika hello.c-I'm just kwenda kufanya kitu kingine. 288 00:22:28,530 --> 00:22:33,770 Char * s = "hello dunia!"; 289 00:22:33,770 --> 00:22:42,310 Kama mimi kutumia * s = kitu au s [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 hivyo kufanya hello, /. hello, kwa nini kuwa segfault? 291 00:22:48,410 --> 00:22:51,250 Kwa nini hii segfault? 292 00:22:55,660 --> 00:22:57,890 Gani, unatarajia nini? 293 00:22:57,890 --> 00:23:06,640 Kama mimi printf ("% s \ n", s); gani, unatarajia kuchapishwa? 294 00:23:06,640 --> 00:23:09,930 [Mwanafunzi] X hello. >> Yeah. 295 00:23:09,930 --> 00:23:15,140 Tatizo ni kwamba wakati wewe kutangaza string kama hii, 296 00:23:15,140 --> 00:23:18,190 s ni pointer kwamba kinaendelea kwenda stack, 297 00:23:18,190 --> 00:23:25,880 na kile ambacho ni akizungumzia ni hii kamba ambayo ni zilizomo katika kumbukumbu kusoma tu. 298 00:23:25,880 --> 00:23:30,560 Hivyo tu kwa jina, kumbukumbu kusoma tu, unapaswa kupata wazo 299 00:23:30,560 --> 00:23:33,010 kwamba kama wewe kujaribu kubadili nini katika kumbukumbu kusoma tu, 300 00:23:33,010 --> 00:23:36,670 wewe ni kufanya kitu unapaswa kufanya na kumbukumbu na wewe segfault. 301 00:23:36,670 --> 00:23:45,360 Hii ni kweli tofauti kubwa kati ya Char * s na Char s []. 302 00:23:45,360 --> 00:23:48,790 Hivyo Char s [], sasa string hii ni kwenda kuwekwa katika stack, 303 00:23:48,790 --> 00:23:53,960 na stack si kusoma tu, ambayo ina maana kwamba hii lazima kazi kikamilifu faini. 304 00:23:55,500 --> 00:23:57,370 Na inakuwa hivyo. 305 00:23:57,370 --> 00:24:06,250 Kumbuka kwamba wakati mimi kufanya Char * s = "hello dunia!", S yenyewe ni juu ya stack 306 00:24:06,250 --> 00:24:10,390 lakini s pointi mahali pengine, na kwamba mahali pengine hufanyika kuwa kusoma tu. 307 00:24:10,390 --> 00:24:15,640 Lakini Char s [] ni kitu tu juu ya stack. 308 00:24:17,560 --> 00:24:21,760 Basi hiyo ni mfano mwingine wa segfault kinachotokea. 309 00:24:21,760 --> 00:24:27,820 >> Tuliona kwamba ./buggy1 ilisababisha segfault. 310 00:24:27,820 --> 00:24:31,810 Katika nadharia, unapaswa kuangalia buggy1.c mara moja. 311 00:24:31,810 --> 00:24:35,170 Badala yake, tutaweza kuangalia ni kwa njia ya gdb. 312 00:24:35,170 --> 00:24:37,750 Taarifa kwamba wakati wewe kupata Mkato kosa (msingi kutupwa), 313 00:24:37,750 --> 00:24:40,850 kupata faili hii juu ya msingi hapa kuitwa. 314 00:24:40,850 --> 00:24:45,200 Kama sisi ls-l, tutaweza kuona msingi kwamba ni kawaida faili pretty kubwa. 315 00:24:45,200 --> 00:24:51,580 Hii ni idadi ya ka ya SVG, hivyo inaonekana kama ni 250-kitu kilobytes. 316 00:24:51,580 --> 00:24:56,120 Sababu hii ni kwamba kile dampo msingi kweli ni 317 00:24:56,120 --> 00:25:01,410 ni wakati mpango wako shambulio, hali ya kumbukumbu ya mpango wako 318 00:25:01,410 --> 00:25:05,230 tu anapata kunakiliwa na pasted katika faili hii. 319 00:25:05,230 --> 00:25:07,270 Ni anapata kutupwa kwenye faili hilo. 320 00:25:07,270 --> 00:25:13,060 Mpango huu, wakati ni mbio, kilichotokea kuwa na matumizi ya kumbukumbu ya kilobytes karibu 250, 321 00:25:13,060 --> 00:25:17,040 na hivyo kwamba ni nini got kutupwa kwenye faili hii. 322 00:25:17,040 --> 00:25:23,630 Sasa unaweza kuangalia faili kwamba kama sisi kufanya gdb buggy1 msingi. 323 00:25:23,630 --> 00:25:30,130 Tunaweza tu kufanya gdb buggy1, na kwamba itakuwa tu kuanzisha gdb mara kwa mara, 324 00:25:30,130 --> 00:25:33,800 kutumia buggy1 kama pembejeo faili wake. 325 00:25:33,800 --> 00:25:38,260 Lakini kama wewe kufanya gdb buggy1 msingi, basi ni hasa kwenda kuanza up gdb 326 00:25:38,260 --> 00:25:40,330 kwa kuangalia faili kwamba msingi. 327 00:25:40,330 --> 00:25:45,560 Na wewe kusema buggy1 njia gdb anajua kwamba kwamba faili msingi linatokana na mpango buggy1. 328 00:25:45,560 --> 00:25:49,580 Hivyo gdb buggy1 msingi ni kwenda mara moja kutuletea 329 00:25:49,580 --> 00:25:52,060 kwa mpango ambapo kilichotokea kusitisha. 330 00:25:57,720 --> 00:26:02,340 Tunaona hapa Programu terminated pamoja na ishara ya 11, Mkato kosa. 331 00:26:02,340 --> 00:26:10,110 Sisi kutokea kwa kuona mistari ya kanisa, ambayo pengine ni hayasaidii sana. 332 00:26:10,110 --> 00:26:15,360 Lakini kama wewe aina bt au backtrace, ambayo inaenda kuwa kazi 333 00:26:15,360 --> 00:26:19,430 kwamba inatupa orodha ya muafaka wetu wa sasa stack. 334 00:26:19,430 --> 00:26:23,150 Hivyo backtrace. Inaonekana kama sisi tu muafaka stack mbili. 335 00:26:23,150 --> 00:26:26,310 kwanza ni stack yetu kuu frame, 336 00:26:26,310 --> 00:26:29,810 na pili ni sura stack kwa kazi hii ya kuwa sisi kutokea kwa kuwa katika, 337 00:26:29,810 --> 00:26:34,440 ambayo inaonekana kama sisi tu code kanisa kwa ajili ya. 338 00:26:34,440 --> 00:26:38,050 Basi hebu kwenda nyuma katika kazi yetu kuu, 339 00:26:38,050 --> 00:26:42,300 na kwa kufanya hivyo tunaweza kufanya sura 1, na nadhani tunaweza pia kufanya chini, 340 00:26:42,300 --> 00:26:45,160 lakini mimi kamwe karibu kufanya chini - au juu. Yeah. 341 00:26:45,160 --> 00:26:50,710 Juu na chini. Hadi huleta you up moja stack frame, chini huleta wewe chini frame stack. 342 00:26:50,710 --> 00:26:53,240 Mimi huwa kamwe kutumia. 343 00:26:53,240 --> 00:26:59,120 Mimi tu kusema hasa sura 1, ambayo ni kwenda frame labeled 1. 344 00:26:59,120 --> 00:27:01,750 Frame 1 anaenda kutufanya frame kuu stack, 345 00:27:01,750 --> 00:27:05,570 na anasema haki hapa mstari wa kanuni sisi kutokea kwa kuwa katika. 346 00:27:05,570 --> 00:27:07,950 Kama sisi alitaka mistari michache zaidi ya kificho, tunaweza kusema orodha, 347 00:27:07,950 --> 00:27:11,280 na kwamba kinaendelea kutupa mistari yote ya maadili ya kuzunguka. 348 00:27:11,280 --> 00:27:13,360 mstari sisi segfaulted saa ilikuwa 6: 349 00:27:13,360 --> 00:27:17,360 kama (strcmp ("CS50 miamba", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Kama si dhahiri bado, unaweza kupata moja kwa moja kutoka hapa tu kwa kufikiri kwa nini segfaulted. 351 00:27:24,130 --> 00:27:28,800 Lakini tunaweza kuchukua hatua moja zaidi na kusema, "Kwanini argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Magazeti Hebu argv [1], na inaonekana kama 0x0 ni, ambayo ni pointer null. 353 00:27:38,830 --> 00:27:44,750 Sisi ni strcmping miamba CS50 na null, na ili kwenda segfault. 354 00:27:44,750 --> 00:27:48,280 Na kwa nini ni argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Mwanafunzi] sababu sisi hakutoa ni hoja amri yoyote-line. 356 00:27:51,280 --> 00:27:53,390 Yeah. Sisi hatukukubaliana ni hoja amri yoyote-line. 357 00:27:53,390 --> 00:27:58,460 Hivyo ./buggy1 ni kwenda tu kuwa argv [0] kuwa ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Ni si kwenda kuwa na argv [1], ili kwenda segfault. 359 00:28:02,100 --> 00:28:07,450 Lakini kama, badala yake, mimi kufanya tu CS50, ni kwenda kusema Unaweza kupata D 360 00:28:07,450 --> 00:28:09,950 kwa sababu hiyo ni nini ni zinatakiwa kufanya. 361 00:28:09,950 --> 00:28:15,240 Kuangalia buggy1.c, ni walidhani magazeti "Unaweza kupata D" - 362 00:28:15,240 --> 00:28:20,820 Kama argv [1] ni si "CS50 miamba", "Unaweza kupata D", mwingine "Unaweza kupata!" 363 00:28:20,820 --> 00:28:25,660 Hivyo kama tunataka, tunahitaji hii kulinganisha kama kweli, 364 00:28:25,660 --> 00:28:28,710 ambayo ina maana kwamba inalinganishwa na 0. 365 00:28:28,710 --> 00:28:31,100 Hivyo argv [1] inahitaji "kuwa CS50 miamba". 366 00:28:31,100 --> 00:28:35,660 Kama unataka kufanya hivyo juu ya mstari amri, unahitaji kutumia \ kutoroka nafasi. 367 00:28:35,660 --> 00:28:41,690 Hivyo CS50 \ miamba na Wewe kupata A! 368 00:28:41,690 --> 00:28:44,060 Kama huwezi kufanya backslash, kwa nini hii si kazi? 369 00:28:44,060 --> 00:28:47,190 [Mwanafunzi] Ni hoja mbili tofauti. >> Yeah. 370 00:28:47,190 --> 00:28:52,540 Argv [1] ni kwenda kuwa CS50, na argv [2] ni kwenda kuwa miamba. Sawa. 371 00:28:52,540 --> 00:28:56,470 >> Sasa ./buggy2 ni kwenda segfault tena. 372 00:28:56,470 --> 00:29:01,880 Badala ya kufungua faili kwa msingi wake, tutaweza tu kufungua buggy2 moja kwa moja, 373 00:29:01,880 --> 00:29:05,000 hivyo gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Sasa kama sisi tu kuendesha programu yetu, basi ni kwenda kusema Programu ya kupokea signal SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 ambayo ni segfault signal, na hii ni mahali ambapo ilivyotokea kutokea. 376 00:29:15,530 --> 00:29:21,250 Kuangalia backtrace yetu, tunaona kwamba tulikuwa katika oh_no kazi, 377 00:29:21,250 --> 00:29:23,900 ambalo alikuwa amepewa na Dinky kazi, ambayo aliitwa na binky kazi, 378 00:29:23,900 --> 00:29:26,460 ambalo alikuwa amepewa na kuu. 379 00:29:26,460 --> 00:29:31,680 Tunaweza pia kuona hoja kwa kazi hizi. 380 00:29:31,680 --> 00:29:34,680 hoja kwa Dinky na binky alikuwa 1. 381 00:29:34,680 --> 00:29:44,390 Kama sisi orodha oh_no kazi, tunaona kwamba oh_no ni kufanya tu Char ** s = null; 382 00:29:44,390 --> 00:29:47,410 * S = "BOOM"; 383 00:29:47,410 --> 00:29:50,330 Kwa nini kuwa kushindwa? 384 00:29:54,330 --> 00:29:58,380 [Mwanafunzi] Huwezi dereference pointer null? >> Yeah. 385 00:29:58,380 --> 00:30:06,090 Hii ni kusema tu s ni null, bila kujali kama kwamba hutokea kwa kuwa ** Char, 386 00:30:06,090 --> 00:30:12,070 ambayo, kulingana na jinsi kutafsiri, inaweza kuwa pointer pointer string 387 00:30:12,070 --> 00:30:15,550 au safu ya masharti. 388 00:30:15,550 --> 00:30:21,430 Ni s ni null, hivyo * s dereferencing pointer null, 389 00:30:21,430 --> 00:30:24,800 na hivyo hii ni kwenda kwa ajali. 390 00:30:24,800 --> 00:30:27,540 Hii ni moja ya njia ya haraka unaweza uwezekano segfault. 391 00:30:27,540 --> 00:30:31,300 Ni tu kutangaza pointer null na mara segfaulting. 392 00:30:31,300 --> 00:30:34,570 Hiyo ni nini oh_no ni kufanya. 393 00:30:34,570 --> 00:30:43,400 Kama Tunakwenda frame moja, basi sisi ni kwenda kupata ndani ya kazi ambayo inaitwa oh_no. 394 00:30:43,400 --> 00:30:44,830 Mimi haja ya kufanya kwamba chini. 395 00:30:44,830 --> 00:30:48,610 Kama huna kuingia amri na wewe tu hit Enter tena, 396 00:30:48,610 --> 00:30:52,350 itakuwa rudia tu amri ya awali kwamba wewe mbio. 397 00:30:52,350 --> 00:30:56,610 Sisi ni katika sura ya 1. 398 00:30:56,610 --> 00:31:04,650 Kuorodhesha frame hii, tunaona hapa ni kazi yetu. 399 00:31:04,650 --> 00:31:08,520 Unaweza hit orodha tena, au unaweza kufanya orodha 20 na orodha itakuwa ni zaidi. 400 00:31:08,520 --> 00:31:13,640 Dinky kazi anasema kama i ni 1, kisha kwenda kufanya kazi oh_no, 401 00:31:13,640 --> 00:31:15,960 mwingine kwenda kazi slinky. 402 00:31:15,960 --> 00:31:18,700 Na tunajua i ni 1 kwa sababu sisi kutokea kwa kuona hapa 403 00:31:18,700 --> 00:31:22,560 Dinky kwamba aliitwa na hoja 1. 404 00:31:22,560 --> 00:31:27,560 Au unaweza tu wala magazeti i na matokeo yake watasema i ni 1. 405 00:31:27,560 --> 00:31:33,770 Sisi ni sasa katika Dinky, na kama sisi kwenda mwingine frame, tunajua kuishia katika binky. 406 00:31:33,770 --> 00:31:36,600 Up. Sasa tuko katika binky. 407 00:31:36,600 --> 00:31:41,340 Kuorodhesha kazi hii - orodha kutoka kabla ya nusu kunikatilia mbali - 408 00:31:41,340 --> 00:31:52,670 ilianza kama kama i ni 0, kisha tunakwenda kuiita oh_no, mwingine piga Dinky. 409 00:31:52,670 --> 00:31:57,000 Tunajua i alikuwa 1, hivyo kuitwa Dinky. 410 00:31:57,000 --> 00:32:05,030 Na sasa tuko nyuma katika kuu, na kuu ni kwenda tu kuwa int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Hiyo ni kwenda tu kukupa namba random kwamba ni aidha 0, 1, au 2. 412 00:32:08,790 --> 00:32:12,780 Ni kwenda kuwaita binky na idadi hiyo, nayo atarudi 0. 413 00:32:12,780 --> 00:32:16,700 Kuangalia hii, 414 00:32:16,700 --> 00:32:19,880 tu kutembea kupitia mpango manually bila ya mbio mara moja, 415 00:32:19,880 --> 00:32:25,400 ungependa kuweka uhakika wa mapumziko katika kuu, ambayo ina maana kwamba wakati sisi kuendesha programu ya 416 00:32:25,400 --> 00:32:31,020 mpango wako anaendesha hadi hits hatua ya mapumziko. 417 00:32:31,020 --> 00:32:35,450 Hivyo mbio mpango, itakuwa kukimbia na basi itakuwa hit kazi kuu na kuacha kuendesha. 418 00:32:35,450 --> 00:32:44,700 Sasa tuko ndani ya kuu, na hatua au ijayo anaenda kututoa kwa line ya pili ya code. 419 00:32:44,700 --> 00:32:47,050 Unaweza kufanya hatua au ijayo. 420 00:32:47,050 --> 00:32:51,800 Kupiga ijayo, sasa i umeanzishwa kwa rand ()% 3, ili tuweze kuchapa thamani ya i, 421 00:32:51,800 --> 00:32:55,280 na matokeo yake watasema i ni 1. 422 00:32:55,280 --> 00:32:58,110 Sasa ni gani jambo kama sisi kutumia ijayo au hatua. 423 00:32:58,110 --> 00:33:01,000 Mimi nadhani ni mattered katika moja ya awali, lakini sisi wanataka kutumia ijayo. 424 00:33:01,000 --> 00:33:06,000 Kama sisi kutumia hatua, sisi hatua katika kazi, ambayo ina maana ya kuangalia kitu halisi 425 00:33:06,000 --> 00:33:07,940 kwamba kinajitokeza ndani ya binky. 426 00:33:07,940 --> 00:33:10,510 Kama sisi kutumia ijayo, basi ina maana kwenda juu ya kazi 427 00:33:10,510 --> 00:33:14,070 na kwenda tu kwa line ya pili ya kificho katika kazi yetu kuu. 428 00:33:14,070 --> 00:33:17,900 Haki hapa kwenye mstari huu, nilikuwa katika ambapo alisema rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 kama mimi hatua, ingekuwa kwenda katika utekelezaji wa rand 430 00:33:21,320 --> 00:33:25,110 na kuangalia nini kinatokea pale, na mimi nilikuwa hatua kupitia kazi rand. 431 00:33:25,110 --> 00:33:26,920 Lakini mimi sijali kuhusu kazi rand. 432 00:33:26,920 --> 00:33:30,190 Mimi nataka tu kwenda line ya pili ya kificho katika kuu, hivyo mimi kutumia ijayo. 433 00:33:30,190 --> 00:33:35,800 Lakini sasa mimi kufanya huduma kuhusu kazi binky, hivyo nataka hatua katika hilo. 434 00:33:35,800 --> 00:33:37,730 Sasa mimi nina katika binky. 435 00:33:37,730 --> 00:33:42,040 mstari wa kwanza wa code ni kwenda kusema kama (i == 0), mimi kuchukua hatua, 436 00:33:42,040 --> 00:33:44,930 tunaona sisi kuishia katika Dinky. 437 00:33:44,930 --> 00:33:51,620 Kama sisi orodha ya mambo, tunaona kwamba ni checked ni i = 0. 438 00:33:51,620 --> 00:33:55,470 i si sawa na 0, hivyo alikwenda kwa hali kingine, 439 00:33:55,470 --> 00:33:59,540 ambayo ni kwenda kuwaita Dinky (i). 440 00:33:59,540 --> 00:34:04,030 Unaweza kupata kuchanganyikiwa. 441 00:34:04,030 --> 00:34:07,380 Kama wewe tu kuangalia mistari haya moja kwa moja, unaweza kufikiri kama (i == 0), 442 00:34:07,380 --> 00:34:10,800 sawa, basi mimi alichukua hatua na sasa mimi nina katika Dinky (i), 443 00:34:10,800 --> 00:34:14,120 unaweza kufikiri kwamba lazima maana i = 0 au kitu. 444 00:34:14,120 --> 00:34:18,980 No Ni tu ina maana kwamba anajua unaweza fimbo moja kwa moja kwa Dinky line (i). 445 00:34:18,980 --> 00:34:23,300 Sababu i si 0, hatua inayofuata ni si kwenda mwisho katika mwingine. 446 00:34:23,300 --> 00:34:26,239 Mwingine si line ni kwenda kuacha katika. 447 00:34:26,239 --> 00:34:31,570 Ni tu kwenda kwenda line ijayo inaweza kweli nitafanya, ambayo ni Dinky (i). 448 00:34:31,570 --> 00:34:36,090 Kukanyaga katika Dinky (i), sisi kuona kama (i == 1). 449 00:34:36,090 --> 00:34:42,670 Sisi tunajua i = 1, hivyo wakati sisi hatua, tunajua tunakwenda kuishia katika oh_no 450 00:34:42,670 --> 00:34:46,489 kwa sababu i = 1 wito oh_no kazi, ambayo unaweza kujipenyeza katika, 451 00:34:46,489 --> 00:34:52,969 ambayo ni kwenda kuweka Char ** s = kwa null na mara moja "BOOM". 452 00:34:54,270 --> 00:34:59,690 Na kisha kwa kweli kuangalia utekelezaji wa buggy2, 453 00:34:59,690 --> 00:35:04,590 hii, i ni kupata tu idadi random - 0, 1, au 2 - wito binky, 454 00:35:04,590 --> 00:35:10,610 ambayo kama i ni 0 ni wito oh_no, mwingine ni wito Dinky, ambayo huja hapa juu. 455 00:35:10,610 --> 00:35:18,100 Kama i ni 1, wito oh_no, mwingine piga slinky, ambayo kuja hapa, 456 00:35:18,100 --> 00:35:20,460 kama i ni 2, piga oh_no. 457 00:35:20,460 --> 00:35:24,720 Mimi wala hata kufikiri kuna njia - 458 00:35:24,720 --> 00:35:30,030 Je, mtu yeyote kuona njia ya kufanya programu hii ambayo si segfault? 459 00:35:30,030 --> 00:35:37,530 Kwa sababu isipokuwa mimi kukosa kitu, kama i ni 0, utasikia mara segfault, 460 00:35:37,530 --> 00:35:41,250 mwingine wewe kwenda kufanya kazi ambayo kama i ni 1 wewe segfault, 461 00:35:41,250 --> 00:35:44,540 mwingine wewe kwenda kufanya kazi ambapo kama i ni 2 wewe segfault. 462 00:35:44,540 --> 00:35:46,810 Hivyo hakuna jambo gani wewe, wewe segfault. 463 00:35:46,810 --> 00:35:52,380 >> Nadhani njia moja ya fixing itakuwa badala ya kufanya Char ** s = null, 464 00:35:52,380 --> 00:35:55,610 unaweza malloc nafasi kwa kamba hiyo. 465 00:35:55,610 --> 00:36:04,230 Tunaweza kufanya malloc (sizeof) - sizeof nini? 466 00:36:09,910 --> 00:36:15,190 [Mwanafunzi] (Char) * 5? >> Je, hii wanaonekana haki? 467 00:36:15,190 --> 00:36:21,060 Mimi nina kuchukua hii kazi kama mimi kweli mbio, lakini si nini nina kuangalia kwa. 468 00:36:24,400 --> 00:36:32,940 Angalia katika aina ya s. Hebu kuongeza * int, hivyo int * x. 469 00:36:32,940 --> 00:36:35,600 Napenda kufanya malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Au kama nilitaka safu ya 5, napenda kufanya (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Nini kama mimi na ** int? 472 00:36:46,260 --> 00:36:49,140 Gani Mimi malloc? 473 00:36:49,140 --> 00:36:53,510 [Mwanafunzi] Ukubwa wa pointer. >> Yeah. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Same kitu chini hapa. 475 00:36:56,960 --> 00:37:01,280 Mimi nataka (sizeof (Char *)); 476 00:37:06,170 --> 00:37:12,840 Hii ni kwenda kutenga nafasi kwa pointer kwamba anaonyesha "BOOM". 477 00:37:12,840 --> 00:37:15,330 Sihitaji kutenga nafasi kwa ajili ya "BOOM" yenyewe 478 00:37:15,330 --> 00:37:17,210 kwa sababu hii ni kimsingi sawa na kile alisema kabla ya 479 00:37:17,210 --> 00:37:20,870 ya Char * x = "BOOM". 480 00:37:20,870 --> 00:37:27,950 "BOOM" tayari upo. Hufanyika kwa kuwepo katika kanda kusoma tu ya kumbukumbu. 481 00:37:27,950 --> 00:37:35,200 Lakini tayari ipo, ambayo ina maana hii mstari wa kanuni, ikiwa ni s ** Char, 482 00:37:35,200 --> 00:37:43,900 kisha * s ni * Char na wewe ni kuweka hii * Char na kumweka kwa "BOOM". 483 00:37:43,900 --> 00:37:50,040 Kama nilitaka kunakili "BOOM" ndani, basi mimi ingekuwa haja ya kutenga nafasi kwa s. 484 00:37:55,170 --> 00:38:03,900 Nitafanya * s = malloc (sizeof (Char) * 5); 485 00:38:03,900 --> 00:38:06,210 Mbona 5? 486 00:38:06,210 --> 00:38:10,860 Mbona si 4? Inaonekana kama "BOOM" ni 4 wahusika. >> [Mwanafunzi] tabia null. 487 00:38:10,860 --> 00:38:14,580 Yeah. Yote ya masharti yako ni kwenda haja ya tabia null. 488 00:38:14,580 --> 00:38:23,590 Sasa siwezi kufanya kitu kama strcat - Ni nini kazi kwa kuiga kamba? 489 00:38:23,590 --> 00:38:28,520 [Mwanafunzi] cpy? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 mtu strcpy. 491 00:38:36,120 --> 00:38:39,590 Hivyo strcpy au strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy ni kidogo salama tangu unaweza specify hasa jinsi wengi wahusika, 493 00:38:43,410 --> 00:38:46,190 lakini hapa haijalishi sababu tunajua. 494 00:38:46,190 --> 00:38:50,340 Hivyo strcpy na kuangalia katika hoja. 495 00:38:50,340 --> 00:38:53,100 Hoja ya kwanza ni ya marudio yetu. 496 00:38:53,100 --> 00:38:56,770 Hoja ya pili ni chanzo chetu. 497 00:38:56,770 --> 00:39:10,310 Sisi ni kwenda na nakala katika marudio * wetu s pointer "BOOM". 498 00:39:10,310 --> 00:39:19,820 Kwa nini wapate unataka kufanya hii na strcpy badala ya kile tu tulikuwa kabla ya 499 00:39:19,820 --> 00:39:22,800 ya * s = "BOOM"? 500 00:39:22,800 --> 00:39:28,630 Kuna sababu unaweza kutaka kufanya hivyo, lakini nini ni sababu ya kwamba? 501 00:39:28,630 --> 00:39:31,940 [Mwanafunzi] Kama unataka kubadilisha kitu katika "BOOM". >> Yeah. 502 00:39:31,940 --> 00:39:37,950 Sasa siwezi kufanya kitu kama s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 kwa sababu ya pointi chungu na kwamba nafasi kwenye chungu kwamba s ni akizungumzia 504 00:39:48,190 --> 00:39:52,320 ni pointer nafasi zaidi juu ya chungu, ambayo ni hifadhi ya "BOOM". 505 00:39:52,320 --> 00:39:55,150 Hivyo nakala hii ya "BOOM" ni kuwa kuhifadhiwa katika lundo. 506 00:39:55,150 --> 00:39:58,780 Kuna nakala mbili za kitaalam "BOOM" katika programu yetu. 507 00:39:58,780 --> 00:40:03,500 Kuna mmoja tu kwanza hiyo aliyopewa na hii mara kwa mara "BOOM" kamba, 508 00:40:03,500 --> 00:40:09,250 na nakala ya pili ya "BOOM", strcpy umba nakala ya "BOOM". 509 00:40:09,250 --> 00:40:13,100 Lakini nakala ya "BOOM" ni kuwa kuhifadhiwa kwenye chungu, na chungu wewe ni bure kubadilika. 510 00:40:13,100 --> 00:40:17,250 chungu si kusoma tu, hivyo hiyo ina maana kwamba s [0] 511 00:40:17,250 --> 00:40:20,500 ni kwenda basi unaweza kubadilisha thamani ya "BOOM". 512 00:40:20,500 --> 00:40:23,130 Ni kwenda basi wewe kubadili tabia hizo. 513 00:40:23,130 --> 00:40:26,640 >> Maswali? 514 00:40:27,740 --> 00:40:29,290 Sawa. 515 00:40:29,290 --> 00:40:35,500 >> Kuhamia kwenye buggy3, hebu gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Sisi tu kukimbia na sisi kuona sisi kupata segfault. 517 00:40:39,840 --> 00:40:46,550 Kama sisi backtrace, kuna mbili tu kazi. 518 00:40:46,550 --> 00:40:52,970 Kama sisi kwenda juu katika kazi yetu kuu, sisi kuona kwamba sisi segfaulted katika mstari huu. 519 00:40:52,970 --> 00:41:00,180 Hivyo tu kuangalia mstari huu, kwa ajili ya (int line = 0; fgets mambo haya haina sawa null; 520 00:41:00,180 --> 00:41:03,770 mstari + +). 521 00:41:03,770 --> 00:41:08,010 Frame wetu uliopita aliitwa _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Utaona kwamba mengi na kujengwa katika utendaji C, 523 00:41:10,720 --> 00:41:15,350 kwamba wakati wewe kupata segfault, kutakuwa kweli cryptic kazi majina 524 00:41:15,350 --> 00:41:18,090 kama hii _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Lakini ambayo inaenda yanahusiana na wito huu fgets. 526 00:41:21,770 --> 00:41:25,850 Mahali fulani ndani ya hapa, sisi ni segfaulting. 527 00:41:25,850 --> 00:41:30,340 Kama sisi kuangalia hoja kwa fgets, tunaweza magazeti buffer. 528 00:41:30,340 --> 00:41:41,180 Hebu magazeti kama - Oh, hakuna. 529 00:41:48,980 --> 00:41:51,900 Print si kwenda kufanya kazi hasa kama mimi unataka kwa. 530 00:41:55,460 --> 00:41:58,000 Hebu tuangalie mpango halisi. 531 00:42:02,200 --> 00:42:09,640 Buffer ni safu tabia. Ni safu tabia ya wahusika 128. 532 00:42:09,640 --> 00:42:14,980 Hivyo wakati mimi kusema magazeti buffer, ni kwenda magazeti wahusika wale 128, 533 00:42:14,980 --> 00:42:18,300 ambayo mimi nadhani ni mambo yanayotarajiwa. 534 00:42:18,300 --> 00:42:21,390 Nini nilikuwa kutafuta ni magazeti anuani ya buffer, 535 00:42:21,390 --> 00:42:23,680 lakini kwamba si kweli niambie sana. 536 00:42:23,680 --> 00:42:30,770 Hivyo wakati mimi kutokea kwa kusema hapa juu x buffer, inaonyesha mimi 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 ambayo, kama wewe kumbuka kutoka mapema au fulani, Oxbffff huelekea kuwa kanda stack-ish. 538 00:42:38,690 --> 00:42:46,020 stack huelekea kuanza mahali fulani tu chini ya 0xc000. 539 00:42:46,020 --> 00:42:51,890 Tu kwa kuona anuani hii, najua kwamba buffer kinachojitokeza stack. 540 00:42:51,890 --> 00:43:04,500 Kuanzisha tena mpango wangu, kukimbia, juu, buffer tuliona ilikuwa hii mlolongo wa wahusika 541 00:43:04,500 --> 00:43:06,530 kwamba ni kiasi pretty maana. 542 00:43:06,530 --> 00:43:12,270 Kisha uchapishaji faili, nini faili kuangalia kama? 543 00:43:15,120 --> 00:43:17,310 [Mwanafunzi] Batili. >> Yeah. 544 00:43:17,310 --> 00:43:22,610 File ni ya aina * JALADA, hivyo ni pointer, 545 00:43:22,610 --> 00:43:26,610 na thamani ya pointer kwamba ni null. 546 00:43:26,610 --> 00:43:33,240 Hivyo fgets ni kwenda kujaribu kusoma kutoka pointer kwamba katika njia ya moja kwa moja, 547 00:43:33,240 --> 00:43:37,320 lakini ili kupata kwamba pointer, ina dereference yake. 548 00:43:37,320 --> 00:43:40,550 Au, ili kupata kile ni lazima akizungumzia, ni dereferences yake. 549 00:43:40,550 --> 00:43:43,810 Hivyo ni dereferencing pointer null na segfaults yake. 550 00:43:46,600 --> 00:43:48,730 Ningeweza imeweza kuanzisha pale. 551 00:43:48,730 --> 00:43:52,170 Kama sisi kuvunja katika hatua zetu kuu na kukimbia, 552 00:43:52,170 --> 00:43:57,320 mstari wa kwanza wa code ni Char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Kwamba lazima kutoa pretty kubwa ladha kama kwa sababu programu hii inashindwa. 554 00:44:00,870 --> 00:44:06,080 Typing ijayo inanileta kwa mstari unaofuata, ambapo mimi kufungua faili hii, 555 00:44:06,080 --> 00:44:11,140 na kisha mimi mara moja kupata katika line yetu, ambapo mara moja mimi hit ijayo, ni kwenda segfault. 556 00:44:11,140 --> 00:44:16,880 Je, mtu yeyote unataka kutupa nje sababu sisi tupate kuwa segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Mwanafunzi] Picha haipo. >> Yeah. 558 00:44:19,130 --> 00:44:22,250 Hii ni walidhani kuwa dokezo 559 00:44:22,250 --> 00:44:29,570 kwamba wakati wowote wewe ni kufungua faili unahitaji kuangalia kwamba faili kweli lipo. 560 00:44:29,570 --> 00:44:31,510 Hivyo hapa, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Wakati sisi fopen filename kwa ajili ya kusoma, sisi basi haja ya kusema 562 00:44:34,700 --> 00:44:45,870 kama (faili == null) na kusema printf ("Picha haipo!" 563 00:44:45,870 --> 00:44:56,340 au - bado bora - filename); kurudi 1; 564 00:44:56,340 --> 00:45:00,300 Hivyo sasa sisi kuangalia kuona kama ni null 565 00:45:00,300 --> 00:45:03,930 kabla ya kuendelea na kweli kujaribu kusoma kutoka faili hilo. 566 00:45:03,930 --> 00:45:08,800 Tunaweza remake tu kuona kwamba matendo hayo. 567 00:45:11,020 --> 00:45:14,970 Mimi lengo ni pamoja na mstari mpya. 568 00:45:21,090 --> 00:45:25,290 Hivyo sasa nonexistent.txt haipo. 569 00:45:26,890 --> 00:45:30,040 Unapaswa daima kuangalia kwa aina hii ya kitu. 570 00:45:30,040 --> 00:45:33,870 Unapaswa daima kuangalia kuona kama fopen anarudi null. 571 00:45:33,870 --> 00:45:38,170 Unapaswa daima kuangalia kuhakikisha kwamba malloc haina kurudi null, 572 00:45:38,170 --> 00:45:41,410 au mwingine segfault. 573 00:45:42,200 --> 00:45:45,930 >> Sasa buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Mbio. Mimi guessing hii ni kusubiri kwa ajili ya pembejeo au looping uwezekano usio. 575 00:45:58,440 --> 00:46:01,870 Ndiyo, ni usio looping. 576 00:46:01,870 --> 00:46:05,560 Hivyo buggy4. Inaonekana kama sisi ni usio looping. 577 00:46:05,560 --> 00:46:12,590 Tunaweza kuvunja saa kuu, kuendesha programu yetu. 578 00:46:12,590 --> 00:46:20,180 Katika gdb, kwa muda mrefu kama wewe kutumia abbreviation ni suala la utata 579 00:46:20,180 --> 00:46:23,420 au maalum vifupisho kwamba wao kutoa kwa ajili yenu, 580 00:46:23,420 --> 00:46:29,020 basi unaweza kutumia n kutumia ijayo badala ya kuwa na aina nje karibu njia yote. 581 00:46:29,020 --> 00:46:33,730 Na kwa kuwa sasa nimepata hit n mara moja, siwezi tu hit Enter kuendelea ijayo 582 00:46:33,730 --> 00:46:36,640 badala ya kuwa na hit n Ingiza, n Ingiza, n Ingiza. 583 00:46:36,640 --> 00:46:44,630 Inaonekana kama mimi niko katika baadhi ya aina ya kwa kitanzi ambacho kuweka safu [i] kwa 0. 584 00:46:44,630 --> 00:46:50,510 Inaonekana kama mimi kamwe kuvunja nje ya hili kwa kitanzi. 585 00:46:50,510 --> 00:46:54,780 Kama mimi magazeti i, hivyo i ni 2, kisha nitakwenda ijayo. 586 00:46:54,780 --> 00:46:59,250 Mimi itabidi magazeti i, i ni 3, kisha nitakwenda ijayo. 587 00:46:59,250 --> 00:47:05,360 Mimi itabidi magazeti i na i ni 3. Next, magazeti i, i ni 4. 588 00:47:05,360 --> 00:47:14,520 Kweli, magazeti sizeof (safu), hivyo ukubwa wa safu ni 20. 589 00:47:16,310 --> 00:47:32,870 Lakini inaonekana kama kuna baadhi maalum gdb amri kwa ajili ya kwenda mpaka kitu kinachotokea. 590 00:47:32,870 --> 00:47:37,620 Ni kama kuweka hali juu ya thamani ya kutofautiana. Lakini sikumbuki ni nini. 591 00:47:37,620 --> 00:47:44,100 Hivyo kama sisi kuendelea - 592 00:47:44,100 --> 00:47:47,120 Nini walikuwa wewe kusema? Nini kuleta? 593 00:47:47,120 --> 00:47:50,500 [Mwanafunzi] Je kuonyesha i kuongeza - >> Yeah. Hivyo kuonyesha i inaweza kusaidia. 594 00:47:50,500 --> 00:47:54,530 Kama sisi tu kuonyesha i, itakuwa kuweka hapa nini thamani ya i ni 595 00:47:54,530 --> 00:47:56,470 hivyo mimi hawana magazeti ni nje kila wakati. 596 00:47:56,470 --> 00:48:02,930 Kama sisi tu kuendelea ijayo, tunaona 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 Kitu ni kwenda vibaya sana, na i ni kuwa upya kwa 0. 598 00:48:13,330 --> 00:48:22,220 Kuangalia buggy4.c, tunaona yote ambayo hufanyika ni int safu [5]; 599 00:48:22,220 --> 00:48:26,200 kwa ajili ya (i = 0; i <= sizeof (safu); i + +) 600 00:48:26,200 --> 00:48:28,550 safu [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Nini sisi kuona kwamba ni makosa hapa? 602 00:48:31,390 --> 00:48:39,480 Kama dokezo, wakati mimi nilikuwa kufanya gdb buggy4 - hebu kuvunja kuu, kukimbia - 603 00:48:39,480 --> 00:48:45,980 Sikuweza magazeti sizeof (safu) tu kuona nini hali ni ambapo mimi lazima hatimaye kuvunja nje. 604 00:48:47,690 --> 00:48:51,100 Ambapo Mimi ni nani? Je, mimi kukimbia? 605 00:48:51,100 --> 00:48:54,280 Sikuweza kutangaza bado. 606 00:48:54,280 --> 00:48:58,680 Hivyo magazeti sizeof (safu) na kwamba 20, 607 00:48:58,680 --> 00:49:06,690 ambayo inatarajiwa tangu safu yangu ni ya kawaida 5 na ni ya integers 5, 608 00:49:06,690 --> 00:49:12,410 hivyo suala zima lazima 5 * sizeof (int) ka, ambapo sizeof (int) huelekea kuwa 4. 609 00:49:12,410 --> 00:49:14,780 Hivyo sizeof (safu) ni 20. 610 00:49:14,780 --> 00:49:17,420 Nini hii? 611 00:49:17,420 --> 00:49:21,720 [Mwanafunzi] Kugawanywa na sizeof (int). >> Yeah, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Inaonekana kama bado kuna tatizo hapa. Nadhani hii lazima tu kuwa < 613 00:49:30,630 --> 00:49:36,960 tangu ni kiasi pretty daima 00:49:44,860 Sasa hebu fikiria nini hii ilikuwa kweli kuvunjwa. 615 00:49:44,860 --> 00:49:53,370 Je, mtu yeyote kuwa guesses kwanini i upya kwa njia ya kila 0 iteration ya kitanzi? 616 00:50:01,300 --> 00:50:09,350 Kitu pekee ndani ya hapa kwamba kinachotokea ni kwamba safu [i] ni kuwa kuweka 0. 617 00:50:09,350 --> 00:50:15,350 Hivyo kwa namna fulani, hii mstari wa kanuni ni kusababisha int yetu i kuwekwa kwa 0. 618 00:50:16,730 --> 00:50:23,130 [Mwanafunzi] Inawezekana kuwa kwa sababu ni kuu ya kumbukumbu ya sehemu hii ya i 619 00:50:23,130 --> 00:50:27,970 wakati anadhani ni kipengele kingine cha safu? >> [Bowden] Ndiyo. 620 00:50:27,970 --> 00:50:33,880 Wakati sisi ni kwenda nje ya mwisho wa safu yetu, 621 00:50:33,880 --> 00:50:39,870 namna fulani kwamba nafasi ya kuwa sisi ni kuu ni kuu thamani ya i. 622 00:50:39,870 --> 00:50:48,030 Na hivyo kama sisi kuangalia ndani buggy4, kuvunja kuu, kukimbia, 623 00:50:48,030 --> 00:50:53,120 hebu magazeti anuani ya i. 624 00:50:53,120 --> 00:50:57,280 Inaonekana kama ni bffff124. 625 00:50:57,280 --> 00:51:03,930 Sasa hebu magazeti anuani ya safu [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Je kuhusu [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11c, 120. safu [5] ni bfff124. 629 00:51:14,530 --> 00:51:26,990 Hivyo safu [5] ina anuani hiyo kama i, ambayo ina maana kwamba safu [5] ni i. 630 00:51:26,990 --> 00:51:30,720 Kama wana anuani hiyo, wao ni kitu kimoja. 631 00:51:30,720 --> 00:51:38,410 Hivyo wakati sisi kuweka safu [5] kwa 0, sisi ni kuweka i kwa 0. 632 00:51:38,410 --> 00:51:46,070 Na kama wewe kufikiri juu ya hili katika suala la stack, 633 00:51:46,070 --> 00:51:55,590 int i ni alitangaza kwanza, ambayo ina maana i anapata baadhi nafasi kwenye stack. 634 00:51:55,590 --> 00:52:04,730 Kisha safu [5] ni zilizotengwa, hivyo basi ka 20 zinatolewa kwa stack. 635 00:52:04,730 --> 00:52:08,400 Hivyo i anapata zilizotengwa kwanza, basi ka hizi 20 kupata zilizotengwa. 636 00:52:08,400 --> 00:52:11,400 Hivyo i kinachotokea haki kabla ya safu, 637 00:52:11,400 --> 00:52:19,230 na kwa sababu ya njia, kama nilivyosema wiki iliyopita, ambapo kitaalam stack hukua chini, 638 00:52:19,230 --> 00:52:28,520 wakati wewe index katika safu, sisi ni uhakika kwamba nafasi 0 katika safu 639 00:52:28,520 --> 00:52:31,970 daima hufanyika kabla ya nafasi ya kwanza katika safu. 640 00:52:31,970 --> 00:52:35,900 Hii ni aina ya jinsi mimi akauchomoa wiki iliyopita. 641 00:52:35,900 --> 00:52:42,210 Ona kwamba chini tuna anuani 0 na saa ya juu tuna anuani Max. 642 00:52:42,210 --> 00:52:44,880 stack daima ni kukua chini. 643 00:52:48,100 --> 00:52:53,500 Hebu sema sisi kutenga i. 644 00:52:53,500 --> 00:52:59,680 Sisi kutenga integer i, ambayo ina maana wacha tu kusema hapa juu integer i anapata zilizotengwa. 645 00:52:59,680 --> 00:53:06,420 Kisha sisi kutenga safu yetu ya integers 5, ambayo ina maana kwamba chini ya kwamba, 646 00:53:06,420 --> 00:53:11,230 tangu stack ni kuongezeka chini, integers wale 5 kupata zilizotengwa. 647 00:53:11,230 --> 00:53:15,900 Lakini kwa sababu ya jinsi arrays kazi, sisi ni uhakika kwamba nafasi ya kwanza katika safu 648 00:53:15,900 --> 00:53:22,260 daima ina anuani chini ya Jambo la pili katika safu. 649 00:53:22,260 --> 00:53:28,270 Hivyo safu nafasi 0 daima ina kutokea kwanza katika kumbukumbu, 650 00:53:28,270 --> 00:53:30,700 ambapo safu msimamo 1 kitokee baada ya kuwa 651 00:53:30,700 --> 00:53:33,310 na safu msimamo 2 kitokee baada ya kuwa, 652 00:53:33,310 --> 00:53:37,900 ambayo ina maana kwamba nafasi safu 0 kingetokea mahali fulani hapa chini, 653 00:53:37,900 --> 00:53:40,690 safu msimamo 1 kingetokea hapo juu kwamba 654 00:53:40,690 --> 00:53:45,530 sababu ukienda juu ina maana anwani ya juu tangu anuani upeo ni hapa juu. 655 00:53:45,530 --> 00:53:50,490 Hivyo safu [0] chini hapa, safu [1] hadi hapa, safu [2] hadi hapa, safu [3] hadi hapa. 656 00:53:50,490 --> 00:53:55,620 Angalia jinsi kabla sisi zilizotengwa integer i wote njia ya juu hapa, 657 00:53:55,620 --> 00:54:01,040 kama sisi hoja zaidi na zaidi katika safu yetu, sisi ni kupata karibu na karibu na integer yetu i. 658 00:54:01,040 --> 00:54:07,640 Ni hivyo tu hutokea kwamba safu [5], ambayo ni moja nafasi zaidi ya safu yetu, 659 00:54:07,640 --> 00:54:13,010 ni hasa ambapo integer i kilichotokea kuwa zilizotengwa. 660 00:54:13,010 --> 00:54:16,920 Basi hiyo ni mahali ambapo sisi kutokea kwa kuwa kupiga nafasi kwenye stack 661 00:54:16,920 --> 00:54:21,680 zilizotengwa kwa ajili ya integer i, na sisi ni kuweka kwamba kwa 0. 662 00:54:21,680 --> 00:54:26,160 >> Hiyo ni jinsi ya kuwa kazi. Maswali? Yeah. 663 00:54:26,160 --> 00:54:30,710 [Mwanafunzi] Kamwe akili. Sawa. 664 00:54:30,710 --> 00:54:33,090 [Mwanafunzi] Jinsi gani unaweza kuepuka hayo aina ya makosa? 665 00:54:33,090 --> 00:54:41,190 Hizi aina ya makosa? Usitumie C kama programu lugha yako. 666 00:54:41,190 --> 00:54:45,840 Kutumia lugha ambayo ina mipaka safu kuangalia. 667 00:54:45,840 --> 00:54:55,900 Muda mrefu kama wewe ni makini, wewe tu haja ya kuepuka kwenda nyuma mipaka ya safu yako. 668 00:54:55,900 --> 00:54:58,300 [Mwanafunzi] Basi hapa wakati sisi akaenda nyuma mipaka ya safu yako - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Hiyo ambapo mambo kuanza kwenda vibaya. >> [Mwanafunzi] Oh, okay. 670 00:55:01,840 --> 00:55:05,730 Muda mrefu kama wewe kukaa ndani ya kumbukumbu zilizotengwa kwa ajili ya safu yako, wewe ni faini. 671 00:55:05,730 --> 00:55:12,400 Lakini C gani hakuna kuangalia makosa. Kama mimi kufanya safu [1000], ni furaha tu kurekebisha chochote kinachotokea - 672 00:55:12,400 --> 00:55:16,500 Unaendelea na mwanzo wa safu, basi huenda nafasi 1000 baada na huiweka kwa 0. 673 00:55:16,500 --> 00:55:20,000 Haina kufanya yoyote ya kuangalia kwamba oh, hii si kweli kuwa mambo 1000 ndani yake. 674 00:55:20,000 --> 00:55:22,750 1000 ni njia zaidi ya kile mimi lazima kubadilisha, 675 00:55:22,750 --> 00:55:26,940 ambapo Java au kitu utapata safu nje ya mipaka index 676 00:55:26,940 --> 00:55:29,820 au index nje ya ubaguzi mipaka. 677 00:55:29,820 --> 00:55:33,950 Hiyo ni kwa nini mengi ya lugha za ngazi za juu kuwa na mambo haya 678 00:55:33,950 --> 00:55:37,340 ambapo kama kwenda zaidi ya mipaka ya safu, wewe kushindwa 679 00:55:37,340 --> 00:55:40,070 hivyo kwamba huwezi kubadili mambo kutoka chini ya wewe 680 00:55:40,070 --> 00:55:42,590 na kisha mambo kwenda mbaya zaidi kuliko kupata tu isipokuwa 681 00:55:42,590 --> 00:55:44,940 akisema kwamba alikwenda ng'ambo ya mwisho wa safu. 682 00:55:44,940 --> 00:55:50,970 [Mwanafunzi] Na hivyo tusingeli tu iliyopita <= tu > [Bowden] Yeah. 683 00:55:50,970 --> 00:55:54,800 Ni lazima kuwa 00:55:59,560 tangu sizeof (safu) ni 20, lakini sisi tu wanataka 5. >> [Mwanafunzi] Haki. 685 00:55:59,560 --> 00:56:04,060 Zaidi maswali? Sawa. 686 00:56:04,060 --> 00:56:07,380 >> [Mwanafunzi] nina swali. >> Yeah. 687 00:56:07,380 --> 00:56:16,440 [Mwanafunzi] Nini halisi safu variable? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Kama kile ni safu? 689 00:56:20,000 --> 00:56:24,930 Array yenyewe ni ishara. 690 00:56:24,930 --> 00:56:31,490 Ni haki ya anuani ya kuanza ya ka 20 kwamba sisi ni referencing. 691 00:56:31,490 --> 00:56:38,070 Unaweza kufikiria kama pointer, lakini ni pointer mara kwa mara. 692 00:56:38,070 --> 00:56:44,140 Haraka kama mambo kupata compiled, safu variable haipo tena. 693 00:56:44,140 --> 00:56:48,210 [Mwanafunzi] Hivyo jinsi gani kupata ukubwa wa safu? 694 00:56:48,210 --> 00:56:54,130 Ukubwa wa safu inahusu ukubwa wa block kwamba ishara kwamba inahusu. 695 00:56:54,130 --> 00:57:01,240 Wakati mimi kufanya kitu kama printf ("% p \ n", safu); 696 00:57:01,240 --> 00:57:05,140 hebu kukimbia. 697 00:57:12,960 --> 00:57:15,530 Nini mimi tu kufanya makosa? 698 00:57:15,530 --> 00:57:19,220 'Safu' Array alitangaza hapa. 699 00:57:20,820 --> 00:57:23,200 Oh, hapa juu. 700 00:57:23,200 --> 00:57:31,250 Clang ni wajanja, na hutokea kwa taarifa kwamba mimi alitangaza safu kama vipengele 5 701 00:57:31,250 --> 00:57:34,540 lakini nina Indexing katika nafasi 1000. 702 00:57:34,540 --> 00:57:38,450 Ni anaweza kufanya hivyo kwa sababu hizi ni baadhi tu ya constants. 703 00:57:38,450 --> 00:57:43,370 Ni inaweza tu kwenda mbali katika noticing kwamba mimi nina kwenda zaidi ya mipaka ya safu. 704 00:57:43,370 --> 00:57:46,880 Lakini taarifa kabla ya wakati tulikuwa i kuwa sio sahihi, 705 00:57:46,880 --> 00:57:51,040 haiwezi uwezekano kuamua jinsi wengi maadili i inaweza kuchukua, 706 00:57:51,040 --> 00:57:55,540 hivyo hawezi kuamua kwamba i alikuwa anaenda ng'ambo ya mwisho wa safu. 707 00:57:55,540 --> 00:57:59,430 Hiyo tu Clang kuwa wajanja. 708 00:57:59,430 --> 00:58:03,340 >> Lakini sasa kufanya buggy4. Hivyo kile kingine mimi kufanya makosa? 709 00:58:03,340 --> 00:58:05,970 Implicitly kutangaza maktaba kazi 'printf'. 710 00:58:05,970 --> 00:58:14,960 Mimi naenda wanataka # pamoja . 711 00:58:14,960 --> 00:58:18,710 Sawa. Sasa mbio buggy4. 712 00:58:18,710 --> 00:58:24,840 Uchapishaji thamani ya safu kama mimi hapa, uchapishaji ni kama pointer 713 00:58:24,840 --> 00:58:30,060 prints kitu ambacho inaonekana kama hii - bfb8805c - ambayo ni baadhi anuani 714 00:58:30,060 --> 00:58:33,450 kwamba katika mkoa stack-ish. 715 00:58:33,450 --> 00:58:41,820 Array yenyewe ni kama pointer, lakini si pointer halisi, 716 00:58:41,820 --> 00:58:45,410 tangu pointer mara kwa mara tunaweza kubadilisha. 717 00:58:45,410 --> 00:58:54,700 Array ni baadhi tu ya mara kwa mara. Vitalu 20 ya kumbukumbu ya kuanza saa 0xbfb8805c anuani. 718 00:58:54,700 --> 00:59:09,020 Hivyo bfb8805c kupitia anuani hii +20--au mimi nadhani -20 - 719 00:59:09,020 --> 00:59:17,400 yote ni ya kumbukumbu zilizotengwa kwa ajili ya safu hii. 720 00:59:17,400 --> 00:59:20,350 Array, variable yenyewe si kuhifadhiwa mahali popote. 721 00:59:20,350 --> 00:59:27,660 Wakati wewe ni kuandaa, compiler - mkono wimbi saa yake - 722 00:59:27,660 --> 00:59:33,060 lakini compiler tu kutumia ambapo anajua kuwa safu. 723 00:59:33,060 --> 00:59:36,090 Ni anajua ambapo safu kwamba kuanza, 724 00:59:36,090 --> 00:59:40,910 na hivyo inaweza daima tu kufanya mambo katika suala la offsets tangu mwanzo kwamba. 725 00:59:40,910 --> 00:59:43,960 Haina haja ya variable yenyewe kuwakilisha safu. 726 00:59:43,960 --> 00:59:53,730 Lakini wakati mimi kufanya kitu kama int safu * p =; sasa p ni pointer ambayo inaelekeza kwamba safu, 727 00:59:53,730 --> 00:59:57,830 na sasa p kweli gani zipo juu ya stack. 728 00:59:57,830 --> 01:00:01,950 Mimi nina uhuru wa kubadilisha p. Naweza kufanya p = malloc. 729 01:00:01,950 --> 01:00:06,500 Hivyo awali alisema kwa safu; sasa inaelekeza katika nafasi baadhi ya chungu. 730 01:00:06,500 --> 01:00:09,620 Mimi siwezi kufanya safu = malloc. 731 01:00:09,620 --> 01:00:13,710 Kama Clang ni wajanja, itakuwa yell saa yangu haki mbali bat. 732 01:00:17,000 --> 01:00:21,430 Kweli, mimi nina uhakika pretty GCC bila kufanya hii pia. 733 01:00:21,430 --> 01:00:25,010 Hivyo safu aina ya 'int [5]' si assignable. 734 01:00:25,010 --> 01:00:28,040 Huwezi hawawajui kitu aina safu 735 01:00:28,040 --> 01:00:30,500 kwa sababu ni safu tu mara kwa mara. 736 01:00:30,500 --> 01:00:34,760 Ni ishara ambayo marejeo wale ka 20. Siwezi kuibadilisha. 737 01:00:34,760 --> 01:00:37,690 >> [Mwanafunzi] Na pale ambapo ni kawaida ya safu kuhifadhiwa? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Ni si kuhifadhiwa mahali popote. Ni wakati ni kuandaa. 739 01:00:40,670 --> 01:00:46,310 Hivyo ambapo ni kawaida ya safu kuhifadhiwa? 740 01:00:46,310 --> 01:00:51,870 Unaweza tu kutumia sizeof (safu) ndani ya kazi kwamba safu ya kutangazwa yenyewe. 741 01:00:51,870 --> 01:01:03,150 Hivyo kama mimi kufanya baadhi ya kazi, foo, na mimi kufanya (int safu []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (safu)); 743 01:01:10,450 --> 01:01:21,330 na kisha chini hapa mimi wito foo (safu); 744 01:01:21,330 --> 01:01:24,840 ndani ya kazi hii - wacha kukimbia. 745 01:01:34,200 --> 01:01:36,840 Hii ni Clang kuwa wajanja tena. 746 01:01:36,840 --> 01:01:43,890 Ni akiniambia kwamba sizeof kwenye safu parameter kazi 747 01:01:43,890 --> 01:01:46,690 atarudi ukubwa wa '* int'. 748 01:01:46,690 --> 01:01:55,150 Hii itakuwa kosa kama si nini nilitaka kutokea. 749 01:01:55,150 --> 01:01:58,960 Hebu kweli kugeuka mbali Werror. 750 01:02:14,950 --> 01:02:17,590 Onyo. Maonyo ni faini. 751 01:02:17,590 --> 01:02:19,960 Itakuwa bado kukusanya muda mrefu kama ina onyo. 752 01:02:19,960 --> 01:02:22,910 . / A.out ni kwenda magazeti 4. 753 01:02:22,910 --> 01:02:28,650 onyo kwamba alikuwa yanayotokana ni kiashiria wazi ya nini potoka. 754 01:02:28,650 --> 01:02:34,120 Hii safu int ni kwenda tu na magazeti sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Hata kama mimi kuweka safu [5] katika hapa, ni bado tu kwenda magazeti sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Hivyo kwa haraka kama wewe kupita ndani ya kazi, tofauti kati ya arrays na kuyatumia 757 01:02:47,440 --> 01:02:49,670 haipo. 758 01:02:49,670 --> 01:02:52,640 Hii hutokea kwa kuwa safu kwamba ilitangazwa siku ya stack, 759 01:02:52,640 --> 01:02:58,300 lakini kwa haraka kama sisi kupita kwamba thamani, kwamba 0xbf blah, blah, blah katika kazi hii, 760 01:02:58,300 --> 01:03:03,350 kisha pointer hii inaelekeza kwamba safu ya stack. 761 01:03:03,350 --> 01:03:08,310 Hivyo hiyo ina maana kwamba sizeof tu inatumika katika kazi kwamba safu ilitangazwa, 762 01:03:08,310 --> 01:03:11,230 ambayo ina maana kwamba wakati wewe ni kuandaa kazi hii, 763 01:03:11,230 --> 01:03:17,330 wakati Clang huenda kwa njia ya kazi hii, anaona safu safu int ya kawaida 5. 764 01:03:17,330 --> 01:03:20,640 Hivyo basi anaona sizeof (safu). Naam, hiyo ni 20. 765 01:03:20,640 --> 01:03:26,440 Hiyo ni kweli jinsi sizeof kimsingi kazi kwa karibu kesi zote. 766 01:03:26,440 --> 01:03:31,150 Sizeof si kazi; ni operator. 767 01:03:31,150 --> 01:03:33,570 Huwezi kuwaita kazi sizeof. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), compiler tu kutafsiri kwamba kwa 4. 769 01:03:41,480 --> 01:03:43,700 Got it? Sawa. 770 01:03:43,700 --> 01:03:47,520 >> [Mwanafunzi] Basi ni nini tofauti kati ya sizeof (safu) katika kuu na katika foo? 771 01:03:47,520 --> 01:03:52,840 Hii ni kwa sababu sisi ni kusema sizeof (safu), ambayo ni ya aina * int, 772 01:03:52,840 --> 01:03:57,120 ambapo safu chini hapa ni si ya aina * int, ni safu int. 773 01:03:57,120 --> 01:04:04,540 >> [Mwanafunzi] Hivyo kama wewe alikuwa parameter katika safu [] badala ya safu int *, 774 01:04:04,540 --> 01:04:09,230 ingekuwa kwamba maana kwamba unaweza bado kubadili safu kwa sababu sasa ni pointer? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Kama hili? >> [Mwanafunzi] Yeah. Je, unaweza kubadili safu ndani ya kazi sasa? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Unaweza kubadilisha safu katika kesi zote. 777 01:04:18,420 --> 01:04:23,130 Katika wote wa kesi hizi ni huru kusema safu [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Mwanafunzi] Lakini unaweza kufanya safu uhakika na kitu kingine? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Yeah. Katika kesi aidha - >> [mwanafunzi] Yeah. 780 01:04:30,230 --> 01:04:38,410 [Bowden] tofauti kati ya safu [] na int safu *, hapana. 781 01:04:38,410 --> 01:04:42,570 Unaweza pia kupata baadhi ya safu multidimensional katika hapa 782 01:04:42,570 --> 01:04:47,050 kwa syntax baadhi urahisi, lakini bado tu pointer. 783 01:04:47,050 --> 01:04:56,400 Hii ina maana kwamba mimi ni huru kufanya safu = malloc (sizeof (int)); na sasa kumweka mahali pengine. 784 01:04:56,400 --> 01:04:59,610 Lakini tu kama jinsi hii matendo milele na daima, 785 01:04:59,610 --> 01:05:03,210 kubadilisha hii safu kwa kufanya hivyo uhakika na kitu kingine 786 01:05:03,210 --> 01:05:07,570 haibadiliki hii safu chini hapa kwa sababu ni nakala ya hoja, 787 01:05:07,570 --> 01:05:10,780 si pointer hoja kwamba. 788 01:05:10,780 --> 01:05:16,070 Na kweli, kama dalili zaidi kwamba ni sawa - 789 01:05:16,070 --> 01:05:21,100 sisi tayari kuona nini prints safu uchapishaji - 790 01:05:21,100 --> 01:05:31,410 nini kama sisi magazeti anuani ya safu au anuani ya anuani ya safu 791 01:05:31,410 --> 01:05:36,290 aidha ya wale? 792 01:05:41,770 --> 01:05:45,220 Hebu kupuuza hii moja. 793 01:05:48,140 --> 01:05:51,660 Sawa. Hii ni faini. Ni sasa mbio. / A.out. 794 01:05:51,660 --> 01:06:00,220 Uchapishaji safu, basi uchapishaji anuani ya safu, ni kitu kimoja. 795 01:06:00,220 --> 01:06:02,870 Array tu haipo. 796 01:06:02,870 --> 01:06:08,190 Ni anajua wakati wewe ni uchapishaji safu, wewe ni uchapishaji ishara kwamba inahusu ka wale 20. 797 01:06:08,190 --> 01:06:11,940 Uchapishaji anuani ya safu, vizuri, safu haipo. 798 01:06:11,940 --> 01:06:17,200 Haina anuani, hivyo tu Prints anuani ya ka wale 20. 799 01:06:20,820 --> 01:06:28,150 Haraka kama wewe kukusanya chini, kama katika buggy4 yako compiled /. A.out, 800 01:06:28,150 --> 01:06:30,340 safu haipo. 801 01:06:30,340 --> 01:06:33,640 Kuyatumia zipo. Arrays hawana. 802 01:06:34,300 --> 01:06:38,060 vitalu ya kumbukumbu anayewakilisha safu bado zipo, 803 01:06:38,060 --> 01:06:43,270 lakini safu kutofautiana na vigezo ya aina ya kwamba hazipo. 804 01:06:46,260 --> 01:06:50,270 Wale ni kama tofauti kubwa kati ya arrays na kuyatumia 805 01:06:50,270 --> 01:06:55,590 ni haraka kama wewe kufanya wito kazi, hakuna tofauti. 806 01:06:55,590 --> 01:07:00,460 Lakini ndani ya kazi ambayo safu yenyewe ni alitangaza, sizeof kazi tofauti 807 01:07:00,460 --> 01:07:05,190 tangu wewe ni uchapishaji ukubwa wa vitalu badala ya ukubwa wa aina, 808 01:07:05,190 --> 01:07:08,950 na huwezi kubadilisha ni kwa sababu ni ishara. 809 01:07:08,950 --> 01:07:14,370 Uchapishaji kitu na anuani ya kitu Prints kitu kimoja. 810 01:07:14,370 --> 01:07:18,480 Na kwamba ni pretty kiasi. 811 01:07:18,480 --> 01:07:20,820 [Mwanafunzi] Unaweza kusema kwamba muda zaidi? 812 01:07:21,170 --> 01:07:24,170 Nipate kuwa amekosa kitu. 813 01:07:24,170 --> 01:07:29,260 Uchapishaji safu na anuani ya safu Prints kitu kimoja, 814 01:07:29,260 --> 01:07:33,180 lakini kama wewe magazeti pointer dhidi anuani ya pointer, 815 01:07:33,180 --> 01:07:36,010 jambo moja Prints anuani ya nini wewe akizungumzia, 816 01:07:36,010 --> 01:07:40,360 nyingine Prints anuani ya pointer juu ya stack. 817 01:07:40,360 --> 01:07:47,040 Unaweza kubadilisha pointer; huwezi kubadilisha ishara safu. 818 01:07:47,740 --> 01:07:53,270 Na sizeof pointer ni kwenda magazeti ukubwa wa aina hiyo pointer. 819 01:07:53,270 --> 01:07:57,470 Hivyo int * p sizeof (p) ataenda magazeti 4, 820 01:07:57,470 --> 01:08:04,110 lakini int safu [5] magazeti sizeof (safu) ataenda magazeti 20. 821 01:08:04,110 --> 01:08:07,480 [Mwanafunzi] Basi int safu [5] itakuwa magazeti 20? >> Ndiyo. 822 01:08:07,480 --> 01:08:13,300 Hiyo ndiyo sababu ndani ya buggy4 wakati kutumika kuwa sizeof (safu) 823 01:08:13,300 --> 01:08:16,660 hii alikuwa akifanya i <20, ambayo si kile tunachotaka. 824 01:08:16,660 --> 01:08:20,880 Tunataka i <5. >> [Mwanafunzi] Sawa. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Na kisha kwa haraka kama wewe kuanza kupita katika utendaji, 826 01:08:25,569 --> 01:08:34,340 kama tulivyofanya int * p = array; 827 01:08:34,340 --> 01:08:39,779 ndani ya kazi hii, tunaweza kutumia kimsingi p na safu katika hasa njia ile ile, 828 01:08:39,779 --> 01:08:43,710 isipokuwa kwa ajili ya tatizo sizeof na tatizo kubadilisha. 829 01:08:43,710 --> 01:08:49,810 Lakini p [0] = 1; ni sawa na kusema safu [0] = 1; 830 01:08:49,810 --> 01:08:55,600 Na kwa haraka kama sisi kusema foo (safu); au foo (p); 831 01:08:55,600 --> 01:08:59,760 ndani ya kazi ya foo, huu ni mwito huo mara mbili. 832 01:08:59,760 --> 01:09:03,350 Hakuna tofauti kati ya simu hizi mbili. 833 01:09:07,029 --> 01:09:11,080 >> Kila mtu mzuri juu ya hilo? Sawa. 834 01:09:14,620 --> 01:09:17,950 Tuna dakika 10. 835 01:09:17,950 --> 01:09:28,319 >> Tutajaribu kupata kupitia mpango huu typer Hacker, 836 01:09:28,319 --> 01:09:32,350 tovuti hii, ambayo alikuja nje mwaka jana au kitu. 837 01:09:34,149 --> 01:09:41,100 Ni tu walidhani kuwa kama wewe aina nasibu na Prints nje - 838 01:09:41,100 --> 01:09:46,729 Chochote faili hutokea kwa kuwa kubeba ni nini inaonekana kama wewe ni kuandika. 839 01:09:46,729 --> 01:09:52,069 Inaonekana kama baadhi ya aina ya maadili ya mfumo wa uendeshaji. 840 01:09:53,760 --> 01:09:56,890 Hiyo ni nini tunataka kutekeleza. 841 01:10:08,560 --> 01:10:11,690 Unapaswa kuwa executable binary aitwaye hacker_typer 842 01:10:11,690 --> 01:10:14,350 kwamba inachukua katika hoja moja, faili na "aina hacker." 843 01:10:14,350 --> 01:10:16,480 Mbio executable lazima wazi screen 844 01:10:16,480 --> 01:10:20,850 na kisha magazeti nje moja tabia kutoka faili kupita katika kila wakati mtumiaji presses muhimu. 845 01:10:20,850 --> 01:10:24,990 Hivyo kila ufunguo waandishi, ni lazima kutupa mbali na badala yake magazeti tabia kutoka faili 846 01:10:24,990 --> 01:10:27,810 kwamba ni hoja. 847 01:10:29,880 --> 01:10:34,350 Mimi itabidi pretty much kukuambia nini mambo ya sisi ni kwenda haja ya kujua ni. 848 01:10:34,350 --> 01:10:36,440 Lakini tunataka kuangalia nje ya maktaba termios. 849 01:10:36,440 --> 01:10:44,840 Sijawahi kutumika hii maktaba katika maisha yangu yote, hivyo ina madhumuni ya chini sana. 850 01:10:44,840 --> 01:10:48,610 Lakini hii ni kwenda kuwa maktaba tunaweza kutumia kutupa mbali tabia hit 851 01:10:48,610 --> 01:10:52,390 wakati wewe ni kuandika katika kiwango in 852 01:10:56,970 --> 01:11:05,840 Hivyo hacker_typer.c, na sisi ni kwenda wanataka # pamoja . 853 01:11:05,840 --> 01:11:12,870 Kuangalia ukurasa mtu kwa termios - I'm guessing terminal ni OS au kitu - 854 01:11:12,870 --> 01:11:16,240 Sijui jinsi ya kusoma. 855 01:11:16,240 --> 01:11:21,040 Kuangalia hii, inasema kwa pamoja na hizi files 2, hivyo tutaweza kufanya hivyo. 856 01:11:37,620 --> 01:11:46,820 >> Jambo la kwanza kwanza, tunataka kuchukua katika hoja moja, ambayo ni faili sisi inapaswa kufungua. 857 01:11:46,820 --> 01:11:52,420 Basi nini nataka kufanya? Je, mimi kuangalia kuona nina hoja moja? 858 01:11:52,420 --> 01:11:56,480 [Mwanafunzi] Kama argc sawa yake. >> [Bowden] Yeah. 859 01:11:56,480 --> 01:12:21,250 Hivyo kama (argc = 2)! Printf ("matumizi:% s [faili kufungua]"). 860 01:12:21,250 --> 01:12:32,750 Hivyo sasa kama mimi hii kukimbia bila kutoa hoja ya pili - oh, nahitaji mstari mpya - 861 01:12:32,750 --> 01:12:36,240 utaona anasema matumizi: / hacker_typer,. 862 01:12:36,240 --> 01:12:39,770 na kisha hoja ya pili lazima faili mimi wanataka kufungua. 863 01:12:58,430 --> 01:13:01,260 Sasa nini mimi? 864 01:13:01,260 --> 01:13:08,490 Mimi nataka kusoma kutoka faili hii. Je, mimi kusoma kutoka faili? 865 01:13:08,490 --> 01:13:11,920 [Mwanafunzi] Wewe kufungua kwanza. >> Yeah. 866 01:13:11,920 --> 01:13:15,010 Hivyo fopen. Je fopen kuangalia kama? 867 01:13:15,010 --> 01:13:22,980 [Mwanafunzi] Filename. >> [Bowden] Filename ni kwenda kuwa argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Mwanafunzi] Na hapo nini unataka kufanya na hayo, hivyo - >> [Bowden] Yeah. 869 01:13:26,110 --> 01:13:28,740 Hivyo kama hukuzikumbuka, unaweza tu kufanya mtu fopen, 870 01:13:28,740 --> 01:13:32,960 ambapo ni kwenda kuwa const Char * njia ambapo njia ni filename, 871 01:13:32,960 --> 01:13:34,970 const Char * mode. 872 01:13:34,970 --> 01:13:38,660 Kama kutokea kwa si unakumbuka kile mode ni, basi unaweza kuangalia kwa mode. 873 01:13:38,660 --> 01:13:44,660 Ndani ya mtu kurasa, tabia slash ni nini unaweza kutumia ili kutafuta mambo. 874 01:13:44,660 --> 01:13:49,790 Hivyo ninapoandika / mode kutafuta mode. 875 01:13:49,790 --> 01:13:57,130 n na N ni nini unaweza kutumia mzunguko kupitia mechi ya utafutaji. 876 01:13:57,130 --> 01:13:59,800 Hapa inasema pointi mode hoja kwa kamba 877 01:13:59,800 --> 01:14:01,930 mwanzo na mmoja wa Mwandamano zifuatazo. 878 01:14:01,930 --> 01:14:06,480 Hivyo r, Open Nakala faili kwa ajili ya kusoma. Hiyo ni nini tunataka kufanya. 879 01:14:08,930 --> 01:14:13,210 Kwa kusoma, na mimi nataka kuhifadhi kwamba. 880 01:14:13,210 --> 01:14:18,720 kitu kinaenda kuwa * FILE. Sasa nini nataka kufanya? 881 01:14:18,720 --> 01:14:21,200 Nipe pili. 882 01:14:28,140 --> 01:14:30,430 Sawa. Sasa nini nataka kufanya? 883 01:14:30,430 --> 01:14:32,940 [Mwanafunzi] Angalia kama ni null. >> [Bowden] Yeah. 884 01:14:32,940 --> 01:14:38,690 Yoyote wakati wa kufungua faili, kuhakikisha kwamba wewe ni mafanikio na uwezo wa kufungua hiyo. 885 01:14:58,930 --> 01:15:10,460 >> Sasa nataka kufanya kwamba stuff termios ambapo nataka kwanza kusoma yangu mazingira ya sasa ya 886 01:15:10,460 --> 01:15:14,050 na wale kuokoa katika kitu, kisha Mimi nataka kubadili mipangilio yangu 887 01:15:14,050 --> 01:15:19,420 kutupilia mbali tabia yoyote kwamba mimi aina, 888 01:15:19,420 --> 01:15:22,520 na kisha Mimi nataka kusasisha mipangilio hizo. 889 01:15:22,520 --> 01:15:27,250 Na kisha mwisho wa mpango, nataka kubadili nyuma mipangilio yangu ya awali. 890 01:15:27,250 --> 01:15:32,080 Hivyo struct ni kwenda kuwa ya termios aina, na mimi nina kwenda kutaka mbili ya wale. 891 01:15:32,080 --> 01:15:35,600 moja ya kwanza ni kwenda kuwa current_settings yangu, 892 01:15:35,600 --> 01:15:42,010 na kisha wao wanaenda kuwa hacker_settings yangu. 893 01:15:42,010 --> 01:15:48,070 Kwanza, mimi naenda wanataka kuokoa yangu mazingira ya sasa, 894 01:15:48,070 --> 01:15:53,790 basi mimi nina kwenda kutaka update hacker_settings, 895 01:15:53,790 --> 01:16:01,570 na kisha njia mwisho wa mpango wangu, nataka kurudia mazingira ya sasa. 896 01:16:01,570 --> 01:16:08,660 Hivyo kuokoa mazingira ya sasa, njia ya kwamba kazi, termios mtu sisi. 897 01:16:08,660 --> 01:16:15,810 Sisi tunaona kwamba tuna hii tcsetattr int, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Mimi kupita katika struct termios na pointer wake. 899 01:16:22,960 --> 01:16:30,640 njia hii itakuwa kuangalia ni - I've tayari wamesahau nini kazi iliitwa. 900 01:16:30,640 --> 01:16:34,930 Nakala na kuweka. 901 01:16:39,150 --> 01:16:45,500 Hivyo tcgetattr, kisha Mimi nataka kupita katika struct kwamba mimi nina kuokoa habari katika, 902 01:16:45,500 --> 01:16:49,650 ambayo ni kwenda kuwa current_settings, 903 01:16:49,650 --> 01:16:59,120 na hoja ya kwanza ni descriptor faili kwa ajili ya jambo nataka kuokoa sifa ya. 904 01:16:59,120 --> 01:17:04,360 Nini descriptor faili ni ni kama yoyote wakati wa kufungua faili, anapata descriptor faili. 905 01:17:04,360 --> 01:17:14,560 Wakati mimi fopen argv [1], anapata descriptor faili ambayo wewe ni referencing 906 01:17:14,560 --> 01:17:16,730 kila unataka kusoma wala kuandika na hiyo. 907 01:17:16,730 --> 01:17:19,220 Hiyo si descriptor faili nataka kutumia hapa. 908 01:17:19,220 --> 01:17:21,940 Kuna tatu faili descriptors una by default, 909 01:17:21,940 --> 01:17:24,310 ambayo ni ya kiwango katika, kiwango nje, na hitilafu ya kiwango. 910 01:17:24,310 --> 01:17:29,960 By default, nadhani ni ya kiwango katika ni 0, kiwango nje ni 1, na makosa ya hali ni 2. 911 01:17:29,960 --> 01:17:33,980 Basi je, nataka kubadili mipangilio ya? 912 01:17:33,980 --> 01:17:37,370 Nataka mabadiliko ya mazingira ya wakati mimi hit tabia, 913 01:17:37,370 --> 01:17:41,590 Mimi nataka kutupa kwamba tabia mbali badala ya uchapishaji kwa screen. 914 01:17:41,590 --> 01:17:45,960 Nini mkondo - kiwango katika, nje ya kiwango, au kosa kiwango - 915 01:17:45,960 --> 01:17:52,050 anaitikia kwa mambo wakati ninapoandika katika keyboard? >> [Mwanafunzi] darasa in >> Yeah. 916 01:17:52,050 --> 01:17:56,450 Hivyo siwezi ama kufanya 0 au siwezi kufanya stdin. 917 01:17:56,450 --> 01:17:59,380 Nina kupata current_settings ya kiwango in 918 01:17:59,380 --> 01:18:01,720 >> Sasa nataka kusasisha mipangilio hizo, 919 01:18:01,720 --> 01:18:07,200 hivyo kwanza mimi itabidi nakala katika hacker_settings nini current_settings yangu ni. 920 01:18:07,200 --> 01:18:10,430 Na jinsi structs kazi itakuwa ni nakala tu. 921 01:18:10,430 --> 01:18:14,510 Hii nakala zote za mashamba, kama ungependa kutarajia. 922 01:18:14,510 --> 01:18:17,410 >> Sasa nataka update baadhi ya mashamba. 923 01:18:17,410 --> 01:18:21,670 Kuangalia termios, ungependa kuwa na kusoma kwa njia ya kura ya hii 924 01:18:21,670 --> 01:18:24,110 tu kuona nini ungependa unataka kuangalia kwa, 925 01:18:24,110 --> 01:18:28,210 lakini bendera utaenda unataka kuangalia kwa ni mwangwi, 926 01:18:28,210 --> 01:18:33,110 hivyo ECHO Echo pembejeo wahusika. 927 01:18:33,110 --> 01:18:37,710 Kwanza nataka kuweka - I've tayari wamesahau nini mashamba ni. 928 01:18:45,040 --> 01:18:47,900 Hii ni nini struct inaonekana kama. 929 01:18:47,900 --> 01:18:51,060 Hivyo pembejeo modes nadhani tunataka kubadili. 930 01:18:51,060 --> 01:18:54,210 Tutaangalia ufumbuzi kuhakikisha kwamba ni nini tunataka kubadili. 931 01:19:04,060 --> 01:19:12,610 Tunataka kubadili lflag ili kuzuia wanaohitaji kuangalia njia zote hizi. 932 01:19:12,610 --> 01:19:14,670 Tunataka kubadili modes mitaa. 933 01:19:14,670 --> 01:19:17,710 Ungependa kuwa na kusoma kwa jambo hili zima kuelewa ambapo kila kitu ni mali 934 01:19:17,710 --> 01:19:19,320 kwamba tunataka mabadiliko. 935 01:19:19,320 --> 01:19:24,120 Lakini ni ndani ya modes mitaa ambapo tunakwenda wanataka mabadiliko hayo. 936 01:19:27,080 --> 01:19:33,110 Hivyo hacker_settings.cc_lmode ni nini ni wito. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Hii ni wapi tunapata ndani ya waendeshaji bitwise. 939 01:19:52,280 --> 01:19:54,860 Sisi ni aina ya nje ya muda, lakini tutaweza kwenda kupitia haraka ni halisi. 940 01:19:54,860 --> 01:19:56,600 Hii ni wapi tunapata ndani ya waendeshaji bitwise, 941 01:19:56,600 --> 01:19:59,950 ambapo mimi nadhani alisema mmoja wa muda mrefu uliopita kwamba wakati wowote kuanza kushughulika na bendera, 942 01:19:59,950 --> 01:20:03,370 utaenda kutumia bitwise operator mengi. 943 01:20:03,370 --> 01:20:08,240 Kila kidogo katika bendera sambamba na aina fulani ya tabia. 944 01:20:08,240 --> 01:20:14,090 Hivyo hapa, bendera hii ina rundo la vitu mbalimbali, ambapo wote maana kitu tofauti. 945 01:20:14,090 --> 01:20:18,690 Lakini nini nataka kufanya ni tu kugeuka mbali kidogo ambayo inalingana na ECHO. 946 01:20:18,690 --> 01:20:25,440 Hivyo kugeuka kuwa mbali mimi kufanya & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 Kweli, nadhani ni kama tECHO au kitu. Mimi tu kwenda kuangalia tena. 948 01:20:30,110 --> 01:20:34,050 Naweza termios yake. Ni tu ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO ni kwenda kuwa kidogo moja. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO ni kwenda kwa maana ya bits wote ni kuweka 1, ambayo ina maana bendera wote ni kuweka kweli 951 01:20:44,230 --> 01:20:47,140 isipokuwa kwa kidogo ECHO. 952 01:20:47,140 --> 01:20:53,830 Kwa kumaliza wangu bendera ya ndani na hii, ina maana bendera zote kwamba sasa kuweka kweli 953 01:20:53,830 --> 01:20:56,520 Bado utakuwa kuweka kweli. 954 01:20:56,520 --> 01:21:03,240 Kama ECHO bendera yangu ni kuweka kweli, basi hii ni lazima kuweka uongo juu ya bendera ya ECHO. 955 01:21:03,240 --> 01:21:07,170 Hivyo hii mstari wa kanuni tu anarudi mbali bendera ECHO. 956 01:21:07,170 --> 01:21:16,270 mistari nyingine ya kificho, na mimi itabidi nakala kwa maslahi ya muda na kisha kueleza wao. 957 01:21:27,810 --> 01:21:30,180 Katika ufumbuzi, alisema 0. 958 01:21:30,180 --> 01:21:33,880 Ni pengine bora kwa uwazi kusema stdin. 959 01:21:33,880 --> 01:21:42,100 >> Ona kwamba mimi nina pia kufanya ECHO | ICANON hapa. 960 01:21:42,100 --> 01:21:46,650 ICANON inahusu kitu tofauti, ambayo ina maana mode kisheria. 961 01:21:46,650 --> 01:21:50,280 Nini kisheria mode njia ni kawaida wakati wewe ni kuandika nje ya mstari amri, 962 01:21:50,280 --> 01:21:54,670 kiwango katika mchakato haina chochote mpaka hit newline. 963 01:21:54,670 --> 01:21:58,230 Hivyo wakati wa kufanya GetString, unapoandika rundo la vitu, wewe hit newline. 964 01:21:58,230 --> 01:22:00,590 Hiyo ni wakati ni alimtuma kiwango in 965 01:22:00,590 --> 01:22:02,680 Hiyo ni default. 966 01:22:02,680 --> 01:22:05,830 Wakati mimi kugeuka mbali mode kisheria, sasa kila tabia moja vyombo vya habari 967 01:22:05,830 --> 01:22:10,910 ni nini anapata kusindika, ambayo ni kawaida aina ya mbaya kwa sababu ni mwepesi wa mchakato mambo haya, 968 01:22:10,910 --> 01:22:14,330 ambayo ni kwa nini ni vizuri buffer ndani mistari nzima. 969 01:22:14,330 --> 01:22:16,810 Lakini Mimi nataka kila tabia kuwa processed 970 01:22:16,810 --> 01:22:18,810 tangu mimi sitaki kusubiri kwa mimi hit newline 971 01:22:18,810 --> 01:22:21,280 kabla michakato ya wahusika wote nimekuwa kuandika. 972 01:22:21,280 --> 01:22:24,760 Hii anarudi mbali mode kisheria. 973 01:22:24,760 --> 01:22:31,320 Mambo haya tu ina maana wakati ni kweli michakato wahusika. 974 01:22:31,320 --> 01:22:35,830 Hii ina maana mchakato wao mara moja; haraka kama mimi kuandika yao, mchakato wao. 975 01:22:35,830 --> 01:22:42,510 Na hii ni kazi ambayo ni uppdatering mipangilio yangu kwa kiwango katika, 976 01:22:42,510 --> 01:22:45,480 na TCSA njia kufanya hivyo hivi sasa. 977 01:22:45,480 --> 01:22:50,310 chaguzi nyingine ni kusubiri hadi hapo kila kitu sasa ni juu ya mkondo ni processed. 978 01:22:50,310 --> 01:22:52,030 Hiyo haina kweli jambo. 979 01:22:52,030 --> 01:22:56,920 Haki tu sasa kubadili mipangilio yangu kuwa chochote kwa sasa katika hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Mimi nadhani kuitwa ni hacker_settings, hivyo hebu mabadiliko hayo. 981 01:23:09,610 --> 01:23:13,500 Kubadili kila kitu kwa hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Sasa mwisho wa programu yetu sisi ni kwenda kutaka revert 983 01:23:16,870 --> 01:23:20,210 kwa nini kwa sasa ndani ya normal_settings, 984 01:23:20,210 --> 01:23:26,560 ambayo ni kwenda kuangalia tu kama & normal_settings. 985 01:23:26,560 --> 01:23:30,650 Taarifa mimi si iliyopita yoyote ya normal_settings yangu tangu awali ya kupata. 986 01:23:30,650 --> 01:23:34,520 Kisha kubadili tu nyuma yao, mimi kupita yao nyuma mwishoni. 987 01:23:34,520 --> 01:23:38,390 Hii ilikuwa update. Sawa. 988 01:23:38,390 --> 01:23:43,900 >> Sasa ndani ya hapa mimi itabidi kueleza code katika maslahi ya muda. 989 01:23:43,900 --> 01:23:46,350 Siyo kwamba code sana. 990 01:23:50,770 --> 01:24:03,750 Tunaona tunasoma tabia kutoka faili. Tuliihisabia f. 991 01:24:03,750 --> 01:24:07,850 Sasa unaweza mtu fgetc, lakini jinsi fgetc ni kwenda kufanya kazi 992 01:24:07,850 --> 01:24:11,910 ni tu ni kwenda na kurudi tabia ya kuwa wewe tu kusoma au EOF, 993 01:24:11,910 --> 01:24:15,680 ambazo zinahusiana na mwisho wa faili au baadhi likitokea kosa. 994 01:24:15,680 --> 01:24:19,900 Sisi ni looping, kuendelea kusoma tabia moja kutoka faili, 995 01:24:19,900 --> 01:24:22,420 mpaka tumekuwa kukimbia nje ya wahusika kusoma. 996 01:24:22,420 --> 01:24:26,650 Na wakati sisi ni kufanya hivyo, sisi kusubiri juu ya tabia moja kutoka kiwango in 997 01:24:26,650 --> 01:24:29,090 Kila wakati unapoandika kitu katika mstari amri, 998 01:24:29,090 --> 01:24:32,820 hiyo ni ya kusoma katika tabia kutoka kiwango in 999 01:24:32,820 --> 01:24:38,330 Kisha putchar ni kwenda tu kuweka Char tunasoma juu hapa kutoka faili nje ya kiwango. 1000 01:24:38,330 --> 01:24:42,890 Unaweza mtu putchar, lakini ni kuweka tu kwa kiwango nje, ni uchapishaji kwamba tabia. 1001 01:24:42,890 --> 01:24:51,600 Unaweza pia tu kufanya printf ("% c", c); Same wazo. 1002 01:24:53,330 --> 01:24:56,670 Hiyo kwenda kufanya wingi wa kazi yetu. 1003 01:24:56,670 --> 01:25:00,300 >> Jambo la mwisho tunakwenda wanataka kufanya ni tu fclose faili wetu. 1004 01:25:00,300 --> 01:25:03,310 Kama huna fclose, hiyo leak kumbukumbu. 1005 01:25:03,310 --> 01:25:06,680 Tunataka fclose faili sisi awali kufunguliwa, na nadhani hiyo ni yake. 1006 01:25:06,680 --> 01:25:13,810 Kama sisi kufanya huo, mimi tayari got matatizo. 1007 01:25:13,810 --> 01:25:17,260 Hebu angalia. 1008 01:25:17,260 --> 01:25:19,960 Ni nini kulalamika kuhusu? 1009 01:25:19,960 --> 01:25:30,220 Inatarajiwa 'int' lakini hoja ni ya aina ya 'struct _IO_FILE *'. 1010 01:25:36,850 --> 01:25:39,370 Tutaweza kuona kama kwamba kazi. 1011 01:25:45,210 --> 01:25:53,540 Kuruhusiwa tu katika C99. Augh. Okay, kufanya hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Sasa sisi kupata maelezo muhimu zaidi. 1013 01:25:57,760 --> 01:25:59,900 Hivyo matumizi ya kitambulisho Undeclared 'normal_settings'. 1014 01:25:59,900 --> 01:26:04,170 Sikuweza kuiita normal_settings. Mimi kuitwa ni current_settings. 1015 01:26:04,170 --> 01:26:12,090 Basi hebu mabadiliko yote. 1016 01:26:17,920 --> 01:26:21,710 Sasa kupita hoja. 1017 01:26:26,290 --> 01:26:29,500 Mimi itabidi kufanya hili 0 kwa sasa. 1018 01:26:29,500 --> 01:26:36,720 Sawa. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Mimi pia hakuwa wazi screen mwanzoni. 1020 01:26:39,590 --> 01:26:42,960 Lakini unaweza kuangalia nyuma kwa kuweka mwisho tatizo kuona jinsi wewe wazi screen. 1021 01:26:42,960 --> 01:26:45,160 Ni tu uchapishaji wahusika baadhi 1022 01:26:45,160 --> 01:26:47,210 wakati hii ni kufanya nini nataka kufanya. 1023 01:26:47,210 --> 01:26:48,900 Sawa. 1024 01:26:48,900 --> 01:26:55,280 Na kufikiri kuhusu nini hii zinahitajika kuwa 0 badala ya stdin, 1025 01:26:55,280 --> 01:27:00,560 ambayo inapaswa # define 0, 1026 01:27:00,560 --> 01:27:03,890 hii ni kulalamika kwamba - 1027 01:27:13,150 --> 01:27:19,360 Kabla ya wakati mimi alisema kwamba kuna faili descriptors lakini basi wewe pia kuwa JALADA yako *, 1028 01:27:19,360 --> 01:27:23,210 descriptor faili ni tu integer moja, 1029 01:27:23,210 --> 01:27:26,970 ambapo * JALADA ana rundo zima ya mambo yanayohusiana na hayo. 1030 01:27:26,970 --> 01:27:30,380 sababu tunahitaji kusema 0 badala ya stdin 1031 01:27:30,380 --> 01:27:37,480 ni kwamba ni stdin * JALADA ambayo inaelekeza kwamba ni jambo referencing faili descriptor 0. 1032 01:27:37,480 --> 01:27:45,070 Hivyo hata hapa wakati mimi kufanya fopen (argv [1], nina kupata * JALADA nyuma. 1033 01:27:45,070 --> 01:27:51,180 Lakini mahali fulani katika kwamba * JALADA ni kitu sambamba na descriptor faili kwa ajili ya faili hilo. 1034 01:27:51,180 --> 01:27:57,430 Kama ukiangalia ukurasa mtu kwa ajili ya wazi, hivyo nadhani itabidi kufanya mtu 3 wazi - nope - 1035 01:27:57,430 --> 01:27:59,380 mtu 2 wazi - yeah. 1036 01:27:59,380 --> 01:28:06,250 Kama ukiangalia ukurasa kwa wazi, wazi ni kama fopen chini ya ngazi, 1037 01:28:06,250 --> 01:28:09,350 na ni kurudi halisi faili descriptor. 1038 01:28:09,350 --> 01:28:12,050 fopen gani rundo la stuff juu ya wazi, 1039 01:28:12,050 --> 01:28:17,640 ambayo badala ya kurudi tu kwamba faili descriptor anarudi JALADA zima * pointer 1040 01:28:17,640 --> 01:28:20,590 ndani ambayo ni faili wetu descriptor kidogo. 1041 01:28:20,590 --> 01:28:25,020 Hivyo kiwango katika inahusu kitu * JALADA, 1042 01:28:25,020 --> 01:28:29,120 ambapo 0 inahusu tu kiwango faili descriptor katika yenyewe. 1043 01:28:29,120 --> 01:28:32,160 >> Maswali? 1044 01:28:32,160 --> 01:28:35,930 [Atacheka] akapiga kupitia njia hiyo. 1045 01:28:35,930 --> 01:28:39,140 Wote haki. Sisi ni kosa. [Atacheka] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]