1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [SECTION 5: mas kumportable] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [Ito ay CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Kaya maligayang pagdating pabalik, guys. 5 00:00:11,690 --> 00:00:16,320 Maligayang pagdating sa seksyon 5. 6 00:00:16,320 --> 00:00:20,220 Sa puntong ito, ang pag-nakumpleto pagsusulit 0 at nagki makikita kung paano nagawa mo na, 7 00:00:20,220 --> 00:00:25,770 sana sa tingin mo ba talagang magandang dahil napaka ako ay impressed sa pamamagitan ng ang mga marka sa seksyon na ito. 8 00:00:25,770 --> 00:00:28,050 Para sa aming online na mga manonood, kami ay may ilang mga katanungan 9 00:00:28,050 --> 00:00:33,680 tungkol sa huling dalawang mga problema sa hanay ng problema - o sa pagsusulit, sa halip. 10 00:00:33,680 --> 00:00:39,690 Kaya kami ay pagpunta sa pumunta sa paglipas ng mga talagang mabilis kaya na ang lahat ay nakikita kung ano ang nangyari 11 00:00:39,690 --> 00:00:45,060 at kung paano pumunta sa pamamagitan ng aktwal na solusyon sa halip na lamang tinitingnan ang solusyon mismo. 12 00:00:45,060 --> 00:00:50,330 Kami ay pagpunta sa pumunta sa ibabaw ng huling ilang mga problema talagang mabilis, 32 at 33. 13 00:00:50,330 --> 00:00:53,240 Lang, muli, kaya na ang mga online na mga manonood ay maaaring makita ito. 14 00:00:53,240 --> 00:00:59,080 >> Kapag isinara mo sa iyong problema 32, na kung saan ay sa pahina 13, 15 00:00:59,080 --> 00:01:02,730 13 ng 16, problema 32 ay tungkol sa swaps. 16 00:01:02,730 --> 00:01:05,010 Ito ay lahat ng tungkol sa pagpapalit dalawang integer. 17 00:01:05,010 --> 00:01:08,740 Ang problema na gusto namin nawala sa paglipas ng ilang beses sa panayam. 18 00:01:08,740 --> 00:01:13,590 At in dito, kung ano ang namin ang humihiling sa iyo na gawin ang isang mabilis na trace ng memory. 19 00:01:13,590 --> 00:01:17,000 Upang punan ang mga halaga ng variable habang ang mga ito ay sa stack 20 00:01:17,000 --> 00:01:20,250 ng code napupunta sa pamamagitan ng function na makipagpalitan na ito. 21 00:01:20,250 --> 00:01:24,500 Sa partikular, kung ano ang aming iyong hinahanap sa - I'm pagpunta sa ilagay ang iPad - 22 00:01:24,500 --> 00:01:29,650 partikular, kung ano ang iyong hinahanap namin sa linya na ito bilang 6 karapatan dito. 23 00:01:29,650 --> 00:01:36,740 At ito bilang 6 para lamang pagkamalapit sa nakaraang problema. 24 00:01:36,740 --> 00:01:41,720 Ang gusto naming gawin ay ipakita o label ang estado ng memorya 25 00:01:41,720 --> 00:01:46,090 tulad ng ito ay sa oras kapag execute namin ang line number 6, 26 00:01:46,090 --> 00:01:52,540 na epektibo ng kita mula sa aming makipagpalitan ng function na dito mismo. 27 00:01:52,540 --> 00:01:59,450 Kung mag-scroll pababa namin dito, nakita namin na ang mga address ng lahat sa memory para sa amin. 28 00:01:59,450 --> 00:02:02,540 Ito ay napaka key, magpapadala kami bumalik dito sa sandali lamang. 29 00:02:02,540 --> 00:02:09,240 At pagkatapos ay down na dito sa ibaba, kami ay nagkaroon ng isang maliit na diagram ng memorya na kami ay pagpunta sa sumangguni sa. 30 00:02:09,240 --> 00:02:12,490 Aktwal na tapos ko na ito sa aking iPad. 31 00:02:12,490 --> 00:02:20,720 Kaya ako pagpunta sa pagsalitin pabalik-balik sa pagitan ng iPad at ang code na ito para sa reference. 32 00:02:20,720 --> 00:02:26,540 >> Magsimula tayo. Una, sabihin tumutok sa unang dalawang linya ng pangunahing karapatan dito. 33 00:02:26,540 --> 00:02:30,220 Upang magsimula, kami ay pagpunta sa simulan ang x sa 1 at y sa 2. 34 00:02:30,220 --> 00:02:33,040 Kaya mayroon kaming dalawang integer variable, sila ay parehong pagpunta sa ilagay sa stack. 35 00:02:33,040 --> 00:02:36,050 Kami ay pagpunta sa maglagay ng 1 at 2 sa kanila. 36 00:02:36,050 --> 00:02:43,150 Kaya kung i-flip ko sa aking iPad, sana, sabihin makita - 37 00:02:43,150 --> 00:02:48,660 Apple TV mirror, at doon kami. Okay. 38 00:02:48,660 --> 00:02:51,670 Kaya kung i-flip ko sa aking iPad, 39 00:02:51,670 --> 00:02:56,220 Gusto kong simulan ang x sa 1 at y sa 2. 40 00:02:56,220 --> 00:03:00,580 Ginagawa namin na medyo lamang sa pamamagitan ng pagsusulat ng 1 sa box na may markang x 41 00:03:00,580 --> 00:03:07,730 at ng 2 sa kahon sa minarkahan y. Medyo simple. 42 00:03:07,730 --> 00:03:11,620 Kaya ngayon sabihin bumalik sa laptop, makita kung ano ang susunod na mangyayari. 43 00:03:11,620 --> 00:03:15,810 Kaya ang susunod na linya ay kung saan ang mga bagay makakuha ng nakakalito. 44 00:03:15,810 --> 00:03:28,110 Pumasa namin ang address ng x at ang address ng y bilang ang mga parameter at b sa function na makipagpalitan. 45 00:03:28,110 --> 00:03:32,380 Ang address ng x at ang address ng y ang mga bagay na hindi namin maaaring kalkulahin 46 00:03:32,380 --> 00:03:36,360 nang hindi nagre-refer sa mga bullet POINTS kanan pababa dito. 47 00:03:36,360 --> 00:03:39,750 At sa kabutihang-palad, ang unang dalawang mga punto ng bullet sabihin sa amin nang eksakto kung ano ang mga sagot. 48 00:03:39,750 --> 00:03:44,740 Ang address ng x sa memorya ay 10, at ang address ng y sa memorya ay 14. 49 00:03:44,740 --> 00:03:51,870 Kaya mga ang mga halaga na makapag ang pumasa sa bilang isang at b tuktok hanggang sa aming makipagpalitan ng function na. 50 00:03:51,870 --> 00:04:00,760 Sa muli, lumipat pabalik sa aming diagram, ang maaari kong magsulat ng isang 10 sa isang 51 00:04:00,760 --> 00:04:07,400 at 14 sa b. 52 00:04:07,400 --> 00:04:11,610 Ngayon, ang puntong ito ay kung saan naming magpatuloy na may makipagpalitan. 53 00:04:11,610 --> 00:04:14,520 Kaya flipping pabalik sa laptop muli, 54 00:04:14,520 --> 00:04:21,079 nakikita namin na ang paraan makipagpalitan gumagana ang ako unang dereference at store ang resulta sa tmp. 55 00:04:21,079 --> 00:04:27,650 Kaya ang operator ng dereference sabi, "Uy Tratuhin ang mga nilalaman ng variable ng bilang isang address. 56 00:04:27,650 --> 00:04:33,830 Pumunta sa anumang ay naka-imbak sa address na iyon, at i-load ito. " 57 00:04:33,830 --> 00:04:41,720 Ano ang nag-load ka ng variable ay pagpunta sa naka-imbak sa aming tmp variable. 58 00:04:41,720 --> 00:04:45,150 Flipping pabalik sa iPad. 59 00:04:45,150 --> 00:04:51,690 Kung pumunta namin upang matugunan ang 10, alam namin na ang address 10 ang varible x 60 00:04:51,690 --> 00:04:55,480 dahil kami ay sinabi sa pamamagitan ng aming bullet point na ang address ng x sa memorya ay 10. 61 00:04:55,480 --> 00:05:00,180 Upang maaari naming pumunta doon, kumuha ng ang halaga nito, na 1, tulad ng nakikita namin sa aming iPad, 62 00:05:00,180 --> 00:05:06,300 at i-load na sa tmp. 63 00:05:06,300 --> 00:05:08,250 Muli, ito ay hindi ang panghuling nilalaman. 64 00:05:08,250 --> 00:05:14,350 Kami ay pagpunta sa lakad sa pamamagitan ng at magpapadala kami sa aming huling katayuan ng programa sa dulo. 65 00:05:14,350 --> 00:05:17,210 Ngunit ngayon, mayroon kaming ang halaga 1 na naka-imbak sa tmp. 66 00:05:17,210 --> 00:05:19,210 >> At may isang mabilis na tanong sa paglipas dito. 67 00:05:19,210 --> 00:05:23,980 [Alexander] ang dereference operator - na lamang ang star kanan sa harap ng variable? 68 00:05:23,980 --> 00:05:27,600 >> Oo. Kaya ang dereference operator, bilang namin i-flip pabalik sa aming laptop muli, 69 00:05:27,600 --> 00:05:33,780 ay ang star na ito sa harap mismo. 70 00:05:33,780 --> 00:05:37,460 Sa pakiramdam na iyon, ito ay - Contrast mo ito sa mga operator ng pagpaparami 71 00:05:37,460 --> 00:05:42,400 na nangangailangan ng dalawang bagay, ang dereference operator ay isang unary operator. 72 00:05:42,400 --> 00:05:46,130 Lamang inilapat sa isang halaga na taliwas sa isang binary operator, 73 00:05:46,130 --> 00:05:48,810 kung saan kang mag-aplay sa dalawang iba't ibang mga halaga. 74 00:05:48,810 --> 00:05:52,080 Kaya na kung ano ang mangyayari sa linya. 75 00:05:52,080 --> 00:05:58,390 Namin load ang halaga 1 at naka-imbak ito sa aming pansamantalang integer variable. 76 00:05:58,390 --> 00:06:05,800 Ang susunod na linya, iniimbak namin ang mga nilalaman ng b sa - 77 00:06:05,800 --> 00:06:12,630 o, sa halip, iniimbak namin ang mga nilalaman na b ay tumuturo sa sa lugar na kung saan ay tumuturo sa. 78 00:06:12,630 --> 00:06:17,690 Kung pag-aralan namin ito mula sa karapatan sa kaliwa, kami ay ng pagpunta sa dereference b, 79 00:06:17,690 --> 00:06:23,580 kami ay pagpunta upang matugunan ang 14, kami ay pagpunta upang makakuha ng integer na doon, 80 00:06:23,580 --> 00:06:26,900 at pagkatapos namin pumunta sa address na 10, 81 00:06:26,900 --> 00:06:34,240 at kami ay magtapon ang resulta ng aming dereference ng b sa puwang na iyon. 82 00:06:34,240 --> 00:06:40,080 Flipping pabalik sa aming iPad, kung saan maaari naming gawin ito ng kaunti pa kongkreto, 83 00:06:40,080 --> 00:06:44,070 maaaring makatulong sa kung ako sumulat ng mga numero sa lahat ng mga address dito. 84 00:06:44,070 --> 00:06:53,820 Upang malaman namin na sa y, hindi namin sa address 14, x sa address 10. 85 00:06:53,820 --> 00:07:00,180 Kapag nagsimula kami sa b, namin dereference b, kami ay pagpunta sa grab ang halaga 2. 86 00:07:00,180 --> 00:07:08,320 Kami ay pagpunta sa grab ang halaga na ito dahil na ay ang halaga na nakatira sa address na 14. 87 00:07:08,320 --> 00:07:15,700 At kami ay pagpunta sa ilagay ang mga ito sa variable na nakatira sa address na 10, 88 00:07:15,700 --> 00:07:19,160 na doon, na nakaayon sa aming mga variable na x. 89 00:07:19,160 --> 00:07:21,810 Upang maaari naming gawin ng kaunting Sasapawan nito dito 90 00:07:21,810 --> 00:07:35,380 kung saan nakukuha namin mapupuksa ng aming 1 at sa halip namin magsulat ng isang 2. 91 00:07:35,380 --> 00:07:39,560 Kaya lahat ng mahusay at magandang sa mundo, kahit na namin mapapatungan x ngayon. 92 00:07:39,560 --> 00:07:44,890 Naka-imbak namin ang lumang halaga ng x sa aming tmp variable. 93 00:07:44,890 --> 00:07:50,210 Upang maaari naming kumpletuhin ang makipagpalitan sa susunod na linya. 94 00:07:50,210 --> 00:07:53,030 Flipping pabalik sa aming laptop. 95 00:07:53,030 --> 00:07:58,150 Ngayon ang lahat na labi ay upang gawin ang mga nilalaman ng aming pansamantalang integer variable 96 00:07:58,150 --> 00:08:05,630 at mag-imbak ang mga ito sa variable na nakatira sa address na b ay may hawak. 97 00:08:05,630 --> 00:08:10,230 Kaya kami ay pagpunta sa epektibong dereference b upang makakuha ng access sa variable 98 00:08:10,230 --> 00:08:14,340 na sa address na b pagpipigil sa loob nito, 99 00:08:14,340 --> 00:08:19,190 at kami ay pagpunta sa bagay-bagay na ang halaga na tmp ay may hawak na ito. 100 00:08:19,190 --> 00:08:23,280 Flipping pabalik sa iPad minsan pa. 101 00:08:23,280 --> 00:08:31,290 Maaari ko bang burahin ang halaga dito, 2, 102 00:08:31,290 --> 00:08:41,010 at sa halip naming kopyahin ang 1 pakanan papunta dito. 103 00:08:41,010 --> 00:08:43,059 Pagkatapos ay sa susunod na linya na executes, siyempre - 104 00:08:43,059 --> 00:08:47,150 kung i-flip namin pabalik sa laptop - ay puntong ito 6, 105 00:08:47,150 --> 00:08:52,500 na ang punto kung saan gusto naming ang aming diagram ay ganap na napunan ang. 106 00:08:52,500 --> 00:08:58,940 Kaya flipping sa iPad minsan pa, lamang kaya maaari mong makita ang kumpletong diagram, 107 00:08:58,940 --> 00:09:06,610 maaari mong makita na mayroon kami ng 10 sa isang, isang 14 sa b, 1 sa tmp, 2 sa x, at 1 sa y. 108 00:09:06,610 --> 00:09:11,000 Mayroon bang anumang mga katanungan tungkol sa? 109 00:09:11,000 --> 00:09:14,640 Ba ito gumawa ng higit pang kahulugan, pag-lumakad sa pamamagitan nito? 110 00:09:14,640 --> 00:09:24,850 Gawing mas kahulugan? Sana hindi. Okay. 111 00:09:24,850 --> 00:09:28,230 >> Pointer ay isang nakakalito paksa. 112 00:09:28,230 --> 00:09:33,420 Isa ng guys nakikipagtulungan kami sa may kasabihan: 113 00:09:33,420 --> 00:09:36,590 "Upang maunawaan ng mga payo, dapat mo munang maunawaan payo." 114 00:09:36,590 --> 00:09:40,530 Na sa palagay ko ay lubos na totoo. Ang magtagal upang magamit ito. 115 00:09:40,530 --> 00:09:45,360 Pagguhit maraming ng mga larawan, magkaroon ng maraming ng mga diagram ng memory tulad ng isang ito ay kapaki-pakinabang, 116 00:09:45,360 --> 00:09:49,480 at pagkatapos maglakad sa iyo sa pamamagitan ng halimbawa pagkatapos ng halimbawa pagkatapos Halimbawa, 117 00:09:49,480 --> 00:09:54,450 magsimulang gumawa ng kaunti pa sa kahulugan at ng kaunti pa sa kahulugan at ng kaunti pa sa pakiramdam. 118 00:09:54,450 --> 00:10:01,560 Sa wakas, isang araw, makikita mo ito ang lahat ng ganap na pinagkadalubhasaan. 119 00:10:01,560 --> 00:10:13,800 Anumang mga katanungan bago ilipat namin sa sa susunod na problema? Ayos lang. 120 00:10:13,800 --> 00:10:18,840 Kaya i-flip pabalik sa laptop. 121 00:10:18,840 --> 00:10:23,300 Ang susunod na problema na mayroon kami bilang 33 ng problema sa file ako / O. 122 00:10:23,300 --> 00:10:26,350 Mag-zoom in sa ito ng kaunti. 123 00:10:26,350 --> 00:10:28,710 Problema 33 - Oo? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] ko lang ay isang mabilis na tanong. Bituin na ito, o ang asterisk, 125 00:10:32,110 --> 00:10:35,590 ito ay tinatawag na dereferencing kapag gumamit ka ng isang asterisk sa bago. 126 00:10:35,590 --> 00:10:38,820 Ano ang tinatawag kapag ginamit mo ang ampersand bago? 127 00:10:38,820 --> 00:10:43,140 >> Ampersand Ang bago ay ang address ng operator. 128 00:10:43,140 --> 00:10:45,880 Kaya sabihin mag-scroll back up. 129 00:10:45,880 --> 00:10:49,310 Oops. Ako sa zoom mode kaya hindi ko talagang mag-scroll. 130 00:10:49,310 --> 00:10:52,780 Kung titingnan namin sa ang code na ito talagang mabilis dito mismo, 131 00:10:52,780 --> 00:10:54,980 muli, ang parehong bagay mangyari. 132 00:10:54,980 --> 00:10:59,180 Kung titingnan namin sa ang code na ito dito mismo, sa linyang ito kung saan namin ang tawag sa swap, 133 00:10:59,180 --> 00:11:10,460 ampersand ang sinasabi "makuha ang address kung saan variable x buhay." 134 00:11:10,460 --> 00:11:14,460 Kapag ang iyong tagatala compiles ang iyong code, 135 00:11:14,460 --> 00:11:20,590 ito ay aktwal na pisikal na markahan ang isang lugar sa memory para sa lahat ng iyong mga variable upang mabuhay. 136 00:11:20,590 --> 00:11:24,910 At kaya kung ano ang tagatala maaaring gawin sa sandaling ito ay pinagsama-sama ang lahat, 137 00:11:24,910 --> 00:11:31,110 ito alam, "Oh, ko bang ilagay ang x sa address 10 ko bang ilagay ang y sa address 14." 138 00:11:31,110 --> 00:11:34,640 Maaari itong pagkatapos ay punan ang mga halaga na ito para sa iyo. 139 00:11:34,640 --> 00:11:44,740 Sa gayon ay maaari mong - ito ay maaaring ipasa ito sa at pass & y sa pati na rin. 140 00:11:44,740 --> 00:11:50,730 Mga guys makakuha ng address, ngunit din sila, kapag pinapasa mo ang mga ito sa function na makipagpalitan ng, 141 00:11:50,730 --> 00:11:55,690 ganitong uri ng impormasyon, ito int * dito mismo, ay nagsasabi tagatala, 142 00:11:55,690 --> 00:12:01,350 "Okay, kami ay pagpunta sa pagbibigay-kahulugan sa address na ito bilang isang address ng isang integer variable." 143 00:12:01,350 --> 00:12:05,900 Bilang isang address ng isang int, na naiiba mula sa address ng isang variable ng character 144 00:12:05,900 --> 00:12:09,930 dahil int tumatagal hanggang, sa isang 32-bit na machine, tumatagal ng hanggang 4 bytes ng espasyo, 145 00:12:09,930 --> 00:12:13,310 kung saan ang character na tumatagal lamang ng 1 byte ng puwang. 146 00:12:13,310 --> 00:12:17,310 Kaya Mahalagang malaman din kung ano ang - kung ano ang nakatira, kung anong uri ng halaga 147 00:12:17,310 --> 00:12:20,340 nakatira sa address na Nakakuha ang pumasa. 148 00:12:20,340 --> 00:12:22,020 O ang address na iyong pagharap sa. 149 00:12:22,020 --> 00:12:29,020 Sa ganoong paraan, alam mo kung gaano karaming mga byte ng impormasyon sa aktwal na-load ng iyong RAM. 150 00:12:29,020 --> 00:12:31,780 At pagkatapos, oo, ito dereference operator, tulad mo ay humihiling sa, 151 00:12:31,780 --> 00:12:37,200 pupunta at access ng impormasyon sa isang partikular na address. 152 00:12:37,200 --> 00:12:42,820 Kaya sinasabi nito, na ito sa isang variable dito, ituring ang mga nilalaman ng isang bilang isang address, 153 00:12:42,820 --> 00:12:47,880 pumunta sa address na iyon, at hilahin out, load sa processor, ng pagkarga sa isang rehistro 154 00:12:47,880 --> 00:12:56,340 ang aktwal na halaga o ang mga nilalaman na nakatira sa address na iyon. 155 00:12:56,340 --> 00:12:59,620 Anumang higit pang mga tanong? Ito ang mga mahusay na mga katanungan. 156 00:12:59,620 --> 00:13:01,650 Ng maraming ng mga bagong terminolohiya. 157 00:13:01,650 --> 00:13:09,800 Ring uri ng funky, nakikita at at * sa iba't-ibang mga lugar. 158 00:13:09,800 --> 00:13:13,180 >> Ayos lang. 159 00:13:13,180 --> 00:13:18,530 Kaya sa problema 33, maghain ako / O. 160 00:13:18,530 --> 00:13:22,540 Ito ay isa sa mga problema na sa tingin ko ang ilang mga bagay ang nangyari. 161 00:13:22,540 --> 00:13:25,400 Isa, ito ay isang medyo bagong paksa. 162 00:13:25,400 --> 00:13:30,590 Ito ay ipinakita medyo madaling bago ang pagsusulit, 163 00:13:30,590 --> 00:13:33,400 at pagkatapos ay sa tingin ko ito ay uri ng tulad ng isa sa mga problema ng salita sa matematika 164 00:13:33,400 --> 00:13:39,720 kung saan sila magbibigay sa iyo ng maraming impormasyon, ngunit ang iyong aktwal na ay hindi kinakailangang gumamit ng isang tonelada ng. 165 00:13:39,720 --> 00:13:44,060 Ang unang bahagi ng problema na ito ay naglalarawan kung ano ang isang file na CSV. 166 00:13:44,060 --> 00:13:50,620 Ngayon, ang isang CSV file, ayon sa paglalarawan, ay isang comma-separated file halaga. 167 00:13:50,620 --> 00:13:55,300 Ang dahilan kung bakit ito ay sa lahat ng kawili-wili, at ang dahilan mo man gamitin ang mga ito, 168 00:13:55,300 --> 00:14:00,800 , dahil, kung gaano karami ng iyong kailanman ginamit bagay tulad ng Excel? 169 00:14:00,800 --> 00:14:03,240 Figure pinaka-mo na, marahil, o gamitin sa ilang mga punto sa iyong buhay. 170 00:14:03,240 --> 00:14:06,430 Mong gamitin ang isang bagay tulad ng Excel. 171 00:14:06,430 --> 00:14:10,940 Upang makuha ang data ng isang Excel spreadsheet o gawin ang anumang uri ng pagpoproseso sa mga ito, 172 00:14:10,940 --> 00:14:17,240 kung nais mong magsulat ng isang C programa o Python programa, Java programa, 173 00:14:17,240 --> 00:14:20,070 upang harapin ang data na naka-imbak sa doon, 174 00:14:20,070 --> 00:14:23,170 isa sa mga pinaka-karaniwang paraan upang makakuha ng ito sa isang CSV file. 175 00:14:23,170 --> 00:14:26,850 At maaari mong buksan ang Excel at kapag ikaw ay pumunta sa 'I-save Bilang' dialogue, 176 00:14:26,850 --> 00:14:32,840 maaari kang makakuha ng isang aktwal na CSV file. 177 00:14:32,840 --> 00:14:35,890 >> Madaling gamiting malaman kung paano haharapin ang mga bagay na ito. 178 00:14:35,890 --> 00:14:42,010 Ang paraan ito gumagana ay na pareho ito sa - Ibig kong sabihin, mahalagang ito ay paggaya sa isang spreadsheet, 179 00:14:42,010 --> 00:14:47,590 kung saan, bilang makita namin dito, sa napaka-kaliwa-pinaka-piraso, 180 00:14:47,590 --> 00:14:49,910 Mayroon namin ang lahat ng mga huling pangalan. 181 00:14:49,910 --> 00:14:54,670 Kaya mayroon kaming Malan, pagkatapos Hardison, at pagkatapos Bowden, MacWilliam, at pagkatapos Chan. 182 00:14:54,670 --> 00:14:59,470 Ang lahat ng mga huling pangalan. At pagkatapos kuwit na naghihiwalay sa huling pangalan mula sa unang pangalan. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, at Zamyla. 184 00:15:02,970 --> 00:15:06,850 Ko laging ihalo up ng Robby at Pedro. 185 00:15:06,850 --> 00:15:10,940 At pagkatapos, sa wakas, ang ikatlong haligi ay ang email address. 186 00:15:10,940 --> 00:15:18,500 Sandaling nauunawaan mo na, ang natitirang bahagi ng programa ay medyo direkta ipatupad. 187 00:15:18,500 --> 00:15:23,850 Ano ang ginawa namin upang gayahin ang parehong istraktura sa aming programa sa C 188 00:15:23,850 --> 00:15:27,510 ay ginamit namin ang istraktura ng. 189 00:15:27,510 --> 00:15:30,520 Sisimulan naming ipinapalabas na may mga isang maliit na higit pa pati na rin. 190 00:15:30,520 --> 00:15:35,790 Nakita namin ang mga ito para sa unang kaunti sa problema sa set 3, kapag kami ay pagharap sa ang diksyunaryo. 191 00:15:35,790 --> 00:15:40,290 Ngunit ito kawani struct nag-iimbak ng apelyido, unang pangalan, at ng isang email. 192 00:15:40,290 --> 00:15:44,500 Lamang tulad ng ating CSV file ay ang pag-iimbak. 193 00:15:44,500 --> 00:15:47,950 Kaya ito ay nagko-convert mula sa isang format sa ibang. 194 00:15:47,950 --> 00:15:54,630 Mayroon kaming i-convert, sa kasong ito, ang isang kawani struct sa isang linya, 195 00:15:54,630 --> 00:15:59,060 comma-separated line, tulad na. 196 00:15:59,060 --> 00:16:01,500 Ba na magkaroon ng kahulugan? Mong guys lahat kinuha ang pagsusulit, 197 00:16:01,500 --> 00:16:07,680 kaya isipin ko mo na ang hindi bababa sa may ilang oras upang isipin ang tungkol sa. 198 00:16:07,680 --> 00:16:16,410 >> Sa pag-andar ng hire, ang problema ay humihiling sa amin upang kumuha sa - we'll mag-zoom in sa ito ng kaunti - 199 00:16:16,410 --> 00:16:22,480 sa istraktura ng isang kawani, kawani struct, may pangalan s, 200 00:16:22,480 --> 00:16:30,900 at ikabit ang mga nilalaman nito sa aming staff.csv file. 201 00:16:30,900 --> 00:16:34,230 Ito lumiliko out na ito ay medyo direkta upang gamitin. 202 00:16:34,230 --> 00:16:37,430 Padadalhan ka namin ng uri ng i-play sa paligid na may mga function ng kaunti higit pa ngayon. 203 00:16:37,430 --> 00:16:44,510 Ngunit sa kasong ito, ang fprintf function na ay talagang ang susi. 204 00:16:44,510 --> 00:16:51,960 Kaya may fprintf, maaari naming i-print, tulad mo guys ay gamit printf ito buong termino. 205 00:16:51,960 --> 00:16:55,050 Maaari mong printf isang linya sa isang file. 206 00:16:55,050 --> 00:16:59,030 Kaya sa halip na lamang sa paggawa ng dati printf tawag kung saan mo bigyan ito ang format string 207 00:16:59,030 --> 00:17:05,380 at pagkatapos mo palitan ang lahat ng mga variable na may mga sumusunod na mga argumento, 208 00:17:05,380 --> 00:17:11,290 may fprintf, ang iyong unang argumento sa halip ang file na nais mong sumulat sa. 209 00:17:11,290 --> 00:17:21,170 Kung kami ay upang tumingin sa ito sa appliance, halimbawa, tao fprintf, 210 00:17:21,170 --> 00:17:25,980 maaari naming makita ang mga pagkakaiba sa pagitan ng printf at fprintf. 211 00:17:25,980 --> 00:17:28,960 Kukunin ko na mag-zoom in dito nang kaunti. 212 00:17:28,960 --> 00:17:33,140 Kaya may printf, hindi namin bigyan ito ng isang string ng format, at pagkatapos ay ang kasunod na argumento 213 00:17:33,140 --> 00:17:37,580 ay ang lahat ng mga variable para sa kapalit o pagpapalit sa aming format string. 214 00:17:37,580 --> 00:17:47,310 Sapagkat may fprintf, ang unang argumento ay talagang * ang file na ito na tinatawag na stream ng. 215 00:17:47,310 --> 00:17:51,800 >> Paglipat pabalik sa paglipas dito sa aming hire, 216 00:17:51,800 --> 00:17:54,550 na Mayroon namin ang aming file stream * binuksan para sa atin. 217 00:17:54,550 --> 00:17:57,810 Na kung ano ang unang linya na ito, ito ay bumubukas ang staff.csv file, 218 00:17:57,810 --> 00:18:01,690 bubukas ito sa Magkabit mode, at ang lahat na natitira para sa amin upang gawin ay 219 00:18:01,690 --> 00:18:08,640 isulat ang kawani istraktura sa file. 220 00:18:08,640 --> 00:18:10,870 At, sabihin makita, nais kong gamitin ang iPad? 221 00:18:10,870 --> 00:18:17,900 Makikita ko bang gamitin ang iPad. Mayroon kaming walang bisa - ipaalam sa ay ilagay ito sa talahanayan sa gayon ay maaari kong isulat ng kaunti mas mahusay na - 222 00:18:17,900 --> 00:18:33,680 void hire at tumatagal ito sa isang argument, isang kawani ng istraktura na tinatawag na mga. 223 00:18:33,680 --> 00:18:44,120 May aming mga tirante, Mayroon namin ang aming * ng file na tinatawag na file, 224 00:18:44,120 --> 00:18:48,380 namin ang aming fopen line na ibinigay sa atin, 225 00:18:48,380 --> 00:18:51,890 at kukunin ko na magsulat lamang ito bilang tuldok dahil nasa pedia sa. 226 00:18:51,890 --> 00:19:00,530 At pagkatapos ay sa aming susunod na linya, kami ay pagpunta sa tumawag sa fprintf 227 00:19:00,530 --> 00:19:03,700 at kami ay pagpunta sa pumasa sa file na gusto naming i-print, 228 00:19:03,700 --> 00:19:10,290 at pagkatapos ay ang aming format string, na - 229 00:19:10,290 --> 00:19:14,300 Ipapaalam ko ka guys sabihin sa akin kung ano ang mukhang. 230 00:19:14,300 --> 00:19:20,500 Paano tungkol sa iyo, Stella? Alam mo ba kung ano ang unang bahagi ng string ng format kamukha? 231 00:19:20,500 --> 00:19:24,270 [Stella] Hindi ako sigurado. >> Huwag mag-atubiling magtanong Jimmy. 232 00:19:24,270 --> 00:19:27,690 Alam mo ba, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Gusto ito ay hindi huling? Hindi ko alam. Hindi ako ganap na sigurado. 234 00:19:31,000 --> 00:19:39,020 >> Okay. Paano tungkol sa, ay sinuman makuha ang tamang sa pagsusulit? 235 00:19:39,020 --> 00:19:41,770 Hindi. Lahat ng karapatan. 236 00:19:41,770 --> 00:19:47,920 Ito lumiliko out na dito ang lahat ng mayroon kaming gawin ay gusto namin ang bawat bahagi ng aming kawani istraktura 237 00:19:47,920 --> 00:19:53,290 na ipi-print bilang isang string sa aming file. 238 00:19:53,290 --> 00:19:59,900 Lang namin gamitin ang pagpapalit ng karakter ng string tatlong iba't ibang oras dahil mayroon kaming isang apelyido 239 00:19:59,900 --> 00:20:07,160 sinusundan ng kuwit, pagkatapos ng unang pangalan sinusundan ng isang kuwit, 240 00:20:07,160 --> 00:20:12,430 at pagkatapos ay sa wakas ang email address kung saan sinundan - na hindi 241 00:20:12,430 --> 00:20:15,140 umaangkop sa aking screen - ngunit ito ay sinundan sa pamamagitan ng isang newline character. 242 00:20:15,140 --> 00:20:20,060 Kaya ako pagpunta sa magsulat lamang ito pababa doon. 243 00:20:20,060 --> 00:20:23,560 At pagkatapos ay pagsunod sa aming mga string ng format, 244 00:20:23,560 --> 00:20:27,880 lang namin ang mga pamalit, na namin ng access na gamit ang tuldok pagtatanda 245 00:20:27,880 --> 00:20:31,370 na nakita natin sa problema sa set 3. 246 00:20:31,370 --> 00:20:48,820 Maaari naming gamitin ang s.last, s.first, at s.email 247 00:20:48,820 --> 00:20:58,990 ihalili sa mga tatlong mga halaga sa aming format string. 248 00:20:58,990 --> 00:21:06,190 Kaya kung paano ay na pumunta? Kabuluhan? 249 00:21:06,190 --> 00:21:09,700 Oo? Hindi? Posibleng? Okay. 250 00:21:09,700 --> 00:21:14,180 >> Ang huling bagay na ginagawa namin matapos naming naka-print at matapos naming binuksan ang aming file: 251 00:21:14,180 --> 00:21:17,370 tuwing namin na binuksan ng isang file, lagi naming tandaan na isara ang mga ito. 252 00:21:17,370 --> 00:21:19,430 Dahil kung hindi namin makikita tagas ang memorya, 253 00:21:19,430 --> 00:21:22,500 gamit descriptors file. 254 00:21:22,500 --> 00:21:25,950 Kaya upang isara ito, kung aling mga function na namin ang? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, eksakto. 256 00:21:30,120 --> 00:21:37,520 Kaya't ang huling bahagi ng problema na ito ay upang maayos na isara ang file, gamit ang fclose function na, 257 00:21:37,520 --> 00:21:40,370 na lang kamukha na. 258 00:21:40,370 --> 00:21:43,880 Hindi masyadong mabaliw. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Kaya na problema 33 sa pagsusulit. 261 00:21:49,520 --> 00:21:52,480 Namin talagang higit pang mga file I / O paparating na. 262 00:21:52,480 --> 00:21:55,130 Gagawin namin ng kaunti higit pa sa panayam ngayon, o sa seksyon ngayon, 263 00:21:55,130 --> 00:22:01,710 dahil na kung ano ang nangyayari upang mabuo ang bulk ng mga ito paparating na pset. 264 00:22:01,710 --> 00:22:05,020 Natin lumipat sa mula sa pagsusulit sa puntong ito. Oo? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Bakit fclose (file) sa halip ng fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ah. Dahil ito ay lumiliko na - kaya ang tanong, na kung saan ay isang mahusay na, 267 00:22:19,100 --> 00:22:27,800 ay kung bakit, kapag isulat namin fclose, kami pagsusulat ng fclose (file) star variable 268 00:22:27,800 --> 00:22:33,680 na iba sa pangalan ng file, staff.csv? Iyan ba ang tama? Oo. 269 00:22:33,680 --> 00:22:39,570 Kaya sabihin tingnan. Kung lumipat ako pabalik sa aking laptop, 270 00:22:39,570 --> 00:22:45,040 at tingnan natin sa fclose function na. 271 00:22:45,040 --> 00:22:51,460 Kaya ang fclose function na isinasara stream at tumatagal ito sa ang pointer sa stream na gusto naming upang isara, 272 00:22:51,460 --> 00:22:57,010 bilang laban sa ang aktwal na pangalan ng file na gusto naming upang isara. 273 00:22:57,010 --> 00:23:01,620 At ito ay dahil sa likod ng mga eksena, kapag gumawa ka ng isang tawag sa fopen, 274 00:23:01,620 --> 00:23:12,020 kapag binuksan mo ang isang file, aktwal ka paglaan ng memorya upang mag-imbak ng impormasyon tungkol sa mga file. 275 00:23:12,020 --> 00:23:16,380 Kaya mayroon kang file na pointer na may impormasyon tungkol sa mga file, 276 00:23:16,380 --> 00:23:23,080 tulad ng ito ay bukas, ang laki, kung saan ikaw ay kasalukuyang sa file, 277 00:23:23,080 --> 00:23:29,100 sa gayon ay maaari kang magsagawa ng pagbabasa at pagsusulat ng mga tawag sa partikular na lugar sa loob ng file. 278 00:23:29,100 --> 00:23:38,060 Magtapos mong isara ang pointer sa halip na isara ang pangalan ng file. 279 00:23:38,060 --> 00:23:48,990 >> Oo? [Daniel] Kaya upang magamit hire, nais mong sabihin - paano ito makuha ang input ng user? 280 00:23:48,990 --> 00:23:53,830 Ba fprintf kumilos tulad ng GetString sa ang kahulugan na lamang maghintay para sa input ng user 281 00:23:53,830 --> 00:23:57,180 at hilingin sa mong i-type ito - o maghintay para sa iyo upang i-type ang tatlong bagay sa? 282 00:23:57,180 --> 00:24:00,480 O kailangan mong gamitin ang isang bagay na ipapatupad ang hire? 283 00:24:00,480 --> 00:24:04,100 >> Oo. Kaya hindi namin - tanong ay, kung paano namin makuha ang input ng user 284 00:24:04,100 --> 00:24:09,220 upang ipatupad ang hire? At kung ano ang mayroon kami dito ang tumatawag ng hire, 285 00:24:09,220 --> 00:24:17,690 ang pumasa sa struct ito kawani sa lahat ng mga data na naka-imbak sa struct na. 286 00:24:17,690 --> 00:24:22,990 Kaya fprintf ay magsulat lamang ang data na iyon nang direkta sa file. 287 00:24:22,990 --> 00:24:25,690 Walang naghihintay para sa input ng user. 288 00:24:25,690 --> 00:24:32,110 Gumagamit na ibinigay ang input sa pamamagitan ng paglalagay ng maayos ito sa struct kawani na ito. 289 00:24:32,110 --> 00:24:36,510 At bagay, siyempre, masira kung anumang ng mga payo ay null, 290 00:24:36,510 --> 00:24:40,370 kaya mag-scroll namin back up dito at tinitingnan namin ang aming struct. 291 00:24:40,370 --> 00:24:43,640 Mayroon kaming string huling, unang string, string email. 292 00:24:43,640 --> 00:24:48,530 Alam namin ngayon na ang lahat ng mga talagang, sa ilalim ng hood, magpasinda * variable. 293 00:24:48,530 --> 00:24:53,470 Na maaaring o hindi maaaring tumuturo sa null. 294 00:24:53,470 --> 00:24:55,800 Maaari silang nagtuturo sa memory sa magbunton, 295 00:24:55,800 --> 00:24:59,650 siguro memory sa stack. 296 00:24:59,650 --> 00:25:04,580 Hindi namin talaga alam, ngunit kung mayroon man sa mga payo null, o di-wasto, 297 00:25:04,580 --> 00:25:08,120 na na kailangan talagang pag-crash ng aming hire function na. 298 00:25:08,120 --> 00:25:11,050 Na isang bagay na uri ng higit sa saklaw ng pagsusulit. 299 00:25:11,050 --> 00:25:16,440 Hindi kami nag-aalala tungkol na. 300 00:25:16,440 --> 00:25:22,170 Mahusay. Okay. Kaya gumagalaw sa mula sa pagsusulit. 301 00:25:22,170 --> 00:25:25,760 >> Natin isara ang tao na ito, at kami ay pagpunta sa tumingin sa pset 4. 302 00:25:25,760 --> 00:25:34,700 Kaya kung guys tumingin sa spec pset, sa sandaling maaari mong i-access ito, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 kami ay pagpunta sa pumunta sa pamamagitan ng ilang ng mga problema sa ngayon ng seksyon. 304 00:25:42,730 --> 00:25:52,240 Ako scroll pababa - seksyon ng tanong nagsisimula sa ikatlong pahina ng spec pset. 305 00:25:52,240 --> 00:25:57,800 At ang unang bahagi ay humihiling sa iyo na pumunta at panoorin ang maikling sa pag-redirect at pipe. 306 00:25:57,800 --> 00:26:02,820 Aling mga uri ng isang cool na maikling, ay nagpapakita sa iyo ng ilang mga bagong, cool na utos trick linya na maaari mong gamitin. 307 00:26:02,820 --> 00:26:06,050 At pagkatapos Mayroon kami ng ilang mga katanungan para sa iyo pati na rin. 308 00:26:06,050 --> 00:26:10,860 Ang unang tanong tungkol sa mga stream, na printf nagsusulat sa pamamagitan ng default, 309 00:26:10,860 --> 00:26:15,920 namin uri ng hinawakan sa lamang ng kaunti ng ilang sandali ang nakalipas. 310 00:26:15,920 --> 00:26:22,380 Ito fprintf na lang namin ay tinatalakay tumatagal sa isang stream ng file * bilang nito argument. 311 00:26:22,380 --> 00:26:26,580 fclose tumatagal sa isang stream ng file * pati na rin, 312 00:26:26,580 --> 00:26:32,660 at ang return halaga ng fopen ay nagbibigay sa iyo ng isang stream ng file * pati na rin. 313 00:26:32,660 --> 00:26:36,060 Ang dahilan kung bakit hindi namin nakita mga bago kapag kami Aaksyunan printf 314 00:26:36,060 --> 00:26:39,450 ay dahil printf ay may default stream. 315 00:26:39,450 --> 00:26:41,810 At ang default na stream na ito nagsusulat 316 00:26:41,810 --> 00:26:45,190 makikita mo ang tungkol sa maikling. 317 00:26:45,190 --> 00:26:50,080 Kaya talagang tumagal ng isang pagtingin sa. 318 00:26:50,080 --> 00:26:53,010 >> Sa seksyon ngayon, kami ay makipag-usap ng kaunti tungkol sa GDB, 319 00:26:53,010 --> 00:26:57,720 dahil mas pamilyar ka sa ito, ang mas maraming mga kasanayan kang makakuha sa ito, 320 00:26:57,720 --> 00:27:01,390 mas mahusay na magagawang makikita mo sa aktwal na manghuli down na mga bug sa iyong sariling code. 321 00:27:01,390 --> 00:27:05,540 Ito mga bilis ang proseso ng pag-debug tremendously. 322 00:27:05,540 --> 00:27:09,230 Kaya sa pamamagitan ng paggamit ng printf, sa tuwing gagawin mo na mayroon kang mag-recompile ang iyong code, 323 00:27:09,230 --> 00:27:13,000 mayroon kang upang patakbuhin itong muli, minsan mayroon kang ilipat ang printf tawag sa paligid, 324 00:27:13,000 --> 00:27:17,100 magkomento ang code, ito lamang tumatagal ng isang habang. 325 00:27:17,100 --> 00:27:20,850 Ang aming layunin ay upang subukan at kumbinsihin sa iyo na may GDB, maaari mong mahalagang 326 00:27:20,850 --> 00:27:26,810 printf anumang bagay sa anumang punto sa iyong code at hindi mo kailangang mag-recompile ito. 327 00:27:26,810 --> 00:27:35,120 Hindi mo upang simulan at panatilihin ang paghula kung saan printf susunod. 328 00:27:35,120 --> 00:27:40,910 Ang unang bagay na gawin ay upang kopyahin ang linya na ito at makakuha ng seksyon ng code ng web. 329 00:27:40,910 --> 00:27:47,530 Ako kopyahin ito linya ng code na nagsasabing, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Ako pagpunta sa kopyahin ito. 331 00:27:49,510 --> 00:27:55,950 Ako pagpunta upang pumunta sa aking appliance, mag-zoom out sa gayon maaari mong makita kung ano ang ako ginagawa, 332 00:27:55,950 --> 00:28:01,890 paste ito sa doon, at kapag ako ay pindutin ang Enter, ito wget command na literal ay isang web makakuha. 333 00:28:01,890 --> 00:28:06,210 Ito ay pagpunta sa pull down ang file na ito ng Internet, 334 00:28:06,210 --> 00:28:11,790 at ito upang i-save ang mga ito sa kasalukuyang direktoryo. 335 00:28:11,790 --> 00:28:21,630 Ngayon kung ilista ko ang aking kasalukuyang direktoryo maaari mong makita na Mayroon akong ito section5.zip file mismo sa doon. 336 00:28:21,630 --> 00:28:25,260 Ang paraan upang makitungo sa tao na unzip ito, 337 00:28:25,260 --> 00:28:27,650 na maaari mong gawin sa command line, tulad ng ito. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Na makikita unzip ito, lumikha ng mga folder para sa akin, 340 00:28:36,980 --> 00:28:40,410 awdit ng lahat ng nilalaman, ilagay ang mga ito sa doon. 341 00:28:40,410 --> 00:28:47,410 Kaya ngayon maaari kong pumunta sa aking direktoryo seksyon 5 gamit ang command na cd. 342 00:28:47,410 --> 00:28:58,310 I-clear ang screen gamit ang malinaw. Kaya i-clear ang screen. 343 00:28:58,310 --> 00:29:02,280 Ngayon Mayroon akong isang magaling na malinis terminal humarap sa. 344 00:29:02,280 --> 00:29:06,200 >> Ngayon kung ilista ko ang lahat ng mga file na nakikita ko sa direktoryong ito, 345 00:29:06,200 --> 00:29:12,270 makikita mo na Mayroon akong apat na file: buggy1, buggy2, buggy3, at buggy4. 346 00:29:12,270 --> 00:29:16,180 Din Mayroon akong kanilang naaayon. File ng c. 347 00:29:16,180 --> 00:29:20,400 Hindi namin ay pagpunta upang tumingin sa file c sa ngayon. 348 00:29:20,400 --> 00:29:24,140 Sa halip, kami ay upang gamitin ang mga ito kapag binuksan namin hanggang GDB. 349 00:29:24,140 --> 00:29:28,220 Namin ang iningatan ito kaya na kami ay may access sa aktwal na source code kapag ginagamit namin GDB, 350 00:29:28,220 --> 00:29:32,740 ngunit ang mga layunin ng bahaging ito ng seksyon ay sa latero sa paligid may GDB 351 00:29:32,740 --> 00:29:40,370 at makita kung paano namin maaaring gamitin ito upang malaman kung ano ang nangyayari mali sa bawat isa sa mga apat na mga programa sa maraming surot. 352 00:29:40,370 --> 00:29:43,380 Kaya lang namin ang pagpunta sa buong kuwarto ay talagang mabilis, 353 00:29:43,380 --> 00:29:47,000 at ako upang humingi ng isang tao upang patakbuhin ang isa sa mga maraming surot programa, 354 00:29:47,000 --> 00:29:54,730 at pagkatapos ay gagamitin namin bilang isang grupo sa pamamagitan ng GDB, at kami na makita kung ano ang maaari naming gawin upang ayusin ang mga programang ito, 355 00:29:54,730 --> 00:29:58,460 o sa hindi bababa sa kilalanin kung ano ang nangyayari mali sa bawat isa sa kanila. 356 00:29:58,460 --> 00:30:04,760 Natin magsimula muli dito na may Daniel. Kang magpatakbo buggy1? Natin makita kung ano ang mangyayari. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Sinasabi nito ang isang application kasalanan. >> Oo. Eksakto. 358 00:30:09,470 --> 00:30:12,460 Kaya kung nagpatakbo ako ng buggy1, nakakuha ako ng seg kasalanan. 359 00:30:12,460 --> 00:30:16,210 Sa puntong ito, maaari ba akong pumunta at buksan buggy1.c, 360 00:30:16,210 --> 00:30:19,450 subukan at malaman kung ano ang nangyayari mali, 361 00:30:19,450 --> 00:30:22,000 ngunit isa ng ang pinaka-kasuklam-suklam na mga bagay tungkol sa ito seg kasalanan error 362 00:30:22,000 --> 00:30:27,610 na hindi ito sabihin sa iyo sa kung ano ang linya ng mga bagay na programa aktwal nangyaring mali at sinira. 363 00:30:27,610 --> 00:30:29,880 Uri ng upang tingnan ang code 364 00:30:29,880 --> 00:30:33,990 at malaman gamit ng hula at i-check o printf upang makita kung ano ang nangyayari mali. 365 00:30:33,990 --> 00:30:37,840 Isa sa mga pinaka-cool na bagay tungkol sa GDB na ito ay talagang, talagang madali 366 00:30:37,840 --> 00:30:42,170 upang malaman kung ang linya sa kung saan ang iyong programa-crash. 367 00:30:42,170 --> 00:30:46,160 Lubos Ito ay nagkakahalaga ito upang gamitin ito, kahit na para lamang sa na. 368 00:30:46,160 --> 00:30:56,190 Kaya sa bota up GDB, ako type GDB, at pagkatapos ko bigyan ito ang landas sa executable na gusto kong patakbuhin. 369 00:30:56,190 --> 00:31:01,960 Narito nagta-type ako ng gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Pindutin ang Enter. Ay nagbibigay sa akin ang lahat ng ito impormasyon ng copyright, 371 00:31:06,600 --> 00:31:13,000 at pababa dito makikita mo ang line na nagsasabing, "Binabasa ng mga simbolo mula sa / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 At kung ang lahat ng napupunta na rin, makikita mo itong i-print ang isang mensahe na ganito ang hitsura. 374 00:31:22,060 --> 00:31:25,500 Makikita ito basahin ang mga simbolo, makikita ito sabihin "ako pagbabasa ng mga simbolo mula sa iyong executable file," 375 00:31:25,500 --> 00:31:29,900 at pagkatapos na ito "tapos" na mensahe sa paglipas dito. 376 00:31:29,900 --> 00:31:35,410 Kung nakikita mo ang ilang iba pang mga pagkakaiba-iba ng mga ito, o nakikita mo hindi ito mahanap ang mga simbolo 377 00:31:35,410 --> 00:31:41,460 o isang bagay tulad na, kung ano ang nangangahulugan iyon na hindi mo lang inipon iyong executable nang maayos. 378 00:31:41,460 --> 00:31:49,980 Kapag namin makatipon ng mga programa para sa paggamit na may GDB, mayroon kaming gamitin na espesyal na-g-flag, 379 00:31:49,980 --> 00:31:54,540 at na ginawa sa pamamagitan ng default kung makatipon mo ang iyong mga programa, sa lamang sa pamamagitan ng pag-type ng gumawa 380 00:31:54,540 --> 00:31:59,320 o gumawa ng maraming surot o gumawa mabawi, anuman sa mga. 381 00:31:59,320 --> 00:32:07,800 Ngunit kung ikaw ay kino-compile ang manu-mano sa may kalatong, pagkatapos makikita mo upang pumunta sa at isama ang na-g bandila. 382 00:32:07,800 --> 00:32:10,310 >> Sa puntong ito, ngayon na mayroon namin ang aming GDB prompt, 383 00:32:10,310 --> 00:32:12,310 medyo simple upang patakbuhin ang program. 384 00:32:12,310 --> 00:32:19,740 Maaari naming alinman type ang run, o maaari naming i-type lamang ang r. 385 00:32:19,740 --> 00:32:22,820 Karamihan sa mga utos GDB dinaglat. 386 00:32:22,820 --> 00:32:25,940 Karaniwan sa isa lamang o ng ilang mga titik, na medyo magaling. 387 00:32:25,940 --> 00:32:30,980 Kaya Saad, kung nag-type ka r at pindutin ang Enter, ano ang mangyayari? 388 00:32:30,980 --> 00:32:39,390 [Saad] Nakatanggap ako SIGSEGV, segmentation fault, at pagkatapos ang lahat ng ito gobbledygook. 389 00:32:39,390 --> 00:32:43,650 >> Oo. 390 00:32:43,650 --> 00:32:47,990 Tulad ng aming nakikita sa screen ngayon, at tulad ng Saad sinabi, 391 00:32:47,990 --> 00:32:53,430 kapag type namin run o r at pindutin ang Enter, pa rin namin makuha ang parehong kasalanan seg. 392 00:32:53,430 --> 00:32:55,830 Ito gamit GDB ay hindi malutas ang aming problema. 393 00:32:55,830 --> 00:32:59,120 Ngunit ito ay nagbibigay sa amin ilang gobbledygook, at ito ay lumiliko out na ito gobbledygook 394 00:32:59,120 --> 00:33:03,080 aktwal na nagsasabi sa amin kung saan ito nangyayari. 395 00:33:03,080 --> 00:33:10,680 Upang i-parse ang ilang sandali, ang unang bit ay ang function na kung saan lahat ng pagpunta mali. 396 00:33:10,680 --> 00:33:20,270 Mayroong __ strcmp_sse4_2 na ito, at ito ay nagsasabi sa amin na ito nangyayari sa file na ito 397 00:33:20,270 --> 00:33:29,450 tinatawag sysdeps/i386, ang lahat ng ito, muli, uri ng gulo - ngunit linya 254. 398 00:33:29,450 --> 00:33:31,670 Na uri ng mahirap upang i-parse. Karaniwan kapag mong makita ang mga bagay na tulad nito, 399 00:33:31,670 --> 00:33:38,770 na nangangahulugan na ito ay seg faulting sa isa ng library ng sistema. 400 00:33:38,770 --> 00:33:43,220 Kaya isang bagay gawin sa strcmp. Mong guys nakita strcmp bago. 401 00:33:43,220 --> 00:33:52,730 Hindi masyadong mabaliw, ngunit ang ibig sabihin nito na strcmp ay nasira o na ang isang problema sa strcmp? 402 00:33:52,730 --> 00:33:57,110 Ano ang tingin mo, Alexander? 403 00:33:57,110 --> 00:34:04,890 [Alexander] ba na - 254 ang linya? At ang - hindi binary, ngunit ito ay hindi sa kanilang kisame, 404 00:34:04,890 --> 00:34:10,590 at pagkatapos ay may isa pang wika para sa bawat function na. Ay na ang 254 sa function na iyon, o -? 405 00:34:10,590 --> 00:34:21,460 >> Line 254. Mukhang sa ito. File mga, kaya ito ang assembly code marahil. 406 00:34:21,460 --> 00:34:25,949 >> Subalit, hulaan ko ang mas pagpindot bagay, dahil hindi namin nakuha ang seg kasalanan, 407 00:34:25,949 --> 00:34:29,960 at mukhang ito ay darating mula sa strcmp function na, 408 00:34:29,960 --> 00:34:38,030 ito magpahiwatig, pagkatapos, ang strcmp na ay nasira? 409 00:34:38,030 --> 00:34:42,290 Hindi ito dapat, sana. Kaya lamang dahil mayroon kang isang segmentation fault 410 00:34:42,290 --> 00:34:49,480 sa isa sa mga pag-andar ng system, karaniwang na nangangahulugan na hindi mo lamang na tinatawag na ito nang tama. 411 00:34:49,480 --> 00:34:52,440 Ang pinakamabilis na bagay na dapat gawin upang malaman kung ano ang aktwal na pagpunta sa 412 00:34:52,440 --> 00:34:55,500 kapag nakita mo ang isang bagay na mabaliw tulad nito, tuwing makikita mo ang isang seg kasalanan, 413 00:34:55,500 --> 00:34:59,800 lalo na kung mayroon kang isang programa na sa paggamit ng higit pa sa pangunahing, 414 00:34:59,800 --> 00:35:03,570 ay gumamit ng backtrace. 415 00:35:03,570 --> 00:35:13,080 Ko pagpapaiksi backtrace sa pamamagitan ng pagsusulat ng BT, bilang kabaligtaran sa buong salita backtrace. 416 00:35:13,080 --> 00:35:16,510 Ngunit Charlotte, ano ang mangyayari kapag nag-type ka BT at pindutin ang Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ipinapakita nito sa akin ang dalawang linya, linya 0 at linya 1. 418 00:35:23,200 --> 00:35:26,150 >> Oo. Kaya linya 0 at linya 1. 419 00:35:26,150 --> 00:35:34,560 Mga ito ay aktwal na frame ng stack na kasalukuyang nasa laro kapag nag-crash ang iyong programa. 420 00:35:34,560 --> 00:35:42,230 Simula mula sa ang pinakamataas na frame, frame 0, at pagpunta sa ibaba karamihan, na ang frame 1. 421 00:35:42,230 --> 00:35:45,140 Aming pinakamataas na frame ang strcmp frame. 422 00:35:45,140 --> 00:35:50,080 Maaari mong isipin na ito bilang mga katulad na problema na lang namin ay ginagawa sa pagsusulit na may mga payo, 423 00:35:50,080 --> 00:35:54,890 kung saan namin swap stack frame sa tuktok ng pangunahing stack frame, 424 00:35:54,890 --> 00:35:59,700 at nagkaroon kami ang mga variable na makipagpalitan ay gamit sa tuktok ng mga variable na pangunahing ay gamit. 425 00:35:59,700 --> 00:36:08,440 Narito aming pag-crash ang nangyari sa aming strcmp function, na tinatawag na sa pamamagitan ng aming mga pangunahing function na, 426 00:36:08,440 --> 00:36:14,370 at backtrace ay nagbibigay sa amin hindi lamang ang mga function na kung saan ang mga bagay Nabigo, 427 00:36:14,370 --> 00:36:16,440 ngunit din ito ng pagsasabi sa amin kung saan ang lahat ay tinawag mula sa. 428 00:36:16,440 --> 00:36:18,830 Kaya kung mag-scroll ko sa paglipas ng kaunti pa sa kanan, 429 00:36:18,830 --> 00:36:26,110 maaari naming makita na oo, kami on line 254 ng ito strcmp-sse4.s file. 430 00:36:26,110 --> 00:36:32,540 Ngunit ang tawag ay ginawa sa buggy1.c, linya 6. 431 00:36:32,540 --> 00:36:35,960 Kaya na nangangahulugan na maaari naming gawin - ay maaaring pumunta lamang namin tingnan at makita kung ano ang nangyayari sa 432 00:36:35,960 --> 00:36:39,930 sa buggy1.c, linya 6. 433 00:36:39,930 --> 00:36:43,780 Muli, may mga ilang paraan upang gawin ito. Isa ay upang lumabas ng GDB 434 00:36:43,780 --> 00:36:49,460 o ang iyong code na buksan sa ibang window at cross reference. 435 00:36:49,460 --> 00:36:54,740 Na, sa loob at ng sarili nito, ay medyo madaling gamiting dahil ngayon kung handa ka sa mga oras ng opisina 436 00:36:54,740 --> 00:36:57,220 at mayroon ka ng seg kasalanan at ang iyong tf ang nagtataka kung saan ang lahat ay paglabag, 437 00:36:57,220 --> 00:36:59,710 Maaari mo lamang sabihin, "Oh, linya 6 Hindi ko alam kung ano ang nangyayari sa, 438 00:36:59,710 --> 00:37:03,670 ngunit ang isang bagay tungkol sa linya 6 na nagiging sanhi upang masira ang aking programa. " 439 00:37:03,670 --> 00:37:10,430 Ang iba pang mga paraan upang gawin ito ay maaari mong gamitin ang command na ito na tinatawag na listahan sa GDB. 440 00:37:10,430 --> 00:37:13,650 Maaari mo ring pagpapaiksi dito sa l. 441 00:37:13,650 --> 00:37:18,910 Kaya kung namin pindutin l, ano ang gagawin namin dito? 442 00:37:18,910 --> 00:37:21,160 Makuha namin ang maramihang mga bagay na kakaiba. 443 00:37:21,160 --> 00:37:26,030 Ito ay ang aktwal na code sa pagpupulong 444 00:37:26,030 --> 00:37:29,860 na sa strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Ito ganito ang uri ng funky, 446 00:37:32,440 --> 00:37:36,520 at ang dahilan namin ay ang pagkakaroon ng ganitong dahil ngayon, 447 00:37:36,520 --> 00:37:40,160 May amin ng GDB sa frame 0. 448 00:37:40,160 --> 00:37:43,070 >> Kaya anumang oras tinitingnan namin ang variable, anumang oras na tinitingnan namin ang source code, 449 00:37:43,070 --> 00:37:50,530 kaming naghahanap sa source code na hinggil sa stack frame hindi namin kasalukuyang in 450 00:37:50,530 --> 00:37:53,200 Kaya upang makakuha ng anumang makahulugang, mayroon kaming 451 00:37:53,200 --> 00:37:57,070 ilipat sa stack frame na gumagawa ng higit pang kahulugan. 452 00:37:57,070 --> 00:38:00,180 Sa kasong ito, ang pangunahing stack frame ng kaunti pa sa kahulugan, 453 00:38:00,180 --> 00:38:02,680 dahil iyon ay talagang ang code na aming sinulat ni. 454 00:38:02,680 --> 00:38:05,330 Hindi ang strcmp code. 455 00:38:05,330 --> 00:38:08,650 Ang paraan maaari kang lumipat sa pagitan ng mga frame, sa kasong ito, dahil mayroon kaming dalawang, 456 00:38:08,650 --> 00:38:10,430 kami ay may 0 at 1, 457 00:38:10,430 --> 00:38:13,650 gawin mo na gamit ang pataas at pababang mga utos. 458 00:38:13,650 --> 00:38:18,480 Kung ilipat ko isang frame, 459 00:38:18,480 --> 00:38:21,770 ngayon ako sa pangunahing stack frame. 460 00:38:21,770 --> 00:38:24,330 Maaari kong ilipat pababa upang bumalik sa kung saan ako ay, 461 00:38:24,330 --> 00:38:32,830 pumunta up muli, pumunta down na muli, at pumunta muli. 462 00:38:32,830 --> 00:38:39,750 Kung sakaling ang iyong programa sa GDB, makakakuha ka ng pag-crash, makukuha mo ang backtrace, 463 00:38:39,750 --> 00:38:42,380 at makikita mo na ito sa ilang mga file na hindi mo alam kung anong nangyayari sa. 464 00:38:42,380 --> 00:38:45,460 Subukan mong listahan, ang code ay hindi mukhang pamilyar sa iyo, 465 00:38:45,460 --> 00:38:48,150 tingnan ang iyong mga frame at malaman kung nasaan ka. 466 00:38:48,150 --> 00:38:51,010 Ikaw ay marahil sa maling frame ng stack. 467 00:38:51,010 --> 00:38:58,760 O hindi bababa sa isang stack frame na ay hindi isa na maaari mo ba talagang i-debug. 468 00:38:58,760 --> 00:39:03,110 Ngayon na kami sa naaangkop na stack frame, hindi namin sa pangunahing, 469 00:39:03,110 --> 00:39:08,100 ngayon maaari naming gamitin ang listahan na command upang malaman kung anong linya ay. 470 00:39:08,100 --> 00:39:13,590 At maaari mong makita ang mga ito;-print ito sa ito para sa amin dito mismo. 471 00:39:13,590 --> 00:39:19,470 Ngunit maaari naming pindutin ang ilista ang lahat ng mga parehong, at ang listahan ay nagbibigay ito sa amin magaling printout 472 00:39:19,470 --> 00:39:23,920 ng aktwal na source code na nangyayari sa dito. 473 00:39:23,920 --> 00:39:26,420 >> Sa partikular, maaari naming tumingin sa linya 6. 474 00:39:26,420 --> 00:39:29,330 Maaari naming makita kung ano ang nangyayari sa dito. 475 00:39:29,330 --> 00:39:31,250 At mukhang namin ang paggawa ng isang string paghahambing 476 00:39:31,250 --> 00:39:41,050 sa pagitan ng mga string "CS50 bato" at argv [1]. 477 00:39:41,050 --> 00:39:45,700 Ang isang bagay tungkol sa pag-crash. 478 00:39:45,700 --> 00:39:54,120 Kaya Missy, mayroon kang anumang saloobin sa kung ano ang maaaring pagpunta sa dito? 479 00:39:54,120 --> 00:39:59,400 [Missy] Hindi ko alam kung bakit ito ay pag-crash. >> Hindi mo alam kung bakit ito ay pag-crash? 480 00:39:59,400 --> 00:40:02,700 Jimmy, anumang saloobin? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] ako hindi ganap na sigurado, ngunit ang huling beses na ginamit namin string ihambing, 482 00:40:06,240 --> 00:40:10,260 o strcmp, nagkaroon kami tulad ng tatlong iba't ibang mga kaso sa ilalim ito. 483 00:40:10,260 --> 00:40:12,800 Hindi namin magkaroon ng ==, hindi ko sa tingin, sa na unang linya. 484 00:40:12,800 --> 00:40:16,700 Sa halip ito ay pinaghihiwalay sa tatlong, at ang isa ay == 0, 485 00:40:16,700 --> 00:40:19,910 isa ay <0, tingin ko, at isa> 0. 486 00:40:19,910 --> 00:40:22,590 Kaya marahil ng isang bagay tulad na? >> Oo. Kaya may isyu na ito 487 00:40:22,590 --> 00:40:27,200 ng namin ay ang paggawa ng tama ang paghahambing? 488 00:40:27,200 --> 00:40:31,660 Stella? Anumang saloobin? 489 00:40:31,660 --> 00:40:38,110 [Stella] Hindi ako sigurado. >> Hindi sigurado. Daniel? Saloobin? Okay. 490 00:40:38,110 --> 00:40:44,770 Ito lumiliko kung ano ang nangyayari dito mismo kapag tumakbo kami sa programa 491 00:40:44,770 --> 00:40:48,370 at nakuha namin ang seg kasalanan, kapag pinatakbo mo ang programa para sa unang pagkakataon, Daniel, 492 00:40:48,370 --> 00:40:50,800 mo bigyan ito ng anumang mga argumento command line? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No. >> No. Sa kasong iyon, ano ang ang halaga ng argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> May ay walang halaga. >> Karapatan. 495 00:41:00,920 --> 00:41:06,120 Well, may hindi naaangkop na halaga ng string. 496 00:41:06,120 --> 00:41:10,780 Ngunit ang ilang mga halaga. Ano ay ang halaga na ay makakakuha ng naka-imbak sa may? 497 00:41:10,780 --> 00:41:15,130 >> Ang isang halaga ng basura? >> Ito ay alinman sa isang halaga ng basura o, sa kasong ito, 498 00:41:15,130 --> 00:41:19,930 ang dulo ng array argv ay laging winakasan na may null. 499 00:41:19,930 --> 00:41:26,050 Kaya kung ano ang aktwal na Nakakuha na naka-imbak sa may null. 500 00:41:26,050 --> 00:41:30,810 Ang iba pang mga paraan upang malutas ito, kaysa sa iniisip ito sa pamamagitan, 501 00:41:30,810 --> 00:41:33,420 ay upang subukan ang pag-print ito. 502 00:41:33,420 --> 00:41:35,880 Ito ay kung saan ako ay nagsasabi na gamit GDB ay mahusay, 503 00:41:35,880 --> 00:41:40,640 dahil maaari mong i-print ang lahat ng mga variable, ang lahat ng mga halaga na nais mong 504 00:41:40,640 --> 00:41:43,230 gamit ang madaling-gamiting-napakainam na utos p. 505 00:41:43,230 --> 00:41:48,520 Kaya kung type ko p at pagkatapos ko i-type ang mga halaga ng isang variable o ang pangalan ng isang variable, 506 00:41:48,520 --> 00:41:55,320 sabihin, argc, nakikita ko na argc ay 1. 507 00:41:55,320 --> 00:42:01,830 Kung gusto kong i-print ang argv [0], maaari kong gawin ito tulad na. 508 00:42:01,830 --> 00:42:04,840 At tulad ng nakita natin, argv [0] ay laging ang pangalan ng iyong programa, 509 00:42:04,840 --> 00:42:06,910 lagi ang pangalan ng executable. 510 00:42:06,910 --> 00:42:09,740 Narito mong makita ito ay nakuha ang buong pangalan ng landas. 511 00:42:09,740 --> 00:42:15,920 Ko ring i-print ang argv [1] at makita kung ano ang mangyayari. 512 00:42:15,920 --> 00:42:20,890 >> Narito namin nakuha ito uri ng mystical halaga. 513 00:42:20,890 --> 00:42:23,890 Nakuha namin ito 0x0. 514 00:42:23,890 --> 00:42:27,850 Tandaan sa simula ng termino kapag usapan natin ang tungkol sa hexadecimal numero? 515 00:42:27,850 --> 00:42:34,680 O na maliit na tanong sa dulo ng pset 0 tungkol sa kung paano upang kumatawan 50 sa hex? 516 00:42:34,680 --> 00:42:39,410 Ang paraan na isulat namin hex numero sa CS, hindi lituhin ang ating sarili 517 00:42:39,410 --> 00:42:46,080 may decimal na numero, ay lagi naming prefix sa kanila na may 0x. 518 00:42:46,080 --> 00:42:51,420 Kaya ito 0x prefix na laging lamang ibig sabihin nito ay mabibigyang-kahulugan ang mga sumusunod na bilang bilang isang hexadecimal numero, 519 00:42:51,420 --> 00:42:57,400 hindi bilang isang string, hindi bilang isang decimal na numero, hindi bilang isang binary numero. 520 00:42:57,400 --> 00:43:02,820 Dahil ang bilang 5-0 ng isang wastong numero sa hexadecimal. 521 00:43:02,820 --> 00:43:06,240 At ito ay isang numero sa decimal, 50. 522 00:43:06,240 --> 00:43:10,050 Kaya ito ay lamang kung paano namin disambiguate. 523 00:43:10,050 --> 00:43:14,860 Kaya 0x0 paraan hexadecimal 0, na rin decimal 0, binary 0. 524 00:43:14,860 --> 00:43:17,030 0 ang halaga. 525 00:43:17,030 --> 00:43:22,630 Ito lumiliko out na ito ay kung ano null ay, aktwal na, sa memorya. 526 00:43:22,630 --> 00:43:25,940 Null ay 0. 527 00:43:25,940 --> 00:43:37,010 Dito, ang elemento na naka-imbak sa argv [1] ay null. 528 00:43:37,010 --> 00:43:45,220 Kaya kami ay sinusubukan upang ihambing ang aming "CS50 bato" na string sa isang null string. 529 00:43:45,220 --> 00:43:48,130 Kaya dereferencing null, sinusubukan upang ma-access ang mga bagay sa null, 530 00:43:48,130 --> 00:43:55,050 mga karaniwang pagpunta sa maging sanhi ng ilang mga uri ng segmentation fault o iba pang masamang mangyari. 531 00:43:55,050 --> 00:43:59,350 At ito ay lumiliko out na strcmp hindi suriin upang makita 532 00:43:59,350 --> 00:44:04,340 mo man o hindi ang pumasa sa isang halaga na null. 533 00:44:04,340 --> 00:44:06,370 Sa halip, ito ay napupunta magpatuloy, sinusubukan na gawin ang bagay, 534 00:44:06,370 --> 00:44:14,640 at kung ito seg faults, seg faults, at ito ang iyong problema. Mayroon kang pumunta ayusin ito. 535 00:44:14,640 --> 00:44:19,730 Talagang mabilis, kung paano namin ayusin ang problemang ito? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Maaari mong suriin ang paggamit ng kung. 537 00:44:23,540 --> 00:44:32,240 Kaya kung argv [1] ay null, == 0, pagkatapos ay bumalik 1, o isang bagay na [hindi maintindihan]. 538 00:44:32,240 --> 00:44:34,590 >> Oo. Kaya na isang mahusay na paraan upang gawin ito, tulad ng maaari naming suriin upang makita, 539 00:44:34,590 --> 00:44:39,230 ang halaga na hindi namin upang pumasa sa strcmp, argv [1], ito Null? 540 00:44:39,230 --> 00:44:45,830 Kung ito ay null, maaari naming sabihin okay, i-abort. 541 00:44:45,830 --> 00:44:49,450 >> Ang isang mas karaniwang paraan upang gawin ito ay upang gamitin ang argc halaga. 542 00:44:49,450 --> 00:44:52,040 Maaari mong makita dito mismo sa simula ng pangunahing, 543 00:44:52,040 --> 00:44:58,040 tinanggal namin na unang pagsubok na ating kadalasang kapag ginagamit namin na command argumento line, 544 00:44:58,040 --> 00:45:05,240 na ay upang subukan man o hindi ang aming argc ang halaga ng kung ano ang inaasahan namin. 545 00:45:05,240 --> 00:45:10,290 Sa kasong ito, kami ay umaasa sa hindi bababa sa dalawang argumento, 546 00:45:10,290 --> 00:45:13,660 ang pangalan ng programa kasama ang isang iba pa. 547 00:45:13,660 --> 00:45:17,140 Dahil hindi namin tungkol sa gamitin ang pangalawang argumento dito mismo. 548 00:45:17,140 --> 00:45:21,350 Kaya pagkakaroon ng ilang mga uri ng pagsubok muna, bago ang aming strcmp tawag 549 00:45:21,350 --> 00:45:37,390 na pagsubok man o hindi argv ay hindi bababa sa 2, ay ring gawin ang parehong uri ng bagay. 550 00:45:37,390 --> 00:45:40,620 Maaari naming makita kung na gumagana sa pamamagitan ng pagpapatakbo ng programa muli. 551 00:45:40,620 --> 00:45:45,610 Maaari mong palaging i-restart ang iyong programa sa loob ng GDB, na talagang magaling. 552 00:45:45,610 --> 00:45:49,310 Maaari kang magpatakbo ng, at kapag pumasa ka sa mga argumento sa iyong programa, 553 00:45:49,310 --> 00:45:53,060 pumasa ka sa mga ito sa kapag ka call magpatakbo ng, hindi kapag ikaw sipain hanggang GDB. 554 00:45:53,060 --> 00:45:57,120 Na paraan na maaari mong panatilihin na invoking iyong programa na may iba't ibang mga argumento sa bawat oras. 555 00:45:57,120 --> 00:46:08,080 Kaya tatakbo, o muli, ang maaari kong i-type ang r, at sabihin makita kung ano ang mangyayari kung namin type "hoy". 556 00:46:08,080 --> 00:46:11,140 Ito ay palaging hilingin sa iyo kung nais mong simulan ang mga ito muli mula sa simula. 557 00:46:11,140 --> 00:46:17,490 Karaniwan, mo nais upang simulan ang mga ito muli mula sa simula. 558 00:46:17,490 --> 00:46:25,010 At sa puntong ito, restart itong muli, mga Kopya ang 559 00:46:25,010 --> 00:46:28,920 ang programa na kami ay tumatakbo, buggy1, ang argumento kumusta, 560 00:46:28,920 --> 00:46:32,720 at mga Kopya ang pamantayang ito out, sinasabi nito, "Nakakuha ka ng D," malungkot na mukha. 561 00:46:32,720 --> 00:46:37,610 Ngunit hindi namin seg ng kasalanan. Sinabi ito ang proseso na lumabas normal. 562 00:46:37,610 --> 00:46:39,900 Kaya na mukhang medyo magandang. 563 00:46:39,900 --> 00:46:43,050 Wala nang seg kasalanan, ginawa namin itong nakaraan, 564 00:46:43,050 --> 00:46:48,190 kaya kamukha na talaga ang seg bug kasalanan namin ay nakakakuha ng. 565 00:46:48,190 --> 00:46:51,540 Sa kasamaang-palad, ito ay nagsasabi sa amin na kami ay pagkuha ng D. 566 00:46:51,540 --> 00:46:54,090 >> Maaari naming bumalik at tumingin sa ang code at makita kung ano ay pagpunta sa may 567 00:46:54,090 --> 00:46:57,980 upang malaman kung anong ay - kung bakit ito ay nagsasabi sa amin na namin Mayroon D. 568 00:46:57,980 --> 00:47:03,690 Natin makita, dito ay ito printf sinasabi na Mayroon D. 569 00:47:03,690 --> 00:47:08,540 Kung namin type ang listahan, bilang patuloy kang mag-type listahan, iniingatan nito ang-iterating sa pamamagitan ng iyong programa, 570 00:47:08,540 --> 00:47:10,940 kaya ito ay ipakita sa iyo ang unang ilang mga linya ng iyong programa. 571 00:47:10,940 --> 00:47:15,450 Pagkatapos ito ay magpapakita sa iyo ng susunod na ilang mga linya, at sa susunod na tipak at ang susunod na tipak. 572 00:47:15,450 --> 00:47:18,240 At ito ay patuloy na sinusubukan upang pumunta pababa. 573 00:47:18,240 --> 00:47:21,180 At ngayon namin sa "linya bilang 16 ay wala sa sakop." 574 00:47:21,180 --> 00:47:23,940 Dahil lamang ito ay may 15 linya. 575 00:47:23,940 --> 00:47:30,310 Kung ikaw ay makakuha sa puntong ito at ang iyong nagtataka, "Ano ang gagawin ko?" Maaari mong gamitin ang utos ng tulong. 576 00:47:30,310 --> 00:47:34,340 Gamitin ang tulong at pagkatapos ay bigyan ito ng pangalan ng isang command. 577 00:47:34,340 --> 00:47:36,460 At makikita mo ang GDB ang nagbibigay sa amin ng lahat ng ito uri ng mga bagay-bagay. 578 00:47:36,460 --> 00:47:43,870 Sinasabi nito, "Nang walang argument, naglilista ng sampung higit pang mga linya pagkatapos o sa buong nakaraang listahan. 579 00:47:43,870 --> 00:47:47,920 Listahan - naglilista ng mga sampung linya bago - " 580 00:47:47,920 --> 00:47:52,960 Kaya natin subukang gamit ang minus listahan. 581 00:47:52,960 --> 00:47:57,000 At na naglilista sa 10 linya sa nakaraang, maaari mong i-play sa paligid na may listahan ng kaunti. 582 00:47:57,000 --> 00:48:02,330 Maaari mong gawin ang listahan, listahan -, maaari mong kahit bigyan ilista ang isang numero, tulad ng listahan 8, 583 00:48:02,330 --> 00:48:07,500 at ilista ang 10 linya sa buong linya 8. 584 00:48:07,500 --> 00:48:10,290 At maaari mong makita kung anong nangyayari sa dito ay mayroon kang isang simpleng kung tao. 585 00:48:10,290 --> 00:48:13,980 Kung nagta-type ka sa CS50 bato, ng mga Kopya "Makakakuha ka ng A." 586 00:48:13,980 --> 00:48:16,530 Kung hindi man ito ng mga Kopya "Nakakuha ka ng D." 587 00:48:16,530 --> 00:48:23,770 Nakakainis bayan. Ayos lang. Oo? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Kaya kapag sinubukan ko paggawa ng CS50 bato nang walang mga panipi, 589 00:48:26,730 --> 00:48:29,290 sinasabi nito na "Nakakuha ka ng D." 590 00:48:29,290 --> 00:48:32,560 Ko kailangan ang mga quote upang makakuha ng ito upang gumana; kung bakit ay na? 591 00:48:32,560 --> 00:48:38,490 >> Oo. Ito ay lumiliko out na kapag - ito ay isa pang masaya maliit na maliit na piraso - 592 00:48:38,490 --> 00:48:47,900 kapag nagpatakbo ka sa programa, kung nagpapatakbo namin ito at type namin sa CS50 bato, 593 00:48:47,900 --> 00:48:50,800 tulad lamang ng Daniel ay sinasabi ginawa niya, at pindutin ang Enter, 594 00:48:50,800 --> 00:48:52,870 pa rin ito nagsasabing naming makakuha ng D. 595 00:48:52,870 --> 00:48:55,580 At tanong ay, kung bakit ito? 596 00:48:55,580 --> 00:49:02,120 At ito ay lumiliko out na ang aming parehong terminal at GDB-parse ang mga ito bilang dalawang magkahiwalay na mga argumento. 597 00:49:02,120 --> 00:49:04,800 Dahil kapag may isang puwang, na ipinahiwatig bilang 598 00:49:04,800 --> 00:49:08,730 ang unang argumento natapos, sa susunod na argumento ay tungkol sa upang simulan. 599 00:49:08,730 --> 00:49:13,260 Ang paraan upang pagsamahin ang mga sa dalawang, o ng paumanhin, sa isang argument, 600 00:49:13,260 --> 00:49:18,510 ay upang gamitin ang mga quote. 601 00:49:18,510 --> 00:49:29,560 Sa ngayon, kung namin itong ilagay sa mga quotes at patakbuhin itong muli, makakakuha kami ng A. 602 00:49:29,560 --> 00:49:38,780 Kaya lang sa paglalagom, walang mga quote, CS50 at bato parse bilang dalawang magkahiwalay na mga argumento. 603 00:49:38,780 --> 00:49:45,320 Sa mga quote, parse bilang isang argument sa kabuuan. 604 00:49:45,320 --> 00:49:53,070 >> Maaari naming makita ang mga ito gamit ang isang breakpoint. 605 00:49:53,070 --> 00:49:54,920 Sa ngayon kami tumatakbo aming programa, at ito ay tumatakbo 606 00:49:54,920 --> 00:49:58,230 hanggang sa alinman ito seg faults o hit ng isang error 607 00:49:58,230 --> 00:50:05,930 o hanggang sa ito ay lumabas at lahat ng ay lubos pinong. 608 00:50:05,930 --> 00:50:08,360 Ito ay hindi kinakailangan ang pinaka-kapaki-pakinabang na bagay, dahil minsan 609 00:50:08,360 --> 00:50:11,840 mayroon kang isang error sa iyong programa, ngunit hindi ito nagdudulot ng segmentation fault. 610 00:50:11,840 --> 00:50:16,950 Hindi ito na nagiging sanhi ng iyong programa upang ihinto o anumang bagay tulad na. 611 00:50:16,950 --> 00:50:20,730 Ang paraan upang makakuha ng GDB i-pause ang iyong programa sa isang partikular na punto 612 00:50:20,730 --> 00:50:23,260 upang itakda ang isang breakpoint. 613 00:50:23,260 --> 00:50:26,520 Maaari mong gawin ito sa pamamagitan ng pagtatakda ng isang breakpoint sa isang pangalan ng function na 614 00:50:26,520 --> 00:50:30,770 o maaari mong itakda ang isang breakpoint sa isang partikular na linya ng code. 615 00:50:30,770 --> 00:50:34,450 Gusto kong magtakda ng mga breakpoints sa pangalan ng function na, dahil - madaling tandaan, 616 00:50:34,450 --> 00:50:37,700 at kung aktwal mong pumunta sa at baguhin ang iyong source code up ng kaunti, 617 00:50:37,700 --> 00:50:42,020 ang iyong breakpoint ay aktwal na manatili sa parehong lugar sa loob ng iyong code. 618 00:50:42,020 --> 00:50:44,760 Sapagkat kung gumagamit ka ng numero ng linya, at ang mga numero ng linya baguhin 619 00:50:44,760 --> 00:50:51,740 dahil kang magdagdag o magtanggal ng ilang mga code, pagkatapos ay ang iyong mga breakpoints lahat ng lubos screwed up. 620 00:50:51,740 --> 00:50:58,590 Isa sa mga pinaka-karaniwang mga bagay na gagawin ko ay itakda ang isang breakpoint sa pangunahing function na. 621 00:50:58,590 --> 00:51:05,300 Madalas makikita ko sipain hanggang GDB, makikita ko type b main, pindutin ang Enter, at na kailangan itakda ang isang breakpoint 622 00:51:05,300 --> 00:51:10,630 sa pangunahing function na kung saan lamang sabi, "I-pause ang programa sa lalong madaling simulan mo sa pagtakbo," 623 00:51:10,630 --> 00:51:17,960 at na paraan, kapag nagpatakbo ako ng aking programa sa, sabihin nating, CS50 bato sa bilang ng dalawang argumento 624 00:51:17,960 --> 00:51:24,830 at pindutin ang Enter, nakakakuha ng sa pangunahing function na at humihinto mismo sa unang linya, 625 00:51:24,830 --> 00:51:30,620 kanan bago ito sinusuri ang strcmp function na. 626 00:51:30,620 --> 00:51:34,940 >> Dahil ako naka-pause, ngayon maaari kong simulan ang mucking sa paligid at nakikita kung anong nangyayari sa 627 00:51:34,940 --> 00:51:40,250 sa lahat ng ibang mga variable na lumipas sa aking programa. 628 00:51:40,250 --> 00:51:43,670 Dito ko i-print argc at makita kung ano ang nangyayari sa. 629 00:51:43,670 --> 00:51:50,030 Tingnan na ang argc ay 3, sapagkat ito ay nakakuha ng 3 iba't ibang mga halaga sa loob nito. 630 00:51:50,030 --> 00:51:54,060 Ito ay nakuha ang pangalan ng programa, ito ay nakuha ang unang argumento at ang pangalawang argumento. 631 00:51:54,060 --> 00:52:09,330 Maaari naming i-print ang mga sa pamamagitan ng pagtingin sa argv [0], argv [1], at argv [2]. 632 00:52:09,330 --> 00:52:12,030 Kaya ngayon maaari mo ring makita kung bakit ito strcmp tawag ay pagpunta sa mabibigo, 633 00:52:12,030 --> 00:52:21,650 dahil nakita mo na ito ay nahati ang CS50 at ang mga bato sa dalawang magkahiwalay na mga argumento. 634 00:52:21,650 --> 00:52:27,250 Sa puntong ito, sa sandaling pindutin ang breakpoint, maaari mong patuloy na hakbang sa pamamagitan ng iyong programa 635 00:52:27,250 --> 00:52:32,920 linya sa pamamagitan ng linya, bilang kabaligtaran sa muling simulan ang iyong programa. 636 00:52:32,920 --> 00:52:35,520 Kaya kung hindi mo nais na upang simulan muli ang iyong programa at patuloy mula dito, 637 00:52:35,520 --> 00:52:41,970 maaari mong gamitin ang Magpatuloy utos at patuloy na tatakbo ang programa sa dulo. 638 00:52:41,970 --> 00:52:45,010 Lamang tulad ng ginawa ito dito. 639 00:52:45,010 --> 00:52:54,880 Gayunpaman, kung ako i-restart ang programa, CS50 bato, mga hit muli ang aking breakpoint, 640 00:52:54,880 --> 00:52:59,670 at oras na ito, kung hindi ko nais upang pumunta lamang ang lahat ng mga paraan sa pamamagitan ng iba pang mga bahagi ng programa, 641 00:52:59,670 --> 00:53:08,040 Maaari ko bang gamitin ang susunod na utos, na ako din pagpapaiksi may n. 642 00:53:08,040 --> 00:53:12,960 At ito ay hakbang sa pamamagitan ng linya ng programa sa pamamagitan ng linya. 643 00:53:12,960 --> 00:53:17,530 Sa gayon maaari mong panoorin bilang ang mga bagay execute, tulad ng variable pagbabago, tulad ng mga bagay na makapag-update. 644 00:53:17,530 --> 00:53:21,550 Aling ay medyo magaling. 645 00:53:21,550 --> 00:53:26,570 Ang iba pang mga cool na bagay ay kaysa sa paulit-ulit na ang parehong utos nang paulit-ulit at mahigit muli, 646 00:53:26,570 --> 00:53:30,670 kung ikaw pindutin ang Enter - kaya dito mo makita Hindi ko pa nai-type sa anumang - 647 00:53:30,670 --> 00:53:33,780 kung ko lang pindutin ang Enter, ulitin ang mga nakaraang utos, 648 00:53:33,780 --> 00:53:36,900 o sa nakaraang utos ng GDB ko lang ilagay. 649 00:53:36,900 --> 00:53:56,000 Maaari kong panatilihin ang pagpindot sa Ipasok at ito ang stepping sa pamamagitan ng aking code sa linya sa pamamagitan ng linya. 650 00:53:56,000 --> 00:53:59,310 Gusto ko hinihikayat ka guys upang pumunta tingnan ang iba pang mga programa sa maraming surot pati na rin. 651 00:53:59,310 --> 00:54:01,330 Wala kaming oras upang makakuha ng sa pamamagitan ng lahat ng mga ito ngayon sa seksyon. 652 00:54:01,330 --> 00:54:05,890 Ang source code ay doon, kaya maaari mong uri ng makita kung ano ang nangyayari sa 653 00:54:05,890 --> 00:54:07,730 likod ng mga eksena na kung talagang hindi ka makaalis, 654 00:54:07,730 --> 00:54:11,940 ngunit sa pinakadulo hindi bababa sa, magsanay booting up GDB, 655 00:54:11,940 --> 00:54:13,940 ang pagpapatakbo ng programa hanggang Pinaghihiwa sa iyo, 656 00:54:13,940 --> 00:54:18,260 pagkuha ng backtrace, ang pag-uunawa kung ano ang gumana ng pag-crash ay sa, 657 00:54:18,260 --> 00:54:24,450 kung ano ang linya na ito ay sa, pag-print ang ilang mga variable na halaga, 658 00:54:24,450 --> 00:54:30,140 lang kaya mo makakuha ng isang pakiramdam para dito, dahil na ay talagang makakatulong sa iyo pasulong. 659 00:54:30,140 --> 00:54:36,340 Sa puntong ito, kami ay na umalis ng GDB, kung saan mo gamit quit o q. 660 00:54:36,340 --> 00:54:40,460 Kung ang iyong programa ay sa gitna ng tumatakbo pa rin, at hindi ito lumabas, 661 00:54:40,460 --> 00:54:43,510 ito ay palaging hilingin sa iyo, "Sigurado ka bang gusto mo talagang mag-quit?" 662 00:54:43,510 --> 00:54:48,770 Maaari mong pindutin lamang ang oo. 663 00:54:48,770 --> 00:54:55,250 >> Ngayon kami ay upang tingnan ang susunod na problema na mayroon kami, na ang pusa programa. 664 00:54:55,250 --> 00:54:59,880 Kung panoorin ang maikling sa pag-redirect at pipe, makikita mo na gumagamit ng Tommy sa programang ito 665 00:54:59,880 --> 00:55:07,540 na talaga mga Kopya lahat ng mga output ng isang file sa screen. 666 00:55:07,540 --> 00:55:12,660 Kaya kung nagpatakbo ako ng pusa, ito ay talagang isang built-in na programa sa appliance, 667 00:55:12,660 --> 00:55:16,860 at kung mayroon kang Mac maaari mong gawin ito sa iyong Mac, kapag binuksan mo ang terminal. 668 00:55:16,860 --> 00:55:25,630 At hindi na namin - pusa, sabihin nating, cp.c, at pindutin ang Enter. 669 00:55:25,630 --> 00:55:29,640 Kung ano ang ginawa, kung mag-scroll up namin ng kaunti at makita kung saan tumakbo kami sa line, 670 00:55:29,640 --> 00:55:40,440 o kung saan namin tumakbo ang pusa utos, literal lamang print ang mga nilalaman ng cp.c sa aming screen. 671 00:55:40,440 --> 00:55:44,140 Maaari naming patakbuhin itong muli at maaari mong ilagay sa maramihang mga file nang magkasama. 672 00:55:44,140 --> 00:55:49,880 Sa gayon ay maaari mong gawin ang cat cp.c, at maaari rin naming pagdugtungin ang cat.c file, 673 00:55:49,880 --> 00:55:53,250 na programa na hindi namin na magsulat, 674 00:55:53,250 --> 00:55:58,140 at makikita ito i-print ang parehong mga file pabalik upang i-back sa aming screen. 675 00:55:58,140 --> 00:56:05,490 Kaya kung mag-scroll namin ng kaunti, nakita namin na kapag tumakbo namin ito pusa cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 una itong-print ang cp file, at pagkatapos ay sa ibaba nito, naka-print ang cat.c file kanan pababa dito. 677 00:56:17,110 --> 00:56:19,650 Kami ay pagpunta sa gamitin ito lamang makakuha ng aming mga paa basa. 678 00:56:19,650 --> 00:56:25,930 I-play sa paligid na may simpleng pag-print sa terminal, makita kung paano na gumagana. 679 00:56:25,930 --> 00:56:39,170 Kung ikaw guys buksan up sa gedit cat.c, pindutin ang Enter, 680 00:56:39,170 --> 00:56:43,760 maaari mong makita ang mga programa na hindi namin tungkol sa upang magsulat. 681 00:56:43,760 --> 00:56:48,980 Nagsama kami ito magaling kuluan plate, kaya hindi namin upang magpalipas ng oras sa pag-type ng lahat na out. 682 00:56:48,980 --> 00:56:52,310 Din namin suriin ang dami ng mga argument ang pumasa. 683 00:56:52,310 --> 00:56:56,910 -Print namin ang gandang mensahe ng paggamit. 684 00:56:56,910 --> 00:57:00,950 >> Ito ang uri ng bagay, muli, tulad namin na pinag-uusapan, 685 00:57:00,950 --> 00:57:04,490 ito ay halos tulad ng kalamnan memory. 686 00:57:04,490 --> 00:57:07,190 Tandaan lamang upang panatilihin ang paggawa ng ang parehong uri ng mga bagay-bagay 687 00:57:07,190 --> 00:57:11,310 at laging pag-print ang ilang mga uri ng mga kapaki-pakinabang na mensahe 688 00:57:11,310 --> 00:57:17,670 kaya na alam ng mga tao kung paano patakbuhin ang iyong programa. 689 00:57:17,670 --> 00:57:21,630 Sa pusa, ito ay medyo simple; lang kami upang pumunta sa pamamagitan ng lahat ng ibang argumento 690 00:57:21,630 --> 00:57:24,300 na ang pumasa sa aming programa, at kami ay pagpunta upang i-print 691 00:57:24,300 --> 00:57:29,950 kanilang mga nilalaman sa screen ng paisa-isa. 692 00:57:29,950 --> 00:57:35,670 Upang makapagpa-print ang mga file sa screen, kami ay pagpunta sa gawin ng isang bagay na katulad na katulad 693 00:57:35,670 --> 00:57:38,120 sa kung ano ang ginawa namin sa dulo ng pagsusulit. 694 00:57:38,120 --> 00:57:45,350 Sa dulo ng pagsusulit, na umarkila programa, nagkaroon kami upang buksan ang isang file, 695 00:57:45,350 --> 00:57:48,490 at pagkatapos namin ay upang i-print ito. 696 00:57:48,490 --> 00:57:54,660 Sa kasong ito, kami ay pagpunta upang buksan ang isang file, at kami ay pagpunta upang basahin mula dito sa halip. 697 00:57:54,660 --> 00:58:00,630 Pagkatapos kami ay pagpunta sa print, sa halip na sa isang file, kami ay pagpunta upang i-print sa screen. 698 00:58:00,630 --> 00:58:05,830 Kaya pag-print sa screen lahat ng nagawa mo na bago may printf. 699 00:58:05,830 --> 00:58:08,290 Sa gayon ay hindi masyadong mabaliw. 700 00:58:08,290 --> 00:58:12,190 Ngunit sa pagbabasa ng isang file ay uri ng kakaiba. 701 00:58:12,190 --> 00:58:17,300 Susubukan naming pumunta sa pamamagitan ng na ang isang kaunti sa isang pagkakataon. 702 00:58:17,300 --> 00:58:20,560 Kung ikaw guys bumalik sa na huling problema sa iyong pagsusulit, problema 33, 703 00:58:20,560 --> 00:58:27,280 ang unang linya na kami ay pagpunta sa gawin dito, pagbubukas ng file, ay lubos na katulad sa kung ano ang ginawa namin doon. 704 00:58:27,280 --> 00:58:36,370 Kaya Stella, ano ang na linya itsura, kapag naming buksan ang isang file? 705 00:58:36,370 --> 00:58:47,510 [Stella] Capital FILE *, file - >> Okay. >> - Katumbas ng fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Aling sa kasong ito ay? Ito sa komento. 707 00:58:55,980 --> 00:59:06,930 >> Sa komento? argv [i] at r? 708 00:59:06,930 --> 00:59:11,300 >> Mismong. Kanan sa. Kaya Stella lubos na karapatan. 709 00:59:11,300 --> 00:59:13,720 Ito ay kung ano ang linya kamukha. 710 00:59:13,720 --> 00:59:19,670 Kami ay pagpunta upang makakuha ng isang file ng stream ng variable, iimbak ito sa isang FILE *, kaya lahat ng mga caps, 711 00:59:19,670 --> 00:59:25,720 FILE, *, at ang pangalan ng variable na ito ay ang file na. 712 00:59:25,720 --> 00:59:32,250 Kami maaaring tumawag ito anumang gusto namin. Kami maaaring tumawag ito first_file, o file_i, anumang nais naming. 713 00:59:32,250 --> 00:59:37,590 At pagkatapos ay ang pangalan ng file ay naipasa sa linya ng command sa program na ito. 714 00:59:37,590 --> 00:59:44,450 Kaya ito na naka-imbak sa argv [i,] at pagkatapos namin ay pagpunta upang buksan ang file na ito sa basahin mode. 715 00:59:44,450 --> 00:59:48,100 Ngayon na iyong binuksan namin ang file, ano ang bagay na lagi naming tandaan na gawin 716 00:59:48,100 --> 00:59:52,230 tuwing namin na binuksan ang file? Itong isara. 717 00:59:52,230 --> 00:59:57,220 Kaya Missy, kung paano namin isara ang isang file? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (file) >> fclose (file). Eksakto. 719 01:00:01,020 --> 01:00:05,340 Mahusay. Okay. Kung titingnan namin sa upang gawin ang komento dito mismo, 720 01:00:05,340 --> 01:00:11,940 sinasabi nito, "Buksan argv [i] at i-print ang mga nilalaman nito sa stdout." 721 01:00:11,940 --> 01:00:15,460 >> Standard out ay kakaiba pangalan. Stdout ay lamang ang aming paraan ng pagsabi 722 01:00:15,460 --> 01:00:22,880 gusto naming upang i-print ang mga ito sa terminal, gusto naming upang i-print ang mga ito sa karaniwang output stream. 723 01:00:22,880 --> 01:00:26,450 Maaari namin ang aktwal na makakuha ng mapupuksa ang komentong ito dito mismo. 724 01:00:26,450 --> 01:00:36,480 Ako pagpunta upang kopyahin ang mga ito at i-paste ito dahil na kung ano ang ginawa namin. 725 01:00:36,480 --> 01:00:41,290 Sa puntong ito, ngayon ay mayroon kaming upang basahin ang mga file na unti-unti. 726 01:00:41,290 --> 01:00:46,300 Tinalakay namin ang ng ilang mga paraan ng pagbabasa ng mga file. 727 01:00:46,300 --> 01:00:51,830 Kung alin ang iyong mga paborito sa ngayon? 728 01:00:51,830 --> 01:00:57,960 Aling mga paraan na nakikita o mo tandaan, upang basahin ang mga file? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Kaya fread ay isa. Jimmy, alam mo ang anumang iba? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No. >> Okay. Nope. Charlotte? Alexander? Anumang iba? Okay. 731 01:01:12,150 --> 01:01:20,740 Kaya ang iba pang mga fgetc, na gagamitin namin ng maraming. 732 01:01:20,740 --> 01:01:26,410 Mayroon ding fscanf; mo guys makita ang isang pattern dito? 733 01:01:26,410 --> 01:01:29,170 Ang lahat ng mga ito ay nagsisimula sa f. Anumang bagay na gawin sa isang file. 734 01:01:29,170 --> 01:01:35,260 Mayroong fread, fgetc, fscanf. Ito ay lahat ng pagbabasa function. 735 01:01:35,260 --> 01:01:49,120 Para sa pagsusulat mayroon kaming fwrite, mayroon kaming fputc sa halip na fgetc. 736 01:01:49,120 --> 01:01:58,250 Din namin na fprintf bang nakita natin sa pagsusulit. 737 01:01:58,250 --> 01:02:01,680 Dahil ito ay isang problema na nagsasangkot pagbabasa mula sa isang file, 738 01:02:01,680 --> 01:02:04,940 kami ay gamitin ang isa sa mga tatlong function. 739 01:02:04,940 --> 01:02:10,890 Hindi namin ay pagpunta sa gamitin ang mga function hanggang dito. 740 01:02:10,890 --> 01:02:14,880 Mga function na ito ay matatagpuan sa standard I / O library. 741 01:02:14,880 --> 01:02:17,510 Kaya't kung tiningnan mo sa tuktok ng programang ito, 742 01:02:17,510 --> 01:02:24,110 maaari mong makita na isinama namin ang header na file para sa standard I / O library. 743 01:02:24,110 --> 01:02:27,120 Kung gusto naming malaman kung saan ang isa gusto naming gamitin, 744 01:02:27,120 --> 01:02:29,690 maaari naming laging buksan ang pahina ng tao. 745 01:02:29,690 --> 01:02:34,350 Kaya maaari naming i-type ang tao stdio 746 01:02:34,350 --> 01:02:43,180 at basahin ang lahat ng tungkol sa stdio input at output function sa C. 747 01:02:43,180 --> 01:02:49,870 At maaari namin na makita oh, hanapin. Ito ay pagbanggit fgetc, ito pagbanggit fputc. 748 01:02:49,870 --> 01:02:57,220 Gayon ay maaari mong mag-drill down ng kaunti at tumingin sa, sabihin nating, fgetc 749 01:02:57,220 --> 01:03:00,060 at tumingin sa kanyang pahina ng tao. 750 01:03:00,060 --> 01:03:03,430 Maaari mong makita ang na ito napupunta kasama ng buong bungkos ng iba pang mga function: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, ay nakakakuha, ungetc, at ang input ng mga character at mga string. 752 01:03:12,640 --> 01:03:19,180 Kaya ito ay kung paano basahin namin sa mga character at mga string mula sa mga file mula sa standard input, 753 01:03:19,180 --> 01:03:21,990 na mahalagang mula sa user. 754 01:03:21,990 --> 01:03:24,780 At ito ay kung paano gawin namin ito sa aktwal C. 755 01:03:24,780 --> 01:03:30,850 Kaya ito ay hindi gumagamit ng ang GetString at GetChar function 756 01:03:30,850 --> 01:03:36,840 na ginamit namin mula sa CS50 library. 757 01:03:36,840 --> 01:03:39,710 Kami ay pagpunta sa gawin ang problemang ito sa dalawang paraan 758 01:03:39,710 --> 01:03:43,430 sa gayon ay maaari mong makita ang dalawang magkaibang mga paraan ng paggawa nito. 759 01:03:43,430 --> 01:03:48,490 Parehong fread function na nabanggit Daniel at fgetc ang mga mahusay na paraan upang gawin ito. 760 01:03:48,490 --> 01:03:53,790 Tingin ko fgetc ng kaunti mas madali, dahil ito lamang ay may, tulad ng nakikita mo, 761 01:03:53,790 --> 01:03:59,660 isang argument, ang FILE * na sinusubukan naming basahin ang karakter mula sa, 762 01:03:59,660 --> 01:04:02,740 at ang ang return halaga nito ay isang int. 763 01:04:02,740 --> 01:04:05,610 At ito ay isang maliit na nakalilito, kanang? 764 01:04:05,610 --> 01:04:11,450 >> Dahil kami ay nakakakuha ng isang character, kaya bakit hindi ang return ito ng pansamantalang trabaho? 765 01:04:11,450 --> 01:04:18,700 Mong guys ay may anumang mga ideya kung bakit hindi ito maaaring magbalik ng pansamantalang trabaho? 766 01:04:18,700 --> 01:04:25,510 [Missy sagot, hindi maintindihan] >> Oo. Kaya Missy lubos na karapatan. 767 01:04:25,510 --> 01:04:31,570 Kung ito ang ASCII, integer na ito ay maaaring mai-map sa isang aktwal na pansamantalang trabaho. 768 01:04:31,570 --> 01:04:33,520 Maaaring maging isang ASCII na character, at na tama. 769 01:04:33,520 --> 01:04:36,220 Iyon ay eksakto kung ano ang nangyayari. 770 01:04:36,220 --> 01:04:39,190 Ginagamit namin isang int lamang dahil ito ay may higit pang mga bit. 771 01:04:39,190 --> 01:04:44,750 Ito ay mas malaki kaysa sa isang pansamantalang trabaho; aming magpasinda lamang ay may 8 bits, na 1 byte sa aming 32-bit na machine. 772 01:04:44,750 --> 01:04:48,520 At int ng lahat ng 4 bytes halaga ng puwang. 773 01:04:48,520 --> 01:04:50,940 At lumiliko ito na ang paraan na ang fgetc gumagana, 774 01:04:50,940 --> 01:04:53,940 kung mag-scroll namin sa aming buod sa pahina ang taong ito ng kaunting, 775 01:04:53,940 --> 01:05:05,000 mag-scroll ang lahat ng mga paraan down. Ito lumiliko out na gamitin nila ang espesyal na halaga na tinatawag na EOF. 776 01:05:05,000 --> 01:05:09,640 Ito ay isang espesyal na pare-pareho ang bilang ang return halaga ng mga function na ang fgetc 777 01:05:09,640 --> 01:05:14,570 tuwing pindutin ang dulo ng file o kung ikaw ay nakakakuha ng error. 778 01:05:14,570 --> 01:05:18,170 At lumiliko ito na upang gawin ang mga paghahambing na ito na may EOF maayos, 779 01:05:18,170 --> 01:05:24,060 gusto mo na ang dagdag na halaga ng impormasyon na mayroon ka sa isang int 780 01:05:24,060 --> 01:05:28,420 kumpara sa gamit ang isang pansamantalang trabaho variable. 781 01:05:28,420 --> 01:05:32,130 Kahit fgetc ay epektibo ng isang character mula sa isang file, 782 01:05:32,130 --> 01:05:38,450 nais mong tandaan na ito ay nagbabalik ng isang bagay na ng uri int sa iyo. 783 01:05:38,450 --> 01:05:41,360 Na sinabi, ito ay medyo madaling gamitin. 784 01:05:41,360 --> 01:05:44,960 Ito ay upang bigyan kami ng isang character, kaya lahat kami ay may sa gawin ay panatilihin ang pagtatanong sa ang file, 785 01:05:44,960 --> 01:05:48,440 "Bigyan mo ako sa susunod na character, ninyo ako sa susunod na character, ninyo ako sa susunod na character," 786 01:05:48,440 --> 01:05:51,400 hanggang sa makuha namin sa dulo ng file. 787 01:05:51,400 --> 01:05:54,730 At iyon ay hilahin sa isang character sa isang oras mula sa aming mga file, 788 01:05:54,730 --> 01:05:56,250 at pagkatapos ay maaari naming gawin ang anumang gusto namin dito. 789 01:05:56,250 --> 01:06:00,160 Maaari kaming mag-imbak ito, maaari naming idagdag ito sa isang string, maaari naming i-print ito. 790 01:06:00,160 --> 01:06:04,630 Gawin ang anumang ng na. 791 01:06:04,630 --> 01:06:09,600 >> Pag-zoom pabalik at pagpunta sa aming cat.c programa, 792 01:06:09,600 --> 01:06:16,170 kung kami ay pagpunta sa gamitin fgetc, 793 01:06:16,170 --> 01:06:21,710 kung paano namin lapitan ang susunod na linya ng code? 794 01:06:21,710 --> 01:06:26,020 Kami ay pagpunta sa gamitin - fread gawin ang isang bagay na bahagyang naiiba. 795 01:06:26,020 --> 01:06:32,600 At oras na ito, lamang kami ay upang gamitin ang fgetc upang makakuha ng isang character sa isang pagkakataon. 796 01:06:32,600 --> 01:06:40,910 Upang maproseso ang isang buong file, kung ano ang maaari naming gawin? 797 01:06:40,910 --> 01:06:44,030 Gaano karaming mga character ay sa isang file? 798 01:06:44,030 --> 01:06:47,390 Mayroong maraming isang. Kaya marahil ay gusto mo upang makakuha ng isa 799 01:06:47,390 --> 01:06:49,860 at pagkatapos ay makakuha ng isa at makakuha ng isa at makakuha ng isa. 800 01:06:49,860 --> 01:06:53,330 Anong uri ng mga algorithm tingin mo maaaring namin upang gamitin dito? 801 01:06:53,330 --> 01:06:55,470 Anong uri ng -? [Alexander] A para sa loop? >> Mismong. 802 01:06:55,470 --> 01:06:57,500 Ang ilang mga uri ng loop. 803 01:06:57,500 --> 01:07:03,380 A para sa loop ay talagang mahusay, sa kasong ito. 804 01:07:03,380 --> 01:07:08,620 At tulad ng ikaw ay sinasabi, ito tunog tulad ng gusto mo ng loop sa ibabaw ng buong file, 805 01:07:08,620 --> 01:07:11,820 ng isang character sa isang pagkakataon. 806 01:07:11,820 --> 01:07:13,850 Anumang mga mungkahi sa kung ano na maaaring magmukhang? 807 01:07:13,850 --> 01:07:22,090 [Alexander, hindi maintindihan] 808 01:07:22,090 --> 01:07:30,050 >> Okay, lamang sabihin sa akin sa Ingles kung ano ang iyong sinusubukang gawin? [Alexander, hindi maintindihan] 809 01:07:30,050 --> 01:07:36,270 Kaya sa kasong ito, ito tunog tulad lamang sinusubukan namin sa loop sa buong file. 810 01:07:36,270 --> 01:07:45,330 [Alexander] Kaya i > Ang laki ng -? 811 01:07:45,330 --> 01:07:49,290 Hulaan ko ang laki ng file, i-right? Ang laki - we'll magsulat lamang ito tulad nito. 812 01:07:49,290 --> 01:07:57,470 Laki ng file para sa oras, i + +. 813 01:07:57,470 --> 01:08:04,610 Kaya ito lumiliko na ang paraan mo ito gamit fgetc, at ito ay bagong, 814 01:08:04,610 --> 01:08:10,460 ay na mayroong walang madaling paraan upang makuha ang laki ng isang file 815 01:08:10,460 --> 01:08:16,979 na may ganitong uri ng "sizeof" bumuo na nakita mo bago. 816 01:08:16,979 --> 01:08:20,910 Kapag ginagamit namin na fgetc function na, ipinapakilala namin ang ilang mga uri ng 817 01:08:20,910 --> 01:08:29,069 bagong, funky na syntax na ito para sa loop, kung saan sa halip ng paggamit lamang ng isang pangunahing counter 818 01:08:29,069 --> 01:08:33,920 pumunta karakter sa pamamagitan ng karakter, kami ay pagpunta sa pull isang character sa isang pagkakataon, 819 01:08:33,920 --> 01:08:37,120 isang character sa isang pagkakataon, at ang paraan na alam namin na hindi namin sa dulo 820 01:08:37,120 --> 01:08:41,290 hindi kapag namin ang binibilang ng isang tiyak na bilang ng mga character, 821 01:08:41,290 --> 01:08:49,939 ngunit kapag ang mga character na hilahin namin ang ay na espesyal na dulo ng file na character. 822 01:08:49,939 --> 01:08:58,689 Upang maaari naming gawin ito sa pamamagitan ng - tawagan ko ito ch, at kami ay pagpunta sa initialize ito 823 01:08:58,689 --> 01:09:08,050 sa aming unang tawag upang makuha ang unang character ng file. 824 01:09:08,050 --> 01:09:14,979 Kaya ito bahagi dito mismo, ito ay upang makakuha ng isang character ng file 825 01:09:14,979 --> 01:09:20,840 at mag-imbak ang mga ito sa variable ch. 826 01:09:20,840 --> 01:09:25,420 Kami ay pagpunta sa patuloy na paggawa nito hanggang sa makuha namin sa dulo ng file, 827 01:09:25,420 --> 01:09:41,170 na aming ginagawa sa pamamagitan ng pagsubok para sa character na hindi katumbas na espesyal na character EOF. 828 01:09:41,170 --> 01:09:48,750 At pagkatapos ay sa halip ng paggawa ch + +, na nais lamang dagdagan ang halaga, 829 01:09:48,750 --> 01:09:52,710 kaya kung binabasa namin ang A ng file, kabisera A, sabihin, 830 01:09:52,710 --> 01:09:56,810 ch + + ay bigyan kami ng b, at gusto namin c at pagkatapos d. 831 01:09:56,810 --> 01:09:59,310 Iyon ay malinaw na hindi kung ano ang gusto namin. Ano ang gusto namin dito 832 01:09:59,310 --> 01:10:05,830 sa huling sandali ay gusto naming makuha ang susunod na character mula sa file. 833 01:10:05,830 --> 01:10:09,500 >> Kaya kung paano namin makuha ang susunod na character mula sa file? 834 01:10:09,500 --> 01:10:13,470 Paano kami makakuha ng unang character mula sa file? 835 01:10:13,470 --> 01:10:17,200 [Mag-aaral] fgetfile? >> Fgetc, o, paumanhin, ay lubos na karapatan. 836 01:10:17,200 --> 01:10:20,470 Maling nabaybay ko ito doon. Kaya oo. 837 01:10:20,470 --> 01:10:26,240 Dito sa halip ng paggawa ch + +, 838 01:10:26,240 --> 01:10:29,560 lang kami tawagan fgetc (file) muli 839 01:10:29,560 --> 01:10:39,180 at mag-imbak ang mga resulta sa aming parehong variable ch. 840 01:10:39,180 --> 01:10:43,730 [Estudyante tanong, hindi maintindihan] 841 01:10:43,730 --> 01:10:52,390 >> Ito ay kung saan ang mga FILE * guys mga espesyal na. 842 01:10:52,390 --> 01:10:59,070 Ang paraan na gumagana ang mga iyon sila - noong una mong buksan - noong una mong gumawa na fopen tawag, 843 01:10:59,070 --> 01:11:04,260 ang FILE * epektibo nagsisilbing bilang isang pointer sa simula ng file. 844 01:11:04,260 --> 01:11:12,830 At pagkatapos ay sa bawat oras na tawagan ka fgetc, gumagalaw isang character sa pamamagitan ng file. 845 01:11:12,830 --> 01:11:23,280 Kaya kapag Tinatawag mo ito, ikaw ay ng incrementing ang file pointer sa pamamagitan ng isang character. 846 01:11:23,280 --> 01:11:26,210 At kapag fgetc ka muli, ikaw ay gumagalaw ito sa isa pang character na 847 01:11:26,210 --> 01:11:28,910 at ibang character at ibang character at isa pang character na. 848 01:11:28,910 --> 01:11:32,030 [Estudyante tanong, hindi maintindihan] >> At that's - oo. 849 01:11:32,030 --> 01:11:34,810 Ito ay uri ng magic na ito sa ilalim ng hood. 850 01:11:34,810 --> 01:11:37,930 Mo lamang panatilihin ang incrementing sa pamamagitan ng. 851 01:11:37,930 --> 01:11:46,510 Sa puntong ito, hindi mo aktwal na gumagana sa isang character. 852 01:11:46,510 --> 01:11:52,150 Kaya kung paano namin i-print ito sa screen, ngayon? 853 01:11:52,150 --> 01:11:58,340 Maaari naming gamitin ang parehong printf bagay na ginamit namin bago. 854 01:11:58,340 --> 01:12:00,330 Na ginagamit namin ang lahat ng semestre. 855 01:12:00,330 --> 01:12:05,450 Maaari naming tawagan printf, 856 01:12:05,450 --> 01:12:21,300 at maaari naming pumasa sa ang mga character na katulad nito. 857 01:12:21,300 --> 01:12:27,430 Ang isa pang paraan upang gawin ito ay sa halip na gamitin ang printf at upang gawin ito format string, 858 01:12:27,430 --> 01:12:29,490 Maaari rin naming gamitin ang isa sa mga iba pang mga function. 859 01:12:29,490 --> 01:12:40,090 Maaari naming gamitin ang fputc, na mga Kopya ng character sa screen, 860 01:12:40,090 --> 01:12:52,580 maliban kung tinitingnan namin ang fputc - hayaan mo akong mag-zoom out ng kaunti. 861 01:12:52,580 --> 01:12:56,430 Nakikita namin kung ano ang magaling ay tumatagal sa karakter na binabasa namin ang paggamit ng fgetc, 862 01:12:56,430 --> 01:13:05,100 ngunit pagkatapos ay mayroon kaming upang bigyan ito ng isang stream upang i-print. 863 01:13:05,100 --> 01:13:11,850 Maaari din naming gamitin ang putchar function, na kung saan ay ilagay direkta sa pamantayan out. 864 01:13:11,850 --> 01:13:16,070 Kaya may isang buong grupo ng mga iba't ibang mga pagpipilian na maaari naming gamitin para sa pag-print. 865 01:13:16,070 --> 01:13:19,580 Ang mga ito ay lahat sa standard I / O library. 866 01:13:19,580 --> 01:13:25,150 Kahit kailan mo gusto upang i-print - kaya printf, sa pamamagitan ng default, ang mag-print sa espesyal na pamantayan out stream, 867 01:13:25,150 --> 01:13:27,910 na stdout na. 868 01:13:27,910 --> 01:13:41,300 Upang maaari naming lamang sumangguni sa ito bilang uri ng ito magic na halaga, stdout in dito. 869 01:13:41,300 --> 01:13:48,410 Oops. Ilagay ang semicolon sa labas. 870 01:13:48,410 --> 01:13:52,790 >> Ito ay isang maraming bagong, funky impormasyon sa dito. 871 01:13:52,790 --> 01:13:58,600 Isang maraming ng mga ito ay masyadong pansalitain, sa kamalayan na ito ay code 872 01:13:58,600 --> 01:14:05,700 na nakasulat sa ganitong paraan dahil lang sa ito ang malinis na basahin, madaling basahin. 873 01:14:05,700 --> 01:14:11,520 Mayroong maraming iba't ibang mga paraan upang gawin ito, maraming iba't ibang mga function na maaari mong gamitin, 874 01:14:11,520 --> 01:14:14,680 ngunit may posibilidad namin upang sundin lamang ang mga parehong pattern ng paulit-ulit. 875 01:14:14,680 --> 01:14:20,180 Kaya huwag magulat kung makakita ka ng code tulad nito paparating na muli at muli. 876 01:14:20,180 --> 01:14:25,690 Ayos lang. Sa puntong ito, kailangan naming buksan para sa araw. 877 01:14:25,690 --> 01:14:31,300 Salamat para sa darating na. Salamat para sa panonood kung online ka. At kami na nakikita mo sa susunod na linggo. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]