1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Seksyon 5 - Higit kumportableng] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Harvard University] 3 00:00:04,690 --> 00:00:07,250 [Ito ay CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Tulad ng sinabi ko sa aking email, may maraming mga bagay na maaari mong gamitin 5 00:00:14,250 --> 00:00:17,060 iba kaysa sa appliance upang aktwal na gawin ang mga set ng problema. 6 00:00:17,060 --> 00:00:19,910 Inirerekomenda namin na gawin mo ito sa appliance dahil lang maaari naming mas madaling makatulong sa iyo 7 00:00:19,910 --> 00:00:22,070 at alam namin kung gaano ang lahat upang gumana. 8 00:00:22,070 --> 00:00:26,950 Ngunit bilang isang halimbawa ng kung saan maaari mong gawin ang mga bagay na kung, sabihin nating, hindi mo magkaroon ng access 9 00:00:26,950 --> 00:00:31,570 sa isang appliance o nais mong upang gumana sa basement ng Science Center - 10 00:00:31,570 --> 00:00:33,090 kung saan aktwal na nila ang appliance masyadong - 11 00:00:33,090 --> 00:00:35,150 kung gusto mong gumana kahit saan. 12 00:00:35,150 --> 00:00:42,370 Ang isang halimbawa ay ang iyong nakita / narinig ng SSH? 13 00:00:44,380 --> 00:00:47,780 SSH ay isa lamang tulad kumonekta sa isang bagay. 14 00:00:47,780 --> 00:00:51,340 Aktwal na, ngayon ako SSHed papunta sa appliance. 15 00:00:51,340 --> 00:00:54,290 Ko hindi gumana nang direkta sa appliance. 16 00:00:55,930 --> 00:01:01,060 Narito ang ang appliance, at kung titingnan mo ang dito mo makita ang IP address na ito. 17 00:01:01,060 --> 00:01:03,650 Hindi ko kailanman sa appliance mismo; 18 00:01:03,650 --> 00:01:08,840 Ko laging darating sa isang iTerm2 window / terminal na window. 19 00:01:08,840 --> 00:01:15,910 Maaari mong SSH na IP address, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Natatandaan ko numerong iyon lalong madaling dahil ito ay tulad gandang pattern. 21 00:01:20,390 --> 00:01:24,920 Ngunit iyon ay hilingin sa akin para sa aking password, at ngayon ako sa appliance. 22 00:01:24,920 --> 00:01:33,060 Talaga, sa puntong ito, kung ikaw ay nagbukas ng isang terminal sa loob ng appliance mismo, 23 00:01:33,060 --> 00:01:36,350 interface na ito, gayunpaman, nais mong gamitin ito, ay eksaktong kapareho 24 00:01:36,350 --> 00:01:40,010 bilang ang interface ako ginagamit sa paglipas dito ngunit ngayon ka SSHed. 25 00:01:42,240 --> 00:01:44,920 Hindi mo na kailangang sa SSH sa appliance. 26 00:01:44,920 --> 00:01:52,360 Isang halimbawa ng isa pang lugar na maaari mong SSH sa ako ay medyo sigurado na mayroon ka sa pamamagitan ng default - 27 00:01:52,360 --> 00:01:55,020 Oh. Mas malaki. 28 00:01:55,020 --> 00:02:01,130 Lahat mo ay dapat magkaroon ng default FAS account sa mga server ng FAS. 29 00:02:01,130 --> 00:02:06,840 Para sa akin, gagawin ko SSH sa rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Ito ay upang hilingin sa iyo na ang unang pagkakataon, at sabihin mo oo. 31 00:02:11,610 --> 00:02:15,840 Ang aking password na ang aking password sa FAS. 32 00:02:15,840 --> 00:02:22,650 At ito ngayon, ako SSHed sa magaling server, at ang maaari kong gawin ang anumang gusto ko sa dito. 33 00:02:22,650 --> 00:02:28,560 Isang maraming ng mga klase na maaari mong gawin, tulad ng 124, pagpunta sa nag-upload ka ng mga bagay-bagay dito 34 00:02:28,560 --> 00:02:30,950 sa aktwal na isumite ang iyong mga set ng problema. 35 00:02:30,950 --> 00:02:34,100 Ngunit sinasabi hindi ka magkaroon ng access sa iyong appliance. 36 00:02:34,100 --> 00:02:37,910 Pagkatapos ay maaari mong gawin ang mga bagay, tulad ng sa dito ay ito sabihin - 37 00:02:37,910 --> 00:02:42,160 Ito lamang ang aming seksyon ng mga tanong. 38 00:02:42,160 --> 00:02:45,070 Ito ay hilingin mong gawin ito sa appliance. 39 00:02:45,070 --> 00:02:47,790 Sa halip kukunin ko na lang gawin ito sa server. 40 00:02:47,790 --> 00:02:50,560 Ako pagpunta sa-unzip na. 41 00:02:50,560 --> 00:02:55,670 Ang problema ay na ginamit ka gamit ang isang bagay tulad ng gedit 42 00:02:55,670 --> 00:02:58,160 o anumang loob ng appliance. 43 00:02:58,160 --> 00:03:01,830 Hindi mo ay mayroon na sa server ng FAS. 44 00:03:01,830 --> 00:03:04,110 Ito ay lahat lamang ito tekstuwal interface. 45 00:03:04,110 --> 00:03:09,180 Kaya maaari mong alinman sa isa, subukan upang matuto ang isang editor ng teksto na sila. 46 00:03:09,180 --> 00:03:12,130 Ang mga ito ay may Nano. 47 00:03:12,130 --> 00:03:14,990 Nano ay karaniwang medyo madaling gamitin. 48 00:03:14,990 --> 00:03:19,470 Maaari mong gamitin ang iyong mga arrow at i-type normal. 49 00:03:19,470 --> 00:03:21,250 Kaya na hindi mahirap. 50 00:03:21,250 --> 00:03:24,720 Kung nais mong makakuha ng talagang magarbong maaari mong gamitin ang Emacs, 51 00:03:24,720 --> 00:03:29,850 kung saan ako marahil ay hindi dapat binuksan dahil hindi ko alam kung paano isara ang Emacs. 52 00:03:29,850 --> 00:03:32,760 Control X, Control C? Oo. 53 00:03:32,760 --> 00:03:35,310 O maaari mong gamitin Vim, na kung saan ay kung ano ang ko bang gamitin ang. 54 00:03:35,310 --> 00:03:37,800 At kaya mga ang iyong mga pagpipilian. 55 00:03:37,800 --> 00:03:43,830 Kung hindi mo nais na upang gawin iyon, maaari mo ring, kung tiningnan mo ang manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Sa PC, maaari mong SSH gamit ang masilya, 58 00:03:49,920 --> 00:03:51,940 kung saan ka pagpunta upang i-download nang hiwalay. 59 00:03:51,940 --> 00:03:55,460 Sa Mac, maaari ka lamang sa pamamagitan ng paggamit ng default Terminal o mo maaaring i-download iTerm2, 60 00:03:55,460 --> 00:03:58,490 na ay tulad ng isang magaling, magarbong Terminal. 61 00:03:58,490 --> 00:04:03,780 Kung pupunta ka sa manual.cs50.net makikita mo ang isang link sa Notepad + +, 62 00:04:03,780 --> 00:04:07,120 na ay kung ano ang maaari mong gamitin sa PC. 63 00:04:07,120 --> 00:04:13,340 Ito ay nagbibigay-daan sa SFTP mo mula sa Notepad + +, na kung saan ay isa lamang SSH. 64 00:04:13,340 --> 00:04:17,750 Ano ito ay hayaan mong gawin ay i-edit ang iyong mga file sa lokal, 65 00:04:17,750 --> 00:04:20,670 at pagkatapos ay kahit kailan mo gusto upang i-save ang mga ito, ito ay i-save sa mga nice.fas, 66 00:04:20,670 --> 00:04:23,670 kung saan maaari mong patakbuhin ang mga ito. 67 00:04:23,670 --> 00:04:26,880 At ang katumbas sa Mac ay pagpunta sa TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Kaya ito ay nagbibigay-daan sa gawin mo ang parehong bagay. 69 00:04:28,760 --> 00:04:32,800 Ay nagbibigay-daan sa iyo upang lokal na i-edit ang mga file at i-save ang mga ito sa mga nice.fas, 70 00:04:32,800 --> 00:04:35,730 kung saan maaari mong patakbuhin ang mga ito. 71 00:04:35,730 --> 00:04:40,400 Kaya kung sakaling ikaw ay natigil nang walang isang appliance, mayroon kang mga pagpipilian na ito 72 00:04:40,400 --> 00:04:44,230 pa rin na gawin ang iyong mga hanay ng problema. 73 00:04:44,230 --> 00:04:48,250 Ang isang problema na hindi ka ng CS50 library 74 00:04:48,250 --> 00:04:51,580 dahil nice.fas ay hindi sa pamamagitan ng default na mayroon na. 75 00:04:51,580 --> 00:04:55,970 Maaari mong i-download ang CS50 library - 76 00:04:55,970 --> 00:04:58,470 Hindi sa tingin ko kailangan ko na sa puntong ito. 77 00:04:58,470 --> 00:05:03,270 Maaari mong i-download ang CS50 library at kopyahin ito sa nice.fas, 78 00:05:03,270 --> 00:05:07,450 o tingin ko sa puntong ito hindi namin gamitin ito ngayon pa rin. 79 00:05:07,450 --> 00:05:12,720 O kung gagawin namin, maaari mo para sa oras na palitan ito sa 80 00:05:12,720 --> 00:05:18,480 ang pagpapatupad ng ang mga function sa CS50 library pa rin. 81 00:05:18,480 --> 00:05:21,370 Sa gayon ay hindi dapat na magkano ng isang paghihigpit. 82 00:05:21,370 --> 00:05:23,710 At na na. 83 00:05:26,460 --> 00:05:29,820 >> Kukunin ko na bumalik sa appliance ngayon, gagawin namin ang lahat sa appliance. 84 00:05:29,820 --> 00:05:37,510 Pagtingin sa aming seksyon ng mga tanong, sa simula, tulad ng sinabi ko sa aking email, 85 00:05:37,510 --> 00:05:43,620 mayroon kaming makipag-usap tungkol sa isang maikling ay dapat kang manood. 86 00:05:43,620 --> 00:05:51,980 Mayroon kaming ang nagre-redirect & Pipes at ang tatlong tanong. 87 00:05:51,980 --> 00:05:56,070 >> Na kung saan stream ang mga function tulad ng printf sumulat sa pamamagitan ng default? 88 00:05:56,070 --> 00:05:59,130 Kaya stream. Ano ang isang stream? 89 00:06:06,520 --> 00:06:15,100 Stream ay isa lamang tulad lang ilang - 90 00:06:15,100 --> 00:06:21,450 Hindi ito kahit isang pinagmulan ng 1s at 0s. 91 00:06:21,450 --> 00:06:24,920 Ang stream na ito ay humihingi para dito ay karaniwang out. 92 00:06:24,920 --> 00:06:27,250 At kaya karaniwang out ay isang stream na kapag ka magsulat dito, 93 00:06:27,250 --> 00:06:30,940 ito lumilitaw sa screen. 94 00:06:30,940 --> 00:06:36,860 Standard out, sa pamamagitan ng stream, ito ay nangangahulugan na magsulat lamang 1s at 0s dito, 95 00:06:36,860 --> 00:06:40,220 at ang iba pang mga dulo ng standard out bumabasa mula sa stream. 96 00:06:40,220 --> 00:06:43,540 Ito ay isang string ng 1s at 0s. 97 00:06:43,540 --> 00:06:45,570 Maaari kang sumulat sa stream o maaari mong basahin mula sa stream 98 00:06:45,570 --> 00:06:47,950 depende sa kung ano ang stream talaga. 99 00:06:47,950 --> 00:06:52,800 Ang iba pang dalawang default stream Standard sa at karaniwang error. 100 00:06:52,800 --> 00:06:57,540 Standard sa tuwing mo GetString, naghihintay para sa iyo sa input bagay. 101 00:06:57,540 --> 00:07:01,570 Kaya naghihintay para sa iyo, aktwal na ito ay naghihintay sa Standard sa, 102 00:07:01,570 --> 00:07:04,880 na talaga kung ano ang makakakuha ka kapag nag-type sa keyboard. 103 00:07:04,880 --> 00:07:07,530 Nagta-type ka sa pamantayan. 104 00:07:07,530 --> 00:07:10,050 Standard error ay isa lamang katumbas sa pamantayan out, 105 00:07:10,050 --> 00:07:13,280 ngunit nagdadalubhasang sa na kapag-print ka sa standard error, 106 00:07:13,280 --> 00:07:16,770 ka dapat upang i-print lamang ang mga mensahe ng error na iyon 107 00:07:16,770 --> 00:07:20,200 sa gayon ay maaari mong pagkakaiba sa pagitan ng regular na mga mensahe na naka-print sa screen 108 00:07:20,200 --> 00:07:24,560 kumpara sa mga mensahe ng error depende sa kung sila nagpunta sa pamantayan out o standard error. 109 00:07:24,560 --> 00:07:28,660 File. 110 00:07:28,660 --> 00:07:32,440 Standard out, pamantayan sa, at karaniwang error lamang espesyal stream, 111 00:07:32,440 --> 00:07:36,810 ngunit talagang file anumang, kapag binuksan mo ang isang file, ito ay magiging isang stream ng mga byte 112 00:07:36,810 --> 00:07:40,740 kung saan maaari mo lamang basahin mula sa stream. 113 00:07:40,740 --> 00:07:47,770 Sa iyo, para sa pinaka-bahagi, maaari lamang sa tingin ng isang file bilang isang stream ng mga byte. 114 00:07:47,770 --> 00:07:51,190 Kaya kung ano ang stream na ito sumulat sa pamamagitan ng default? Standard out. 115 00:07:51,190 --> 00:07:56,980 >> Ano ang pagkakaiba sa pagitan> at >>? 116 00:07:58,140 --> 00:08:03,710 Ba sinuman panoorin muna ang video? Okay. 117 00:08:03,710 --> 00:08:10,960 > Ay pagpunta sa kung paano mo pag-redirect sa file, 118 00:08:10,960 --> 00:08:15,240 at >> din upang i-redirect ang output sa file, 119 00:08:15,240 --> 00:08:17,820 ngunit sa halip ito upang isama sa file. 120 00:08:17,820 --> 00:08:23,430 Halimbawa, sabihin nating ko mangyayari sa dict dito mismo, 121 00:08:23,430 --> 00:08:27,020 at ang tanging bagay-bagay sa loob ng dict pusa, cat, dog, isda, aso. 122 00:08:27,020 --> 00:08:31,530 Isa utos na mayroon ka sa command line ay pusa, 123 00:08:31,530 --> 00:08:34,539 na lamang upang i-print kung ano ang sa isang file. 124 00:08:34,539 --> 00:08:40,679 Kaya kapag sinabi ko pusa dict, ito upang i-print ang pusa, cat, dog, isda, aso. Na pusa lahat ng ginagawa. 125 00:08:40,679 --> 00:08:46,280 Iyon ay nangangahulugan na ito ay naka-print sa standard out pusa, cat, dog, aso isda,. 126 00:08:46,280 --> 00:08:53,240 Kung gusto ko sa halip upang i-redirect na sa isang file, maaari ko bang gamitin ang> at i-redirect ang mga ito sa anumang file. 127 00:08:53,240 --> 00:08:56,460 Tatawag ako ng file ng file. 128 00:08:56,460 --> 00:09:00,320 Kaya ngayon kung ako ls, makikita ko makita ang mayroon akong isang bagong file na tinatawag na file. 129 00:09:00,320 --> 00:09:05,700 At kung ako buksan ito, ito ay kung ano mismo ang pusa ilagay sa command line. 130 00:09:05,700 --> 00:09:11,040 Kaya ngayon kung gagawin ko na muli, pagkatapos ito upang i-redirect ang output sa file, 131 00:09:11,040 --> 00:09:13,930 at ako pagpunta sa ang parehong eksaktong bagay. 132 00:09:13,930 --> 00:09:17,910 Kaya technically, ganap na ito overrode kung ano ang nagkaroon kami. 133 00:09:17,910 --> 00:09:22,970 At kami na makita kung ko bang baguhin dict, kinuha ko ang aso. 134 00:09:22,970 --> 00:09:29,980 Ngayon kung namin pusa dict sa file muli, kami ay pagpunta sa ang bagong bersyon na may aso inalis. 135 00:09:29,980 --> 00:09:32,400 Kaya ganap na-override ito. 136 00:09:32,400 --> 00:09:36,640 Sa halip, kung ginagamit namin >>, ito upang isama ang file. 137 00:09:36,640 --> 00:09:40,860 Ngayon, ang pagbubukas ng file, makikita namin lang namin ang parehong bagay na naka-print na dalawang beses 138 00:09:40,860 --> 00:09:44,920 dahil ito ay doon sabay-sabay, pagkatapos namin nakadugtong sa orihinal. 139 00:09:44,920 --> 00:09:48,130 Kaya iyon ang> at >> gawin. 140 00:09:48,130 --> 00:09:50,580 Ba ang susunod na isa hilingin - Hindi ito magtanong tungkol dito. 141 00:09:50,580 --> 00:09:59,050 >> Ang iba pang isa na mayroon kaming <, na kung> nagre-redirect karaniwang out, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Natin makita kung kami ay may isang halimbawa. 144 00:10:14,750 --> 00:10:16,930 Maaari kong magsulat ng isang real mabilis. 145 00:10:17,870 --> 00:10:25,700 Natin gumawa ng anumang file, hello.c. 146 00:10:56,060 --> 00:10:59,070 Medyo direkta file. 147 00:10:59,070 --> 00:11:03,570 Lang ako ng isang string at pagkatapos ay pag-print "Kamusta" anumang string na ipinasok ko lang. 148 00:11:03,570 --> 00:11:07,990 Kaya gumawa ng halo at pagkatapos. / Kumusta. 149 00:11:07,990 --> 00:11:10,720 Ngayon pagdikta sa akin upang magpasok ng isang bagay, 150 00:11:10,720 --> 00:11:15,070 na nangangahulugan na ito ay naghihintay sa mga bagay na pumasok sa pamantayan. 151 00:11:15,070 --> 00:11:20,450 Kaya ipasok ang anumang gusto ko sa pamantayan. Lamang Kami ay pagpunta sa sabihin Kumusta, Rob! 152 00:11:20,450 --> 00:11:23,310 Pagkatapos ito pag-print sa standard out Kamusta, Rob! 153 00:11:23,310 --> 00:11:28,860 Kung gagawin ko. / Kumusta at pagkatapos ay pag-redirect, 154 00:11:30,740 --> 00:11:34,310 sa ngayon, maaari ka lamang pag-redirect mula sa isang file. 155 00:11:34,310 --> 00:11:41,720 Kaya kung ko bang ilagay sa ilang mga file, i-txt, at ko bang ilagay ang Rob, 156 00:11:41,720 --> 00:11:52,300 kung ba akong magpatakbo ng halo at pagkatapos redirect ang txt file sa. / kumusta, ito upang sabihin Kamusta, Rob! kaagad. 157 00:11:52,300 --> 00:11:57,160 Kapag ito unang nakakakuha ng sa GetString at ito ay naghihintay sa karaniwang sa, 158 00:11:57,160 --> 00:12:01,730 Standard sa hindi na naghihintay sa keyboard para sa data upang ipinasok. 159 00:12:01,730 --> 00:12:05,980 Sa halip, kami ay redirect Standard sa upang basahin mula sa txt file. 160 00:12:05,980 --> 00:12:10,290 At kaya upang mabasa mula sa file txt, na lamang ang linya Rob, 161 00:12:10,290 --> 00:12:13,380 at pagkatapos ito upang i-print Kumusta, Rob! 162 00:12:13,380 --> 00:12:18,180 At kung Nais kong, maaari ko ring gawin. / Helo 00:12:21,500 at pagkatapos ay ang pamantayan out na ito ay pag-print, na Kamusta, Rob!, 164 00:12:21,500 --> 00:12:24,700 Ko na pag-redirect sa sarili nitong file. 165 00:12:24,700 --> 00:12:29,790 Kukunin ko na lang tawagan ang file halo - hindi, hindi ako, dahil na ang executable - txt2. 166 00:12:29,790 --> 00:12:40,150 Ngayon, txt2 ay ang output ng. / Helo 00:12:43,520 >> Mga tanong? 168 00:12:45,900 --> 00:12:49,090 >> Okay. Kaya pagkatapos dito mayroon kaming pipeline. 169 00:12:49,090 --> 00:12:53,510 Pipe ay ang huling yunit ng pag-redirect. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Hulaan ko kung sa halip na ang isa pang yunit ng pag-redirect> gawin mo 2>, 171 00:12:58,750 --> 00:13:01,070 na nagre-redirect sa standard error. 172 00:13:01,070 --> 00:13:06,280 Kaya kung may nangyaring sa standard error, hindi ito ay makapag-maglagay sa txt2. 173 00:13:06,280 --> 00:13:12,480 Ngunit mapansin kung gawin ko 2>, pagkatapos pa rin ito sa pag-print Kumusta, Rob! sa command line 174 00:13:12,480 --> 00:13:18,600 dahil lamang ako nagre-redirect ng mga karaniwang error, hindi ako nagre-redirect pamantayan out. 175 00:13:18,600 --> 00:13:22,210 Standard na error at pamantayan out ay naiiba. 176 00:13:24,210 --> 00:13:27,080 Kung nais mong aktwal na sumulat sa standard error, 177 00:13:27,080 --> 00:13:35,080 maaari ko bang baguhin ito sa fprintf sa stderr. 178 00:13:35,080 --> 00:13:37,850 Sa printf, sa pamamagitan ng default, Kopya na pamantayan out. 179 00:13:37,850 --> 00:13:41,720 Kung gusto kong i-print sa manu-mano ang standard error, pagkatapos ko bang gamitin ang fprintf 180 00:13:41,720 --> 00:13:45,010 at tukuyin kung ano ang gusto kong i-print. 181 00:13:45,010 --> 00:13:49,720 Kung sa halip ay ginawa ko fprintf stdout, pagkatapos na talaga katumbas sa printf. 182 00:13:49,720 --> 00:13:55,530 Ngunit fprintf sa standard error. 183 00:13:57,790 --> 00:14:03,650 Sa ngayon, kung ako pag-redirect ito sa txt2, Kamusta, Rob! ay nagsisimula pa rin naka-print sa command line 184 00:14:03,650 --> 00:14:08,270 dahil ito nagsisimula naka-print sa standard error at lamang ako nagre-redirect ng pamantayan ang. 185 00:14:08,270 --> 00:14:16,420 Kung ako ngayon na-redirect ang standard error, na ngayon ay hindi ito makapag-print, at txt2 ay magiging Kumusta, Rob! 186 00:14:16,420 --> 00:14:21,910 Sa ngayon, maaari mong i-print ang iyong aktwal na mga error sa standard error 187 00:14:21,910 --> 00:14:24,720 at i-print ang iyong regular na mensahe sa pamantayan out. 188 00:14:24,720 --> 00:14:31,420 At kaya kapag pinatakbo mo ang iyong programa, maaari kang magpatakbo ng ito bilang. / Kumusta ganitong uri na may 2> 189 00:14:31,420 --> 00:14:33,800 sa gayon na ang iyong programa ay pagpunta sa pagtakbo ng normal, 190 00:14:33,800 --> 00:14:38,400 ngunit ang anumang mga mensahe ng error na makakakuha ka ng check sa ibang pagkakataon sa iyong error log, 191 00:14:38,400 --> 00:14:44,500 kaya error, at pagkatapos ay tumingin sa ibang pagkakataon at iyong mga error sa file ay magkakaroon ng anumang mga error na nangyari. 192 00:14:45,200 --> 00:14:47,540 >> Mga tanong? 193 00:14:47,540 --> 00:14:58,070 >> Ang huling pipe, na maaari mong tingin ng bilang ng paglalaan ang pamantayan out mula sa isang utos 194 00:14:58,070 --> 00:15:01,210 at gawin ito ang pamantayan in ng susunod na utos. 195 00:15:01,210 --> 00:15:05,570 Isang halimbawa dito ay echo ay isang bagay sa linya ng command na 196 00:15:05,570 --> 00:15:11,840 na lang sa echo anumang ko bang ilagay ang bilang nito argument. Hindi ko ay ilagay ang mga quote. 197 00:15:11,840 --> 00:15:16,150 Echo blah, blah, blah ay pagpunta upang i-print ang blah, blah, blah. 198 00:15:16,150 --> 00:15:20,600 Bago, kapag sinabi ko ako ay upang ilagay ang Rob sa isang txt file 199 00:15:20,600 --> 00:15:28,830 dahil maaari ko lamang pag-redirect file txt, sa halip, / kung echo ko Rob 200 00:15:28,830 --> 00:15:35,520 at pagkatapos ay tubo ito sa / kumusta, na ring gawin ang parehong uri ng bagay. 201 00:15:35,520 --> 00:15:39,160 Ito ay paglalaan ng output ng command na ito, echo Rob, 202 00:15:39,160 --> 00:15:43,610 at gamitin ito bilang input para sa. / kumusta. 203 00:15:44,790 --> 00:15:49,560 Maaari mong isipin na ito bilang unang pag-redirect echo Rob sa isang file 204 00:15:49,560 --> 00:15:54,160 at pagkatapos input sa. / kumusta na file na ay lamang outputted. 205 00:15:54,160 --> 00:15:57,850 Ngunit ito ay tumatagal ang pansamantalang file ng larawan. 206 00:16:01,890 --> 00:16:04,460 >> Mga tanong sa na? 207 00:16:04,460 --> 00:16:07,150 >> Ang susunod na tanong ay upang makasali ito. 208 00:16:07,150 --> 00:16:15,310 Ano pipeline ang maaari mong gamitin upang mahanap ang bilang ng mga natatanging pangalan sa isang file na tinatawag names.txt? 209 00:16:15,310 --> 00:16:24,160 Ang mga utos na kami ay pagpunta sa gusto mong gamitin dito ay natatangi, kaya uniq, at pagkatapos WC. 210 00:16:24,160 --> 00:16:28,840 Maaari mong gawin ang tao uniq sa aktwal na hitsura sa kung ano na ginagawa, 211 00:16:28,840 --> 00:16:34,840 at ito upang i-filter ang mga katabi pagtutugma ng linya mula sa input. 212 00:16:34,840 --> 00:16:40,690 At tao WC ay pagpunta sa i-print ang newline, salita, at byte bilang para sa bawat file. 213 00:16:40,690 --> 00:16:43,760 At ang huling isa na kami ay pagpunta sa nais na gumamit ng uri, 214 00:16:43,760 --> 00:16:47,410 na lang na-uri-uriin ang mga linya ng txt file. 215 00:16:47,410 --> 00:16:58,080 Kung gumawa ako ng ilang txt file, names.txt, at ito Rob, Tommy, Jose, Tommy, Joseph, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 kung ano ang gusto kong gawin dito ay mahanap ang bilang ng mga natatanging pangalan sa file na ito. 217 00:17:03,910 --> 00:17:08,750 Kaya ano ang dapat ang sagot? >> [Mag-aaral] 4. >> Oo. 218 00:17:08,750 --> 00:17:13,780 Ito ay dapat 4 dahil Rob, Tommy, Joseph, RJ lamang natatanging pangalan sa file na ito. 219 00:17:13,780 --> 00:17:20,180 Ang unang hakbang, kung ko lang ang bilang ng salita sa names.txt, 220 00:17:20,180 --> 00:17:24,290 ito ay aktwal na nagsasabi sa akin ang lahat. 221 00:17:24,290 --> 00:17:32,560 Ito ay talagang pag-print - hayaan ang makita, tao WC - newline, salita, at byte bilang ng. 222 00:17:32,560 --> 00:17:38,270 Kung lamang ako pakialam tungkol sa mga linya, maaari ko lang WC-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Kaya na hakbang 1. 224 00:17:44,300 --> 00:17:50,510 Ngunit hindi ko nais sa WC-l names.txt dahil names.txt lamang na naglalaman ng lahat ng mga pangalan, 225 00:17:50,510 --> 00:17:54,170 at gusto ko upang i-filter ang anumang di-natatanging mga. 226 00:17:54,170 --> 00:18:01,200 Kaya kung gagawin ko uniq names.txt, na hindi pa ninyo ako kung ano ang gusto kong 227 00:18:01,200 --> 00:18:03,760 dahil ang mga dobleng mga pangalan ay pa rin doon. 228 00:18:03,760 --> 00:18:07,690 Bakit na? Bakit uniq hindi ginagawa kung ano ang gusto ko? 229 00:18:07,690 --> 00:18:10,500 [Mag-aaral] mga duplicate ay hindi [hindi marinig] >> Oo. 230 00:18:10,500 --> 00:18:16,370 Tandaan ang tao na pahina para uniq nagsasabing filter katabing linya ng pagtutugma. 231 00:18:16,370 --> 00:18:19,680 Hindi ito mga katabi, kaya hindi ito ay sasalain ang mga ito. 232 00:18:19,680 --> 00:18:31,100 Kung uri-uriin ko muna ang mga ito,-uuri names.txt ay upang ilagay ang lahat ng mga duplicate na linya. 233 00:18:31,100 --> 00:18:34,450 Kaya ngayon-uuri names.txt na. 234 00:18:34,450 --> 00:18:40,550 Ako pagpunta sa gusto upang gamitin ang na bilang ang input sa uniq, na | uniq. 235 00:18:40,550 --> 00:18:43,390 Na nagbibigay sa akin Joseph, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 at gusto kong gamitin na bilang ang input sa WC-l, 237 00:18:49,260 --> 00:18:52,740 na kung saan ay upang bigyan ako ng 4. 238 00:18:52,740 --> 00:18:56,930 Tulad ng sinasabi dito, kung ano pipeline maaari mong gamitin? 239 00:18:56,930 --> 00:19:01,390 Maaari mong gawin ng maraming mga bagay tulad ng paggamit ng isang serye ng mga utos 240 00:19:01,390 --> 00:19:05,130 kung saan ginamit mo ang output mula sa isang utos bilang ang input sa susunod na utos. 241 00:19:05,130 --> 00:19:08,780 Maaari mong gawin ng maraming mga bagay, ng maraming mga bagay matalino. 242 00:19:08,780 --> 00:19:11,440 >> Mga tanong? 243 00:19:12,910 --> 00:19:14,600 Okay. 244 00:19:14,600 --> 00:19:17,880 Iyon ay para sa mga pipe at pag-redirect. 245 00:19:18,370 --> 00:19:24,090 >> Ngayon namin pumunta sa ang aktwal na mga bagay-bagay, ang coding bagay. 246 00:19:24,090 --> 00:19:29,100 Inside ng PDF, makikita mo ang command na ito, 247 00:19:29,100 --> 00:19:32,950 at makikita mo nais patakbuhin ang command na ito sa iyong appliance. 248 00:19:36,240 --> 00:19:42,250 wget ang command para sa pagkuha lamang ng isang bagay mula sa Internet, talaga, 249 00:19:42,250 --> 00:19:45,180 kaya wget at ang URL na ito. 250 00:19:45,180 --> 00:19:49,110 Kung nagpunta ka sa URL na ito sa iyong browser, i-download na file. 251 00:19:49,110 --> 00:19:52,510 Ko lang ang nag-click sa ito, kaya-download ang file para sa akin. 252 00:19:52,510 --> 00:19:55,650 Ngunit sa pagsusulat sa wget ng bagay na sa loob ng terminal 253 00:19:55,650 --> 00:19:58,620 ay lamang pagpunta upang i-download ang mga ito sa iyong terminal. 254 00:19:58,620 --> 00:20:02,750 Mayroon akong section5.zip, at gugustuhin mong i-unzip section5.zip, 255 00:20:02,750 --> 00:20:06,520 na kung saan ay upang bigyan ka ng isang folder na tinatawag na section5, 256 00:20:06,520 --> 00:20:11,550 na upang magkaroon ng lahat ng mga file na kami ay pagpunta sa gumagamit ngayon sa loob nito. 257 00:20:33,380 --> 00:20:37,710 Bilang iminumungkahi ang pangalan ng file ng mga programang ito, hindi sila ng kaunti maraming surot, 258 00:20:37,710 --> 00:20:40,990 kaya ang iyong misyon ay upang malaman kung bakit gamit gdb. 259 00:20:40,990 --> 00:20:44,560 Ba ang lahat sa kanila-download / malaman kung paano upang makakuha ang mga ito-download 260 00:20:44,560 --> 00:20:47,480 sa kanilang appliance? Okay. 261 00:20:47,480 --> 00:20:56,400 >> Pagpapatakbo ng ./buggy1, ito ay sabihin ang Segmentation fault (core dumped), 262 00:20:56,400 --> 00:21:00,500 kung saan ang anumang oras na makakakuha ka ng isang segfault, ito ay isang masamang bagay. 263 00:21:00,500 --> 00:21:03,810 Sa ilalim kung ano pangyayari kang makakuha ng segfault? 264 00:21:03,810 --> 00:21:08,210 [Mag-aaral] Dereferencing null pointer. >> Oo. Kaya na ay isang halimbawa. 265 00:21:08,210 --> 00:21:11,580 Dereferencing isang null pointer ka pagpunta upang makakuha ng isang segfault. 266 00:21:11,580 --> 00:21:16,720 Anong segfault paraan ka ng pagpindot sa memory hindi mo dapat na nakadikit. 267 00:21:16,720 --> 00:21:21,350 Kaya dereferencing null pointer ng pagpindot address 0, 268 00:21:21,350 --> 00:21:28,060 at isa lamang, lahat ng mga computer sa kasalukuyan sabihin ang address 0 memory, hindi mo dapat pagpindot. 269 00:21:28,060 --> 00:21:31,920 Kaya na kung bakit dereferencing ng isang null pointer resulta sa isang segfault. 270 00:21:31,920 --> 00:21:37,210 Kapag mangyari sa hindi nakapagsimula ng pointer, pagkatapos ito ay may halaga ng basura, 271 00:21:37,210 --> 00:21:41,520 at iba pa kapag sinubukan mong dereference, sa lahat ng posibilidad ka ng pagpindot sa memory 272 00:21:41,520 --> 00:21:43,540 na sa gitna ng wala kahit saan. 273 00:21:43,540 --> 00:21:45,650 Kung mangyari sa iyo upang makakuha ng masuwerteng at ang halaga ng basura 274 00:21:45,650 --> 00:21:48,440 nangyari upang tumuro sa isang lugar sa stack o isang bagay, 275 00:21:48,440 --> 00:21:50,820 pagkatapos kapag dereference mo na pointer na hindi mo pa nasimulan, 276 00:21:50,820 --> 00:21:52,730 walang magkamali. 277 00:21:52,730 --> 00:21:55,480 Ngunit kung ito ay tumuturo sa, sabihin nating, sa isang lugar sa pagitan ng mga stack at ang magbunton, 278 00:21:55,480 --> 00:21:59,850 o pagturo lamang sa isang lugar na hindi pa ginagamit ng iyong programa, 279 00:21:59,850 --> 00:22:02,240 ka pagpindot sa memory hindi mo dapat na nakadikit at iyong segfault. 280 00:22:02,240 --> 00:22:06,370 Kapag sumulat ka ng isang recursive function na at ito recurses masyadong maraming beses 281 00:22:06,370 --> 00:22:08,720 at ang iyong stack ay lumalaki masyadong malaki at ng stack collides sa bagay 282 00:22:08,720 --> 00:22:12,270 na hindi ito dapat nagbabanggaan na may, ka ng pagpindot sa memory, hindi mo dapat hinahawakan, 283 00:22:12,270 --> 00:22:14,810 kaya segfault. 284 00:22:14,810 --> 00:22:17,010 Iyon ay kung ano ang isang segfault. 285 00:22:17,010 --> 00:22:21,810 >> Rin sa parehong dahilan na kung mayroon ka ng isang string tulad ng - 286 00:22:21,810 --> 00:22:23,930 sabihin bumalik sa nakaraang programa. 287 00:22:23,930 --> 00:22:28,530 Sa hello.c--I'm lamang pagpunta sa iba pa. 288 00:22:28,530 --> 00:22:33,770 magpasinda * s = "Hello World!"; 289 00:22:33,770 --> 00:22:42,310 Kung gamitin ko * s = isang bagay o mga [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 kaya't kumusta,. / kumusta, bakit ay na segfault? 291 00:22:48,410 --> 00:22:51,250 Bakit ito segfault? 292 00:22:55,660 --> 00:22:57,890 Ano ang gusto mong asahan na mangyayari? 293 00:22:57,890 --> 00:23:06,640 Kung ginawa ko printf ("% s \ n", mga); kung ano ang mong asahan na ipi-print? 294 00:23:06,640 --> 00:23:09,930 [Mag-aaral] X halo. >> Oo. 295 00:23:09,930 --> 00:23:15,140 Ang problema ay na kapag ikaw ay ipinapahayag ng isang string tulad nito, 296 00:23:15,140 --> 00:23:18,190 s ay isang pointer na pumunta sa stack, 297 00:23:18,190 --> 00:23:25,880 at kung ano s ay tumuturo sa ay ang string na ito na siyang nakapaloob sa read-only memory. 298 00:23:25,880 --> 00:23:30,560 Kaya sa pamamagitan ng pangalan, read-only memory, dapat mong makuha ang ideya 299 00:23:30,560 --> 00:23:33,010 na kung susubukan mong baguhin kung ano ang nasa read-only memory, 300 00:23:33,010 --> 00:23:36,670 ikaw ay gumagawa ng isang bagay na hindi mo dapat ginagawa sa memory at iyong segfault. 301 00:23:36,670 --> 00:23:45,360 Ito ay talagang isang malaking pagkakaiba sa pagitan ng magpasinda * s at magpasinda mga []. 302 00:23:45,360 --> 00:23:48,790 Kaya magpasinda mga [], na ngayon ay ang string na ito ay pagpunta sa ilagay sa ang stack, 303 00:23:48,790 --> 00:23:53,960 at stack ay hindi na read-only, na nangangahulugan na ito ay dapat na gumana perpektong fine. 304 00:23:55,500 --> 00:23:57,370 At ginagawa nito. 305 00:23:57,370 --> 00:24:06,250 Tandaan na kapag gagawin ko magpasinda * s = "Hello World!", Mga mismong sa stack 306 00:24:06,250 --> 00:24:10,390 ngunit mga puntos sa ibang lugar, at sa iba pang lugar ang mangyayari read-only. 307 00:24:10,390 --> 00:24:15,640 Ngunit magpasinda mga [] ay isang bagay sa stack. 308 00:24:17,560 --> 00:24:21,760 Kaya, na ang isa pang halimbawa ng isang segfault nangyayari. 309 00:24:21,760 --> 00:24:27,820 >> Nakita namin na ./buggy1 nagresulta sa isang segfault. 310 00:24:27,820 --> 00:24:31,810 Sa teorya, hindi ka dapat magmukhang sa buggy1.c. 311 00:24:31,810 --> 00:24:35,170 Sa halip, titingnan namin ito sa pamamagitan ng gdb. 312 00:24:35,170 --> 00:24:37,750 Pansinin na kapag nakakuha ka ng Segmentation fault (core dumped), 313 00:24:37,750 --> 00:24:40,850 sa makuha mo ang file na ito sa paglipas dito tinatawag na core. 314 00:24:40,850 --> 00:24:45,200 Kung namin ls-l, gagamitin namin ang core ay karaniwang isang medyo malaking file. 315 00:24:45,200 --> 00:24:51,580 Ito ay ang bilang ng mga bytes ng file, kaya mukhang 250-isang bagay na kilobytes. 316 00:24:51,580 --> 00:24:56,120 Ang dahilan para sa ay na kung ano ang core dump aktwal 317 00:24:56,120 --> 00:25:01,410 ay kapag ang iyong programa nag-crash, ang estado ng memorya ng iyong programa 318 00:25:01,410 --> 00:25:05,230 lamang ay makakakuha ng kopyahin at ilagay sa ang file na ito. 319 00:25:05,230 --> 00:25:07,270 Ito ay makakakuha dumped sa file na iyon. 320 00:25:07,270 --> 00:25:13,060 Ang program na ito, habang ito ay tumatakbo, nangyari sa paggamit ng memory sa loob ng 250 kilobytes, 321 00:25:13,060 --> 00:25:17,040 at sa gayon ay ang Nakakuha dumped sa ang file na ito. 322 00:25:17,040 --> 00:25:23,630 Ngayon ay maaari kang tumingin sa file na iyon kung gagawin namin gdb buggy1 core. 323 00:25:23,630 --> 00:25:30,130 Maaari lamang namin gawin gdb buggy1, at na start up lang gdb regular, 324 00:25:30,130 --> 00:25:33,800 Ang gamit ang buggy1 bilang input file nito. 325 00:25:33,800 --> 00:25:38,260 Ngunit kung gagawin mo gdb buggy1 core, pagkatapos partikular ito upang simulan ang gdb 326 00:25:38,260 --> 00:25:40,330 sa pamamagitan ng pagtingin sa na core file. 327 00:25:40,330 --> 00:25:45,560 At ikaw sinasabi buggy1 ay nangangahulugan gdb alam na core file ay mula sa buggy1 programa. 328 00:25:45,560 --> 00:25:49,580 Kaya gdb buggy1 core ay pagpunta sa dalhin agad sa amin 329 00:25:49,580 --> 00:25:52,060 sa kung saan nangyari ang programa na wakasan. 330 00:25:57,720 --> 00:26:02,340 Nakikita namin dito Program itinigil may signal 11, Segmentation fault. 331 00:26:02,340 --> 00:26:10,110 Mangyari namin upang makita ang isang linya ng pagpupulong, na kung saan ay malamang na hindi kapaki-pakinabang. 332 00:26:10,110 --> 00:26:15,360 Ngunit kung ikaw type ang BT o backtrace, na ang function na 333 00:26:15,360 --> 00:26:19,430 na nagbibigay sa amin ang listahan ng aming kasalukuyang mga frame ng stack. 334 00:26:19,430 --> 00:26:23,150 Kaya backtrace. Mukhang lamang namin ay may dalawang frame stack. 335 00:26:23,150 --> 00:26:26,310 Ang una ay ang aming pangunahing stack frame, 336 00:26:26,310 --> 00:26:29,810 at ang pangalawa ay ang stack frame para sa function na mangyayari namin sa, 337 00:26:29,810 --> 00:26:34,440 na kamukha lamang namin ang assembly code para sa. 338 00:26:34,440 --> 00:26:38,050 Kaya sabihin bumalik sa aming pangunahing function na, 339 00:26:38,050 --> 00:26:42,300 at upang gawin na maaari naming gawin frame 1, at sa tingin ko Maaari din namin gawin ang, 340 00:26:42,300 --> 00:26:45,160 ngunit ko halos hindi kailanman gawin ang - o up. Oo. 341 00:26:45,160 --> 00:26:50,710 Pataas at pababa. Up Pinagsasama-up ng isang stack frame, pinagsasama-mo pababa stack frame. 342 00:26:50,710 --> 00:26:53,240 Malamang ko sa hindi kailanman gamitin na. 343 00:26:53,240 --> 00:26:59,120 Ko lang ang partikular na sabihin frame 1, na kung saan ay pumunta sa frame na may label na 1. 344 00:26:59,120 --> 00:27:01,750 Frame 1 upang dalhin sa amin sa pangunahing stack frame, 345 00:27:01,750 --> 00:27:05,570 at sinasabi nito dito mismo ang linya ng code na mangyayari namin na sa. 346 00:27:05,570 --> 00:27:07,950 Kung gusto namin ng ilang higit pang mga linya ng code, maaari naming sabihin ang listahan, 347 00:27:07,950 --> 00:27:11,280 at na upang bigyan kami ng lahat ng mga linya ng code sa paligid nito. 348 00:27:11,280 --> 00:27:13,360 Ang linya namin segfaulted sa 6: 349 00:27:13,360 --> 00:27:17,360 kung (strcmp ("CS50 bato", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Kung ito ay hindi pa halata, maaari kang makakuha ng ito tuwid mula dito sa pamamagitan lamang ng pag-iisip kung bakit ito segfaulted. 351 00:27:24,130 --> 00:27:28,800 Ngunit maaari naming dalhin ito isang hakbang karagdagang at sabihin, "Bakit argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Natin ang naka-print na argv [1], at ito mukhang ito ay 0x0, kung saan ang null pointer. 353 00:27:38,830 --> 00:27:44,750 Kami ay strcmping CS50 bato at null, at sa gayon ay pagpunta sa segfault. 354 00:27:44,750 --> 00:27:48,280 At bakit argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Mag-aaral] Dahil hindi namin bigyan ito ng anumang command-line argumento. 356 00:27:51,280 --> 00:27:53,390 Oo. Hindi namin bigyan ito ng anumang command-line argumento. 357 00:27:53,390 --> 00:27:58,460 Kaya ./buggy1 ay lamang pagpunta sa argv [0] na ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Hindi ito upang magkaroon ng isang argv [1], kaya na pagpunta sa segfault. 359 00:28:02,100 --> 00:28:07,450 Ngunit kung, sa halip, gawin ko lang CS50, ito ay pagpunta sa sabihin mong makakuha ng D 360 00:28:07,450 --> 00:28:09,950 dahil na kung ano ang dapat gawin. 361 00:28:09,950 --> 00:28:15,240 Naghahanap sa buggy1.c, dapat i-print "Nakakuha ka ng D" - 362 00:28:15,240 --> 00:28:20,820 Kung argv [1] ay hindi "CS50 bato", "Makakakuha ka ng D", iba pa "Makakakuha ka ng isang A!" 363 00:28:20,820 --> 00:28:25,660 Kaya kung gusto naming ng isang A, kailangan namin ito upang ihambing ang bilang totoo, 364 00:28:25,660 --> 00:28:28,710 na nangangahulugan na ito sa 0. 365 00:28:28,710 --> 00:28:31,100 Kaya argv [1] ay kailangang "CS50 bato". 366 00:28:31,100 --> 00:28:35,660 Kung nais mo bang gawin iyon sa command line, kailangan mong gamitin ang \ upang makatakas ang espasyo. 367 00:28:35,660 --> 00:28:41,690 Kaya CS50 \ bato at kang makakuha ng isang A! 368 00:28:41,690 --> 00:28:44,060 Kung hindi mo gawin ang backslash, bakit ito hindi gumagana? 369 00:28:44,060 --> 00:28:47,190 [Mag-aaral] ang dalawang magkaibang argumento. >> Oo. 370 00:28:47,190 --> 00:28:52,540 Argv [1] ay pagpunta sa CS50, at argv [2] ay pagpunta sa bato. Okay. 371 00:28:52,540 --> 00:28:56,470 >> Ngayon ./buggy2 ay pagpunta sa segfault muli. 372 00:28:56,470 --> 00:29:01,880 Sa halip na ito binubuksan sa core nito file, makikita namin lamang buksan ang buggy2 direkta, 373 00:29:01,880 --> 00:29:05,000 kaya gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Ngayon kung lamang namin patakbuhin ang aming programa, pagkatapos ito ay upang sabihin Program natanggap signal SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 na ang segfault signal, at ito ay kung saan ito nangyari mangyari. 376 00:29:15,530 --> 00:29:21,250 Naghahanap sa aming backtrace, nakikita namin na kami sa function na ang oh_no, 377 00:29:21,250 --> 00:29:23,900 kung saan ay tinatawag na sa pamamagitan ng maliit na lokomotora ang function na, na tinatawag na sa pamamagitan ng function na ang binky, 378 00:29:23,900 --> 00:29:26,460 na tinatawag na sa pamamagitan ng pangunahing. 379 00:29:26,460 --> 00:29:31,680 Maaari din namin makita ang mga argumento sa mga function. 380 00:29:31,680 --> 00:29:34,680 Ang argumento sa maliit na lokomotora at binky 1. 381 00:29:34,680 --> 00:29:44,390 Kung naming ilista ang function na oh_no, nakita namin na ang oh_no lang ginagawa magpasinda ** s = null; 382 00:29:44,390 --> 00:29:47,410 * S = "Boom"; 383 00:29:47,410 --> 00:29:50,330 Bakit na mabigo? 384 00:29:54,330 --> 00:29:58,380 [Mag-aaral] Hindi ka maaaring dereference ang null pointer? >> Oo. 385 00:29:58,380 --> 00:30:06,090 Ito ay sinasabi s null, kung anuman na mangyayari sa isang pansamantalang trabaho **, 386 00:30:06,090 --> 00:30:12,070 kung saan, depende sa kung paano bigyang-kahulugan mo ang mga ito, maaaring ito ay isang pointer sa isang pointer sa isang string 387 00:30:12,070 --> 00:30:15,550 o isang hanay ng mga string. 388 00:30:15,550 --> 00:30:21,430 S null, kaya * s ay dereferencing null pointer, 389 00:30:21,430 --> 00:30:24,800 at kaya ito ng pag-crash. 390 00:30:24,800 --> 00:30:27,540 Ito ay isa ng ang pinakamabilis na paraan maaari mong posibleng segfault. 391 00:30:27,540 --> 00:30:31,300 Lamang ito deklarasyon null pointer at agad segfaulting. 392 00:30:31,300 --> 00:30:34,570 Na ang oh_no ay ginagawa. 393 00:30:34,570 --> 00:30:43,400 Kung pumunta kami isang frame, pagkatapos namin ay pagpunta upang makakuha ng sa function na tinatawag na oh_no. 394 00:30:43,400 --> 00:30:44,830 Kailangan kong gawin na pababa. 395 00:30:44,830 --> 00:30:48,610 Kung hindi mo ipasok ang isang command at pindutin lamang ang Ipasok muli, 396 00:30:48,610 --> 00:30:52,350 ito lamang ulitin ang mga nakaraang utos na pinatakbo mo. 397 00:30:52,350 --> 00:30:56,610 Namin sa frame 1. 398 00:30:56,610 --> 00:31:04,650 Naglilista frame na ito, makikita namin dito ang aming function na. 399 00:31:04,650 --> 00:31:08,520 Maaari mong pindutin ang listahan muli, o maaari mong gawin ang listahan 20 at ilista ang higit pa. 400 00:31:08,520 --> 00:31:13,640 Ang function na maliit na lokomotora nagsasabing kung i ay 1, pagkatapos ay pumunta sa function na oh_no, 401 00:31:13,640 --> 00:31:15,960 tao pumunta sa slinky function na. 402 00:31:15,960 --> 00:31:18,700 At alam namin i ay 1 dahil mangyayari namin upang makita dito 403 00:31:18,700 --> 00:31:22,560 maliit na lokomotora na tinatawag na sa mga argumento 1. 404 00:31:22,560 --> 00:31:27,560 O maaari mo lamang huwag i-print ang i at sabihin i ito ay 1. 405 00:31:27,560 --> 00:31:33,770 Kami ay kasalukuyang nasa maliit na lokomotora, at kung kami isa pang frame, alam namin magpapadala kami magtapos sa binky. 406 00:31:33,770 --> 00:31:36,600 Up. Ngayon hindi namin binky. 407 00:31:36,600 --> 00:31:41,340 Naglilista ito function na - ang listahan mula sa bago kalahating cut sa akin off - 408 00:31:41,340 --> 00:31:52,670 ito nagsimula off bilang kung i ay 0, pagkatapos kami ay pagpunta sa tumawag ito oh_no, tao tumawag maliit na lokomotora. 409 00:31:52,670 --> 00:31:57,000 Alam namin na i ay 1, kaya tinatawag na maliit na lokomotora. 410 00:31:57,000 --> 00:32:05,030 At ngayon hindi namin pabalik sa pangunahing, at pangunahing ay lamang pagpunta sa int i = ribete ()% 3; 411 00:32:05,030 --> 00:32:08,790 Na lamang upang bigyan ka ng random na numero na ay alinman sa 0, 1, o 2. 412 00:32:08,790 --> 00:32:12,780 Ito ay pagpunta sa tumawag binky sa numerong iyon, at ito ay bumalik 0. 413 00:32:12,780 --> 00:32:16,700 Naghahanap sa, 414 00:32:16,700 --> 00:32:19,880 lamang paglalakad sa pamamagitan nang manu-mano ang programa nang hindi tumatakbo ito agad, 415 00:32:19,880 --> 00:32:25,400 nais mong magtakda ng isang punto ng pahinga sa pangunahing, na nangangahulugan na kapag nagpatakbo kami sa programa 416 00:32:25,400 --> 00:32:31,020 tumatakbo ang iyong programa hanggang ito hit sa punto ng pahinga. 417 00:32:31,020 --> 00:32:35,450 Kaya't ang pagpapatakbo sa programa, ito ay tumakbo at pagkatapos ay pindutin ang pangunahing function at hihinto sa pagtakbo. 418 00:32:35,450 --> 00:32:44,700 Ngayon ay hindi namin sa loob ng pangunahing, at hakbang o sa susunod na pagpunta upang dalhin sa amin sa susunod na linya ng code. 419 00:32:44,700 --> 00:32:47,050 Maaari mong gawin ang hakbang o sa susunod. 420 00:32:47,050 --> 00:32:51,800 Pagpindot sa tabi, ngayon i ay nakatakda sa ribete ()% 3, upang maaari naming i-print ang halaga ng i, 421 00:32:51,800 --> 00:32:55,280 at sabihin i ito ay 1. 422 00:32:55,280 --> 00:32:58,110 Ngayon ang bagay kung ginagamit namin susunod o hakbang. 423 00:32:58,110 --> 00:33:01,000 Hulaan ko ito mattered sa nakaraang, ngunit nais namin nais na gamitin ang susunod. 424 00:33:01,000 --> 00:33:06,000 Kung gagamitin namin ang hakbang, hakbang namin sa pag-andar, na kung saan ay nangangahulugan na ang pagtingin sa ang aktwal na bagay 425 00:33:06,000 --> 00:33:07,940 na nangyayari sa loob ng binky. 426 00:33:07,940 --> 00:33:10,510 Kung ginagamit namin susunod, pagkatapos ay nangangahulugan ito pumunta sa paglipas ng ang function na 427 00:33:10,510 --> 00:33:14,070 at pumunta lamang sa susunod na linya ng code sa aming pangunahing function na. 428 00:33:14,070 --> 00:33:17,900 Dito mismo sa linyang ito, ako ay sa kung saan ito sinabi ribete ()% 3; 429 00:33:17,900 --> 00:33:21,320 kung ginawa ko hakbang, pumunta sa ang pagpapatupad ng ribete 430 00:33:21,320 --> 00:33:25,110 at tingnan kung ano ang nangyayari doon, at maaari kong hakbang sa pamamagitan ng katangian ng ribete. 431 00:33:25,110 --> 00:33:26,920 Ngunit Wala akong pakialam tungkol sa mga katangian ng ribete. 432 00:33:26,920 --> 00:33:30,190 Gusto ko lang upang pumunta sa susunod na linya ng code sa pangunahing, kaya gamitin ko susunod. 433 00:33:30,190 --> 00:33:35,800 Ngunit ngayon gagawin ko pag-aalaga tungkol sa binky function na, kaya gusto kong hakbang sa na. 434 00:33:35,800 --> 00:33:37,730 Ngayon ako sa binky. 435 00:33:37,730 --> 00:33:42,040 Ang unang linya ng code upang sabihin kung (i == 0), kumuha ako ng hakbang, 436 00:33:42,040 --> 00:33:44,930 nakikita namin namin magtapos sa maliit na lokomotora. 437 00:33:44,930 --> 00:33:51,620 Kung namin ang listahan ng mga bagay, nakita namin na ito naka-check ay i = 0. 438 00:33:51,620 --> 00:33:55,470 i ay hindi katumbas ng 0, kaya napunta sa pang tao kondisyon, 439 00:33:55,470 --> 00:33:59,540 na tawagan ang maliit na lokomotora (i). 440 00:33:59,540 --> 00:34:04,030 Maaari mong nalilito. 441 00:34:04,030 --> 00:34:07,380 Kung kamakailan mo lamang tumingin sa mga linyang ito nang direkta, maaari mong isipin kung (i == 0), 442 00:34:07,380 --> 00:34:10,800 okay, pagkatapos ko kinuha ng isang hakbang at ngayon ako sa maliit na lokomotora (i), 443 00:34:10,800 --> 00:34:14,120 maaari mong isipin na dapat ibig sabihin i = 0 o isang bagay. 444 00:34:14,120 --> 00:34:18,980 Hinde lamang nangangahulugan na ito alam dumikit ito nang direkta sa maliit na lokomotora ang linya (i). 445 00:34:18,980 --> 00:34:23,300 Dahil i ay hindi 0, ang susunod na hakbang ay hindi nagtatapos sa pang tao. 446 00:34:23,300 --> 00:34:26,239 Iba Pa ay hindi isang linya na ito upang tumigil sa. 447 00:34:26,239 --> 00:34:31,570 Lamang ito upang pumunta sa susunod na linya na ito aktwal na execute, na maliit na lokomotora (i). 448 00:34:31,570 --> 00:34:36,090 Stepping sa maliit na lokomotora (i), makikita namin kung (i == 1). 449 00:34:36,090 --> 00:34:42,670 Namin alam i = 1, kaya kapag hakbang namin, alam namin na kami ay pagpunta upang magtapos sa oh_no 450 00:34:42,670 --> 00:34:46,489 dahil i = 1 tawag ang function na oh_no, na maaari mong hakbang sa, 451 00:34:46,489 --> 00:34:52,969 na i-set magpasinda ** s = null at agad "Boom". 452 00:34:54,270 --> 00:34:59,690 At pagkatapos ay talagang aktwal na tumitingin sa pagpapatupad ng buggy2, 453 00:34:59,690 --> 00:35:04,590 ito, lamang i pagkuha ng random na numero - 0, 1, o 2 - pagtawag binky, 454 00:35:04,590 --> 00:35:10,610 na kung i ay 0 tawag oh_no, tao tawag sa maliit na lokomotora, kung saan ay dito. 455 00:35:10,610 --> 00:35:18,100 Kung i ay 1, tawag oh_no, iba pa tawagan slinky, na darating dito, 456 00:35:18,100 --> 00:35:20,460 kung i ay 2, tumawag oh_no. 457 00:35:20,460 --> 00:35:24,720 Hindi ko kahit na sa tingin may paraan - 458 00:35:24,720 --> 00:35:30,030 Ba ang sinuman makita ang isang paraan ng paggawa ng ito ng programa na hindi segfault? 459 00:35:30,030 --> 00:35:37,530 Dahil maliban kung ako nawawalang ng isang bagay, kung i ay 0, makikita mo kaagad segfault, 460 00:35:37,530 --> 00:35:41,250 tao mong pumunta sa isang function na kung i ay 1 ka segfault, 461 00:35:41,250 --> 00:35:44,540 tao mong pumunta sa isang function na kung saan kung i 2 segfault mo. 462 00:35:44,540 --> 00:35:46,810 Kaya hindi mahalaga kung ano ang ginagawa mo, segfault. 463 00:35:46,810 --> 00:35:52,380 >> Hulaan ko ang isang paraan ng pag-aayos na ito ay sa halip ng paggawa magpasinda ** s = null, 464 00:35:52,380 --> 00:35:55,610 maaari mong malloc ng puwang para sa string. 465 00:35:55,610 --> 00:36:04,230 Namin ang malloc (sizeof) - sizeof kung ano? 466 00:36:09,910 --> 00:36:15,190 [Mag-aaral] (magpasinda) * 5? >> Ba ito mukhang tama? 467 00:36:15,190 --> 00:36:21,060 Ako ipagpalagay na ito ay gagana kung hindi ko aktwal na tumatakbo ito, ngunit ito ay hindi kung ano ang Naghahanap ako. 468 00:36:24,400 --> 00:36:32,940 Hanapin sa uri ng mga. Natin magdagdag ng int *, kaya int * x. 469 00:36:32,940 --> 00:36:35,600 Gusto kong gawin malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 O kung gusto ko ang isang hanay ng mga 5, gusto kong gawin (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Paano kung mayroon akong isang int **? 472 00:36:46,260 --> 00:36:49,140 Ano ang gagawin ko malloc? 473 00:36:49,140 --> 00:36:53,510 [Mag-aaral] Laki ng pointer. >> Oo. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Parehong bagay sa pababa dito. 475 00:36:56,960 --> 00:37:01,280 Gusto kong (sizeof (pansamantalang trabaho *)); 476 00:37:06,170 --> 00:37:12,840 Ito ay upang maglaan ng espasyo para sa pointer na tumuturo sa "Boom". 477 00:37:12,840 --> 00:37:15,330 Hindi ko kailangan upang maglaan ng espasyo para sa "Boom" mismo 478 00:37:15,330 --> 00:37:17,210 dahil ito ay isa lamang na katumbas sa kung ano ang sinabi ko bago 479 00:37:17,210 --> 00:37:20,870 ng pansamantalang trabaho * x = "Boom". 480 00:37:20,870 --> 00:37:27,950 "Boom" ay umiiral na. Ang mangyayari sa umiiral sa read-only na rehiyon ng memory. 481 00:37:27,950 --> 00:37:35,200 Ngunit ito ay umiiral na, na nangangahulugan na ang linya ng code, kung s ay isang pansamantalang trabaho **, 482 00:37:35,200 --> 00:37:43,900 pagkatapos * s ay isang pansamantalang trabaho * at ka-set ang magpasinda * upang tumuro sa "Boom". 483 00:37:43,900 --> 00:37:50,040 Kung gusto ko upang kopyahin ang "Boom" sa mga, pagkatapos ay kailangan ko upang maglaan ng espasyo para sa mga. 484 00:37:55,170 --> 00:38:03,900 Kong gawin * s = malloc (sizeof (pansamantalang trabaho) * 5); 485 00:38:03,900 --> 00:38:06,210 Bakit 5? 486 00:38:06,210 --> 00:38:10,860 Bakit hindi 4? Mukhang "Boom" ay 4 na character. >> [Mag-aaral] Ang null character. 487 00:38:10,860 --> 00:38:14,580 Oo. Lahat ng iyong mga string ay pagpunta sa kailangan ang null karakter. 488 00:38:14,580 --> 00:38:23,590 Ngayon ay maaari kong gawin ang isang bagay tulad strcat - Ano ang pag-andar para sa pagkopya ng isang string? 489 00:38:23,590 --> 00:38:28,520 [Mag-aaral] cpy? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 tao strcpy. 491 00:38:36,120 --> 00:38:39,590 Kaya strcpy o strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy ng kaunti mas ligtas dahil maaari mong tukuyin kung paano maraming mga character, 493 00:38:43,410 --> 00:38:46,190 ngunit hindi mahalaga dahil alam namin. 494 00:38:46,190 --> 00:38:50,340 Kaya strcpy at hanapin sa argumento. 495 00:38:50,340 --> 00:38:53,100 Ang unang argumento ang aming destination. 496 00:38:53,100 --> 00:38:56,770 Ang pangalawang argumento ang aming pinagmulan. 497 00:38:56,770 --> 00:39:10,310 Kami ay pagpunta sa kopyahin sa aming destination * s pointer na "Boom". 498 00:39:10,310 --> 00:39:19,820 Bakit baka gusto mong gawin ito na may strcpy sa halip na lamang kung ano ang nagkaroon kami bago 499 00:39:19,820 --> 00:39:22,800 ng * s = "Boom"? 500 00:39:22,800 --> 00:39:28,630 May ay isang dahilan baka gusto mong gawin ito, ngunit kung ano ang dahilan na? 501 00:39:28,630 --> 00:39:31,940 [Mag-aaral] Kung nais mong baguhin ang isang bagay sa "Boom". >> Oo. 502 00:39:31,940 --> 00:39:37,950 Ngayon ay maaari kong gawin ang isang bagay tulad ng mga [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 dahil ang mga puntos sa magbunton at ang puwang na iyon sa magbunton na s tumuturo sa 504 00:39:48,190 --> 00:39:52,320 ay isang pointer sa higit pang puwang sa magbunton, na pag-iimbak ng "Boom". 505 00:39:52,320 --> 00:39:55,150 Kaya ito kopya ng "Boom" ay naka-imbak sa ang magbunton. 506 00:39:55,150 --> 00:39:58,780 May technically dalawang kopya ng "Boom" sa aming programa. 507 00:39:58,780 --> 00:40:03,500 May ang unang na lang ibinigay sa pamamagitan ng ang string na "Boom" pare-pareho, 508 00:40:03,500 --> 00:40:09,250 at ang pangalawang kopya ng "Boom", strcpy nilikha ang kopya ng "Boom". 509 00:40:09,250 --> 00:40:13,100 Ngunit ang kopya ng "Boom" ay naka-imbak sa magbunton, at magbunton ang libreng upang baguhin. 510 00:40:13,100 --> 00:40:17,250 Magbunton ay hindi read-only, kaya na nangangahulugan na s [0] 511 00:40:17,250 --> 00:40:20,500 ay upang ipaalam sa iyo na baguhin ang halaga ng "Boom". 512 00:40:20,500 --> 00:40:23,130 Ito ay upang ipaalam sa iyo na baguhin ang mga character. 513 00:40:23,130 --> 00:40:26,640 >> Mga tanong? 514 00:40:27,740 --> 00:40:29,290 Okay. 515 00:40:29,290 --> 00:40:35,500 >> Paglipat sa buggy3, sabihin gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Lang namin patakbuhin ito at makita namin kami makakuha ng segfault. 517 00:40:39,840 --> 00:40:46,550 Kung namin backtrace, may dalawang function lamang. 518 00:40:46,550 --> 00:40:52,970 Kung kami sa aming pangunahing function na, tingnan namin na na namin segfaulted sa line na ito. 519 00:40:52,970 --> 00:41:00,180 Kaya lang hinahanap sa linya na ito, para sa (int line = 0; fgets ng mga bagay na ito ay ginagawa hindi katumbas null; 520 00:41:00,180 --> 00:41:03,770 linya + +). 521 00:41:03,770 --> 00:41:08,010 Ang aming nakaraang frame ay tinatawag na _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Makikita mo na ng maraming na may built-in na function C, 523 00:41:10,720 --> 00:41:15,350 na kapag nakuha mo ang segfault, ay talagang misteriyoso pangalan ng function na 524 00:41:15,350 --> 00:41:18,090 tulad ang _IO_fgets na ito. 525 00:41:18,090 --> 00:41:21,770 Ngunit na nauugnay sa ang tawag na ito fgets. 526 00:41:21,770 --> 00:41:25,850 Sa isang lugar sa loob dito, kami ay segfaulting. 527 00:41:25,850 --> 00:41:30,340 Kung titingnan namin sa argumento sa mga fgets, maaari naming i-print ang buffer. 528 00:41:30,340 --> 00:41:41,180 Natin i-print bilang isang - Oh, hindi. 529 00:41:48,980 --> 00:41:51,900 Print ay hindi pagpunta upang gumana nang eksakto tulad ng gusto ko ito. 530 00:41:55,460 --> 00:41:58,000 Tingnan natin sa aktwal na programa. 531 00:42:02,200 --> 00:42:09,640 Buffer ay isang character array. Isang character na hanay ng mga 128 mga character. 532 00:42:09,640 --> 00:42:14,980 Kaya kapag sinabi ko ng naka-print na buffer, ito upang i-print ang mga 128 character, 533 00:42:14,980 --> 00:42:18,300 kung saan hulaan ko kung ano ang inaasahan. 534 00:42:18,300 --> 00:42:21,390 Ano ako ay naghahanap para sa i-print ang address ng buffer, 535 00:42:21,390 --> 00:42:23,680 ngunit hindi talagang sabihin sa akin magkano. 536 00:42:23,680 --> 00:42:30,770 Kaya kapag mangyayari kong sabihin dito x buffer, ito ay nagpapakita sa akin ng 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 kung saan, kung tandaan mo mula sa mas maaga o ilang mga punto, Oxbffff may kaugaliang na stack-ish rehiyon. 538 00:42:38,690 --> 00:42:46,020 Stack ang may kaugaliang upang simulan ang isang lugar lamang sa ilalim ng 0xc000. 539 00:42:46,020 --> 00:42:51,890 Sa pamamagitan lamang ng nakakakita sa address na ito, alam ko na buffer ang nangyayari sa stack. 540 00:42:51,890 --> 00:43:04,500 I-restart ang aking programa, patakbuhin, hanggang, buffer nakita natin ay ang pagkakasunud-sunod ng mga character 541 00:43:04,500 --> 00:43:06,530 na medyo mas walang kahulugan. 542 00:43:06,530 --> 00:43:12,270 Pagkatapos pag-print ng file, kung ano ang file hitsura? 543 00:43:15,120 --> 00:43:17,310 [Mag-aaral] Null. >> Oo. 544 00:43:17,310 --> 00:43:22,610 File ay isang ng uri ng FILE *, kaya ito ay isang pointer, 545 00:43:22,610 --> 00:43:26,610 at ang halaga ng pointer na null. 546 00:43:26,610 --> 00:43:33,240 Kaya fgets pagpunta sa subukan na magbasa mula sa na pointer sa isang hindi direktang paraan, 547 00:43:33,240 --> 00:43:37,320 ngunit upang ma-access na pointer, ito ay sa dereference ito. 548 00:43:37,320 --> 00:43:40,550 O kaya, upang ma-access ang ano ang dapat na tumuturo sa, dereferences ito. 549 00:43:40,550 --> 00:43:43,810 Kaya dereferencing null pointer at ito segfaults. 550 00:43:46,600 --> 00:43:48,730 Ko restart ito doon. 551 00:43:48,730 --> 00:43:52,170 Kung masira namin sa aming pangunahing punto at patakbuhin, 552 00:43:52,170 --> 00:43:57,320 ang unang linya ng code magpasinda * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Na dapat magbigay ng isang medyo malaking pahiwatig bakit nabigo ang programang ito. 554 00:44:00,870 --> 00:44:06,080 Pinagsasama-akin ng pag-type ng susunod sa susunod na linya, kung saan binuksan ko ang file na ito, 555 00:44:06,080 --> 00:44:11,140 at pagkatapos ko agad makakuha ng sa aming mga linya, kung saan sabay-sabay ko pindutin ang susunod, pagpunta sa segfault. 556 00:44:11,140 --> 00:44:16,880 Ba ang sinuman gusto mong dumura isang dahilan kung bakit maaari naming segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Mag-aaral] File ay hindi umiiral. >> Oo. 558 00:44:19,130 --> 00:44:22,250 Ito ay dapat na isang hint 559 00:44:22,250 --> 00:44:29,570 na tuwing ka ng pagbukas ng file kailangan mo upang suriin na ang file na aktwal na umiiral. 560 00:44:29,570 --> 00:44:31,510 Kaya dito, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Kapag kami fopen filename para sa pagbabasa, kailangan namin pagkatapos sasabihin 562 00:44:34,700 --> 00:44:45,870 kung (file == null) at sabihin printf ("File ay hindi umiiral!" 563 00:44:45,870 --> 00:44:56,340 o - mas mahusay pa - filename); return 1; 564 00:44:56,340 --> 00:45:00,300 Kaya ngayon namin suriin upang makita kung ito ay null 565 00:45:00,300 --> 00:45:03,930 bago aktwal na patuloy at sinusubukang basahin mula sa file na iyon. 566 00:45:03,930 --> 00:45:08,800 Gumawang muli namin ito lamang upang makita na na gawa. 567 00:45:11,020 --> 00:45:14,970 Ko na nilayon upang isama ang isang bagong linya ng. 568 00:45:21,090 --> 00:45:25,290 Kaya ngayon nonexistent.txt ay hindi umiiral. 569 00:45:26,890 --> 00:45:30,040 Dapat mong palaging suriin para sa ganitong uri ng bagay. 570 00:45:30,040 --> 00:45:33,870 Dapat mong palaging suriin upang makita kung fopen nagbabalik null. 571 00:45:33,870 --> 00:45:38,170 Dapat mong palaging suriin upang matiyak na malloc hindi nagbabalik null, 572 00:45:38,170 --> 00:45:41,410 o tao ka segfault. 573 00:45:42,200 --> 00:45:45,930 >> Ngayon buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Tumatakbo. Ako paghula ito ay naghihintay para sa input o posibleng walang katapusan looping. 575 00:45:58,440 --> 00:46:01,870 Oo, walang katapusan na looping. 576 00:46:01,870 --> 00:46:05,560 Kaya buggy4. Mukhang hindi kami ng walang hangganang looping. 577 00:46:05,560 --> 00:46:12,590 Maaari naming masira sa pangunahing, patakbuhin ang aming programa. 578 00:46:12,590 --> 00:46:20,180 Gdb, hangga't ang pagpapaikli gamitin mo ay hindi malabo 579 00:46:20,180 --> 00:46:23,420 o espesyal na mga pagdadaglat na ibinibigay nila para sa iyo, 580 00:46:23,420 --> 00:46:29,020 maaari mong gamitin n na gamitin ang susunod na sa halip na kinakailangang i-type ang susunod na ang lahat ng mga paraan. 581 00:46:29,020 --> 00:46:33,730 At ngayon ko na pindutin n sabay-sabay, maaari ko lang pindutin ang Enter upang panatilihin ang pagpunta sa tabi 582 00:46:33,730 --> 00:46:36,640 sa halip ng pagkakaroon upang maabot n Ipasok, n Ipasok, n Ipasok. 583 00:46:36,640 --> 00:46:44,630 Mukhang ako sa ilang mga uri ng para sa loop na pagtatakda ng array [i] sa 0. 584 00:46:44,630 --> 00:46:50,510 Mukhang tulad ng hindi kailanman ako paglabag ng ito para sa loop. 585 00:46:50,510 --> 00:46:54,780 Kung ko i-print, kaya i ay 2, pagkatapos ko pumunta sa tabi. 586 00:46:54,780 --> 00:46:59,250 Ko i-print, i 3, pagkatapos ay makikita ko pumunta sa tabi. 587 00:46:59,250 --> 00:47:05,360 Ko i-print at i 3. Susunod, i-print ang i, i ay 4. 588 00:47:05,360 --> 00:47:14,520 Aktwal na, naka-print sizeof (array), kaya ang laki ng array ay 20. 589 00:47:16,310 --> 00:47:32,870 Ngunit mukhang mayroong ilang espesyal na command gdb para sa pagpunta hanggang sa may mangyari. 590 00:47:32,870 --> 00:47:37,620 Ito ay tulad ng pagtatakda ng isang kondisyon sa halaga ng variable. Ngunit hindi ko matandaan kung ano ito ay. 591 00:47:37,620 --> 00:47:44,100 Kaya kung panatilihin namin ang pagpunta - 592 00:47:44,100 --> 00:47:47,120 Ano ang sinasabi? Ano mo ilabas? 593 00:47:47,120 --> 00:47:50,500 [Mag-aaral] ba ipakita i magdagdag - >> Oo. Kaya ipakita maaari i makatulong. 594 00:47:50,500 --> 00:47:54,530 Kung lamang namin ipakita i, ito ilagay dito kung ano ang halaga ng i 595 00:47:54,530 --> 00:47:56,470 kaya hindi ko upang i-print ito sa bawat oras. 596 00:47:56,470 --> 00:48:02,930 Kung namin lamang panatilihin ang pagpunta sa tabi, makikita namin 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 Isang bagay ay pagpunta katakut-takot mali, at i ay i-reset sa 0. 598 00:48:13,330 --> 00:48:22,220 Naghahanap sa buggy4.c, makikita namin ang lahat ng mangyayari int array [5]; 599 00:48:22,220 --> 00:48:26,200 para sa (i = 0; i <= sizeof (array); i + +) 600 00:48:26,200 --> 00:48:28,550 array [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Ano ang gagawin namin makita na ang mali dito? 602 00:48:31,390 --> 00:48:39,480 Bilang isang pahiwatig, kapag ako ay ginagawa ang gdb buggy4 - sabihin lumalabag sa pangunahing, run - 603 00:48:39,480 --> 00:48:45,980 Ko ang naka-print na sizeof (array) lamang upang makita kung ano ang kundisyon kung saan ang dapat kong wakas masira ang. 604 00:48:47,690 --> 00:48:51,100 Nasaan ako? Ba akong magpatakbo ng? 605 00:48:51,100 --> 00:48:54,280 Hindi ko ipinapahayag. 606 00:48:54,280 --> 00:48:58,680 Kaya i-print ang sizeof (array) at na 20, 607 00:48:58,680 --> 00:49:06,690 na inaasahan dahil ang aking array ng laki 5 at ng 5 integer, 608 00:49:06,690 --> 00:49:12,410 kaya ang buong bagay ay dapat 5 * sizeof (int) bytes, kung saan sizeof (int) ay may kaugaliang 4. 609 00:49:12,410 --> 00:49:14,780 Kaya sizeof (array) 20. 610 00:49:14,780 --> 00:49:17,420 Ano ang dapat ito? 611 00:49:17,420 --> 00:49:21,720 [Mag-aaral] na hinati sa pamamagitan ng sizeof (int). >> Oo, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Mukhang mayroon pa rin ng problema dito. Tingin ko ito ay dapat lamang na < 613 00:49:30,630 --> 00:49:36,960 dahil medyo mas laging 00:49:44,860 Ngayon sabihin isipin ang tungkol sa kung bakit ito ay aktwal na pinaghiwa. 615 00:49:44,860 --> 00:49:53,370 Ba ang sinuman na guesses kung bakit ay i-reset sa 0 sa pamamagitan ng bawat pag-ulit ng loop? 616 00:50:01,300 --> 00:50:09,350 Ang tanging bagay sa loob ng dito na nangyayari na array [i] ay nakatakda sa 0. 617 00:50:09,350 --> 00:50:15,350 Kaya sa paanuman, ang linya ng code na nagsasanhi sa aming int i nakatakda sa 0. 618 00:50:16,730 --> 00:50:23,130 [Mag-aaral] Puwede ito ay dahil na-override ang memorya ng ito bahagi ng i 619 00:50:23,130 --> 00:50:27,970 kapag sa tingin nito ay ang susunod na elemento ng array? >> [Bowden] Oo. 620 00:50:27,970 --> 00:50:33,880 Kapag kami ay lagpas sa pagtatapos ng aming array, 621 00:50:33,880 --> 00:50:39,870 sa paanuman na espasyo na aming override-override ang halaga ng i. 622 00:50:39,870 --> 00:50:48,030 At kaya kung tiningnan namin sa buggy4, masira pangunahing, run, 623 00:50:48,030 --> 00:50:53,120 sabihin i-print ang address ng i. 624 00:50:53,120 --> 00:50:57,280 Mukhang ito bffff124. 625 00:50:57,280 --> 00:51:03,930 Ngayon sabihin i-print ang address ng array [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Paano ang tungkol sa [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11c, 120. array [5] ay bfff124. 629 00:51:14,530 --> 00:51:26,990 Kaya array [5] may parehong address tulad ng i, na nangangahulugan na array [5] ay i. 630 00:51:26,990 --> 00:51:30,720 Kung mayroon sila ang parehong address, ang mga ito ay ang parehong bagay. 631 00:51:30,720 --> 00:51:38,410 Kaya kapag kami itakda ang array [5] sa 0, kami ay pagtatakda ng i sa 0. 632 00:51:38,410 --> 00:51:46,070 At kung sa tingin mo tungkol sa ito sa mga tuntunin ng stack, 633 00:51:46,070 --> 00:51:55,590 int i ay ipinahayag una, na nangangahulugang i nakakakuha ng ilang espasyo sa stack. 634 00:51:55,590 --> 00:52:04,730 Pagkatapos array [5] ay inilalaan, kaya pagkatapos 20 bytes ay inilalaan sa stack. 635 00:52:04,730 --> 00:52:08,400 Kaya i maipo inilalaan muna, pagkatapos ay mga 20 bytes makapag inilalaan. 636 00:52:08,400 --> 00:52:11,400 Kaya i mangyayari bago ang array, 637 00:52:11,400 --> 00:52:19,230 at dahil sa ang paraan, tulad ko sinabi noong nakaraang linggo, kung saan technically stack ang lumalaki pababa, 638 00:52:19,230 --> 00:52:28,520 kapag ikaw ay index sa isang array, kami ay katiyakan na ang 0 posisyon sa array 639 00:52:28,520 --> 00:52:31,970 palaging nangyayari bago ang unang posisyon sa array. 640 00:52:31,970 --> 00:52:35,900 Ito ay uri ng kung paano ko ginamit ito noong nakaraang linggo. 641 00:52:35,900 --> 00:52:42,210 Pansinin na sa ilalim namin ang address 0 at sa tuktok namin ang address Max. 642 00:52:42,210 --> 00:52:44,880 Stack ay palaging lumalagong. 643 00:52:48,100 --> 00:52:53,500 Ipagpalagay natin na naming maglaan i. 644 00:52:53,500 --> 00:52:59,680 Magtalaga namin integer i, na nangangahulugan sabihin lamang sabihin dito integer i maipo inilalaan. 645 00:52:59,680 --> 00:53:06,420 Pagkatapos namin maglaan ang aming hanay ng mga 5 integer, na nangangahulugan na sa ilalim na, 646 00:53:06,420 --> 00:53:11,230 dahil stack ay lumalaking pababa, mga 5 integer inilalaan. 647 00:53:11,230 --> 00:53:15,900 Ngunit dahil sa kung paano array gumagana, kami ay katiyakan na ang unang posisyon sa array 648 00:53:15,900 --> 00:53:22,260 laging may isang address na mas mababa kaysa sa ikalawang bagay sa array. 649 00:53:22,260 --> 00:53:28,270 Kaya 0 array posisyon ay palaging may mangyari muna sa memory, 650 00:53:28,270 --> 00:53:30,700 samantalang ang array posisyon 1 ay mangyayari pagkatapos na 651 00:53:30,700 --> 00:53:33,310 at array posisyon 2 ay na mangyayari pagkatapos nito, 652 00:53:33,310 --> 00:53:37,900 na nangangahulugan na array posisyon 0 ang mangyayari sa isang lugar down na dito, 653 00:53:37,900 --> 00:53:40,690 array posisyon 1 ang mangyayari sa itaas na 654 00:53:40,690 --> 00:53:45,530 dahil ang paglipat up ay nangangahulugan ng mas mataas address dahil ang maximum address ay dito. 655 00:53:45,530 --> 00:53:50,490 Kaya array [0] pababa dito, array [1] hanggang dito, array [2] hanggang dito, array [3] up dito. 656 00:53:50,490 --> 00:53:55,620 Pansinin kung paano bago inilalaan namin ang integer i lahat ng mga paraan dito, 657 00:53:55,620 --> 00:54:01,040 bilang ilipat namin ng karagdagang at karagdagang sa aming array, kami ay nakakakuha ng mas malapit at mas malapit sa aming integer i. 658 00:54:01,040 --> 00:54:07,640 Lamang kaya mangyayari na array [5], na kung saan ay isang posisyon higit pa sa aming array, 659 00:54:07,640 --> 00:54:13,010 ay eksaktong kung saan integer i nangyari sa inilalaan. 660 00:54:13,010 --> 00:54:16,920 Kaya na ang punto kung saan namin mangyari na pagpindot sa lugar sa stack 661 00:54:16,920 --> 00:54:21,680 na inilaan para sa integer i, at namin ang pagse-set na 0. 662 00:54:21,680 --> 00:54:26,160 >> Kung paano na gumagana. Mga tanong? Oo. 663 00:54:26,160 --> 00:54:30,710 [Mag-aaral] Huwag kailanman isipan. Okay. 664 00:54:30,710 --> 00:54:33,090 [Mag-aaral] Paano mo maiwasan ang mga uri ng mga error? 665 00:54:33,090 --> 00:54:41,190 Mga uri ng mga error? Huwag gumamit ng C bilang iyong programming language. 666 00:54:41,190 --> 00:54:45,840 Gumamit ng isang wika na may hangganan array check. 667 00:54:45,840 --> 00:54:55,900 Hangga't hindi ka maingat, kailangan mo lamang upang maiwasan ang pagpunta nakaraang ang mga hangganan ng iyong array. 668 00:54:55,900 --> 00:54:58,300 [Mag-aaral] Kaya dito kapag nagpunta kami nakaraang ang mga hangganan ng iyong array - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Iyon ay kung saan ang mga bagay simulan pagpunta mali. >> [Mag-aaral] Oh, okay. 670 00:55:01,840 --> 00:55:05,730 Hangga't manatili sa loob ng memory inilalaan para sa iyong array, ikaw fine. 671 00:55:05,730 --> 00:55:12,400 Ngunit C ang walang error checking. Kung gawin ko array [1000], ito Masaya lang baguhin ang anumang mangyayari - 672 00:55:12,400 --> 00:55:16,500 Pupunta ito sa simula ng array, pagkatapos ito napupunta 1000 posisyon pagkatapos at nagtatakda ito sa 0. 673 00:55:16,500 --> 00:55:20,000 Hindi ito gumagawa ng anumang checking na oh, ito ay hindi tunay na 1000 mga bagay sa loob nito. 674 00:55:20,000 --> 00:55:22,750 1000 ay paraan na lampas sa kung ano ang dapat kong pagbabago, 675 00:55:22,750 --> 00:55:26,940 samantalang Java o isang bagay na makikita mo makakuha ng array ng mga hanggahan index 676 00:55:26,940 --> 00:55:29,820 o index ng mga hanggahan ng pagbubukod. 677 00:55:29,820 --> 00:55:33,950 Iyon ay kung bakit ang isang maraming mga mas mataas na mga wika antas ay may mga bagay na ito 678 00:55:33,950 --> 00:55:37,340 kung saan kung pumunta ka lampas sa hangganan ng array, hindi mo 679 00:55:37,340 --> 00:55:40,070 sa gayon ay hindi mo maaaring baguhin ang mga bagay mula sa ilalim mo 680 00:55:40,070 --> 00:55:42,590 at pagkatapos ay mga bagay pumunta mas mas malala pa sa pagkuha ng pagbubukod 681 00:55:42,590 --> 00:55:44,940 nagsasabi na nagpunta higit sa dulo ng array. 682 00:55:44,940 --> 00:55:50,970 [Mag-aaral] At kaya dapat lamang namin binago ang <= sa makatarungan > [Bowden] Oo. 683 00:55:50,970 --> 00:55:54,800 Ito ay dapat 00:55:59,560 dahil sizeof (array) ay 20, ngunit nais lamang namin 5. >> [Mag-aaral] Kanan. 685 00:55:59,560 --> 00:56:04,060 Higit pang mga tanong? Okay. 686 00:56:04,060 --> 00:56:07,380 >> [Mag-aaral] Mayroon akong tanong. >> Oo. 687 00:56:07,380 --> 00:56:16,440 [Mag-aaral] Ano ang aktwal na array variable? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Tulad ng kung ano ang array? 689 00:56:20,000 --> 00:56:24,930 Array mismo ay isang simbolo. 690 00:56:24,930 --> 00:56:31,490 Ito ay ang address ng simula ng 20 bytes na kami ay tumutukoy lamang. 691 00:56:31,490 --> 00:56:38,070 Maaari mong isipin na ito bilang isang pointer, ngunit ito ay isang pare-pareho ang pointer. 692 00:56:38,070 --> 00:56:44,140 Sa lalong madaling bagay makapag inipon, ang variable array ay hindi umiiral na ngayon. 693 00:56:44,140 --> 00:56:48,210 [Mag-aaral] Kaya paano hanapin ang laki ng array? 694 00:56:48,210 --> 00:56:54,130 Laki ng array ay tumutukoy sa laki ng block na ang simbolo na tumutukoy sa. 695 00:56:54,130 --> 00:57:01,240 Kapag ginawa ko ang isang bagay tulad ng printf ("% p \ n", array); 696 00:57:01,240 --> 00:57:05,140 sabihin patakbuhin ito. 697 00:57:12,960 --> 00:57:15,530 Ano ang sinabi ko lang gawin mali? 698 00:57:15,530 --> 00:57:19,220 'Array' Array ipinahayag dito. 699 00:57:20,820 --> 00:57:23,200 Oh, hanggang dito. 700 00:57:23,200 --> 00:57:31,250 Kumalatong ay matalino, at mangyayari sa mapansin na ipinahayag ko ang array bilang 5 elemento 701 00:57:31,250 --> 00:57:34,540 ngunit ako pag-i-index sa posisyon 1000. 702 00:57:34,540 --> 00:57:38,450 Maaari itong gawin iyon dahil ito lamang ang constants. 703 00:57:38,450 --> 00:57:43,370 Maaari lamang ito pumunta sa ngayon sa makapansin na ako pagpunta lampas sa hangganan ng array. 704 00:57:43,370 --> 00:57:46,880 Ngunit mapansin bago kapag nagkaroon kami i hindi tama, 705 00:57:46,880 --> 00:57:51,040 hindi ito posibleng matukoy kung gaano karaming mga halaga na maaaring i tumagal sa, 706 00:57:51,040 --> 00:57:55,540 kaya hindi ito maaaring matukoy na ay i pagpunta higit sa dulo ng array. 707 00:57:55,540 --> 00:57:59,430 Na kumalatong pagiging matalino. 708 00:57:59,430 --> 00:58:03,340 >> Ngunit ngayon buggy4. Kaya ano pa ang ako paggawa ng mali? 709 00:58:03,340 --> 00:58:05,970 Deklarasyon nang kataon lamang library function na 'printf'. 710 00:58:05,970 --> 00:58:14,960 Ako pagpunta sa nais na # include . 711 00:58:14,960 --> 00:58:18,710 Okay. Tumatakbo na ngayon buggy4. 712 00:58:18,710 --> 00:58:24,840 Pag-print ang halaga ng array tulad ng ginawa ko dito, pag-print ang mga ito bilang isang pointer 713 00:58:24,840 --> 00:58:30,060 print ng isang bagay na ganito ang hitsura - bfb8805c - na ilang address 714 00:58:30,060 --> 00:58:33,450 na sa stack-ish rehiyon. 715 00:58:33,450 --> 00:58:41,820 Array mismo ay tulad ng isang pointer, ngunit ito ay hindi isang aktwal na pointer, 716 00:58:41,820 --> 00:58:45,410 dahil sa isang regular na pointer maaari naming baguhin. 717 00:58:45,410 --> 00:58:54,700 Array ay ilan lang pare-pareho. Ang 20 mga bloke ng memorya ay nagsisimula sa address 0xbfb8805c. 718 00:58:54,700 --> 00:59:09,020 Kaya bfb8805c sa pamamagitan ng address na ito +20--o hulaan ko -20 - 719 00:59:09,020 --> 00:59:17,400 ay ang lahat ng memory na inilalaan para sa array na ito. 720 00:59:17,400 --> 00:59:20,350 Array, ang variable mismo ay hindi naka-imbak sa kahit saan. 721 00:59:20,350 --> 00:59:27,660 Kapag ikaw ay kino-compile, ang tagatala - wave ng kamay sa ito - 722 00:59:27,660 --> 00:59:33,060 ngunit ang tagatala ay gamitin na lamang kung saan ito alam array na. 723 00:59:33,060 --> 00:59:36,090 Alam kung saan na magsisimula ang array, 724 00:59:36,090 --> 00:59:40,910 at sa gayon ay maaari itong palaging lamang gawin ang mga bagay sa mga tuntunin ng Offset mula sa simula. 725 00:59:40,910 --> 00:59:43,960 Ito ay hindi kailangan ng isang variable mismo upang kumatawan array. 726 00:59:43,960 --> 00:59:53,730 Ngunit kapag gagawin ko ang isang bagay tulad ng int * p = array; ngayon p ay isang pointer na mga punto na array, 727 00:59:53,730 --> 00:59:57,830 at ngayon p aktwal na umiiral sa stack. 728 00:59:57,830 --> 01:00:01,950 Ako-atubiling baguhin ang p. Ang maaari kong gawin p = malloc. 729 01:00:01,950 --> 01:00:06,500 Kaya orihinal tulis sa array, ito POINTS ngayon sa ilang espasyo sa magbunton. 730 01:00:06,500 --> 01:00:09,620 Hindi ko maaaring gawin ang array = malloc. 731 01:00:09,620 --> 01:00:13,710 Kung kumalatong ay matalino, ito ay sumigaw sa akin karapatan off ang bat. 732 01:00:17,000 --> 01:00:21,430 Aktwal, ako ay medyo sigurado GCC gawin ito masyadong. 733 01:00:21,430 --> 01:00:25,010 Kaya array uri 'int [5]' ay hindi naitatalaga. 734 01:00:25,010 --> 01:00:28,040 Hindi ka maaaring magtalaga ng isang bagay sa isang uri ng array 735 01:00:28,040 --> 01:00:30,500 dahil lamang pare-pareho ang array. 736 01:00:30,500 --> 01:00:34,760 Ito ay isang simbolo na reference mga 20 bytes. Hindi ko maaaring baguhin ito. 737 01:00:34,760 --> 01:00:37,690 >> [Mag-aaral] At kung saan naka-imbak ang laki ng array? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Hindi ito naka-imbak sa kahit saan. Ito kapag ito kino-compile. 739 01:00:40,670 --> 01:00:46,310 Kaya kung saan ay ang laki ng array na naka-imbak? 740 01:00:46,310 --> 01:00:51,870 Maaari mo lamang gamitin ang sizeof (array) sa loob ng pag-andar na array ay ipinahayag mismo. 741 01:00:51,870 --> 01:01:03,150 Kaya kung gagawin ko ilang function, foo, at gagawin ko (int array []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (array)); 743 01:01:10,450 --> 01:01:21,330 at pagkatapos ay down na dito tumawag ako foo (array); 744 01:01:21,330 --> 01:01:24,840 sa loob ng function na ito - sabihin patakbuhin ito. 745 01:01:34,200 --> 01:01:36,840 Ito ay kumalatong pagiging matalino muli. 746 01:01:36,840 --> 01:01:43,890 Ito ay nagsasabi sa akin na sizeof sa array function na parameter 747 01:01:43,890 --> 01:01:46,690 ay bumalik ang laki ng 'int *'. 748 01:01:46,690 --> 01:01:55,150 Ito ay isang error kung ito ay hindi kung ano ang nais kong mangyari. 749 01:01:55,150 --> 01:01:58,960 Natin ang aktwal na i-off ang Werror. 750 01:02:14,950 --> 01:02:17,590 Babala. Babala ay pinong. 751 01:02:17,590 --> 01:02:19,960 Ito ay pa rin makatipon hangga't ay isang babala. 752 01:02:19,960 --> 01:02:22,910 . / A.out ay pagpunta upang mag-print ng 4. 753 01:02:22,910 --> 01:02:28,650 Ang babala na nabuo ay isang malinaw na tagapagpahiwatig ng kung ano ang nangyaring mali. 754 01:02:28,650 --> 01:02:34,120 Ang int array ay pagpunta upang i-print ang sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Kahit na kung ko bang ilagay ang array [5] sa dito, pa rin ito lamang upang i-print ang sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Ito sa lalong madaling kayo na ipasa ito sa isang function, ang pagkakaiba sa pagitan ng mga array at pointer 757 01:02:47,440 --> 01:02:49,670 ay nonexistent. 758 01:02:49,670 --> 01:02:52,640 Ito ang mangyayari sa isang array na ipinahayag sa stack, 759 01:02:52,640 --> 01:02:58,300 ngunit sa lalong madaling pumasa namin na halaga, na 0xbf blah, blah, blah sa ito function na, 760 01:02:58,300 --> 01:03:03,350 pointer ito POINTS na array sa stack. 761 01:03:03,350 --> 01:03:08,310 Kaya na nangangahulugan na sizeof Nalalapat lamang sa pag-andar na array ay ipinahayag, 762 01:03:08,310 --> 01:03:11,230 na nangangahulugan na kapag ikaw ay kino-compile ang function na ito, 763 01:03:11,230 --> 01:03:17,330 kapag kumalatong napupunta sa pamamagitan ng function na, nakikita Ang array ay isang int na hanay ng mga laki 5. 764 01:03:17,330 --> 01:03:20,640 Kaya ito nakikita sizeof (array). Well, na 20. 765 01:03:20,640 --> 01:03:26,440 Na ang aktwal na kung paano talaga gumagana ang sizeof para sa halos lahat ng mga kaso. 766 01:03:26,440 --> 01:03:31,150 Sizeof ay hindi isang function, ito ay isang operator. 767 01:03:31,150 --> 01:03:33,570 Hindi mo tawagan ang sizeof function na. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), tagatala ay lamang na isalin ang na 4 na. 769 01:03:41,480 --> 01:03:43,700 Nakuha ko? Okay. 770 01:03:43,700 --> 01:03:47,520 >> [Mag-aaral] Kaya kung ano ay ang pagkakaiba sa pagitan ng sizeof (array) sa pangunahing at sa foo? 771 01:03:47,520 --> 01:03:52,840 Ito ay sapagkat hindi namin sinasabi na sizeof (array), na kung saan ay ng uri int *, 772 01:03:52,840 --> 01:03:57,120 samantalang array ang down dito ay hindi ng uri int *, isang int array. 773 01:03:57,120 --> 01:04:04,540 >> [Mag-aaral] Kaya kung mayroon kang ang parameter sa array [] sa halip ng int * array, 774 01:04:04,540 --> 01:04:09,230 ay na nangangahulugan na maaari mo pa ring baguhin ang array dahil ngayon ang isang pointer? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Tulad ito? >> [Mag-aaral] Oo. Maaari mong baguhin ang array sa loob ng function na ngayon? 776 01:04:14,250 --> 01:04:18,420 [Bowden] maaari mong baguhin ang array sa parehong mga kaso. 777 01:04:18,420 --> 01:04:23,130 Sa parehong mga kaso na ito ay libre upang sabihin array [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Mag-aaral] Ngunit maaari kang gumawa ng array punto sa iba pa? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Oo. Sa alinmang kaso - >> [mag-aaral] Oo. 780 01:04:30,230 --> 01:04:38,410 [Bowden] Ang pagkakaiba sa pagitan ng array [] at isang int array *, ay wala. 781 01:04:38,410 --> 01:04:42,570 Maaari ka ring makakuha ng ilang maraming interes array in dito 782 01:04:42,570 --> 01:04:47,050 para sa ilang maginhawang syntax, ngunit pa rin ito lamang ang pointer. 783 01:04:47,050 --> 01:04:56,400 Nangangahulugan ito na ako libreng upang gawin ang array = malloc (sizeof (int)); at ngayon ay ituro sa ibang lugar. 784 01:04:56,400 --> 01:04:59,610 Ngunit tulad lamang ng kung paano ito gumagana magpakailanman at laging, 785 01:04:59,610 --> 01:05:03,210 pagbabago ang array na ito sa pamamagitan ng paggawa ng ito tumuro sa iba pa 786 01:05:03,210 --> 01:05:07,570 ay hindi baguhin ito array dito dahil ito ay isang kopya ng argument, 787 01:05:07,570 --> 01:05:10,780 ito ay hindi isang pointer na argumento. 788 01:05:10,780 --> 01:05:16,070 At aktwal, tulad ng higit pang mga pahiwatig na ito ay eksaktong kapareho - 789 01:05:16,070 --> 01:05:21,100 Nakita namin na kung ano ang pagpi-print ng mga kopya array - 790 01:05:21,100 --> 01:05:31,410 kung ano ang kung-print namin ang address ng array o ang address ng address ng array 791 01:05:31,410 --> 01:05:36,290 sa alinman sa mga? 792 01:05:41,770 --> 01:05:45,220 Natin hindi pansinin ang isang ito. 793 01:05:48,140 --> 01:05:51,660 Okay. Ito ay pinong. Ngayon tumatakbo. / A.out. 794 01:05:51,660 --> 01:06:00,220 Pagpi-print ng array, pagkatapos ay pag-print ang address ng array, ang mga parehong bagay. 795 01:06:00,220 --> 01:06:02,870 Array na ay hindi umiiral. 796 01:06:02,870 --> 01:06:08,190 Alam kapag ikaw ay pag-print array, ka ng pag-print ang simbolo na tumutukoy sa mga 20 bytes. 797 01:06:08,190 --> 01:06:11,940 Pag-print ang address ng array, well, array ay hindi umiiral. 798 01:06:11,940 --> 01:06:17,200 Hindi ito isang address, kaya lamang ito ng mga Kopya address ng mga 20 bytes. 799 01:06:20,820 --> 01:06:28,150 Sa lalong madaling mo makatipon pababa, gusto sa iyong inipon buggy4. / A.out, 800 01:06:28,150 --> 01:06:30,340 array ay nonexistent. 801 01:06:30,340 --> 01:06:33,640 Payo umiiral. Array hindi. 802 01:06:34,300 --> 01:06:38,060 Ang mga bloke ng memorya na kumakatawan sa array Umiiral pa rin, 803 01:06:38,060 --> 01:06:43,270 ngunit ang variable array at mga variable ng uri na ay hindi umiiral. 804 01:06:46,260 --> 01:06:50,270 Yaong tulad ng mga pangunahing pagkakaiba sa pagitan ng mga array at pointer 805 01:06:50,270 --> 01:06:55,590 sa lalong madaling gumawa ka ng tawag function na, ay walang pagkakaiba. 806 01:06:55,590 --> 01:07:00,460 Ngunit sa loob ng pag-andar na ang array mismo ay ipinahayag, sizeof gumagana naiiba 807 01:07:00,460 --> 01:07:05,190 dahil iyong pag-print ang laki ng mga bloke sa halip ng ang laki ng uri, 808 01:07:05,190 --> 01:07:08,950 at hindi mo maaaring baguhin ito dahil ito ay isang simbolo. 809 01:07:08,950 --> 01:07:14,370 Pag-print ng mga Kopya ng bagay at ang address ng bagay sa parehong bagay. 810 01:07:14,370 --> 01:07:18,480 At na medyo magkano ito. 811 01:07:18,480 --> 01:07:20,820 [Mag-aaral] Puwede mong sabihin na ang isa pang oras? 812 01:07:21,170 --> 01:07:24,170 Maaaring ko may nakaligtaan. 813 01:07:24,170 --> 01:07:29,260 Array ng Pagpi-print at address ng array ng mga Kopya ang parehong bagay, 814 01:07:29,260 --> 01:07:33,180 samantalang kung print ka ng isang pointer kumpara sa address ng pointer, 815 01:07:33,180 --> 01:07:36,010 isang bagay ng mga Kopya ang address ng kung ano ang iyong na tumuturo sa, 816 01:07:36,010 --> 01:07:40,360 ang iba pang mga Kopya address ng ang pointer sa stack. 817 01:07:40,360 --> 01:07:47,040 Maaari mong baguhin ang isang pointer, hindi mo maaaring baguhin ang isang simbolo ng array. 818 01:07:47,740 --> 01:07:53,270 At sizeof pointer ay pagpunta sa i-print ang laki ng na uri ng pointer. 819 01:07:53,270 --> 01:07:57,470 Kaya int * p sizeof (p) ay pagpunta sa i-print ang 4, 820 01:07:57,470 --> 01:08:04,110 ngunit int array [5] naka-print sizeof (array) ay pagpunta sa i-print ang 20. 821 01:08:04,110 --> 01:08:07,480 [Mag-aaral] Kaya int array [5] ay i-print ang 20? >> Oo. 822 01:08:07,480 --> 01:08:13,300 Iyon ay kung bakit sa loob ng buggy4 kapag ginamit sizeof (array) 823 01:08:13,300 --> 01:08:16,660 ito ay ginagawa i <20, na kung saan ay hindi kung ano ang gusto namin. 824 01:08:16,660 --> 01:08:20,880 Gusto naming i <5. >> [Mag-aaral] Okay. 825 01:08:20,880 --> 01:08:25,569 [Bowden] At pagkatapos ay sa lalong madaling simulan mo ang pagpasa sa mga pag-andar, 826 01:08:25,569 --> 01:08:34,340 kung ginawa namin int * p = array; 827 01:08:34,340 --> 01:08:39,779 sa loob ng function na ito, maaari naming talaga gamitin p at array sa eksaktong parehong paraan, 828 01:08:39,779 --> 01:08:43,710 maliban para sa sizeof problema at ang pagbabago ng problema. 829 01:08:43,710 --> 01:08:49,810 Ngunit p [0] = 1; katulad ng sinasabi ng array [0] = 1; 830 01:08:49,810 --> 01:08:55,600 At sa lalong madaling sabihin namin foo (array); o foo (p); 831 01:08:55,600 --> 01:08:59,760 sa loob ng foo function na, ito ay ang parehong tawag dalawang beses. 832 01:08:59,760 --> 01:09:03,350 Walang pagkakaiba sa pagitan ng dalawang mga tawag. 833 01:09:07,029 --> 01:09:11,080 >> Ang bawat tao'y mahusay na iyon? Okay. 834 01:09:14,620 --> 01:09:17,950 Mayroon kaming 10 minuto. 835 01:09:17,950 --> 01:09:28,319 >> Susubukan naming makakuha ng sa pamamagitan ng programang ito ng Hacker Typer, 836 01:09:28,319 --> 01:09:32,350 website na ito, na dumating ang nakaraang taon o isang bagay. 837 01:09:34,149 --> 01:09:41,100 Lamang Ito ay dapat na maging tulad mo type random at mga Kopya ang - 838 01:09:41,100 --> 01:09:46,729 Anuman file ang mangyayari sa load ang mukhang tina-type mo. 839 01:09:46,729 --> 01:09:52,069 Mukhang ilang uri ng operating system code. 840 01:09:53,760 --> 01:09:56,890 Iyon ay kung ano ang gusto naming ipatupad. 841 01:10:08,560 --> 01:10:11,690 Dapat kang magkaroon ng isang binary executable na may pangalang hacker_typer 842 01:10:11,690 --> 01:10:14,350 na tumatagal ng isang argumento, ang file sa "uri ng Hacker." 843 01:10:14,350 --> 01:10:16,480 Ang pagpapatakbo ng executable dapat i-clear ang screen 844 01:10:16,480 --> 01:10:20,850 at pagkatapos ay i-print ang isang character mula sa ang pumasa sa-in file sa bawat oras na ang user pagpindot sa isang susi. 845 01:10:20,850 --> 01:10:24,990 Kaya ang anumang key pindutin, dapat itapon at sa halip ay i-print ang isang character mula sa file 846 01:10:24,990 --> 01:10:27,810 na ang argumento. 847 01:10:29,880 --> 01:10:34,350 Makikita ko medyo magkano sabihin sa iyo kung ano ang mga bagay na kami ay pagpunta sa kailangan upang malaman. 848 01:10:34,350 --> 01:10:36,440 Ngunit nais naming upang suriin ang termios library. 849 01:10:36,440 --> 01:10:44,840 Hindi ko ginamit ang library na ito sa aking buong buhay, kaya ito ay napaka kaunting mga layunin ng. 850 01:10:44,840 --> 01:10:48,610 Ngunit ito ay pagpunta sa library na maaari naming gamitin upang itapon ng character mo pindutin ang 851 01:10:48,610 --> 01:10:52,390 kapag nagta-type ka sa pamantayan. 852 01:10:56,970 --> 01:11:05,840 Kaya hacker_typer.c, at kami ay pagpunta sa nais na # include . 853 01:11:05,840 --> 01:11:12,870 Pagtingin sa pahina ng tao para sa termios - I'm paghula ito sa terminal OS o isang bagay - 854 01:11:12,870 --> 01:11:16,240 Hindi ko alam kung paano basahin. 855 01:11:16,240 --> 01:11:21,040 Naghahanap sa, sinasabi nito upang isama ang mga 2 mga file, kaya makikita namin gawin iyon. 856 01:11:37,620 --> 01:11:46,820 >> Muna ang unang bagay, gusto naming gumawa ng sa isang solong argument, na ang file ay dapat namin buksan. 857 01:11:46,820 --> 01:11:52,420 Kaya kung ano ang gusto kong gawin? Paano ko suriin upang makita ako ng isang argumento? 858 01:11:52,420 --> 01:11:56,480 [Mag-aaral] Kung katumbas ng argc ito. >> [Bowden] Oo. 859 01:11:56,480 --> 01:12:21,250 Kaya kung (argc = 2!) Printf ("paggamit:% s [file upang buksan]"). 860 01:12:21,250 --> 01:12:32,750 Kaya ngayon kung nagpatakbo ako ng ito nang hindi pagbibigay ng pangalawang argumento - oh, kailangan ko ang mga bagong linya - 861 01:12:32,750 --> 01:12:36,240 makikita mo ang sinasabi nito sa paggamit:. / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 at pagkatapos ay ang pangalawang argumento ay dapat na ang file na gusto kong buksan. 863 01:12:58,430 --> 01:13:01,260 Ngayon ano ang gagawin ko? 864 01:13:01,260 --> 01:13:08,490 Gusto ko na magbasa mula sa file na ito. Paano ko basahin mula sa isang file? 865 01:13:08,490 --> 01:13:11,920 [Mag-aaral] buksan mo muna ito. >> Oo. 866 01:13:11,920 --> 01:13:15,010 Kaya fopen. Ano ang fopen hitsura? 867 01:13:15,010 --> 01:13:22,980 [Mag-aaral] Filename. >> [Bowden] Filename pagpunta sa argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Mag-aaral] At pagkatapos ay kung ano ang gusto mong gawin dito, kaya ang - >> [Bowden] Oo. 869 01:13:26,110 --> 01:13:28,740 Kaya kung hindi mo matandaan, lamang mo maaaring gawin ng tao fopen, 870 01:13:28,740 --> 01:13:32,960 kung saan ito const magpasinda * path kung saan ang path filename, 871 01:13:32,960 --> 01:13:34,970 const magpasinda * mode. 872 01:13:34,970 --> 01:13:38,660 Kung mangyayari mong hindi matandaan kung ano ang mode ay, pagkatapos ay maaari kang tumingin para sa mode. 873 01:13:38,660 --> 01:13:44,660 Inside ng mga tao pahina, ang slash character ay kung ano ang maaari mong gamitin upang maghanap para sa mga bagay. 874 01:13:44,660 --> 01:13:49,790 Kaya ko type / mode upang maghanap para sa mode. 875 01:13:49,790 --> 01:13:57,130 n at N kung ano ang maaari mong gamitin upang umikot sa pamamagitan ng mga tugma ng paghahanap. 876 01:13:57,130 --> 01:13:59,800 Narito sinasabi nito na ang mga puntos sa mode ng argumento sa isang string 877 01:13:59,800 --> 01:14:01,930 nagsisimula sa isa sa mga sumusunod na pagkakasunud-sunod. 878 01:14:01,930 --> 01:14:06,480 Kaya r, Buksan ang text file para sa pagbabasa. Iyon ay kung ano ang gusto naming gawin. 879 01:14:08,930 --> 01:14:13,210 Para sa pagbabasa, at gusto ko upang mag-imbak na. 880 01:14:13,210 --> 01:14:18,720 Bagay ay pagpunta sa isang FILE *. Ngayon kung ano ang gusto kong gawin? 881 01:14:18,720 --> 01:14:21,200 Bigyan mo ako ng isang segundo. 882 01:14:28,140 --> 01:14:30,430 Okay. Ngayon kung ano ang gusto kong gawin? 883 01:14:30,430 --> 01:14:32,940 [Mag-aaral] Suriin kung ito ang null. >> [Bowden] Oo. 884 01:14:32,940 --> 01:14:38,690 Anumang oras na magbubukas ka ng isang file, tiyakin na ikaw ay matagumpay na magagawang upang buksan ito. 885 01:14:58,930 --> 01:15:10,460 >> Ngayon gusto kong gawin na termios bagay kung saan nais ko munang basahin ang aking mga kasalukuyang setting 886 01:15:10,460 --> 01:15:14,050 at i-save ang mga sa isang bagay, pagkatapos Gusto kong baguhin ang aking mga setting 887 01:15:14,050 --> 01:15:19,420 itapon ang anumang mga karakter na aking i-type, 888 01:15:19,420 --> 01:15:22,520 at pagkatapos ay gusto kong i-update ang mga setting na iyon. 889 01:15:22,520 --> 01:15:27,250 At pagkatapos ay sa dulo ng programa, Gusto kong baguhin ang bumalik sa aking orihinal na mga setting. 890 01:15:27,250 --> 01:15:32,080 Kaya struct ng termios uri, at ako pagpunta sa gusto ng dalawang ng mga. 891 01:15:32,080 --> 01:15:35,600 Ang unang pagpunta sa aking current_settings, 892 01:15:35,600 --> 01:15:42,010 at pagkatapos ay pagpunta sa aking hacker_settings. 893 01:15:42,010 --> 01:15:48,070 Una, ako pagpunta sa gusto upang i-save ang aking kasalukuyang mga setting, 894 01:15:48,070 --> 01:15:53,790 pagkatapos ay ako pagpunta sa gusto upang i-update ang hacker_settings, 895 01:15:53,790 --> 01:16:01,570 at pagkatapos ay sa dulo ng aking mga programa, gusto kong bumalik sa mga kasalukuyang setting. 896 01:16:01,570 --> 01:16:08,660 Kaya sine-save ang mga kasalukuyang setting, ang paraan na gumagana, kami termios tao. 897 01:16:08,660 --> 01:16:15,810 Nakikita namin na mayroon kaming ito int tcsetattr, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Pumasa ako sa isang termios struct sa pamamagitan ng pointer. 899 01:16:22,960 --> 01:16:30,640 Ang paraan na ito ang magiging hitsura - I've na nakalimutan kung ano ang function ay tinatawag na. 900 01:16:30,640 --> 01:16:34,930 Kopyahin at i-paste ito. 901 01:16:39,150 --> 01:16:45,500 Kaya tcgetattr, pagkatapos ay gusto ko upang pumasa sa struct na ako sa pag-save ng impormasyon sa, 902 01:16:45,500 --> 01:16:49,650 na pagpunta sa current_settings, 903 01:16:49,650 --> 01:16:59,120 at ang unang argumento ang file descriptor para sa mga bagay na gusto kong i-save ang mga katangian ng. 904 01:16:59,120 --> 01:17:04,360 Ano ang file descriptor ay tulad ng anumang oras na magbubukas ka ng isang file, nakakakuha ng file descriptor. 905 01:17:04,360 --> 01:17:14,560 Kapag ako ay nag fopen argv [1], ay nakakakuha ng isang file descriptor na kung saan ikaw ay tumutukoy sa 906 01:17:14,560 --> 01:17:16,730 kahit kailan mo gusto upang basahin o magsulat dito. 907 01:17:16,730 --> 01:17:19,220 Na hindi ang file descriptor na gusto kong gamitin dito. 908 01:17:19,220 --> 01:17:21,940 May tatlong file descriptors na mayroon ka sa pamamagitan ng default, 909 01:17:21,940 --> 01:17:24,310 na pamantayan sa, karaniwang out, at karaniwang error. 910 01:17:24,310 --> 01:17:29,960 Sa pamamagitan ng default, tingin ko standard in ay 0, karaniwang out ay 1, at karaniwang error ay 2. 911 01:17:29,960 --> 01:17:33,980 Kaya kung ano ang ko gusto mong baguhin ang mga setting ng? 912 01:17:33,980 --> 01:17:37,370 Gusto kong baguhin ang mga setting tuwing pindutin ko ang isang character, 913 01:17:37,370 --> 01:17:41,590 Gusto ko ito itapon na karakter ang layo sa halip ng pag-print ang mga ito sa screen. 914 01:17:41,590 --> 01:17:45,960 Ano stream - pamantayan sa, karaniwang out, o karaniwang error - 915 01:17:45,960 --> 01:17:52,050 tumugon sa mga bagay kapag ako ay nag-type sa keyboard? >> [Mag-aaral] Standard. >> Oo. 916 01:17:52,050 --> 01:17:56,450 Kaya ko alinman sa gawin 0 o maaari kong gawin stdin. 917 01:17:56,450 --> 01:17:59,380 Ako nakakakuha ang current_settings ng standard. 918 01:17:59,380 --> 01:18:01,720 >> Ngayon gusto ko upang i-update ang mga setting na iyon, 919 01:18:01,720 --> 01:18:07,200 kaya muna ako kokopya sa hacker_settings kung ano ang aking mga current_settings. 920 01:18:07,200 --> 01:18:10,430 At kung paano structs trabaho ito kopyahin lamang. 921 01:18:10,430 --> 01:18:14,510 Ito kinokopya lahat ng mga patlang, tulad ng inaasahan mo. 922 01:18:14,510 --> 01:18:17,410 >> Ngayon gusto ko upang i-update ang ilan sa mga field. 923 01:18:17,410 --> 01:18:21,670 Naghahanap sa termios, gusto mo upang basahin sa pamamagitan ng maraming ito 924 01:18:21,670 --> 01:18:24,110 lamang upang makita kung ano ang gusto mo upang hanapin, 925 01:18:24,110 --> 01:18:28,210 ngunit ang mga flag ka ng pagpunta sa gusto upang tumingin para sa echo, 926 01:18:28,210 --> 01:18:33,110 kaya Echo Echo input character. 927 01:18:33,110 --> 01:18:37,710 Una gusto kong mag-set - I've na nakalimutan kung ano ang mga patlang. 928 01:18:45,040 --> 01:18:47,900 Ito ay kung ano ang struct ang kamukha. 929 01:18:47,900 --> 01:18:51,060 Kaya input mode sa tingin ko gusto naming baguhin. 930 01:18:51,060 --> 01:18:54,210 Titingnan namin ang solusyon upang matiyak na kung ano ang gusto naming baguhin. 931 01:19:04,060 --> 01:19:12,610 Gusto naming upang baguhin ang lflag upang maiwasan ang nangangailangan upang tumingin sa pamamagitan ng lahat ng mga. 932 01:19:12,610 --> 01:19:14,670 Gusto naming baguhin ang mga lokal na mode. 933 01:19:14,670 --> 01:19:17,710 Mayroon kang upang basahin ang buong bagay upang maunawaan kung saan ang lahat ng nabibilang 934 01:19:17,710 --> 01:19:19,320 na gusto naming baguhin. 935 01:19:19,320 --> 01:19:24,120 Subalit sa loob ng mga lokal na mode na kung saan kami ay pagpunta sa gusto mong baguhin na. 936 01:19:27,080 --> 01:19:33,110 Kaya hacker_settings.cc_lmode ano ang tawag dito. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Ito ay kung saan nakukuha namin sa bitwise operator. 939 01:19:52,280 --> 01:19:54,860 Humihingi kami ng uri ng out ng oras, ngunit gagamitin namin pumunta sa pamamagitan ng ito tunay na mabilis. 940 01:19:54,860 --> 01:19:56,600 Ito ay kung saan nakukuha namin sa bitwise operator, 941 01:19:56,600 --> 01:19:59,950 kung saan sa tingin ko sinabi ko isang beses matagal na ang nakalipas na kapag sinimulan mo ang pagharap sa flag, 942 01:19:59,950 --> 01:20:03,370 ka pagpunta sa gamit ang bitwise operator ng maraming. 943 01:20:03,370 --> 01:20:08,240 Bawat bit sa bandila ay tumutugma sa ilang mga uri ng pag-uugali. 944 01:20:08,240 --> 01:20:14,090 Kaya dito, i-flag na ito ay may isang bungkos ng mga iba't ibang mga bagay, kung saan ang lahat ng mga ito ay nangangahulugan ng isang bagay na iba't ibang. 945 01:20:14,090 --> 01:20:18,690 Ngunit kung ano ang gusto kong gawin ay lamang i-off ang bit na tumutugma sa Echo. 946 01:20:18,690 --> 01:20:25,440 Kaya upang i-off ko & = ¬ Echo. 947 01:20:25,440 --> 01:20:30,110 Aktwal na, sa tingin ko ito tulad ng tECHO o isang bagay. Lang ako pagpunta upang suriin muli. 948 01:20:30,110 --> 01:20:34,050 Ko ito termios. Lamang nito echo. 949 01:20:34,050 --> 01:20:38,440 Echo ng isang sandali. 950 01:20:38,440 --> 01:20:44,230 ¬ Echo ay pagpunta sa ibig sabihin ng lahat ng mga bits ay nakatakda sa 1, na nangangahulugan na ang lahat ng mga flag ay nakatakda sa true 951 01:20:44,230 --> 01:20:47,140 maliban para sa Echo bit. 952 01:20:47,140 --> 01:20:53,830 Sa nagtatapos ang aking mga lokal na flag na ito, ito ay nangangahulugan na ang lahat ng mga flag na kasalukuyang nakatakda sa true 953 01:20:53,830 --> 01:20:56,520 pa rin ang nakatakda sa true. 954 01:20:56,520 --> 01:21:03,240 Kung ang aking Echo bandila ay naka-set sa true, pagkatapos ito ay kinakailangan nakatakda sa False sa bandila Echo. 955 01:21:03,240 --> 01:21:07,170 Kaya ang linya ng code off ang echo bandila. 956 01:21:07,170 --> 01:21:16,270 Ang iba pang mga linya ng code, ko lang kopyahin ang mga ito sa interes ng oras at pagkatapos ay ipaliwanag ang mga ito. 957 01:21:27,810 --> 01:21:30,180 Sa solusyon, sinabi niya 0. 958 01:21:30,180 --> 01:21:33,880 Marahil ito ay mas mahusay sa tahasang sabihin ng stdin. 959 01:21:33,880 --> 01:21:42,100 >> Pansinin na din ako ginagawa Echo | ICANON dito. 960 01:21:42,100 --> 01:21:46,650 Ang ICANON ay tumutukoy sa isang bagay na hiwalay na, na kung saan ay nangangahulugan na ang canonical mode. 961 01:21:46,650 --> 01:21:50,280 Anong canonical mode ay nangangahulugan karaniwan kapag tina-type mo ang command line, 962 01:21:50,280 --> 01:21:54,670 Standard sa ay hindi maproseso ang anumang hanggang maabot ang newline. 963 01:21:54,670 --> 01:21:58,230 Kaya kapag mo GetString, nag-type ka ng grupo ng mga bagay, at pagkatapos ay pinindot ninyo ang newline. 964 01:21:58,230 --> 01:22:00,590 Iyon ay kapag ito ay ipinadala sa pamantayan. 965 01:22:00,590 --> 01:22:02,680 Iyon ay ang default. 966 01:22:02,680 --> 01:22:05,830 Kapag ko i-off ang ang canonical mode, ngayon bawat solong character mo pindutin 967 01:22:05,830 --> 01:22:10,910 ay kung ano ay makakakuha naproseso, na kung saan ay karaniwang uri ng masamang dahil ito ay mabagal upang iproseso ang mga bagay na ito, 968 01:22:10,910 --> 01:22:14,330 na kung bakit ito ang magandang buffer ang mga ito sa buong linya. 969 01:22:14,330 --> 01:22:16,810 Ngunit Gusto kong ma-proseso ang karakter bawat 970 01:22:16,810 --> 01:22:18,810 dahil hindi ko gusto ito maghintay para sa akin upang maabot newline 971 01:22:18,810 --> 01:22:21,280 bago maproseso ito sa lahat ang mga character ko na mag-type. 972 01:22:21,280 --> 01:22:24,760 Ito off ang canonical mode. 973 01:22:24,760 --> 01:22:31,320 Ang bagay na ito ay nangangahulugan na kapag ito aktwal na maproseso ang mga character. 974 01:22:31,320 --> 01:22:35,830 Nangangahulugan ito na iproseso ang mga ito agad-agad, sa lalong madaling ako type sa kanila, iproseso ang mga ito. 975 01:22:35,830 --> 01:22:42,510 At ito ay ang function na kung saan ay ina-update ang aking mga setting para sa mga karaniwang sa, 976 01:22:42,510 --> 01:22:45,480 at TCSA paraan na gawin ito ngayon. 977 01:22:45,480 --> 01:22:50,310 Ang iba pang mga pagpipilian ay maghintay hanggang ang lahat na ay kasalukuyang sa stream ay naproseso. 978 01:22:50,310 --> 01:22:52,030 Na hindi talagang mahalaga. 979 01:22:52,030 --> 01:22:56,920 Lamang ngayon baguhin ang aking mga setting sa anumang kasalukuyang nasa hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Hulaan ko tinatawag ko ito hacker_settings, kaya sabihin baguhin ang. 981 01:23:09,610 --> 01:23:13,500 Baguhin ang lahat sa hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Ngayon sa pagtatapos ng aming programa kami ay pagpunta sa nais upang bumalik 983 01:23:16,870 --> 01:23:20,210 sa kung ano ang kasalukuyang loob ng normal_settings, 984 01:23:20,210 --> 01:23:26,560 na lang magmukhang & normal_settings. 985 01:23:26,560 --> 01:23:30,650 Pansinin na hindi ko nagbago ang anumang ng aking mga normal_settings dahil sa orihinal na pagkuha ito. 986 01:23:30,650 --> 01:23:34,520 Pagkatapos upang baguhin lamang ang mga ito pabalik, ipasa ko ang mga ito pabalik sa dulo. 987 01:23:34,520 --> 01:23:38,390 Ito ang update. Okay. 988 01:23:38,390 --> 01:23:43,900 >> Ngayon sa loob ng dito ko lang ipaliwanag ang code sa interes ng panahon. 989 01:23:43,900 --> 01:23:46,350 Ito ay hindi ganoong karaming mga code. 990 01:23:50,770 --> 01:24:03,750 Nakikita namin naming basahin ang isang character mula sa file. Tinatawag namin itong f. 991 01:24:03,750 --> 01:24:07,850 Ngayon ay maaari kang tao fgetc, ngunit kung gaano fgetc ay upang gumana 992 01:24:07,850 --> 01:24:11,910 ay lamang ito upang ibalik ang karakter na iyong basahin o EOF, 993 01:24:11,910 --> 01:24:15,680 na tumutugon sa dulo ng file o ilang mga error mangyari. 994 01:24:15,680 --> 01:24:19,900 Namin ay looping, patuloy na basahin ang isang solong character mula sa file, 995 01:24:19,900 --> 01:24:22,420 hanggang kami maubusan ng mga character upang basahin. 996 01:24:22,420 --> 01:24:26,650 At habang ginagawa namin na, maghintay namin sa isang solong character mula sa pamantayan. 997 01:24:26,650 --> 01:24:29,090 Bawat solong oras na nag-type ka ng isang bagay sa command line, 998 01:24:29,090 --> 01:24:32,820 na pagbabasa sa isang character mula sa pamantayan. 999 01:24:32,820 --> 01:24:38,330 Pagkatapos putchar ay lamang pagpunta upang ilagay ang magpasinda basahin namin dito mula sa file sa standard out. 1000 01:24:38,330 --> 01:24:42,890 Maaari mong tao putchar, ngunit lamang ito ng paglalagay sa standard ang, ang pag-print na karakter. 1001 01:24:42,890 --> 01:24:51,600 Maaari mo ring lamang gawin printf ("% c", c), Parehong ideya. 1002 01:24:53,330 --> 01:24:56,670 Na pagpunta sa gawin ang karamihan ng aming trabaho. 1003 01:24:56,670 --> 01:25:00,300 >> Ang huling bagay na kami ay pagpunta sa nais na gawin lamang fclose ang aming file. 1004 01:25:00,300 --> 01:25:03,310 Kung hindi mo fclose, na ang isang memory mahayag. 1005 01:25:03,310 --> 01:25:06,680 Gusto naming fclose file na binuksan namin ang orihinal na, at sa tingin ko na ito. 1006 01:25:06,680 --> 01:25:13,810 Kung namin na, nakuha ko na problema. 1007 01:25:13,810 --> 01:25:17,260 Natin makita. 1008 01:25:17,260 --> 01:25:19,960 Ano ang ito magreklamo tungkol sa? 1009 01:25:19,960 --> 01:25:30,220 Inaasahan na 'int' ngunit argumento ng uri ng 'struct _IO_FILE *'. 1010 01:25:36,850 --> 01:25:39,370 Susubukan naming makita kung na gumagana. 1011 01:25:45,210 --> 01:25:53,540 Pinapayagan lamang sa C99. Augh. Okay, gumawa ang hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Ngayon makuha namin ang higit pang mga kapaki-pakinabang na mga paglalarawan. 1013 01:25:57,760 --> 01:25:59,900 Kaya gamitin ng hindi nagbigay-alam identifier 'normal_settings'. 1014 01:25:59,900 --> 01:26:04,170 Hindi ako tumawag ito normal_settings. Tinatawag ko ito current_settings. 1015 01:26:04,170 --> 01:26:12,090 Kaya sabihin baguhin ang lahat ng na. 1016 01:26:17,920 --> 01:26:21,710 Ngayon pagpasa ng argumento. 1017 01:26:26,290 --> 01:26:29,500 Ko ito 0 sa ngayon. 1018 01:26:29,500 --> 01:26:36,720 Okay. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Din ako ay hindi i-clear ang screen sa simula. 1020 01:26:39,590 --> 01:26:42,960 Ngunit maaari kang tumingin pabalik sa huling hanay ng problema upang makita kung paano mo i-clear ang screen. 1021 01:26:42,960 --> 01:26:45,160 Lamang ito pag-print ang ilang mga character 1022 01:26:45,160 --> 01:26:47,210 habang ito ay ginagawa kung ano ang gusto kong gawin. 1023 01:26:47,210 --> 01:26:48,900 Okay. 1024 01:26:48,900 --> 01:26:55,280 At iniisip tungkol sa kung bakit ito kinakailangan na ang 0 sa halip ng stdin, 1025 01:26:55,280 --> 01:27:00,560 na dapat # tukuyin 0, 1026 01:27:00,560 --> 01:27:03,890 ito ay nagrereklamo na - 1027 01:27:13,150 --> 01:27:19,360 Bago kapag sinabi ko na may file descriptors ngunit pagkatapos ay mayroon ka ring ang iyong FILE *, 1028 01:27:19,360 --> 01:27:23,210 isang file descriptor ay lamang ng isang integer, 1029 01:27:23,210 --> 01:27:26,970 samantalang ang FILE * ay isang buong grupo ng mga bagay-bagay na kaugnay nito. 1030 01:27:26,970 --> 01:27:30,380 Ang dahilan na kailangan namin upang sabihin ang 0 sa halip ng stdin 1031 01:27:30,380 --> 01:27:37,480 ang stdin na ng FILE * na mga punto sa bagay na tumutukoy sa file descriptor 0. 1032 01:27:37,480 --> 01:27:45,070 Kaya kahit up dito kapag gagawin ko fopen (argv [1], Nakakakuha ako ng FILE * bumalik. 1033 01:27:45,070 --> 01:27:51,180 Ngunit sa isang lugar sa na * FILE ay isang bagay na naaayon sa file descriptor para sa file na iyon. 1034 01:27:51,180 --> 01:27:57,430 Kung tumingin ka sa pahina ng tao para sa open, kaya tingin ko magkakaroon ka upang gawin ang tao 3 bukas - nope - 1035 01:27:57,430 --> 01:27:59,380 tao 2 bukas - oo. 1036 01:27:59,380 --> 01:28:06,250 Kung tumingin ka sa pahina ng para sa bukas, bukas ay tulad ng isang mas mababang antas fopen, 1037 01:28:06,250 --> 01:28:09,350 at bumabalik ang aktwal na file descriptor. 1038 01:28:09,350 --> 01:28:12,050 fopen ang ipinapakita ng grupo ng mga bagay-bagay sa itaas ng bukas, 1039 01:28:12,050 --> 01:28:17,640 kung alin sa halip ng bumabalik lang ang file descriptor nagbalik ng isang buong FILE * pointer 1040 01:28:17,640 --> 01:28:20,590 sa loob ng na aming maliit na file descriptor. 1041 01:28:20,590 --> 01:28:25,020 Kaya karaniwang tumutukoy sa bagay FILE *, 1042 01:28:25,020 --> 01:28:29,120 kung saan 0 ay tumutukoy lamang ang pamantayan file descriptor sa mismong. 1043 01:28:29,120 --> 01:28:32,160 >> Mga tanong? 1044 01:28:32,160 --> 01:28:35,930 [Laughs] Blew pamamagitan na. 1045 01:28:35,930 --> 01:28:39,140 Ayos lang. Tapos na kami. [Laughs] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]