1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [PJESA 5: PAK rehatshme] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Universiteti i Harvardit] 3 00:00:05,180 --> 00:00:08,260 [Kjo është CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Pra, të mirëpritur mbrapa, djema. 5 00:00:11,690 --> 00:00:16,320 Mirë se vini në nenin 5. 6 00:00:16,320 --> 00:00:20,220 Në këtë pikë, ka përfunduar quiz 0 dhe duke parë se si ju keni bërë, 7 00:00:20,220 --> 00:00:25,770 shpresojmë se ju ndiheni me të vërtetë e mirë, sepse unë kam qenë shumë i impresionuar nga rezultatet në këtë seksion. 8 00:00:25,770 --> 00:00:28,050 Për shikuesit tanë online, ne kemi pasur disa pyetje 9 00:00:28,050 --> 00:00:33,680 rreth dy problemet e fundit në grupin problemit - ose në quiz, në vend. 10 00:00:33,680 --> 00:00:39,690 Pra, ne jemi duke shkuar për të shkuar mbi ata me të vërtetë shpejt në mënyrë që të gjithë e sheh se çfarë ka ndodhur 11 00:00:39,690 --> 00:00:45,060 dhe si për të shkuar nëpërmjet zgjidhjes aktuale në vend se vetëm shikimin zgjidhje vetë. 12 00:00:45,060 --> 00:00:50,330 Ne jemi duke shkuar për të shkuar mbi dy të fundit problemet e vërtetë shpejt, 32 dhe 33. 13 00:00:50,330 --> 00:00:53,240 Vetëm, përsëri, në mënyrë që shikuesit online mund të shihni këtë. 14 00:00:53,240 --> 00:00:59,080 >> Nëse ju të kthehet për problemin tuaj 32, e cila është në faqen 13, 15 00:00:59,080 --> 00:01:02,730 13 nga 16, 32 Problemi është mbi të gjitha këmbime. 16 00:01:02,730 --> 00:01:05,010 Kjo ishte e gjitha rreth shkëmbejnë dy integers. 17 00:01:05,010 --> 00:01:08,740 Është problem që kishim shkuar mbi disa herë në leksion. 18 00:01:08,740 --> 00:01:13,590 Dhe këtu, ajo që ne kemi qenë duke kërkuar që ju të bëni është një gjurmë të shpejtë kujtesës. 19 00:01:13,590 --> 00:01:17,000 Për të plotësuar në vlerat e variablave si ata janë në rafte 20 00:01:17,000 --> 00:01:20,250 si kodi kalon nëpër këtë funksion swap. 21 00:01:20,250 --> 00:01:24,500 Në veçanti, ajo që ne jemi duke kërkuar në - Jam duke shkuar për të vënë këtë iPad poshtë - 22 00:01:24,500 --> 00:01:29,650 në veçanti, atë që ne jemi duke kërkuar në është kjo linjë numëruar 6 të drejtë këtu. 23 00:01:29,650 --> 00:01:36,740 Dhe kjo është numëruar 6 për vetëm vazhdimësia me problemin e mëparshëm. 24 00:01:36,740 --> 00:01:41,720 Ajo që ne duam të bëjmë është shfaqur apo emërtim gjendjen e kujtesës 25 00:01:41,720 --> 00:01:46,090 si ajo është në kohën kur ne të ekzekutuar këtë numër linjës 6, 26 00:01:46,090 --> 00:01:52,540 e cila është në mënyrë efektive një kthim nga funksioni tonë swap drejtë këtu. 27 00:01:52,540 --> 00:01:59,450 Nëse ne lëvizni poshtë këtu, pamë se adresat e çdo gjë në memorie është dhënë për ne. 28 00:01:59,450 --> 00:02:02,540 Kjo është shumë e rëndësishme, ne do të kthehemi në të vetëm në një moment. 29 00:02:02,540 --> 00:02:09,240 Dhe pastaj këtu poshtë në fund, kemi pasur një diagram pak memorie që ne jemi duke shkuar për t'iu referuar. 30 00:02:09,240 --> 00:02:12,490 Unë kam bërë këtë në fakt jashtë në iPad tim. 31 00:02:12,490 --> 00:02:20,720 Kështu që unë jam duke shkuar për alternative mbrapa me radhë dhe në mes të iPad dhe këtë kod vetëm për referencë. 32 00:02:20,720 --> 00:02:26,540 >> Le të fillojë. Së pari, le të përqëndrohet në të parë disa linjave të kryesore të drejtë këtu. 33 00:02:26,540 --> 00:02:30,220 Për të filluar, ne jemi duke shkuar për të nisja x dhe y në 1 me 2. 34 00:02:30,220 --> 00:02:33,040 Pra, ne kemi dy variablave numër i plotë, ata të dy do të vendosen në rafte. 35 00:02:33,040 --> 00:02:36,050 Ne jemi duke shkuar për të vënë një 1 dhe një 2 në to. 36 00:02:36,050 --> 00:02:43,150 Pra, nëse unë rrokullisje mbi të iPad tim, me shpresë, le të shohim - 37 00:02:43,150 --> 00:02:48,660 Apple mirroring TV, dhe aty ne do të shkojmë. Rregull. 38 00:02:48,660 --> 00:02:51,670 Pra, nëse unë rrokullisje mbi të iPad tim, 39 00:02:51,670 --> 00:02:56,220 Unë dua të nisja x dhe y në 1 me 2. 40 00:02:56,220 --> 00:03:00,580 Ne e bëjmë se thjesht duke shkruar një 1 në kutinë e shënuar x 41 00:03:00,580 --> 00:03:07,730 dhe një 2 në kutinë shënuar y. Mjaft e thjeshtë. 42 00:03:07,730 --> 00:03:11,620 Pra, tani le të kthehemi në laptopë, shikoni se çfarë ndodh më pas. 43 00:03:11,620 --> 00:03:15,810 Pra, kjo linjë tjetër është ajo ku gjërat ndërlikuar. 44 00:03:15,810 --> 00:03:28,110 Ne kalojnë adresën e x dhe y adresën e si parametrat a dhe b në funksion swap. 45 00:03:28,110 --> 00:03:32,380 Adresa e x dhe adresa e y janë gjëra që ne nuk mund të llogarisim 46 00:03:32,380 --> 00:03:36,360 pa iu referuar këtyre plumb tregon drejtë këtu poshtë. 47 00:03:36,360 --> 00:03:39,750 Dhe për fat të mirë, para dy pika plumb na tregoni saktësisht se çfarë janë përgjigjet. 48 00:03:39,750 --> 00:03:44,740 Adresa e x në memorie është 10, dhe adresa e y në memorie është 14. 49 00:03:44,740 --> 00:03:51,870 Pra, ato janë vlerat që të merrni kaluar si a dhe b të lartë deri në funksionin tonë swap. 50 00:03:51,870 --> 00:04:00,760 Pra, përsëri, switching back to diagramin tonë, unë mund të shkruaj një 10 në një 51 00:04:00,760 --> 00:04:07,400 dhe një 14 në b. 52 00:04:07,400 --> 00:04:11,610 Tani, kjo pikë është vendi ku ne të vazhdojë me swap. 53 00:04:11,610 --> 00:04:14,520 Pra Flipping përsëri në laptop përsëri, 54 00:04:14,520 --> 00:04:21,079 ne shohim se mënyra swap punon është që unë dereference parë një dyqan dhe rezultati në tmp. 55 00:04:21,079 --> 00:04:27,650 Pra, operatori dereference thotë: "Hey. Treat përmbajtjen e ndryshueshme si një një adresë. 56 00:04:27,650 --> 00:04:33,830 Shko tek çdo gjë është ruajtur në atë adresë, dhe ngarkesës atë. " 57 00:04:33,830 --> 00:04:41,720 Çfarë ju ngarkesës nga variabli do të ruhen në ndryshore tonë tmp. 58 00:04:41,720 --> 00:04:45,150 Flipping përsëri në iPad. 59 00:04:45,150 --> 00:04:51,690 Nëse ne do të shkojmë për të adresuar 10, ne e dimë se adresa është 10 x varible 60 00:04:51,690 --> 00:04:55,480 sepse na u tha nga pikëpamja jonë plumb se adresa e x në memorie është 10. 61 00:04:55,480 --> 00:05:00,180 Kështu që ne mund të shkojnë atje, të marrë vlerën e saj, e cila është 1, siç shohim në iPad tonë, 62 00:05:00,180 --> 00:05:06,300 dhe ngarkesës që në tmp. 63 00:05:06,300 --> 00:05:08,250 Përsëri, kjo nuk është përmbajtjen përfundimtare. 64 00:05:08,250 --> 00:05:14,350 Ne jemi duke shkuar për të ecin nëpër dhe ne do të merrni për shtetin tonë final të programit në fund. 65 00:05:14,350 --> 00:05:17,210 Por tani, ne kemi vlerën 1 depozituara në tmp. 66 00:05:17,210 --> 00:05:19,210 >> Dhe ka një pyetje të shpejtë gjatë këtu. 67 00:05:19,210 --> 00:05:23,980 [Aleksandër] është operatori dereference - që është vetëm e drejta yll në frontin e ndryshueshme? 68 00:05:23,980 --> 00:05:27,600 Po >>. Pra, operatori dereference, si ne rrokullisje prapa në laptopë tonë edhe një herë, 69 00:05:27,600 --> 00:05:33,780 është ky yll e drejtë përpara. 70 00:05:33,780 --> 00:05:37,460 Në këtë kuptim, ai është - ju ballafaqojnë atë me operatorin shumëzimit 71 00:05:37,460 --> 00:05:42,400 që kërkon dy gjëra; operatori dereference është një operator unary. 72 00:05:42,400 --> 00:05:46,130 Aplikohet vetëm për një vlerë në krahasim me një operator binar, 73 00:05:46,130 --> 00:05:48,810 ku ju aplikoni për dy vlera të ndryshme. 74 00:05:48,810 --> 00:05:52,080 Pra, kjo është ajo që ndodh në këtë linjë. 75 00:05:52,080 --> 00:05:58,390 Ne ngarkuar vlerën 1 dhe ruajtur atë në ndryshore integer përkohshëm tonë. 76 00:05:58,390 --> 00:06:05,800 Linja tjetër, ne të ruajtur përmbajtjen e B në - 77 00:06:05,800 --> 00:06:12,630 ose, përkundrazi, kemi të ruajtur përmbajtjen që është treguar në b në vendin ku është treguar për të. 78 00:06:12,630 --> 00:06:17,690 Nëse analizojmë këtë nga e djathta në të majtë, ne jemi duke shkuar për të b dereference, 79 00:06:17,690 --> 00:06:23,580 ne jemi duke shkuar për të adresuar 14, ne jemi duke shkuar për të rrëmbyer integer që është atje, 80 00:06:23,580 --> 00:06:26,900 dhe pastaj ne do të shkojnë në adresën 10, 81 00:06:26,900 --> 00:06:34,240 dhe ne do të hedhin rezultatin e dereference tonë të b në atë hapësirë. 82 00:06:34,240 --> 00:06:40,080 Flipping përsëri në iPad tonë, ku ne mund të bëjë këtë një pak më konkret, 83 00:06:40,080 --> 00:06:44,070 ajo mund të ndihmojë në qoftë se unë shkruaj numrat në të gjitha adresat këtu. 84 00:06:44,070 --> 00:06:53,820 Kështu që ne e dimë se në y, ne jemi në adresën 14, x është në adresën 10. 85 00:06:53,820 --> 00:07:00,180 Kur ne të fillojë në b, b dereference ne, ne jemi duke shkuar për të rrëmbyer vlerën 2. 86 00:07:00,180 --> 00:07:08,320 Ne jemi duke shkuar për të rrëmbyer këtë vlerë, sepse kjo është vlera që jeton në adresën 14. 87 00:07:08,320 --> 00:07:15,700 Dhe ne jemi duke shkuar për të vënë atë në ndryshore që jeton në adresën 10, 88 00:07:15,700 --> 00:07:19,160 që është e drejtë atje, që korrespondon me x tona ndryshueshme. 89 00:07:19,160 --> 00:07:21,810 Kështu që ne mund të bëjmë pak overwriting këtu 90 00:07:21,810 --> 00:07:35,380 ku ne të shpëtoj prej 1 tonë dhe në vend të kësaj ne kemi shkruar një 2. 91 00:07:35,380 --> 00:07:39,560 Kështu që të gjithë është mirë dhe të mirë në botë, edhe pse ne kemi x overwritten tani. 92 00:07:39,560 --> 00:07:44,890 Ne kemi ruajtur vlerën e vjetër x në ndryshore tonë tmp. 93 00:07:44,890 --> 00:07:50,210 Kështu që ne mund të përfunduar swap me linjë tjetër. 94 00:07:50,210 --> 00:07:53,030 Flipping kthehet në laptopë tonë. 95 00:07:53,030 --> 00:07:58,150 Tani të gjitha që mbetet është për të marrë përmbajtjen nga variable të përkohshëm tonë integer 96 00:07:58,150 --> 00:08:05,630 dhe ruajtur ato në ndryshore që jeton në adresën që po mban b. 97 00:08:05,630 --> 00:08:10,230 Kështu që ne jemi duke shkuar për të në mënyrë efektive b dereference për të marrë qasje në të ndryshueshme 98 00:08:10,230 --> 00:08:14,340 që është në adresën që b mban në të, 99 00:08:14,340 --> 00:08:19,190 dhe ne jemi duke shkuar për sende vlerën që tmp po mban në të. 100 00:08:19,190 --> 00:08:23,280 Flipping përsëri në iPad herë më shumë. 101 00:08:23,280 --> 00:08:31,290 Unë mund të fshihet këtë vlerë këtu, 2, 102 00:08:31,290 --> 00:08:41,010 dhe në vend të ne do të kopje të drejtën 1 në të. 103 00:08:41,010 --> 00:08:43,059 Pastaj linjë tjetër që ekzekuton, natyrisht - 104 00:08:43,059 --> 00:08:47,150 në qoftë se ne rrokullisje prapa në laptopë - kjo është 6 pikë, 105 00:08:47,150 --> 00:08:52,500 e cila është pika në të cilën ne kemi dashur që të kemi diagramin tonë plotësuar tërësisht. 106 00:08:52,500 --> 00:08:58,940 Pra Flipping përsëri në iPad herë më shumë, vetëm kështu që ju mund të shihni diagramin e kompletuar, 107 00:08:58,940 --> 00:09:06,610 ju mund të shihni se ne kemi një 10 në një, një 14 në B, një 1 në tmp, një 2 në x dhe y në një 1. 108 00:09:06,610 --> 00:09:11,000 A ka ndonjë pyetje në lidhje me këtë? 109 00:09:11,000 --> 00:09:14,640 A ka kjo të bëjë më shumë kuptim, duke ecur nëpër atë? 110 00:09:14,640 --> 00:09:24,850 Kuptim pak? Shpresojmë se jo. Rregull. 111 00:09:24,850 --> 00:09:28,230 >> Pointers janë një subjekt shumë i ndërlikuar. 112 00:09:28,230 --> 00:09:33,420 Një nga djemtë e ne punojmë me ka një thënie shumë të përbashkët: 113 00:09:33,420 --> 00:09:36,590 "Për të kuptuar pointers, ju duhet së pari të kuptojnë pointers." 114 00:09:36,590 --> 00:09:40,530 Të cilat unë mendoj se është shumë e vërtetë. Ajo ka marrë një kohë për të marrë të përdoret për të. 115 00:09:40,530 --> 00:09:45,360 Tërhequr shumë foto, shumë e tërhequr diagramet kujtesës si ky janë shumë të dobishme, 116 00:09:45,360 --> 00:09:49,480 dhe pasi ju ecni nëpër shembull pas shembull pas shembull, 117 00:09:49,480 --> 00:09:54,450 ajo do të fillojë të bëjë kuptim pak më shumë dhe ndjenjë pak më shumë dhe një ndjenjë pak më shumë. 118 00:09:54,450 --> 00:10:01,560 Së fundi, një ditë, ju do të keni të gjitha zotëruar plotësisht. 119 00:10:01,560 --> 00:10:13,800 Çdo pyetje para se të lëvizin për në problemin e ardhshëm? Dakord. 120 00:10:13,800 --> 00:10:18,840 Pra, rrokullisje prapa në laptopë. 121 00:10:18,840 --> 00:10:23,300 Problemi tjetër që kemi është problemi numër 33 në dosje I / O. 122 00:10:23,300 --> 00:10:26,350 Zoom në për këtë pak pak. 123 00:10:26,350 --> 00:10:28,710 Problemi 33 - Po? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Unë vetëm kishte një pyetje të shpejtë. Kjo yll, ose yll, 125 00:10:32,110 --> 00:10:35,590 ajo që quhet dereferencing kur ju përdorni një yll më parë. 126 00:10:35,590 --> 00:10:38,820 Çfarë është kjo quhet kur ju përdorni ampersand para? 127 00:10:38,820 --> 00:10:43,140 >> Me simbol para është adresa e operatorit-. 128 00:10:43,140 --> 00:10:45,880 Pra, le të shkoni back up. 129 00:10:45,880 --> 00:10:49,310 Oops. Unë jam në mënyrë të zoom kështu që unë nuk mund të vërtetë rrotull. 130 00:10:49,310 --> 00:10:52,780 Nëse ne shikojmë në këtë kod të vërtetë shpejt drejtë këtu, 131 00:10:52,780 --> 00:10:54,980 përsëri, e njëjta gjë ndodh. 132 00:10:54,980 --> 00:10:59,180 Nëse ne shikojmë në këtë kod të drejtë këtu, në këtë linjë, ku ne bëjmë thirrje të bie në ujdi, 133 00:10:59,180 --> 00:11:10,460 the simbol është vetëm duke thënë se "të marrë adresën në të cilën jeton ndryshueshme x." 134 00:11:10,460 --> 00:11:14,460 Kur compiler tuaj harton kodin tuaj, 135 00:11:14,460 --> 00:11:20,590 ajo ka që në fakt fizikisht shënuar nga një vend në kujtesën për të gjithë variablat tuaja të jetojnë. 136 00:11:20,590 --> 00:11:24,910 Dhe kështu çfarë përpiluesit pastaj mund të bëni një herë se është përpiluar gjithçka, 137 00:11:24,910 --> 00:11:31,110 ai e di, "Oh, kam vënë në adresën x 10. kam vënë në adresën y 14". 138 00:11:31,110 --> 00:11:34,640 Kjo pastaj mund të plotësoni në këto vlera për ju. 139 00:11:34,640 --> 00:11:44,740 Kështu që ju mund pastaj - kjo pastaj mund të kalojë këtë në dhe të kalojë në & Y si. 140 00:11:44,740 --> 00:11:50,730 Këta njerëz të marrë adresën, por ata gjithashtu, kur ju të kalojë ato në funksion swap, 141 00:11:50,730 --> 00:11:55,690 ky informacion lloji, kjo * int drejtë këtu, tregon përpilues, 142 00:11:55,690 --> 00:12:01,350 "Mirë, ne jemi duke shkuar për të interpretuar këtë adresë si një adresë e një ndryshore integer." 143 00:12:01,350 --> 00:12:05,900 Si një adresë të një int, e cila është e ndryshme nga adresa e një variable karakter 144 00:12:05,900 --> 00:12:09,930 sepse një int merr, në një makinë 32-bit, merr 4 bytes e hapësirës, 145 00:12:09,930 --> 00:12:13,310 ndërsa një karakter të vetëm merr 1 bajt hapësirë. 146 00:12:13,310 --> 00:12:17,310 Kështu që është e rëndësishme të dini edhe atë që është - çfarë jeton, çfarë lloji të vlerës 147 00:12:17,310 --> 00:12:20,340 është duke jetuar në adresën që u miratua in 148 00:12:20,340 --> 00:12:22,020 Ose adresën që ju jeni që kanë të bëjnë me të. 149 00:12:22,020 --> 00:12:29,020 Në këtë mënyrë, ju e dini se sa bytes i informacionit të vërtetë ngarkesës nga RAM tuaj. 150 00:12:29,020 --> 00:12:31,780 Dhe pastaj, po, ky operator dereference, si ju janë kërkuar, 151 00:12:31,780 --> 00:12:37,200 shkon dhe accesses informacion në një adresë të veçantë. 152 00:12:37,200 --> 00:12:42,820 Pra, ajo thotë se, me këtë variabël një këtu, trajtojnë përmbajtjen e një si një adresë, 153 00:12:42,820 --> 00:12:47,880 shkojnë në atë adresë, dhe tërheq jashtë, ngarkesës në procesor, ngarkesës në një regjistër 154 00:12:47,880 --> 00:12:56,340 vlerat aktuale apo përmbajtjet që jetojnë në atë adresë. 155 00:12:56,340 --> 00:12:59,620 Më pyetje? Këto janë pyetje të mira. 156 00:12:59,620 --> 00:13:01,650 Kjo është një shumë e terminologjisë së re shumë. 157 00:13:01,650 --> 00:13:09,800 Është gjithashtu lloj i shokuar, duke parë dhe dhe * në vende të ndryshme. 158 00:13:09,800 --> 00:13:13,180 >> Dakord. 159 00:13:13,180 --> 00:13:18,530 Pra, përsëri për problemin e 33, të paraqesë I / O. 160 00:13:18,530 --> 00:13:22,540 Kjo ishte një nga ato probleme që unë mendoj se disa gjëra të ndodhur. 161 00:13:22,540 --> 00:13:25,400 Një, kjo është një temë mjaft e re. 162 00:13:25,400 --> 00:13:30,590 Ajo u paraqit shumë shpejt para quiz, 163 00:13:30,590 --> 00:13:33,400 dhe atëherë unë mendoj se kjo ishte një lloj si një nga ato problemet e fjalës në matematikë 164 00:13:33,400 --> 00:13:39,720 ku ata të ju jap një shumë informacion, por ju në fakt nuk do të përfundojnë që të përdorni një ton të saj. 165 00:13:39,720 --> 00:13:44,060 Pjesa e parë e këtij problemi është e përshkruar atë një file CSV është. 166 00:13:44,060 --> 00:13:50,620 Tani, një CSV, sipas përshkrimit, është një presje-të ndara vlerat skedar. 167 00:13:50,620 --> 00:13:55,300 Arsyeja këto janë aspak interesante, dhe arsyeja ndonjëherë ju përdorni ato, 168 00:13:55,300 --> 00:14:00,800 po, sepse, si shumë prej jush e kanë përdorur ndonjëherë gjëra si Excel? 169 00:14:00,800 --> 00:14:03,240 Figura shumica prej jush kanë, ndoshta, ose do të përdorë në një pikë në jetën tuaj. 170 00:14:03,240 --> 00:14:06,430 Ju do të përdorni diçka si Excel. 171 00:14:06,430 --> 00:14:10,940 Në mënyrë për të marrë të dhënat nga një Excel spreadsheet ose të bëjë çdo lloj të përpunimit me të, 172 00:14:10,940 --> 00:14:17,240 në qoftë se ju të kërkuar për të shkruar një program C ose program Python, Java programin, 173 00:14:17,240 --> 00:14:20,070 për t'u marrë me të dhënat që ju keni ruajtur në atje, 174 00:14:20,070 --> 00:14:23,170 një nga mënyrat më të zakonshme për të marrë atë jashtë është në një skedar CSV. 175 00:14:23,170 --> 00:14:26,850 Dhe ju mund të hapur deri Excel dhe kur ju shkoni në 'Ruaje Si' dialog, 176 00:14:26,850 --> 00:14:32,840 ju mund të merrni nga një file CSV aktuale. 177 00:14:32,840 --> 00:14:35,890 >> Dobishëm për të dini se si të merren me këto gjëra. 178 00:14:35,890 --> 00:14:42,010 Mënyra se si punon është se ajo është e ngjashme me - Unë do të thotë, kjo është në thelb imituar një spreadsheet, 179 00:14:42,010 --> 00:14:47,590 ku, si ne shohim këtu, në pjesë shumë të la-më, 180 00:14:47,590 --> 00:14:49,910 ne kemi të gjitha emrat e fundit. 181 00:14:49,910 --> 00:14:54,670 Pra, ne kemi Malan, atëherë Hardison, dhe pastaj Bowden, MacWilliam, dhe pastaj Chan. 182 00:14:54,670 --> 00:14:59,470 Të gjithë emrat e fundit. Dhe pastaj një presje ndan emrat e fundit nga emrat e parë. 183 00:14:59,470 --> 00:15:02,970 David, Nate, Rob, Tommy, dhe Zamyla. 184 00:15:02,970 --> 00:15:06,850 Unë gjithmonë përzierje deri Robby dhe Tom. 185 00:15:06,850 --> 00:15:10,940 Dhe pastaj, në fund, kolona e tretë është adresa e-mail. 186 00:15:10,940 --> 00:15:18,500 Pasi ju e kuptoni se, pjesa tjetër e programit është mjaft i hapur për të zbatuar. 187 00:15:18,500 --> 00:15:23,850 Ajo që ne kemi bërë në mënyrë që të imitoj këtë strukturë të njëjtë në C programin tonë 188 00:15:23,850 --> 00:15:27,510 po ne kemi përdorur një strukturë. 189 00:15:27,510 --> 00:15:30,520 Ne do të fillojnë të luajnë me këto pak më të mirë. 190 00:15:30,520 --> 00:15:35,790 Ne pamë ata për pak pare pak në grup Problem 3, kur ne u që kanë të bëjnë me fjalorë. 191 00:15:35,790 --> 00:15:40,290 Por kjo struct stafi ruan një mbiemër, një emër i parë, dhe një email. 192 00:15:40,290 --> 00:15:44,500 Ashtu si CSV dosjen tonë është ruajtur. 193 00:15:44,500 --> 00:15:47,950 Pra, kjo është vetëm konvertimin nga një formë në një tjetër. 194 00:15:47,950 --> 00:15:54,630 Ne kemi për të kthyer, në këtë rast, një struct stafit në një linjë, 195 00:15:54,630 --> 00:15:59,060 një presje-të ndara line, ashtu si kjo. 196 00:15:59,060 --> 00:16:01,500 Bën që të bëjnë kuptim? Ju djema kanë marrë të gjitha quiz, 197 00:16:01,500 --> 00:16:07,680 kështu që unë imagjinoni ju keni të paktën pasur disa kohë për të menduar për këtë. 198 00:16:07,680 --> 00:16:16,410 >> Në funksion qira, problemi na kërkon të marrë në - zoom në në këtë we'll pak pak - 199 00:16:16,410 --> 00:16:22,480 marrë në një strukturë stafit, një struct stafi, me emrin s, 200 00:16:22,480 --> 00:16:30,900 append dhe përmbajtjen e saj të staff.csv dosjen tonë. 201 00:16:30,900 --> 00:16:34,230 Ajo rezulton se kjo është mjaft e lehtë për t'u përdorur. 202 00:16:34,230 --> 00:16:37,430 Ne do lloj të luajnë rreth me këto funksione sot pak më shumë. 203 00:16:37,430 --> 00:16:44,510 Por në këtë rast, funksioni fprintf është me të vërtetë kyç. 204 00:16:44,510 --> 00:16:51,960 Pra, me fprintf, ne mund të shtypura, ashtu si ju djema kanë qenë duke përdorur printf termin këtë tërë. 205 00:16:51,960 --> 00:16:55,050 Ju mund printf një vijë në një skedar. 206 00:16:55,050 --> 00:16:59,030 Pra, në vend të vetëm duke bërë thirrje zakonshme printf ku ju jepni atë string format 207 00:16:59,030 --> 00:17:05,380 dhe pastaj ju zëvendësojë të gjitha ndryshoret me argumentet e mëposhtme, 208 00:17:05,380 --> 00:17:11,290 me fprintf, argumenti juaj i parë është vend file qe doni te shkruani. 209 00:17:11,290 --> 00:17:21,170 Nëse ne do të shikojmë në këtë në aplikim, për shembull, njeriu fprintf, 210 00:17:21,170 --> 00:17:25,980 ne mund të shohim dallimin në mes printf dhe fprintf. 211 00:17:25,980 --> 00:17:28,960 Unë do të zoom në këtu pak. 212 00:17:28,960 --> 00:17:33,140 Pra, me printf, ne t'i jepte një varg format, dhe pastaj argumentet pasuese 213 00:17:33,140 --> 00:17:37,580 janë të gjitha variablat për zëvendësimin ose zëvendësimit në vargun tonë format. 214 00:17:37,580 --> 00:17:47,310 Ndërsa me fprintf, argumenti i parë është me të vërtetë këtë file i quajtur * një lumë. 215 00:17:47,310 --> 00:17:51,800 >> Lëviz përsëri mbi këtu për qira tonë, 216 00:17:51,800 --> 00:17:54,550 ne kemi marrë tashmë * ynë fotografi lumë hapur për ne. 217 00:17:54,550 --> 00:17:57,810 Kjo është ajo që kjo linjë të parë e bën, ajo hap dosjen staff.csv, 218 00:17:57,810 --> 00:18:01,690 ajo hapet append atë në mënyrë, dhe të gjithë që e la për ne të bëjmë është 219 00:18:01,690 --> 00:18:08,640 shkruani strukturën e stafit në dosjen. 220 00:18:08,640 --> 00:18:10,870 Dhe, le të shohim, nuk dua të përdorni iPad? 221 00:18:10,870 --> 00:18:17,900 Unë do të përdorin iPad. Ne kemi zbrazëti - le të vënë këtë në tryezë në mënyrë që unë mund të shkruaj pak më të mirë - 222 00:18:17,900 --> 00:18:33,680 pavlefshëm me qira dhe ajo merr në një argument, një strukturë të quajtur stafit s. 223 00:18:33,680 --> 00:18:44,120 Mori formatimin e teksteve tona, ne kemi marrë * fotografisë tonë quajtur file, 224 00:18:44,120 --> 00:18:48,380 ne kemi linjë tonë fopen dhënë për ne, 225 00:18:48,380 --> 00:18:51,890 dhe unë do të shkruani vetëm atë si pika pasi ajo është tashmë në pedia. 226 00:18:51,890 --> 00:19:00,530 Dhe pastaj në linjë tonë të ardhshëm, ne jemi duke shkuar për të bërë një telefonatë të fprintf 227 00:19:00,530 --> 00:19:03,700 dhe ne jemi duke shkuar për të kaluar në dosjen që ne duam të shkruar për të, 228 00:19:03,700 --> 00:19:10,290 dhe pastaj string format tona, të cilat - 229 00:19:10,290 --> 00:19:14,300 Unë do të le ju djema thoni se çfarë ajo duket si. 230 00:19:14,300 --> 00:19:20,500 Si në lidhje me ju, Stella? A e dini se çfarë Pjesa e parë e vargut format duket si? 231 00:19:20,500 --> 00:19:24,270 [Stella] Unë nuk jam i sigurt. >> Mos ngurroni të pyesni Jimmy. 232 00:19:24,270 --> 00:19:27,690 A e dini, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] A do të jetë vetëm i fundit? Nuk e di. Unë nuk jam plotësisht i sigurt. 234 00:19:31,000 --> 00:19:39,020 Mirë >>. Si rreth, bëri dikush të marrë kjo e saktë në provim? 235 00:19:39,020 --> 00:19:41,770 Nr. rregull. 236 00:19:41,770 --> 00:19:47,920 Ajo rezulton se këtu të gjithë ne duhet të bëni është të duam çdo pjesë e strukturës sonë stafit 237 00:19:47,920 --> 00:19:53,290 të jenë të shtypura si një varg në dosjen tonë. 238 00:19:53,290 --> 00:19:59,900 Ne vetëm përdorin zëvendësimin varg karakter tre herë të ndryshme, sepse ne kemi një emër fundit 239 00:19:59,900 --> 00:20:07,160 ndjekur nga presje, atëherë emri i ndjekur nga një presje, 240 00:20:07,160 --> 00:20:12,430 dhe pastaj në fund adresë e-mail e cila është ndjekur - e cila nuk është 241 00:20:12,430 --> 00:20:15,140 përshtatshëm në ekran e mia - por kjo është pasuar nga një karakter newline. 242 00:20:15,140 --> 00:20:20,060 Kështu që unë jam duke shkuar për të shkruar atë vetëm atje poshtë. 243 00:20:20,060 --> 00:20:23,560 Dhe pastaj pas vargun tonë format, 244 00:20:23,560 --> 00:20:27,880 ne vetëm kemi zëvendësime, të cilat ne qasje duke përdorur simbol dot 245 00:20:27,880 --> 00:20:31,370 që pamë në grup Problem 3. 246 00:20:31,370 --> 00:20:48,820 Ne mund të përdorim s.last, s.first dhe s.email 247 00:20:48,820 --> 00:20:58,990 të zëvendësojë në ato tri vlerat në vargun tonë format. 248 00:20:58,990 --> 00:21:06,190 Pra, si bëri që të shkojnë? Kuptim? 249 00:21:06,190 --> 00:21:09,700 Po? Jo? Ndoshta? Rregull. 250 00:21:09,700 --> 00:21:14,180 >> Gjëja e fundit që ne të bëjmë pasi të kemi të shtypura dhe pas ne kemi hapur dosjen tonë: 251 00:21:14,180 --> 00:21:17,370 sa herë që ne kemi hapur një skedar, ne gjithmonë duhet të mbani mend për të mbyllur atë. 252 00:21:17,370 --> 00:21:19,430 Sepse përndryshe ne do të përfundojë deri në rrjedhjen e kujtesës, 253 00:21:19,430 --> 00:21:22,500 përdorur deri përshkrime file. 254 00:21:22,500 --> 00:21:25,950 Pra, për ta mbyllur atë, e cila funksion nuk kemi përdorim? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] Shkrimi? Shkrimi >>, pikërisht. 256 00:21:30,120 --> 00:21:37,520 Pra, pjesa e fundit e këtij problemi ishte që të duhet mbyllur dosjen, duke përdorur funksionin Shkrimi, 257 00:21:37,520 --> 00:21:40,370 që vetëm duket si kjo. 258 00:21:40,370 --> 00:21:43,880 Jo shumë të çmendur. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Pra, kjo është problem i 33 në quiz. 261 00:21:49,520 --> 00:21:52,480 Ne do të kemi patjetër fotografinë më I / O vjen deri. 262 00:21:52,480 --> 00:21:55,130 Ne do të bëjmë një pak më shumë në leksionin sot, ose në seksionin sot, 263 00:21:55,130 --> 00:22:01,710 sepse kjo është ajo që do të formojnë pjesën më të madhe të këtij pset ardhshme. 264 00:22:01,710 --> 00:22:05,020 Le të lëvizin nga quiz në këtë pikë. Po? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Pse Shkrimi (file) në vend të Shkrimi (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 Ah >>. Sepse ajo rezulton nga se - kështu pyetja, e cila është një një i madh, 267 00:22:19,100 --> 00:22:27,800 është arsyeja pse, kur kemi shkruar Shkrimi, po ne shkrim Shkrimi ndryshore (file) yll 268 00:22:27,800 --> 00:22:33,680 në krahasim me emrin e file, staff.csv? Është e saktë? Po. 269 00:22:33,680 --> 00:22:39,570 Pra, le të marrin një sy. Nëse unë kaloni përsëri në laptop tim, 270 00:22:39,570 --> 00:22:45,040 dhe le të shohim në funksion Shkrimi. 271 00:22:45,040 --> 00:22:51,460 Pra, funksioni Shkrimi mbyllet një lumë dhe ajo merr në treguesin në lumë që ne duam të mbyllur, 272 00:22:51,460 --> 00:22:57,010 në krahasim me emrin aktual e file që ne duam të mbyllur. 273 00:22:57,010 --> 00:23:01,620 Dhe kjo është për shkak se prapa skenave, kur ju bëni një telefonatë për fopen, 274 00:23:01,620 --> 00:23:12,020 kur ju të hapur një skedar, ju jeni në të vërtetë alokimin e kujtesës për të ruajtur informacion në lidhje me dosjen. 275 00:23:12,020 --> 00:23:16,380 Pra, ju keni treguesin file që ka informacion në lidhje me dosjen, 276 00:23:16,380 --> 00:23:23,080 të tilla si ajo e hapur, madhësia e saj, ku ju jeni aktualisht në dosjen, 277 00:23:23,080 --> 00:23:29,100 kështu që ju mund të bëni thirrje lexim dhe shkrim në atë vend të caktuar brenda file. 278 00:23:29,100 --> 00:23:38,060 Ju deri në fund mbylljen treguesin në vend të mbylljes emrin e file. 279 00:23:38,060 --> 00:23:48,990 >> Po? [Daniel] Pra, në mënyrë që të përdorin me qira, do të thonë - si e bën atë të marrë të dhëna përdorues? 280 00:23:48,990 --> 00:23:53,830 A fprintf veprojnë si getString në kuptimin se ajo vetëm do të presin për të dhëna përdoruesi 281 00:23:53,830 --> 00:23:57,180 dhe kërkoj nga ju që të shtypni këtë - apo të presë për ju për të tipit këto tri gjëra në? 282 00:23:57,180 --> 00:24:00,480 Apo nuk keni nevojë të përdorni diçka për të zbatuar me qira? 283 00:24:00,480 --> 00:24:04,100 Po >>. Pra, ne nuk jemi - pyetja është, si nuk kemi marrë të dhëna përdoruesi 284 00:24:04,100 --> 00:24:09,220 në mënyrë që të zbatojnë me qira? Dhe ajo që ne kemi këtu është thirrësi i qira, 285 00:24:09,220 --> 00:24:17,690 kaluar në këtë struct stafit me të gjitha të dhënave të ruajtura në struct tashmë. 286 00:24:17,690 --> 00:24:22,990 Pra fprintf është në gjendje të shkruani vetëm që të dhënat direkt në dosje. 287 00:24:22,990 --> 00:24:25,690 Nuk ka pritur për input të përdoruesit. 288 00:24:25,690 --> 00:24:32,110 Ky përdorues është dhënë tashmë e kontributit duhet duke e vënë atë në këtë struct stafit. 289 00:24:32,110 --> 00:24:36,510 Dhe gjëra, natyrisht, do të prishej në qoftë se ndonjë nga këto pointers ishin null, 290 00:24:36,510 --> 00:24:40,370 kështu që lëviz mbrapa deri këtu dhe ne të shikojmë në struct tonë. 291 00:24:40,370 --> 00:24:43,640 Ne kemi kaluar, string string pari, email string. 292 00:24:43,640 --> 00:24:48,530 Ne tani e dimë se të gjithë ata me të vërtetë, nën kapuç, janë variabla char *. 293 00:24:48,530 --> 00:24:53,470 Kjo mund ose nuk mund të jetë duke treguar null. 294 00:24:53,470 --> 00:24:55,800 Ato mund të vënë në kujtesën mbi tok, 295 00:24:55,800 --> 00:24:59,650 ndoshta kujtesës në rafte. 296 00:24:59,650 --> 00:25:04,580 Ne të vërtetë nuk e di, por nëse ndonjë nga këto pointers janë null, ose të pavlefshme, 297 00:25:04,580 --> 00:25:08,120 se ai patjetër do të rrëzimit funksionin tonë me qira. 298 00:25:08,120 --> 00:25:11,050 Kjo ishte diçka që ishte lloj përtej fushës së provimit. 299 00:25:11,050 --> 00:25:16,440 Ne nuk jemi të brengosur për këtë. 300 00:25:16,440 --> 00:25:22,170 Madhe. Rregull. Pra, duke lëvizur më nga quiz. 301 00:25:22,170 --> 00:25:25,760 >> Le të mbyllur këtë djalë, dhe ne do të shikojmë në pset 4. 302 00:25:25,760 --> 00:25:34,700 Pra, nëse ju djema shikoni në spekulim pset, një herë ju mund të hyni në atë, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 ne jemi duke shkuar për të shkuar nëpër disa nga problemet seksionin sot. 304 00:25:42,730 --> 00:25:52,240 Unë jam scrolling poshtë - seksioni i pyetjeve fillon në faqen e tretë të spec pset. 305 00:25:52,240 --> 00:25:57,800 Dhe pjesa e parë ju pyet për të shkuar dhe të shikojnë të shkurtër në Përcjellin dhe tubave. 306 00:25:57,800 --> 00:26:02,820 Cili ishte lloj i një të shkurtër cool, ju tregon disa të reja, truket ftohtë command line që ju mund të përdorni. 307 00:26:02,820 --> 00:26:06,050 Dhe pastaj ne kemi marrë disa pyetje për ju si. 308 00:26:06,050 --> 00:26:10,860 Kjo pyetje e parë në lidhje me lumenj, në të cilën shkruan printf by default, 309 00:26:10,860 --> 00:26:15,920 ne lloj i preku vetëm pak një moment më parë. 310 00:26:15,920 --> 00:26:22,380 Kjo fprintf se ne ishim vetëm duke diskutuar merr në një lumë * skedar si argument të saj. 311 00:26:22,380 --> 00:26:26,580 Shkrimi merr në një lumë * skedar, si edhe, 312 00:26:26,580 --> 00:26:32,660 dhe vlera kthimi i fopen ju jep një rrjedhë * skedar si. 313 00:26:32,660 --> 00:26:36,060 Arsyeja që ne nuk e kemi parë ata që ishin para, kur ne kemi marrë me printf 314 00:26:36,060 --> 00:26:39,450 është për shkak se ka një lumë printf default. 315 00:26:39,450 --> 00:26:41,810 Dhe lumë parazgjedhur në të cilën ajo shkruan 316 00:26:41,810 --> 00:26:45,190 ju do të gjeni lidhje në afat të shkurtër. 317 00:26:45,190 --> 00:26:50,080 Pra, patjetër të marrë një vështrim në të. 318 00:26:50,080 --> 00:26:53,010 >> Në seksionin e sotme, ne do të flasim pak në lidhje me GDB, 319 00:26:53,010 --> 00:26:57,720 pasi që ju jeni më të njohur me të, praktika që ju të merrni më shumë me të, 320 00:26:57,720 --> 00:27:01,390 më të mirë ju do të jetë në gjendje që në fakt të ndjekë bugs në kodin tuaj. 321 00:27:01,390 --> 00:27:05,540 Kjo përshpejton procesin e debugging deri jashtëzakonshme. 322 00:27:05,540 --> 00:27:09,230 Pra, duke përdorur printf, çdo herë që bëni që ju keni për të përpiluar kodin tuaj, 323 00:27:09,230 --> 00:27:13,000 ju keni për të drejtuar atë përsëri, ndonjëherë ju duhet të lëvizin thirrjen printf rreth, 324 00:27:13,000 --> 00:27:17,100 komentuar nga kodi, ajo merr vetëm një kohë. 325 00:27:17,100 --> 00:27:20,850 Qëllimi ynë është që të përpiqen dhe të ju bindin se me GDB, ju mund të thelb 326 00:27:20,850 --> 00:27:26,810 asgjë printf në çdo moment në kodin tuaj dhe ju kurrë nuk keni për të përpiluar atë. 327 00:27:26,810 --> 00:27:35,120 Ju kurrë nuk duhet të fillojë dhe për të mbajtur guessing ku të printf ardhshëm. 328 00:27:35,120 --> 00:27:40,910 Gjëja e parë që bëni është të kopjoni këtë linjë dhe për të marrë kodin seksion off e internetit. 329 00:27:40,910 --> 00:27:47,530 Unë jam kopjimi këtë linjë të kodit që thotë se, "http://cdn.cs50.net wget". 330 00:27:47,530 --> 00:27:49,510 Unë jam duke shkuar për të kopje atë. 331 00:27:49,510 --> 00:27:55,950 Unë jam duke shkuar për të shkuar mbi të aparatit tim, zoom jashtë në mënyrë që ju mund të shihni atë që unë jam duke bërë, 332 00:27:55,950 --> 00:28:01,890 pasting atë në atje, dhe kur unë hit Enter, kjo komandë wget fjalë për fjalë është një web të merrni. 333 00:28:01,890 --> 00:28:06,210 Ajo do të tërheqë poshtë këtë fotografi off e internetit, 334 00:28:06,210 --> 00:28:11,790 dhe ajo do të shpëtojë atë në dosjen aktuale. 335 00:28:11,790 --> 00:28:21,630 Tani, nëse unë lista dosjen time aktuale që ju mund të shihni se unë kam marrë këtë skedar section5.zip drejtë në atje. 336 00:28:21,630 --> 00:28:25,260 Mënyra për t'u marrë me atë djalë është që të hap zinxhirin atë, 337 00:28:25,260 --> 00:28:27,650 të cilat ju mund të bëni në command line, ashtu si kjo. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Kjo do të unzip atë, të krijojnë dosje për mua, 340 00:28:36,980 --> 00:28:40,410 fryj të gjithë përmbajtjen, ata vënë në atje. 341 00:28:40,410 --> 00:28:47,410 Deri tani unë mund të shkoj në directory 5 seksionin tim duke përdorur komandën cd. 342 00:28:47,410 --> 00:28:58,310 Qartë në ekran duke përdorur të qartë. Pra, qartë në ekran. 343 00:28:58,310 --> 00:29:02,280 Tani unë kam marrë një terminal të mirë të pastër për t'u marrë me të. 344 00:29:02,280 --> 00:29:06,200 >> Tani, nëse unë të listojnë të gjitha dosjet që unë shoh në këtë directory, 345 00:29:06,200 --> 00:29:12,270 ju shihni se unë kam marrë katër fotografi: buggy1, buggy2, buggy3 dhe buggy4. 346 00:29:12,270 --> 00:29:16,180 Unë kam marrë edhe dosjet përkatëse. E tyre c. 347 00:29:16,180 --> 00:29:20,400 Ne nuk do të shohim në fotografi. C për tani. 348 00:29:20,400 --> 00:29:24,140 Në vend të kësaj, ne jemi duke shkuar për t'i përdorur ato, kur ne e hapur deri GDB. 349 00:29:24,140 --> 00:29:28,220 Ne kemi mbajtur rreth tyre në mënyrë që të kemi qasje në kodin burimor aktuale, kur ne jemi duke përdorur GDB, 350 00:29:28,220 --> 00:29:32,740 por qëllimi i kësaj pjese të këtij neni është që të kallajis rreth me GDB 351 00:29:32,740 --> 00:29:40,370 dhe të shohim se si ne mund ta përdorin atë për të kuptoj se çfarë po ndodh gabuar me secilin nga këto katër programe buggy. 352 00:29:40,370 --> 00:29:43,380 Pra, ne jemi vetëm duke shkuar për të nëpër dhomë me të vërtetë shpejt, 353 00:29:43,380 --> 00:29:47,000 dhe unë jam duke shkuar për të pyetur dikë për të drejtuar një nga programet Buggy, 354 00:29:47,000 --> 00:29:54,730 dhe pastaj ne do të shkojnë si një grup përmes GDB, dhe ne do të shohim se çfarë mund të bëjmë për të rregulluar këto programe, 355 00:29:54,730 --> 00:29:58,460 ose të paktën të identifikuar se çfarë po ndodh gabuar në secilën prej tyre. 356 00:29:58,460 --> 00:30:04,760 Le të fillojë gjatë këtu me Danielin. Do të ju drejtuar buggy1? Le të shohim se çfarë ndodh. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Ajo thotë se ka një kërkesë faji. Po >>. Saktësisht. 358 00:30:09,470 --> 00:30:12,460 Pra, nëse kam drejtuar buggy1, unë të marrë një gabim seg. 359 00:30:12,460 --> 00:30:16,210 Në këtë pikë, unë mund të shkoni dhe e hapur deri buggy1.c, 360 00:30:16,210 --> 00:30:19,450 përpiqen dhe të kuptoj se çfarë po ndodh gabuar, 361 00:30:19,450 --> 00:30:22,000 por një nga gjërat më të urryer në lidhje me këtë gabim faji Seg 362 00:30:22,000 --> 00:30:27,610 është se ajo nuk do të ju them se çfarë linjë të gjërave të programit në fakt shkoi keq dhe thyen. 363 00:30:27,610 --> 00:30:29,880 Ju lloj duhet të shikoni në kodin 364 00:30:29,880 --> 00:30:33,990 dhe të kuptoj se duke përdorur mend dhe kontrolloni ose printf për të parë se çfarë po ndodh gabuar. 365 00:30:33,990 --> 00:30:37,840 Një nga gjërat coolest rreth gdb është se ajo është e vërtetë, të vërtetë e lehtë 366 00:30:37,840 --> 00:30:42,170 të gjej linjën në të cilën crashes programin tuaj. 367 00:30:42,170 --> 00:30:46,160 Është krejtësisht e vlefshme për të përdorin atë, edhe në qoftë vetëm për atë. 368 00:30:46,160 --> 00:30:56,190 Pra, për të boot up GDB, unë lloji GDB, dhe atëherë unë jap atë në rrugën të ekzekutueshme që unë dua për të kandiduar. 369 00:30:56,190 --> 00:31:01,960 Këtu unë jam i shtypur gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Hit Enter. Më jep gjithë këtë informacion autorit, 371 00:31:06,600 --> 00:31:13,000 dhe këtu poshtë ju do të shihni këtë linjë që thotë se, "leximi nga simbolet / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Dhe në qoftë se të gjitha shkon mirë, ju do të shihni se të shtypura nga një mesazh që duket si kjo. 374 00:31:22,060 --> 00:31:25,500 Ajo do të lexoni simbole, ajo do të thonë: "Unë jam i lexuar nga simbolet dosjen tuaj ekzekutues" 375 00:31:25,500 --> 00:31:29,900 dhe pastaj ajo do të ketë këtë "bërë" mesazh mbi këtu. 376 00:31:29,900 --> 00:31:35,410 Nëse ju shikoni ndonjë variant tjetër të kësaj, apo e shihni se nuk mund të gjejnë simbole 377 00:31:35,410 --> 00:31:41,460 ose diçka të tillë, çka do të thotë është se ju thjesht nuk kanë përpiluar ekzekutueshme tuaj siç duhet. 378 00:31:41,460 --> 00:31:49,980 Kur ne hartojnë programe për përdorimin me GDB, ne duhet të përdorin atë flamur të veçantë-g, 379 00:31:49,980 --> 00:31:54,540 dhe që është bërë nga default në qoftë se ju hartojnë programet tuaja, vetëm duke shtypur bëjë 380 00:31:54,540 --> 00:31:59,320 ose të bëjë buggy ose të bëjë të shërohen, ndonjë nga ata. 381 00:31:59,320 --> 00:32:07,800 Por në qoftë se ju jeni hartimin dorë me tingëllimë, atëherë ju do të keni për të shkuar në dhe të përfshijë se-g flamurin. 382 00:32:07,800 --> 00:32:10,310 >> Në këtë pikë, tani që ne kemi vëmendjen tonë të shpejtë GDB, 383 00:32:10,310 --> 00:32:12,310 kjo është shumë e thjeshtë për të drejtuar programin. 384 00:32:12,310 --> 00:32:19,740 Ne ose mund të shtypni të kandidojë, ose ne mund vetëm të shtypni r. 385 00:32:19,740 --> 00:32:22,820 Komandat Shumica Gdb mund të jenë shkurtuar. 386 00:32:22,820 --> 00:32:25,940 Zakonisht në vetëm një ose letra çift, e cila është shumë e bukur. 387 00:32:25,940 --> 00:32:30,980 Saad Pra, nëse ju shkruani r dhe hit Enter, çfarë ndodh? 388 00:32:30,980 --> 00:32:39,390 [Saad] kam marrë SIGSEGV, faji segmentimit, dhe atëherë e gjithë kjo kuptueshme. 389 00:32:39,390 --> 00:32:43,650 Po >>. 390 00:32:43,650 --> 00:32:47,990 Si ne po shohim në ekran të drejtë tani, dhe si Saad tha: 391 00:32:47,990 --> 00:32:53,430 kur të shtypni të kandidojë apo R dhe hit Enter, ne ende të marrë fajin njëjtin seg. 392 00:32:53,430 --> 00:32:55,830 Pra, duke përdorur gdb nuk e zgjidh problemin tonë. 393 00:32:55,830 --> 00:32:59,120 Por kjo na jep disa gobbledygook, dhe kjo rezulton se ky gobbledygook 394 00:32:59,120 --> 00:33:03,080 në fakt na tregon se ku ajo ndodh. 395 00:33:03,080 --> 00:33:10,680 Për këtë analizimi pak, kjo pak i parë është funksion në të cilën gjithçka do të gabuar. 396 00:33:10,680 --> 00:33:20,270 Nuk është kjo __ strcmp_sse4_2, dhe kjo na tregon se ajo që po ndodh në këtë dosje 397 00:33:20,270 --> 00:33:29,450 quajtur sysdeps/i386, e gjithë kjo, përsëri, lloj i një rrëmujë - por linjës 254. 398 00:33:29,450 --> 00:33:31,670 Kjo është lloj i vështirë për të kuptoj. Zakonisht kur ju shikoni gjëra si kjo, 399 00:33:31,670 --> 00:33:38,770 që do të thotë se ajo e seg përgënjeshtrojnë në njërën nga biblioteka e sistemit. 400 00:33:38,770 --> 00:33:43,220 Pra, diçka të bëjë me strcmp. Ju djema keni parë strcmp parë. 401 00:33:43,220 --> 00:33:52,730 Jo shumë i çmendur, por kjo do të thotë se strcmp është e thyer ose se ka një problem me strcmp? 402 00:33:52,730 --> 00:33:57,110 Çfarë mendoni ju, Aleksandrin? 403 00:33:57,110 --> 00:34:04,890 [Aleksandër] A është kjo - është 254 linja? Dhe - jo binar, por kjo nuk është tavanet e tyre, 404 00:34:04,890 --> 00:34:10,590 dhe pastaj ka një tjetër gjuhë për secilin funksion. Është se në atë funksion 254, ose -? 405 00:34:10,590 --> 00:34:21,460 Kjo është linja >> 254. Ajo duket si në këtë dosje. S, kështu që është ndoshta kodin kuvendi. 406 00:34:21,460 --> 00:34:25,949 >> Por, unë mendoj se gjëja më e ngutshme është, sepse ne kemi marrë një faj Seg, 407 00:34:25,949 --> 00:34:29,960 dhe kjo duket si ajo vjen nga funksioni strcmp, 408 00:34:29,960 --> 00:34:38,030 nënkupton kjo, atëherë, që strcmp është thyer? 409 00:34:38,030 --> 00:34:42,290 Ajo nuk duhet, me shpresë. Pra, vetëm për shkak se ju keni një faj segmentimit 410 00:34:42,290 --> 00:34:49,480 në një nga funksionet e sistemit, në mënyrë tipike që do të thotë se ju thjesht nuk e kanë quajtur atë të saktë. 411 00:34:49,480 --> 00:34:52,440 Gjëja më e shpejtë për të bërë të kuptoj se çfarë po ndodh në të vërtetë 412 00:34:52,440 --> 00:34:55,500 kur ju shikoni diçka çmendur si kjo, sa herë që ju të shihni një faj Seg, 413 00:34:55,500 --> 00:34:59,800 veçanërisht në qoftë se ju keni një program që është përdorur më shumë se vetëm kryesor, 414 00:34:59,800 --> 00:35:03,570 është që të përdorin një backtrace. 415 00:35:03,570 --> 00:35:13,080 I shkurtoj backtrace duke shkruar BT, në krahasim me fjalën e plotë backtrace. 416 00:35:13,080 --> 00:35:16,510 Por Charlotte, çfarë ndodh kur ju shkruani BT dhe hit Enter? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ajo tregon mua dy linja, 0 line dhe alineja 1. 418 00:35:23,200 --> 00:35:26,150 Po >>. Pra linjë 0 dhe alineja 1. 419 00:35:26,150 --> 00:35:34,560 Këto janë korniza aktuale rafte që ishin aktualisht në lojë kur programi juaj u rrëzua. 420 00:35:34,560 --> 00:35:42,230 Duke filluar nga sistemi i larti, kornizë 0, dhe do të fund-më, e cila është kornizë 1. 421 00:35:42,230 --> 00:35:45,140 Kornizë ynë i larti është kornizë strcmp. 422 00:35:45,140 --> 00:35:50,080 Ju mund të mendoj për këtë si të ngjashme me këtë problem, ne ishim vetëm duke bërë në quiz me pointers, 423 00:35:50,080 --> 00:35:54,890 ku ne kishim shkëmbim kornizë rafte në krye të rafte kornizë kryesore, 424 00:35:54,890 --> 00:35:59,700 dhe kemi pasur variablave që swap u përdorur në krye të variablave që kryesore ishte përdorur. 425 00:35:59,700 --> 00:36:08,440 Këtu përplasje ynë ka ndodhur në funksion tonë strcmp, e cila u quajt nga funksioni ynë kryesor, 426 00:36:08,440 --> 00:36:14,370 backtrace dhe po na jep jo vetëm funksionet në të cilat gjërat dështuar, 427 00:36:14,370 --> 00:36:16,440 Por është gjithashtu e duke na thënë se ku çdo gjë u quajt nga. 428 00:36:16,440 --> 00:36:18,830 Pra, nëse unë lëviz mbi një pak më shumë në të djathtë, 429 00:36:18,830 --> 00:36:26,110 ne mund të shohim se vërtet, ne kemi qenë në linjën 254 të këtij file strcmp-sse4.s. 430 00:36:26,110 --> 00:36:32,540 Por thirrja u bë në linjë buggy1.c, 6. 431 00:36:32,540 --> 00:36:35,960 Kështu që do të thotë që ne mund të bëjmë - është që ne mund të shkoni vetëm të shikoni dhe të shohim se çfarë po ndodh 432 00:36:35,960 --> 00:36:39,930 në linjë buggy1.c, 6. 433 00:36:39,930 --> 00:36:43,780 Përsëri, ka disa mënyra për ta bërë këtë. Njëra është për të dalë nga GDB 434 00:36:43,780 --> 00:36:49,460 ose të ketë kodin tuaj të hapet në një dritare dhe referencë kryq. 435 00:36:49,460 --> 00:36:54,740 Kjo, në vetvete, është shumë i dobishëm, sepse tani, nëse ju jeni në orarit të punës 436 00:36:54,740 --> 00:36:57,220 dhe ju keni marrë një defekt seg dhe TF juaj e pyesin se ku çdo gjë ishte e thyer, 437 00:36:57,220 --> 00:36:59,710 vetëm ju mund të thoni, "Oh, Shkarko 6. Unë nuk e di se çfarë po ndodh, 438 00:36:59,710 --> 00:37:03,670 por diçka rreth 6 linjë është duke shkaktuar programin tim për të thyer ". 439 00:37:03,670 --> 00:37:10,430 Mënyra të tjera për të bërë atë që është që ju mund të përdorni këtë komandë quajtur lista në GDB. 440 00:37:10,430 --> 00:37:13,650 Ju gjithashtu mund të shkurtoj atë me l. 441 00:37:13,650 --> 00:37:18,910 Pra, nëse ne e goditi l, çfarë nuk kemi marrë këtu? 442 00:37:18,910 --> 00:37:21,160 Ne kemi marrë një bandë e tërë e gjëra të çuditshme. 443 00:37:21,160 --> 00:37:26,030 Ky është kodi aktual kuvendi 444 00:37:26,030 --> 00:37:29,860 që është në strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Kjo duket lloj të shokuar, 446 00:37:32,440 --> 00:37:36,520 dhe arsyeja që ne jemi duke marrë kjo është për shkak se tani, 447 00:37:36,520 --> 00:37:40,160 Gdb ka na në kuadër 0. 448 00:37:40,160 --> 00:37:43,070 >> Pra, në çdo kohë ne shikojmë në variablave, në çdo kohë ne shikojmë në kodin burim, 449 00:37:43,070 --> 00:37:50,530 ne jemi duke kërkuar në kodin burimor që ka të bëjë me kuadrin rafte ne jemi aktualisht in 450 00:37:50,530 --> 00:37:53,200 Pra, në mënyrë që të merrni asgjë kuptimplotë, ne duhet të 451 00:37:53,200 --> 00:37:57,070 të shkojë në një kornizë pirg që e bën më shumë kuptim. 452 00:37:57,070 --> 00:38:00,180 Në këtë rast, korniza kryesore rafte do të kishte kuptim pak më shumë, 453 00:38:00,180 --> 00:38:02,680 sepse kjo ishte në fakt kodin që kemi shkruar. 454 00:38:02,680 --> 00:38:05,330 Jo kodin strcmp. 455 00:38:05,330 --> 00:38:08,650 Mënyra se si ju mund të lëvizin në mes të kornizave, në këtë rast, sepse ne kemi dy, 456 00:38:08,650 --> 00:38:10,430 ne kemi 0 dhe 1, 457 00:38:10,430 --> 00:38:13,650 ju bëni që me lart dhe komandat poshtë. 458 00:38:13,650 --> 00:38:18,480 Nëse unë shkojë deri një kornizë, 459 00:38:18,480 --> 00:38:21,770 tani unë jam në kuadër rafte kryesore. 460 00:38:21,770 --> 00:38:24,330 Unë mund të lëvizin poshtë për të shkuar mbrapa ku isha, 461 00:38:24,330 --> 00:38:32,830 shkoni përsëri, të shkojnë poshtë përsëri, dhe të shkojnë përsëri. 462 00:38:32,830 --> 00:38:39,750 Nëse ju ndonjëherë të bëni programin tuaj në GDB, ju merrni një aksident, ju merrni backtrace, 463 00:38:39,750 --> 00:38:42,380 dhe ju të shihni se ajo është në një farë skedar që ju nuk e dini se çfarë po ndodh. 464 00:38:42,380 --> 00:38:45,460 Ju provoni listë, kodi nuk duket të njohura për ju, 465 00:38:45,460 --> 00:38:48,150 hidhini një sy në korniza tuaj dhe të kuptoj se ku jeni. 466 00:38:48,150 --> 00:38:51,010 Ju ndoshta jeni në kuadër të gabuar rafte. 467 00:38:51,010 --> 00:38:58,760 Ose të paktën ju jeni në një kornizë pirg që nuk është një që ju mund të vërtetë të korrigjoj. 468 00:38:58,760 --> 00:39:03,110 Tani që ne jemi në kuadër rafte e duhur, ne jemi në kryesore, 469 00:39:03,110 --> 00:39:08,100 tani ne mund të përdorni komandën listë të kuptoj se çfarë linjë ishte. 470 00:39:08,100 --> 00:39:13,590 Dhe ju mund të shihni atë, por të shtypura atë për ne të drejtë këtu. 471 00:39:13,590 --> 00:39:19,470 Por ne mund të goditur lista të gjithë të njëjtë, dhe lista na jep këtë kopje bukur 472 00:39:19,470 --> 00:39:23,920 i kodit aktual burim që po ndodh në këtu. 473 00:39:23,920 --> 00:39:26,420 >> Në veçanti, ne mund të shohim në linjë 6. 474 00:39:26,420 --> 00:39:29,330 Ne mund të shohim se çfarë po ndodh këtu. 475 00:39:29,330 --> 00:39:31,250 Dhe kjo duket si ne jemi duke bërë një krahasim string 476 00:39:31,250 --> 00:39:41,050 mes vargut "CS50 shkëmbinj" dhe argv [1]. 477 00:39:41,050 --> 00:39:45,700 Diçka në lidhje me këtë u crashing. 478 00:39:45,700 --> 00:39:54,120 Pra Missy, a keni ndonjë mendime mbi atë që mund të ndodh këtu? 479 00:39:54,120 --> 00:39:59,400 [Missy] Unë nuk e di pse kjo është crashing. Ju >> nuk e di pse është e crashing? 480 00:39:59,400 --> 00:40:02,700 Jimmy, çdo mendime? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Unë nuk jam plotësisht i sigurt, por hera e fundit që kemi përdorur string krahasuar, 482 00:40:06,240 --> 00:40:10,260 ose strcmp, kemi pasur si tre raste të ndryshme në bazë të saj. 483 00:40:10,260 --> 00:40:12,800 Ne nuk kemi një ==, unë nuk mendoj se, e drejta në këtë linjë të parë. 484 00:40:12,800 --> 00:40:16,700 Në vend të kësaj ajo ishte e ndarë në tri, dhe një ishte == 0, 485 00:40:16,700 --> 00:40:19,910 njëri ishte <0, unë mendoj, dhe një ishte> 0. 486 00:40:19,910 --> 00:40:22,590 Pra, ndoshta diçka si kjo? Po >>. Pra, nuk është kjo çështje 487 00:40:22,590 --> 00:40:27,200 e po bëjmë krahasimin saktë? 488 00:40:27,200 --> 00:40:31,660 Stella? Çdo mendime? 489 00:40:31,660 --> 00:40:38,110 [Stella] Unë nuk jam i sigurt. Nuk jam i sigurt >>. Daniel? Mendime? Rregull. 490 00:40:38,110 --> 00:40:44,770 Ajo rezulton se çfarë po ndodh këtu është kur ne u programin 491 00:40:44,770 --> 00:40:48,370 dhe kemi marrë fajin Seg, kur ju drejtoi programin për herë të parë, Danieli, 492 00:40:48,370 --> 00:40:50,800 keni jepte argumente command line? 493 00:40:50,800 --> 00:40:58,420 [Daniel] nr nr >> Në këtë rast, ajo që është vlera e argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Nuk ka asnjë vlerë. E drejta >>. 495 00:41:00,920 --> 00:41:06,120 E pra, nuk ka asnjë vlerë string përshtatshme. 496 00:41:06,120 --> 00:41:10,780 Por ka disa vlera. Cila është vlera që merr ruajtur në atje? 497 00:41:10,780 --> 00:41:15,130 Një vlerë >> plehrash? >> Kjo është ose një vlerë plehrash ose, në këtë rast, 498 00:41:15,130 --> 00:41:19,930 fundi i array argv përfundon gjithmonë me null. 499 00:41:19,930 --> 00:41:26,050 Pra, çfarë në të vërtetë u ruajtur në atje është i pavlefshëm. 500 00:41:26,050 --> 00:41:30,810 Mënyra të tjera për të zgjidhur këtë, në vend se duke menduar atë nëpërmjet, 501 00:41:30,810 --> 00:41:33,420 është që të përpiqen shtypjen atë. 502 00:41:33,420 --> 00:41:35,880 Kjo është ajo ku unë isha duke thënë se duke përdorur gdb është e madhe, 503 00:41:35,880 --> 00:41:40,640 sepse ju mund të shtypura nga të gjitha variablave, të gjitha vlerat që ju dëshironi 504 00:41:40,640 --> 00:41:43,230 duke përdorur këtë komandë dobishëm-Pispilluq p. 505 00:41:43,230 --> 00:41:48,520 Pra, nëse unë lloji p dhe pastaj shtypni vlerën e një ndryshore ose emrin e një variable, 506 00:41:48,520 --> 00:41:55,320 thonë, argc, unë shoh se argc është 1. 507 00:41:55,320 --> 00:42:01,830 Në qoftë se unë dua të shtypura nga argv [0], unë mund ta bëjë këtë vetëm si kjo. 508 00:42:01,830 --> 00:42:04,840 Dhe ashtu siç e pamë, argv [0] gjithmonë është emri i programit tuaj, 509 00:42:04,840 --> 00:42:06,910 gjithmonë emri i ekzekutues. 510 00:42:06,910 --> 00:42:09,740 Këtu ju shihni se e mori emrin e plotë rrugën. 511 00:42:09,740 --> 00:42:15,920 Unë gjithashtu mund të shtypura nga argv [1] dhe shikoni se çfarë ndodh. 512 00:42:15,920 --> 00:42:20,890 >> Këtu kemi marrë këtë lloj të vlerës së mistike. 513 00:42:20,890 --> 00:42:23,890 Ne morëm këtë 0x0. 514 00:42:23,890 --> 00:42:27,850 Kujtohet në fillim të mandatit, kur kemi biseduar në lidhje me numrat heksadecimal? 515 00:42:27,850 --> 00:42:34,680 Apo se pyetja pak në fund të pset 0 rreth asaj se si për të përfaqësuar 50 në magji? 516 00:42:34,680 --> 00:42:39,410 Mënyra kemi shkruar numrat magji në CS, vetëm për të mos ngatërruar veten 517 00:42:39,410 --> 00:42:46,080 me numra dhjetore, është ne gjithmonë prefix ato me 0x. 518 00:42:46,080 --> 00:42:51,420 Pra, kjo prefix 0x gjithmonë vetëm do të thotë të interpretuar numrin e mëposhtëm si një numër heksadecimal, 519 00:42:51,420 --> 00:42:57,400 jo si një varg, jo si një numër decimal, jo si një numër binar. 520 00:42:57,400 --> 00:43:02,820 Që nga numri 5-0 është një numër i vlefshëm në heksadecimal. 521 00:43:02,820 --> 00:43:06,240 Dhe kjo është një numër në decimal, 50. 522 00:43:06,240 --> 00:43:10,050 Pra, kjo është vetëm se si ne disambiguate. 523 00:43:10,050 --> 00:43:14,860 Pra, 0x0 Mjetet 0 heksadecimal, e cila është gjithashtu decimal 0 binare, 0. 524 00:43:14,860 --> 00:43:17,030 Është vetëm vlera 0. 525 00:43:17,030 --> 00:43:22,630 Ajo rezulton se kjo është ajo që është null, në të vërtetë, në kujtesë. 526 00:43:22,630 --> 00:43:25,940 Null është vetëm 0. 527 00:43:25,940 --> 00:43:37,010 Këtu, elementi ruajtur në argv [1] është i pavlefshëm. 528 00:43:37,010 --> 00:43:45,220 Pra, ne jemi duke u përpjekur për të krahasuar tonë "CS50 Rocks" string për një varg null. 529 00:43:45,220 --> 00:43:48,130 Pra dereferencing null, duke u përpjekur për të hyrë në gjërat null, 530 00:43:48,130 --> 00:43:55,050 ata janë zakonisht do të shkaktojë ndonjë lloj faji segmentimit ose gjëra të tjera të këqija të ndodhë. 531 00:43:55,050 --> 00:43:59,350 Dhe kjo rezulton se strcmp nuk kontrolloni për të parë 532 00:43:59,350 --> 00:44:04,340 ose nëse nuk e keni kaluar në një vlerë që është null. 533 00:44:04,340 --> 00:44:06,370 Përkundrazi, ajo shkon vetëm përpara, përpiqet të bëjë gjë e saj, 534 00:44:06,370 --> 00:44:14,640 dhe në qoftë se ajo seg gabimet, ajo seg gabimet, dhe kjo është problemi juaj. Ju duhet të shkoni të rregulluar atë. 535 00:44:14,640 --> 00:44:19,730 Me të vërtetë shpejt, si mund ne të rregullojmë këtë problem? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Ju mund të shikoni në qoftë se duke përdorur. 537 00:44:23,540 --> 00:44:32,240 Pra, nëse argv [1] është i pavlefshëm, == 0, pastaj do të ktheheni 1, ose diçka [pakuptueshëm]. 538 00:44:32,240 --> 00:44:34,590 Po >>. Pra, kjo është një mënyrë e madhe për të bërë atë, si ne mund të kontrolloni për të parë, 539 00:44:34,590 --> 00:44:39,230 vlera ne jemi gati për të kaluar në strcmp, argv [1], është ajo null? 540 00:44:39,230 --> 00:44:45,830 Nëse kjo është null, atëherë ne mund të themi rregull, ndërpritet. 541 00:44:45,830 --> 00:44:49,450 >> Një mënyrë më e zakonshme për të bërë këtë është që të përdorin vlera argc. 542 00:44:49,450 --> 00:44:52,040 Ju mund të shihni të drejtë këtu në fillim të kryesore, 543 00:44:52,040 --> 00:44:58,040 ne hequr atë testin e parë që ne bëjmë zakonisht kur ne përdorim argumente command line, 544 00:44:58,040 --> 00:45:05,240 e cila është për të provuar nëse është apo jo vlera jonë argc është ajo që ne presim. 545 00:45:05,240 --> 00:45:10,290 Në këtë rast, ne jemi duke pritur të paktën dy argumente, 546 00:45:10,290 --> 00:45:13,660 emri i programit plus një tjetër. 547 00:45:13,660 --> 00:45:17,140 Sepse ne jemi gati për të përdorur argumentin e dytë të drejtë këtu. 548 00:45:17,140 --> 00:45:21,350 Pra, ka një lloj testi paraprakisht, para se të thirrjes sonë strcmp 549 00:45:21,350 --> 00:45:37,390 se testet nëse janë apo jo argv është të paktën 2, do të bëjë të njëjtin lloj gjë. 550 00:45:37,390 --> 00:45:40,620 Ne mund të shohim nëse që punon me drejtimin e programit përsëri. 551 00:45:40,620 --> 00:45:45,610 Ju gjithmonë mund të rinisni programin tuaj brenda GDB, e cila është me të vërtetë bukur. 552 00:45:45,610 --> 00:45:49,310 Ju mund të kandidojë, dhe kur ju të kalojë në argumentet për programin tuaj, 553 00:45:49,310 --> 00:45:53,060 ju të kalojë ato në kur ju drejtuar thirrje, jo kur ju boot up GDB. 554 00:45:53,060 --> 00:45:57,120 Në këtë mënyrë ju mund të mbani duke u thirrur në programin tuaj me argumente të ndryshme çdo herë. 555 00:45:57,120 --> 00:46:08,080 Pra drejtuar, ose përsëri, unë mund të shtypni r, dhe le të shohim se çfarë ndodh në qoftë se ne e tipit "hello". 556 00:46:08,080 --> 00:46:11,140 Ajo gjithmonë do të ju pyes nëse ju doni të filloni atë nga fillimi përsëri. 557 00:46:11,140 --> 00:46:17,490 Zakonisht, ju do të duan të fillojnë atë nga fillimi përsëri. 558 00:46:17,490 --> 00:46:25,010 Dhe në këtë pikë, ajo rifillon përsëri, ajo printon nga 559 00:46:25,010 --> 00:46:28,920 programi që ne jemi drejtimin, buggy1, me argumentin hello, 560 00:46:28,920 --> 00:46:32,720 dhe printime this out standarde, ajo thotë, "Ju merrni një D," fytyra trishtuar. 561 00:46:32,720 --> 00:46:37,610 Por ne nuk seg faj. Ai tha se procesi i exited normalisht. 562 00:46:37,610 --> 00:46:39,900 Kështu që duket goxha e mirë. 563 00:46:39,900 --> 00:46:43,050 Nuk ka faj më të seg, kemi bërë atë të kaluarën, 564 00:46:43,050 --> 00:46:48,190 kështu që duket si ajo ishte me të vërtetë bug seg faji se ne kemi qenë duke marrë. 565 00:46:48,190 --> 00:46:51,540 Për fat të keq, kjo na tregon se ne jemi duke marrë një D. 566 00:46:51,540 --> 00:46:54,090 >> Ne mund të shkojnë prapa dhe të shikojmë në kodin dhe të shohim se çfarë po ndodh atje 567 00:46:54,090 --> 00:46:57,980 të kuptoj se çfarë ishte - pse u duke na thënë se ne kemi marrë një D. 568 00:46:57,980 --> 00:47:03,690 Le të shohim, këtu është kjo printf thënë se ju mori një D. 569 00:47:03,690 --> 00:47:08,540 Nëse ne shkruani listë, si ju mbani shtypur listë, ajo mban iterating poshtë nëpër programin tuaj, 570 00:47:08,540 --> 00:47:10,940 kështu ajo do t'ju tregojë linjat e para të programit tuaj. 571 00:47:10,940 --> 00:47:15,450 Atëherë ajo do t'ju tregojë linjat e ardhshme, dhe copë tjetër dhe copë tjetër. 572 00:47:15,450 --> 00:47:18,240 Dhe ajo do të vazhdojë të përpiqet për të shkuar poshtë. 573 00:47:18,240 --> 00:47:21,180 Dhe tani ne do të merrni për të "vijë numri 16 është jashtë rrezes." 574 00:47:21,180 --> 00:47:23,940 Për shkak se ajo ka vetëm 15 rreshta. 575 00:47:23,940 --> 00:47:30,310 Nëse ju merrni në këtë pikë dhe tuaj pyesin, "Çfarë të bëj?" ju mund të përdorni komandën ndihmë. 576 00:47:30,310 --> 00:47:34,340 Përdorni ndihmë dhe pastaj jepni emrin e një komandë. 577 00:47:34,340 --> 00:47:36,460 Dhe ju shihni Gdb na jep të gjitha llojet e stuff këtë. 578 00:47:36,460 --> 00:47:43,870 Ajo thotë se, "Me asnjë argument, listat dhjetë rreshta më pas ose rreth liste mëparshëm. 579 00:47:43,870 --> 00:47:47,920 Lista - liston dhjetë linjat e para - " 580 00:47:47,920 --> 00:47:52,960 Pra, le të provoni duke përdorur minus listë. 581 00:47:52,960 --> 00:47:57,000 Dhe se listat e 10 linjat e mëparshme, ju mund të luajnë rreth me listën pak. 582 00:47:57,000 --> 00:48:02,330 Ju mund të bëni listën, listë -, ju mund të jap edhe lista një numër, si lista e 8, 583 00:48:02,330 --> 00:48:07,500 dhe ajo do të rendisin 10 rreshta rreth linjës 8. 584 00:48:07,500 --> 00:48:10,290 Dhe ju mund të shihni se çfarë po ndodh këtu është që ju keni marrë një të thjeshtë, nëse tjetër. 585 00:48:10,290 --> 00:48:13,980 Nëse ju shkruani në shkëmbinj CS50, ajo kopje nga "Ju merrni një A." 586 00:48:13,980 --> 00:48:16,530 Përndryshe ajo printon nga "Ju merrni një D." 587 00:48:16,530 --> 00:48:23,770 Qyteti zhgënjim. Dakord. Po? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Pra, kur unë u përpoq duke bërë CS50 shkëmbinj pa thonjëza, 589 00:48:26,730 --> 00:48:29,290 ai thotë se "Ju merrni një D." 590 00:48:29,290 --> 00:48:32,560 I nevojshëm kuotat për të marrë atë për të punuar, pse është kjo? 591 00:48:32,560 --> 00:48:38,490 Po >>. Ajo rezulton se kur - kjo është një tjetër gjë e mirë pak fun - 592 00:48:38,490 --> 00:48:47,900 kur ju të drejtuar programin, në qoftë se ne e drejtuar atë dhe ne shkruani në CS50 shkëmbinj, 593 00:48:47,900 --> 00:48:50,800 ashtu si Danieli u thënë se ai e bëri, dhe ju goditi Enter, 594 00:48:50,800 --> 00:48:52,870 ajo ende thotë se ne kemi marrë një D. 595 00:48:52,870 --> 00:48:55,580 Dhe pyetja është, pse është kjo? 596 00:48:55,580 --> 00:49:02,120 Dhe kjo rezulton se edhe terminali ynë dhe Gdb kuptoj këto si dy argumente të veçanta. 597 00:49:02,120 --> 00:49:04,800 Sepse kur ka një hapësirë, që është nënkuptuar si 598 00:49:04,800 --> 00:49:08,730 Argumenti i parë përfundoi, argumenti tjetër është gati të fillojë. 599 00:49:08,730 --> 00:49:13,260 Mënyra për të kombinuar ato në dy, ose keq, në një argument, 600 00:49:13,260 --> 00:49:18,510 është që të përdorin kuotat. 601 00:49:18,510 --> 00:49:29,560 Deri tani, në qoftë se ne kemi vënë atë në thonjëza dhe drejtuar atë përsëri, ne të merrni një A. 602 00:49:29,560 --> 00:49:38,780 Pra, vetëm për radhitje, pa thonjëza, CS50 dhe shkëmbinj janë parsed si dy argumente të veçanta. 603 00:49:38,780 --> 00:49:45,320 Me citate, kjo është parsed si një argument krejt. 604 00:49:45,320 --> 00:49:53,070 >> Ne mund të shohim këtë me një breakpoint. 605 00:49:53,070 --> 00:49:54,920 Deri tani ne kemi qenë në drejtimin e programit tonë, dhe kjo është running 606 00:49:54,920 --> 00:49:58,230 deri ose ajo seg meta apo godet një gabim 607 00:49:58,230 --> 00:50:05,930 ose deri sa ajo ka dalë dhe të gjithë ka qenë krejtësisht gjobë. 608 00:50:05,930 --> 00:50:08,360 Kjo nuk është domosdoshmërisht gjëja më e dobishme, sepse ndonjëherë 609 00:50:08,360 --> 00:50:11,840 ju keni një gabim në programin tuaj, por kjo nuk është shkaktuar një defekt segmentimit. 610 00:50:11,840 --> 00:50:16,950 Kjo nuk është shkaktuar programin tuaj për të ndaluar ose diçka të tillë. 611 00:50:16,950 --> 00:50:20,730 Mënyra për të marrë gdb për pushim programin tuaj në një pikë të veçantë 612 00:50:20,730 --> 00:50:23,260 është për të vendosur një breakpoint. 613 00:50:23,260 --> 00:50:26,520 Ju mund ta bëni këtë duke vendosur një breakpoint në një emër funksion 614 00:50:26,520 --> 00:50:30,770 ose ju mund të vendosni një breakpoint në një linjë të veçantë të kodit. 615 00:50:30,770 --> 00:50:34,450 Më pëlqen për të vendosur breakpoints në emrat funksion, sepse - e lehtë për të kujtuar, 616 00:50:34,450 --> 00:50:37,700 dhe në qoftë se ju në të vërtetë të shkoni në dhe për të ndryshuar kodin tuaj burim deri pak, 617 00:50:37,700 --> 00:50:42,020 atëherë breakpoint tuaj të vërtetë do të qëndrojnë në të njëjtin vend brenda kodin tuaj. 618 00:50:42,020 --> 00:50:44,760 Ndërsa në qoftë se ju jeni duke përdorur numrat e linjës, dhe numrat e linjës të ndryshojë 619 00:50:44,760 --> 00:50:51,740 sepse ju shtoni ose fshini ndonjë kod, atëherë pikat e ndalimit tuaja janë të gjithë të dehur totalisht deri. 620 00:50:51,740 --> 00:50:58,590 Një nga gjërat më të zakonshme që bëj unë është vendosur një breakpoint në funksionin kryesor. 621 00:50:58,590 --> 00:51:05,300 Shpesh unë do të boot up GDB, unë do të tipit B MAIN, hit Enter, dhe se do të vendosë një breakpoint 622 00:51:05,300 --> 00:51:10,630 në funksion kryesor që vetëm thotë, "pauzë programin sa më shpejt që ju të filloni running" 623 00:51:10,630 --> 00:51:17,960 Dhe në këtë mënyrë, kur kam drejtuar programin tim me, të themi, CS50 shkëmbinjve si dy argumente 624 00:51:17,960 --> 00:51:24,830 dhe hit Enter, ajo merr me funksionin kryesor dhe ndalon të drejtën në linjë të parë, 625 00:51:24,830 --> 00:51:30,620 drejtë para se ajo vlerëson funksionin strcmp. 626 00:51:30,620 --> 00:51:34,940 >> Që unë jam ndaluar, tani unë mund të fillojë mucking rreth dhe duke parë se çfarë po ndodh 627 00:51:34,940 --> 00:51:40,250 me të gjitha variablave të ndryshme që janë kaluar në programin tim. 628 00:51:40,250 --> 00:51:43,670 Këtu unë mund të shtypura nga argc dhe të shohim se çfarë po ndodh. 629 00:51:43,670 --> 00:51:50,030 Shih se argc është 3, sepse ai e mori 3 vlera të ndryshme në të. 630 00:51:50,030 --> 00:51:54,060 Ajo e mori emrin e programit, ai e mori argumentin e parë dhe Argumenti i dytë. 631 00:51:54,060 --> 00:52:09,330 Ne mund të shtypura nga ata që duke kërkuar në argv [0], argv [1], dhe argv [2]. 632 00:52:09,330 --> 00:52:12,030 Deri tani ju mund të shihni se pse kjo thirrje strcmp do të dështojnë, 633 00:52:12,030 --> 00:52:21,650 sepse ju shihni se ai ka ndarë deri CS50 dhe shkëmbinjtë në dy argumente të veçanta. 634 00:52:21,650 --> 00:52:27,250 Në këtë pikë, një herë ju keni goditur një breakpoint, ju mund të vazhdojë të hap nëpërmjet programit tuaj 635 00:52:27,250 --> 00:52:32,920 rresht pas rreshti, në krahasim me fillimin e programit tuaj përsëri. 636 00:52:32,920 --> 00:52:35,520 Pra, nëse ju nuk doni të filloni programin tuaj përsëri dhe vetëm të vazhdojë më nga këtu, 637 00:52:35,520 --> 00:52:41,970 ju mund të përdorni komandën vazhdojnë dhe do të vazhdojnë të drejtuar programin në fund. 638 00:52:41,970 --> 00:52:45,010 Ashtu si ajo e bëri këtu. 639 00:52:45,010 --> 00:52:54,880 Megjithatë, në qoftë se unë rinisni programin, CS50 shkëmbinj, ajo godet breakpoint time përsëri, 640 00:52:54,880 --> 00:52:59,670 dhe këtë herë, në qoftë se unë nuk dua të vetëm të shkojnë të gjithë rrugën nëpër pjesën tjetër të programit, 641 00:52:59,670 --> 00:53:08,040 Unë mund të përdorni komandën e ardhshëm, i cili edhe unë shkurtoj me n. 642 00:53:08,040 --> 00:53:12,960 Dhe kjo do të hap përmes linjës programit nga linjë. 643 00:53:12,960 --> 00:53:17,530 Kështu që ju mund të shikojnë si gjëra të ekzekutuar, si ndryshimi i variablave, si gjërat të merrni përditësuar. 644 00:53:17,530 --> 00:53:21,550 E cila është shumë e bukur. 645 00:53:21,550 --> 00:53:26,570 Gjë tjetër është e ftohtë sesa përsëritur komandën njëjta pa pushim, 646 00:53:26,570 --> 00:53:30,670 në qoftë se ju vetëm hit Enter - kështu që këtu ju shihni unë nuk kam shtypur në asgjë - 647 00:53:30,670 --> 00:53:33,780 në qoftë se unë vetëm goditi Enter, ai do të përsërisë komandën e mëparshme, 648 00:53:33,780 --> 00:53:36,900 ose komandën mëparshme Gdb se unë vetëm vënë in 649 00:53:36,900 --> 00:53:56,000 Unë mund të mbani goditur Enter dhe ajo do të mbajë shkelën përmes linjës sime kodit nga linjë. 650 00:53:56,000 --> 00:53:59,310 Unë do të ju inkurajoj që të shkoni djema shikoni programe të tjera buggy si. 651 00:53:59,310 --> 00:54:01,330 Ne nuk kemi kohë për të marrë nëpër të gjitha prej tyre sot në seksion. 652 00:54:01,330 --> 00:54:05,890 Kodi burimor është atje, kështu që ju mund të lloj të shohim se çfarë po ndodh 653 00:54:05,890 --> 00:54:07,730 prapa skenave në qoftë se ju merrni mbërthyer me të vërtetë, 654 00:54:07,730 --> 00:54:11,940 por në shumë pak, vetëm praktikë booting up GDB, 655 00:54:11,940 --> 00:54:13,940 drejtimin e programit deri sa prishet për ju, 656 00:54:13,940 --> 00:54:18,260 marrjen e backtrace, duke parafytyruar se çfarë të funksionojë përplasje ishte në, 657 00:54:18,260 --> 00:54:24,450 çfarë ajo ishte në linjë, shtypje nga disa vlera të ndryshueshme, 658 00:54:24,450 --> 00:54:30,140 vetëm kështu që ju të merrni një të ndjehen për atë, sepse kjo do të ndihmojë me të vërtetë që ju të shkojnë përpara. 659 00:54:30,140 --> 00:54:36,340 Në këtë pikë, ne jemi duke shkuar për të lënë jashtë GDB, të cilat ju mund të përdorni lë ose vetëm q. 660 00:54:36,340 --> 00:54:40,460 Nëse programi juaj është në mes të rrjedhshëm ende, dhe kjo nuk ka dalë, 661 00:54:40,460 --> 00:54:43,510 ajo gjithmonë do të ju pyes, "Jeni te sigurte qe doni me të vërtetë të lë?" 662 00:54:43,510 --> 00:54:48,770 Ju vetëm mund të goditur po. 663 00:54:48,770 --> 00:54:55,250 >> Tani ne do të shikojmë në problemin e ardhshëm ne kemi, që është programi cat. 664 00:54:55,250 --> 00:54:59,880 Nëse keni shikuar të shkurtër në Përcjellin dhe tuba, ju do të shihni se Tommy përdor këtë program 665 00:54:59,880 --> 00:55:07,540 që në thelb shtyp të gjithë prodhimin e një file në ekran. 666 00:55:07,540 --> 00:55:12,660 Pra, nëse unë të drejtuar cat, kjo është në fakt një ndërtuar në program për aplikim, 667 00:55:12,660 --> 00:55:16,860 dhe në qoftë se ju keni Macs që ju mund ta bëni këtë në Mac tuaj shumë, nëse keni hapur terminal. 668 00:55:16,860 --> 00:55:25,630 Dhe ne - macja, le të themi, cp.c, dhe hit Enter. 669 00:55:25,630 --> 00:55:29,640 Çfarë kjo e bëri, në qoftë se ne lëvizni lart pak dhe të shohim se ku ne u linjë, 670 00:55:29,640 --> 00:55:40,440 ose ku ne u komandën cat, ajo fjalë për fjalë të shtypura vetëm nga përmbajtjen e cp.c në ekranin tonë. 671 00:55:40,440 --> 00:55:44,140 Ne mund të kandidojë atë përsëri dhe ju mund të vënë në fotografi të shumta së bashku. 672 00:55:44,140 --> 00:55:49,880 Kështu që ju mund të bëni cp.c mace, dhe pastaj ne mund të lidh file cat.c, 673 00:55:49,880 --> 00:55:53,250 që është një program që ne jemi gati për të shkruar, 674 00:55:53,250 --> 00:55:58,140 dhe ajo do të shtypura dy fotografi për të kthyer prapa në ekranin tonë. 675 00:55:58,140 --> 00:56:05,490 Pra, nëse ne lëvizni lart pak, ne shohim se kur ne u këtë cp.c mace, cat.c, 676 00:56:05,490 --> 00:56:17,110 Së pari, ai printuar nga CP dosjen, dhe pastaj poshtë, ajo printohet dosjen cat.c drejtë këtu poshtë. 677 00:56:17,110 --> 00:56:19,650 Ne jemi duke shkuar për të përdorur këtë për të marrë vetëm këmbët tona lagësht. 678 00:56:19,650 --> 00:56:25,930 Luajnë rreth me shtypjen e thjeshtë të terminalit, shih se si funksionon. 679 00:56:25,930 --> 00:56:39,170 Në qoftë se ju djema të hapur deri me Gedit cat.c, hit Enter, 680 00:56:39,170 --> 00:56:43,760 ju mund të shihni programin që ne jemi gati për të shkruar. 681 00:56:43,760 --> 00:56:48,980 Ne kemi përfshirë këtë pjatë bojler të bukur, kështu që ne nuk duhet të kalojnë kohë shtypja gjithë jashtë atë. 682 00:56:48,980 --> 00:56:52,310 Ne gjithashtu kontrolloni numrin e argumenteve kaloi in 683 00:56:52,310 --> 00:56:56,910 Ne të shtypura nga një mesazh të bukur përdorimit. 684 00:56:56,910 --> 00:57:00,950 >> Kjo është lloj i gjë që, përsëri, ashtu si ne kemi qenë duke folur rreth, 685 00:57:00,950 --> 00:57:04,490 kjo është pothuajse si memorie të muskujve. 686 00:57:04,490 --> 00:57:07,190 Vetëm mos harroni të vazhdojmë të bëjmë të njëjtën lloj të stuff 687 00:57:07,190 --> 00:57:11,310 dhe gjithmonë shtypje nga disa lloj mesazhi dobishme 688 00:57:11,310 --> 00:57:17,670 mënyrë që njerëzit të dinë se si për të drejtuar programin tuaj. 689 00:57:17,670 --> 00:57:21,630 Me mace, kjo është shumë e thjeshtë, ne jemi vetëm duke shkuar për të shkuar nëpër të gjitha argumentet të ndryshme 690 00:57:21,630 --> 00:57:24,300 që janë kaluar në programin tonë, dhe ne jemi duke shkuar për të shtypur 691 00:57:24,300 --> 00:57:29,950 Përmbajtja e tyre jashtë në ekran në një kohë. 692 00:57:29,950 --> 00:57:35,670 Në mënyrë që të shtypura fotografi nga të ekranit, ne jemi duke shkuar për të bërë diçka shumë të ngjashme 693 00:57:35,670 --> 00:57:38,120 me atë që ne e bëmë në fund të quiz. 694 00:57:38,120 --> 00:57:45,350 Në fund të quiz, që punësojnë program, ne kishim për të hapur një skedar, 695 00:57:45,350 --> 00:57:48,490 dhe pastaj na u desh për të shkruar për të. 696 00:57:48,490 --> 00:57:54,660 Në këtë rast, ne jemi duke shkuar për të hapur një skedar, dhe ne jemi duke shkuar për të lexuar nga ai vend. 697 00:57:54,660 --> 00:58:00,630 Atëherë ne jemi duke shkuar për të shkruar, në vend të në një skedar, ne jemi duke shkuar për të shtypur në ekran. 698 00:58:00,630 --> 00:58:05,830 Pra, shtypje në ekran që ju keni bërë të gjitha para me printf. 699 00:58:05,830 --> 00:58:08,290 Kështu që nuk është shumë e çmendur. 700 00:58:08,290 --> 00:58:12,190 Por duke lexuar një skedar është lloj i pazakontë. 701 00:58:12,190 --> 00:58:17,300 Ne do të shkoni nëpër atë pak pak në një kohë. 702 00:58:17,300 --> 00:58:20,560 Në qoftë se ju djema shkoni përsëri në këtë problem të fundit në quiz tuaj, problemit 33, 703 00:58:20,560 --> 00:58:27,280 rreshtin e parë që ne jemi duke shkuar për të bërë këtu, duke hapur dosjen, është shumë e ngjashme me atë që ne e bëmë atje. 704 00:58:27,280 --> 00:58:36,370 Pra Stella, çfarë bën që duken si të linjës, kur ne të hapur një skedë? 705 00:58:36,370 --> 00:58:47,510 [Stella] * Capital Foto, file - >> Okay. >> - Është e barabartë me fopen. Yup >>. 706 00:58:47,510 --> 00:58:55,980 E cila në këtë rast është? Është në komentin. 707 00:58:55,980 --> 00:59:06,930 >> Është në komentin? argv [i] dhe r? 708 00:59:06,930 --> 00:59:11,300 Pikërisht >>. Drejtë në. Pra, Stella është krejtësisht e drejtë. 709 00:59:11,300 --> 00:59:13,720 Kjo është ajo që duket si linjë. 710 00:59:13,720 --> 00:59:19,670 Ne jemi duke shkuar për të marrë një ndryshore lumë file, ruani atë në një * Foto, kështu që të gjitha shkronja kapitale, 711 00:59:19,670 --> 00:59:25,720 Foto, *, dhe emri i këtij variablit do të jenë file. 712 00:59:25,720 --> 00:59:32,250 Ne mund të telefononi atë çfarë na pëlqen. Ne mund të telefononi atë first_file, ose file_i, çfarëdo që ne do të donim. 713 00:59:32,250 --> 00:59:37,590 Dhe pastaj emrin e file u miratua në në rreshtin e komandave në këtë program. 714 00:59:37,590 --> 00:59:44,450 Kështu që është ruajtur në argv [i], dhe pastaj ne jemi duke shkuar për të hapur këtë file në mënyrë të lexuar. 715 00:59:44,450 --> 00:59:48,100 Tani që ne kemi hapur dosjen, çfarë është gjëja që ne gjithmonë duhet të mbani mend për të bërë 716 00:59:48,100 --> 00:59:52,230 sa herë që ne kemi hapur një skedar? Afër atë. 717 00:59:52,230 --> 00:59:57,220 Pra Missy, sa nuk kemi mbyllur një skedë? 718 00:59:57,220 --> 01:00:01,020 [Missy] Shkrimi (file) >> Shkrimi (file). Saktësisht. 719 01:00:01,020 --> 01:00:05,340 Madhe. Rregull. Nëse ne shikojmë në këtë të bëni koment drejtë këtu, 720 01:00:05,340 --> 01:00:11,940 ai thotë se, "Open argv [i] dhe printoni përmbajtjen e saj të stdout." 721 01:00:11,940 --> 01:00:15,460 >> Nga standardi është një emër i pazakontë. Syswrite është vetëm mënyra jonë për të thënë 722 01:00:15,460 --> 01:00:22,880 ne duam të shtypura atë në terminal, ne duam të shtypura atë në lumë standarde prodhimit. 723 01:00:22,880 --> 01:00:26,450 Ne fakt mund të shpëtoj nga ky komenti të drejtë këtu. 724 01:00:26,450 --> 01:00:36,480 Unë jam duke shkuar për të kopjoni dhe ngjisni atë atë që kjo është ajo që ne e bëmë. 725 01:00:36,480 --> 01:00:41,290 Në këtë pikë, tani ne kemi për të lexuar pak nga pak e fotografisë. 726 01:00:41,290 --> 01:00:46,300 Ne kemi diskutuar disa mënyra leximit të dosjeve. 727 01:00:46,300 --> 01:00:51,830 Të cilat ato janë të preferuarat tuaja deri tani? 728 01:00:51,830 --> 01:00:57,960 Cili mënyra keni parë ose nuk ju kujtohet, për të lexuar fotografi? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? Fread >>? Kështu fread është një. Jimmy, ju e dini ndonjë të tjerët? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] nr >> Okay. Jo. Charlotte? Alexander? Ndonjë të tjerët? Rregull. 731 01:01:12,150 --> 01:01:20,740 Pra, ato të tjera janë fgetc, është ai që ne do të përdorim një shumë. 732 01:01:20,740 --> 01:01:26,410 Ka gjithashtu fscanf, ju djema shikoni një model këtu? 733 01:01:26,410 --> 01:01:29,170 Ata të gjithë fillojnë me f. Asgjë të bëjë me një skedar. 734 01:01:29,170 --> 01:01:35,260 Ka fread, fgetc, fscanf. Këto janë të gjitha funksionet e leximit. 735 01:01:35,260 --> 01:01:49,120 Për të shkruar kemi fwrite, ne kemi fputc vend të fgetc. 736 01:01:49,120 --> 01:01:58,250 Ne gjithashtu kemi fprintf si e pamë në quiz. 737 01:01:58,250 --> 01:02:01,680 Që kjo është një problem që përfshin lexuar nga një skedar, 738 01:02:01,680 --> 01:02:04,940 ne jemi duke shkuar për të përdorur një nga këto tri funksione. 739 01:02:04,940 --> 01:02:10,890 Ne nuk jemi duke shkuar për të përdorur këto funksione këtu poshtë. 740 01:02:10,890 --> 01:02:14,880 Këto funksione janë gjetur të gjitha në bibliotekën standarde I / O. 741 01:02:14,880 --> 01:02:17,510 Pra, nëse ju shikoni në krye të këtij programi, 742 01:02:17,510 --> 01:02:24,110 ju mund të shihni se ne kemi përfshirë tashmë file header për bibliotekën standarde I / O. 743 01:02:24,110 --> 01:02:27,120 Në qoftë se ne duam të kuptoj se cilat një që ne duam të përdorim, 744 01:02:27,120 --> 01:02:29,690 ne gjithmonë mund të hapë faqet e njeri. 745 01:02:29,690 --> 01:02:34,350 Pra, ne mund të shtypni stdio njeri 746 01:02:34,350 --> 01:02:43,180 dhe të lexoni të gjitha në lidhje me kontributin stdio dhe funksionet e prodhimit në C. 747 01:02:43,180 --> 01:02:49,870 Dhe ne mund të shohim tashmë oh, po. Është përmendur fgetc, ajo përmendet fputc. 748 01:02:49,870 --> 01:02:57,220 Kështu që ju mund të Stërvitja poshtë pak dhe shikoni në, të themi, fgetc 749 01:02:57,220 --> 01:03:00,060 dhe të kërkoni në faqen e saj njeri. 750 01:03:00,060 --> 01:03:03,430 Ju mund të shihni se ajo shkon së bashku me një bandë e tërë e funksioneve të tjera: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, merr, ungetc, dhe kontributin e tij të karaktereve dhe vargjet. 752 01:03:12,640 --> 01:03:19,180 Pra, kjo është se si ne lexojmë në karaktere dhe vargjet nga dosjet nga input standard, 753 01:03:19,180 --> 01:03:21,990 cila është në thelb nga perdoruesit. 754 01:03:21,990 --> 01:03:24,780 Dhe kjo është se si ne bëjmë atë në C. aktuale 755 01:03:24,780 --> 01:03:30,850 Pra, kjo nuk është duke përdorur getString dhe funksionet GetChar 756 01:03:30,850 --> 01:03:36,840 që kemi përdorur nga biblioteka CS50. 757 01:03:36,840 --> 01:03:39,710 Ne jemi duke shkuar për të bërë këtë problem në disa mënyra 758 01:03:39,710 --> 01:03:43,430 kështu që ju mund të shihni dy mënyra të ndryshme për të bërë atë. 759 01:03:43,430 --> 01:03:48,490 Dy fread funksion që Danieli përmendur dhe fgetc janë mënyra të mira për të bërë atë. 760 01:03:48,490 --> 01:03:53,790 Unë mendoj se fgetc është pak më e lehtë, sepse ai ka vetëm, siç e shihni, 761 01:03:53,790 --> 01:03:59,660 një argument, * FILE që ne jemi duke u përpjekur për të lexuar karakter nga, 762 01:03:59,660 --> 01:04:02,740 dhe vlera e tij e kthimit është një int. 763 01:04:02,740 --> 01:04:05,610 Dhe kjo është pak konfuze, apo jo? 764 01:04:05,610 --> 01:04:11,450 >> Sepse ne jemi duke marrë një karakter, kështu që pse nuk e ky kthim një char? 765 01:04:11,450 --> 01:04:18,700 Ju djema keni ndonjë ide se pse kjo nuk mund të kthehen një char? 766 01:04:18,700 --> 01:04:25,510 [Përgjigjet Missy, i pakuptueshëm] >> yeah. Pra Missy është krejtësisht e drejtë. 767 01:04:25,510 --> 01:04:31,570 Nëse kjo është ASCII, atëherë ky numër të plotë mund të jetë plotësisht në një char aktuale. 768 01:04:31,570 --> 01:04:33,520 Mund të jetë një simbol ASCII, dhe kjo është e drejtë. 769 01:04:33,520 --> 01:04:36,220 Kjo është pikërisht ajo që po ndodh. 770 01:04:36,220 --> 01:04:39,190 Ne jemi duke përdorur një int thjesht sepse ajo ka më shumë copa. 771 01:04:39,190 --> 01:04:44,750 Kjo është më e madhe se një char; char ynë i vetëm ka 8 bit, se 1 bajt për makinat 32-bit tonë. 772 01:04:44,750 --> 01:04:48,520 Dhe një int ka vlerë të gjitha 4 bytes 'e hapësirës. 773 01:04:48,520 --> 01:04:50,940 Dhe kjo rezulton se rruga fgetc punon, 774 01:04:50,940 --> 01:04:53,940 nëse lëvizni poshtë në përmbledhje tonë në këtë faqe burrë pak, 775 01:04:53,940 --> 01:05:05,000 shkoni të gjithë rrugën poshtë. Ajo rezulton se ata përdorin këtë vlerë të veçantë të quajtur EOF. 776 01:05:05,000 --> 01:05:09,640 Kjo është një konstante të veçantë si vlerë e kthimit të funksionit fgetc 777 01:05:09,640 --> 01:05:14,570 sa herë që ju goditi në fund të file ose nëse ju merrni një gabim. 778 01:05:14,570 --> 01:05:18,170 Dhe kjo rezulton se për të bërë këto krahasime me EOF siç duhet, 779 01:05:18,170 --> 01:05:24,060 ju dëshironi të keni atë sasi shtesë e informacionit që ju keni në një int 780 01:05:24,060 --> 01:05:28,420 në krahasim me duke përdorur një ndryshore char. 781 01:05:28,420 --> 01:05:32,130 Edhe pse fgetc është në mënyrë efektive duke marrë një karakter nga një skedar, 782 01:05:32,130 --> 01:05:38,450 ju doni të mbani mend se ajo është kthyer diçka që është e tipit int për ju. 783 01:05:38,450 --> 01:05:41,360 Kjo tha, ajo është mjaft e lehtë për t'u përdorur. 784 01:05:41,360 --> 01:05:44,960 Ajo do të na japin një karakter, kështu që të gjithë ne duhet të bëni është të mbani duke i kërkuar dosjen, 785 01:05:44,960 --> 01:05:48,440 "Ma jep karakter tjetër, më jep karakter tjetër, më jep karakter tjetër," 786 01:05:48,440 --> 01:05:51,400 deri sa të kemi në fund të file. 787 01:05:51,400 --> 01:05:54,730 Dhe se do të tërheqë në një karakter në një kohë nga dosjen tonë, 788 01:05:54,730 --> 01:05:56,250 dhe pastaj ne mund të bëjmë çdo gjë që ne donim me të. 789 01:05:56,250 --> 01:06:00,160 Ne mund të ruajë atë, ne mund të shtoni atë në një varg, ne mund të shtypura atë. 790 01:06:00,160 --> 01:06:04,630 A ndonjë nga se. 791 01:06:04,630 --> 01:06:09,600 >> Zooming nga mbrapa dhe duke shkuar prapa në programin tonë cat.c, 792 01:06:09,600 --> 01:06:16,170 në qoftë se ne jemi duke shkuar për të përdorur fgetc, 793 01:06:16,170 --> 01:06:21,710 se si mund të afrohemi këtë linjë tjetër të kodit? 794 01:06:21,710 --> 01:06:26,020 Ne jemi duke shkuar për të përdorur - fread do të bëjë diçka pak të ndryshme. 795 01:06:26,020 --> 01:06:32,600 Dhe këtë herë, ne jemi vetëm duke shkuar për të përdorur fgetc për të marrë një karakter në një kohë. 796 01:06:32,600 --> 01:06:40,910 Të procesit të një file të tërë, çfarë mund të kemi të bëjmë? 797 01:06:40,910 --> 01:06:44,030 Sa shumë karaktere janë atje në një dosje? 798 01:06:44,030 --> 01:06:47,390 Nuk janë një shumë. Pra, ju ndoshta dëshironi të merrni një 799 01:06:47,390 --> 01:06:49,860 dhe pastaj të marrë një tjetër dhe për të marrë një tjetër dhe për të marrë një tjetër. 800 01:06:49,860 --> 01:06:53,330 Çfarë lloj algorithm mendoni se ne mund të kemi për të përdorur këtu? 801 01:06:53,330 --> 01:06:55,470 Çfarë lloji të -? [Aleksandër] A për lak? Pikërisht >>. 802 01:06:55,470 --> 01:06:57,500 Disa lloj lak. 803 01:06:57,500 --> 01:07:03,380 Një për lak është në të vërtetë e madhe, në këtë rast. 804 01:07:03,380 --> 01:07:08,620 Dhe si ju janë duke thënë, kjo tingëllon si ju doni një lak mbi të gjithë dosjen, 805 01:07:08,620 --> 01:07:11,820 duke marrë një karakter në një kohë. 806 01:07:11,820 --> 01:07:13,850 Çdo sugjerime në atë që mund të duken si? 807 01:07:13,850 --> 01:07:22,090 [Alexander, i pakuptueshëm] 808 01:07:22,090 --> 01:07:30,050 Mirë >>, vetëm më tregoni në gjuhën angleze se çfarë jeni duke u përpjekur për të bërë? [Alexander, i pakuptueshëm] 809 01:07:30,050 --> 01:07:36,270 Pra, në këtë rast, kjo tingëllon si ne jemi vetëm duke u përpjekur për të lak mbi të gjithë dosjen. 810 01:07:36,270 --> 01:07:45,330 [Aleksandër] Pra, i > -? 811 01:07:45,330 --> 01:07:49,290 I guess madhësinë e file, apo jo? Madhësia - we'll shkruani vetëm atë si kjo. 812 01:07:49,290 --> 01:07:57,470 Madhësia e dosjes për momentin, i + +. 813 01:07:57,470 --> 01:08:04,610 Pra, rezulton se në mënyrë që ju të bëni këtë duke përdorur fgetc, dhe kjo është e re, 814 01:08:04,610 --> 01:08:10,460 është se nuk ka asnjë mënyrë e lehtë për të merrni vetëm madhësinë e një file 815 01:08:10,460 --> 01:08:16,979 me këtë "sizeof" llojin e ndërtuar që ju keni parë më parë. 816 01:08:16,979 --> 01:08:20,910 Kur ne përdorim atë funksion fgetc, ne jemi futur disa lloj 817 01:08:20,910 --> 01:08:29,069 re, Sintaksa shokuar me këtë për lak, ku në vend të duke përdorur vetëm një counter themelore 818 01:08:29,069 --> 01:08:33,920 për të shkuar karakter nga karakteri, ne jemi duke shkuar për të tërhequr një karakter në një kohë, 819 01:08:33,920 --> 01:08:37,120 një karakter në një kohë, dhe mënyrën se si ne e dimë se ne jemi në fund 820 01:08:37,120 --> 01:08:41,290 nuk është kur ne kemi numëruar një numër të caktuar të karaktereve, 821 01:08:41,290 --> 01:08:49,939 por kur personazhi ne tërhiqet nga se fundi i veçantë i karakterit file. 822 01:08:49,939 --> 01:08:58,689 Pra, ne mund ta bëni këtë duke - Unë e quaj këtë ch, dhe ne jemi duke shkuar për të nisja atë 823 01:08:58,689 --> 01:09:08,050 me thirrjen tonë të parë për të marrë karakterin parë nga file. 824 01:09:08,050 --> 01:09:14,979 Pra, këtë pjesë të drejtë këtu, kjo do të marrë një karakter nga e dosjes 825 01:09:14,979 --> 01:09:20,840 dhe ruajtur atë në ch ndryshueshme. 826 01:09:20,840 --> 01:09:25,420 Ne jemi duke shkuar për të mbajtur të bërë këtë deri sa të kemi në fund të skedarit, 827 01:09:25,420 --> 01:09:41,170 që ne bëjmë nga testimi për karakterin jo të barabartë me atë karakter të veçantë EOF. 828 01:09:41,170 --> 01:09:48,750 Dhe pastaj në vend që të bëjnë ch + +, i cili vetëm do të rritje e vlerës, 829 01:09:48,750 --> 01:09:52,710 kështu që nëse ne lexojmë një nga një të dosjes, një kapital A, thonë, 830 01:09:52,710 --> 01:09:56,810 ch + + do na japin b, dhe pastaj ne do të merrni dhe pastaj c d. 831 01:09:56,810 --> 01:09:59,310 Kjo nuk është e qartë se çfarë duam. Ajo që ne duam këtu 832 01:09:59,310 --> 01:10:05,830 në këtë pak e fundit është që ne duam të marrë karakter tjetër nga dosja. 833 01:10:05,830 --> 01:10:09,500 >> Pra, si mund të kemi marrë karakter tjetër nga dosja? 834 01:10:09,500 --> 01:10:13,470 Si nuk kemi marrë karakterin parë nga file? 835 01:10:13,470 --> 01:10:17,200 [Student] fgetfile? Fgetc >>, ose, më vjen keq, ju ishit krejtësisht e drejtë. 836 01:10:17,200 --> 01:10:20,470 Unë misspelled atë të drejtë atje. Pra, vërtet. 837 01:10:20,470 --> 01:10:26,240 Këtu në vend të bërë ch + +, 838 01:10:26,240 --> 01:10:29,560 ne jemi vetëm duke shkuar për të thirrur fgetc (file) përsëri 839 01:10:29,560 --> 01:10:39,180 dhe ruajtur rezultatin në variabël të njëjtën tonë ch. 840 01:10:39,180 --> 01:10:43,730 [Pyetja Student, pakuptueshëm] 841 01:10:43,730 --> 01:10:52,390 Kjo është ajo ku >> këta dosjen * janë të veçantë. 842 01:10:52,390 --> 01:10:59,070 Mënyra se si ata punojnë është se ata - kur ju së pari të hapur - kur ju së pari të bëni atë telefonatë fopen, 843 01:10:59,070 --> 01:11:04,260 e * Foto efektivisht shërben si një tregues në fillim të file. 844 01:11:04,260 --> 01:11:12,830 Dhe pastaj çdo herë që ju e quani fgetc, ajo lëviz një karakter nëpër dosje. 845 01:11:12,830 --> 01:11:23,280 Pra, kur ju telefononi këtë, ju jeni bën rritjen treguesin e fotografisë me një karakter. 846 01:11:23,280 --> 01:11:26,210 Dhe kur ju fgetc përsëri, ju jeni duke lëvizur atë një karakter 847 01:11:26,210 --> 01:11:28,910 dhe një tjetër karakter dhe një tjetër karakter dhe një tjetër karakter. 848 01:11:28,910 --> 01:11:32,030 [Pyetja Student, pakuptueshëm] >> Dhe that's - yeah. 849 01:11:32,030 --> 01:11:34,810 Kjo është lloj i këtij magji nën kapuç. 850 01:11:34,810 --> 01:11:37,930 Ju vetëm i mbajnë bën rritjen përmes. 851 01:11:37,930 --> 01:11:46,510 Në këtë pikë, ju jeni në gjendje që në fakt të punojnë me një karakter. 852 01:11:46,510 --> 01:11:52,150 Pra, si mund të kemi shkruar këtë jashtë në ekran, tani? 853 01:11:52,150 --> 01:11:58,340 Ne mund të përdorni të njëjtën gjë që kemi përdorur printf parë. 854 01:11:58,340 --> 01:12:00,330 Se ne kemi qenë duke përdorur të gjitha semestër. 855 01:12:00,330 --> 01:12:05,450 Ne mund të telefononi printf, 856 01:12:05,450 --> 01:12:21,300 dhe ne mund të kalojë në karakter vetëm si kjo. 857 01:12:21,300 --> 01:12:27,430 Një tjetër mënyrë për të bërë atë është vend se duke përdorur printf dhe të kesh për të bërë këtë varg format, 858 01:12:27,430 --> 01:12:29,490 ne gjithashtu mund të përdorni një nga funksionet e tjera. 859 01:12:29,490 --> 01:12:40,090 Ne mund të përdorim fputc, i cili shtyp një karakter në ekran, 860 01:12:40,090 --> 01:12:52,580 përveç nëse ne shikojmë në fputc - më lejoni të zoom out pak. 861 01:12:52,580 --> 01:12:56,430 Ne e shohim se çfarë është e bukur është ajo merr në të karakterit që ne lexojmë duke përdorur fgetc, 862 01:12:56,430 --> 01:13:05,100 por atëherë ne kemi për të dhënë atë një lumë për të shkruar për të. 863 01:13:05,100 --> 01:13:11,850 Ne gjithashtu mund të përdorni funksionin e putchar, e cila do të vënë direkt në jashtë standardit. 864 01:13:11,850 --> 01:13:16,070 Pra, ka një bandë e tërë e opcioneve të ndryshme që ne mund të përdorni për printim. 865 01:13:16,070 --> 01:13:19,580 Ata janë të gjithë në bibliotekën standarde I / O. 866 01:13:19,580 --> 01:13:25,150 Sa herë që ju doni të shtypura - kështu printf, by default, do të shtypura me standardin veçantë nga lumë, 867 01:13:25,150 --> 01:13:27,910 cila është se Syswrite. 868 01:13:27,910 --> 01:13:41,300 Pra, ne vetëm mund të referohen asaj si lloj i kësaj vlere magjike, syswrite këtu. 869 01:13:41,300 --> 01:13:48,410 Oops. Vendos pikëpresje jashtë. 870 01:13:48,410 --> 01:13:52,790 >> Kjo është një shumë e informacionit të ri, i shokuar në këtu. 871 01:13:52,790 --> 01:13:58,600 Një shumë e kjo është shumë idiomatike, në kuptimin se ky është kodi 872 01:13:58,600 --> 01:14:05,700 që është shkruar në këtë mënyrë vetëm për shkak se ajo është e pastër për të lexuar, të lehtë për të lexuar. 873 01:14:05,700 --> 01:14:11,520 Ka shumë mënyra të ndryshme për ta bërë atë shumë funksione të ndryshme ju mund të përdorni, 874 01:14:11,520 --> 01:14:14,680 por ne priren për të vetëm të ndiqni këto modele të njëjta pa pushim. 875 01:14:14,680 --> 01:14:20,180 Pra, mos u habitni nëse ju shikoni kodin si kjo vijnë përsëri dhe përsëri. 876 01:14:20,180 --> 01:14:25,690 Dakord. Në këtë pikë, ne kemi nevojë për të thyer për ditë. 877 01:14:25,690 --> 01:14:31,300 Faleminderit për të ardhur. Faleminderit për të shikuar nëse ju jeni online. Dhe ne do të shohim se javën e ardhshme. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]