1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Neni 5 - më të rehatshme] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Universiteti i Harvardit] 3 00:00:04,690 --> 00:00:07,250 [Kjo është CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Ashtu si thashë në email tim, ka shumë gjëra që ju mund të përdorni 5 00:00:14,250 --> 00:00:17,060 përveç aparatit që në fakt të bërë grupe problem. 6 00:00:17,060 --> 00:00:19,910 Ne ju rekomandojmë që ju bëni atë në aplikim vetëm sepse atëherë ne mund të ju ndihmojë më lehtë 7 00:00:19,910 --> 00:00:22,070 dhe ne e dimë se si çdo gjë është duke shkuar për të punuar. 8 00:00:22,070 --> 00:00:26,950 Por si një shembull se ku ju mund të bëni gjëra nëse, të themi, ju nuk keni qasje 9 00:00:26,950 --> 00:00:31,570 në një aplikim ose ju dëshironi të punoni në bodrum Qendra Shkencore - 10 00:00:31,570 --> 00:00:33,090 e cila në fakt ata kanë aplikim shumë - 11 00:00:33,090 --> 00:00:35,150 në qoftë se ju dëshironi të punoni kudo. 12 00:00:35,150 --> 00:00:42,370 Një shembull është i keni parë / dëgjuar SSH? 13 00:00:44,380 --> 00:00:47,780 SSH është në thelb vetëm si të lidheni me diçka. 14 00:00:47,780 --> 00:00:51,340 Në fakt, tani unë jam SSHed në aplikim. 15 00:00:51,340 --> 00:00:54,290 Unë kurrë nuk punojnë direkt në aplikim. 16 00:00:55,930 --> 00:01:01,060 Këtu është aplikim, dhe nëse ju shikoni këtu poshtë shihni ju këtë adresë IP. 17 00:01:01,060 --> 00:01:03,650 Unë kurrë nuk punojnë në aplikim vetë; 18 00:01:03,650 --> 00:01:08,840 Unë gjithmonë të vijë mbi të një dritare dritare iTerm2 / terminal. 19 00:01:08,840 --> 00:01:15,910 Ju mund të SSH në atë adresë IP, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Mbaj mend se numri shumë të lehtë për shkak se ajo është e tillë një model bukur. 21 00:01:20,390 --> 00:01:24,920 Por që do të pyesni mua për fjalëkalimin tim, dhe tani unë jam në aplikim. 22 00:01:24,920 --> 00:01:33,060 Në thelb, në këtë pikë, në qoftë se keni hapur një terminal brenda vetë pajisjes, 23 00:01:33,060 --> 00:01:36,350 kjo interface, megjithatë ju do të përdorin atë, është saktësisht e njëjtë 24 00:01:36,350 --> 00:01:40,010 si unë jam duke përdorur ndërfaqe gjatë këtu, por tani ju jeni SSHed. 25 00:01:42,240 --> 00:01:44,920 Ju nuk keni për të SSH në pajisjen. 26 00:01:44,920 --> 00:01:52,360 Një shembull i një vend tjetër ju mund të SSH për të është që unë jam goxha i sigurt që ju keni nga default - 27 00:01:52,360 --> 00:01:55,020 Oh. Madhe. 28 00:01:55,020 --> 00:02:01,130 Të gjithë ju duhet të ketë nga llogaritë FAS si parazgjedhje në serverat FAS. 29 00:02:01,130 --> 00:02:06,840 Për mua, unë do të SSH rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Kjo do të ju pyes se herë të parë, dhe ju them po. 31 00:02:11,610 --> 00:02:15,840 Fjalëkalimi im është vetëm do të jetë fjalëkalimi im FAS. 32 00:02:15,840 --> 00:02:22,650 Dhe kështu tani, unë jam SSHed në serverat e bukur, dhe unë mund të bëjë asgjë që unë dua këtu. 33 00:02:22,650 --> 00:02:28,560 Një shumë e klasave ju mund të merrni, si 124, do të keni ngarkoni gjëra këtu 34 00:02:28,560 --> 00:02:30,950 që në fakt paraqesin grupe tuaja problem. 35 00:02:30,950 --> 00:02:34,100 Por thonë se ju nuk keni qasje në pajisjen tuaj. 36 00:02:34,100 --> 00:02:37,910 Atëherë ju mund të bëni gjëra, si në këtu do të thonë - 37 00:02:37,910 --> 00:02:42,160 Kjo është vetëm pjesë e pyetjeve tona. 38 00:02:42,160 --> 00:02:45,070 Kjo do të ju pyes për të bërë këtë në aplikim. 39 00:02:45,070 --> 00:02:47,790 Në vend të kësaj unë do vetëm të bëjë atë në server. 40 00:02:47,790 --> 00:02:50,560 Unë jam duke shkuar për të unzip atë. 41 00:02:50,560 --> 00:02:55,670 Problemi do të jetë se ju jeni përdorur për të përdorur diçka si Gedit 42 00:02:55,670 --> 00:02:58,160 ose çfarëdo brendësi të pajisjes. 43 00:02:58,160 --> 00:03:01,830 Ju nuk jeni do të ketë që në server FAS. 44 00:03:01,830 --> 00:03:04,110 Kjo është e gjitha vetëm do të jetë në këtë ndërfaqe tekstuale. 45 00:03:04,110 --> 00:03:09,180 Kështu që ju mund të ose një, do të përpiqen për të mësuar një editor teksti që ata kanë. 46 00:03:09,180 --> 00:03:12,130 Ata kanë Nanon. 47 00:03:12,130 --> 00:03:14,990 Nano është zakonisht shumë e lehtë për t'u përdorur. 48 00:03:14,990 --> 00:03:19,470 Ju mund të përdorni shigjetat tuaja dhe shkruani normalisht. 49 00:03:19,470 --> 00:03:21,250 Kështu që nuk është e vështirë. 50 00:03:21,250 --> 00:03:24,720 Në qoftë se ju doni të merrni të vërtetë dashuroj ju mund të përdorni Emacs, 51 00:03:24,720 --> 00:03:29,850 që unë ndoshta nuk duhet të ketë hapur, sepse unë nuk e di edhe se si për të mbyllur Emacs. 52 00:03:29,850 --> 00:03:32,760 Kontrolli X, Kontrollit C? Po. 53 00:03:32,760 --> 00:03:35,310 Ose ju mund të përdorni vim, e cila është ajo që unë e përdor. 54 00:03:35,310 --> 00:03:37,800 Dhe kështu ata janë mundësitë tuaja. 55 00:03:37,800 --> 00:03:43,830 Nëse ju nuk doni të bëni këtë, ju gjithashtu mund të, nëse ju shikoni në manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Në një PC, ju mund të përdorni SSH stuko, 58 00:03:49,920 --> 00:03:51,940 që ju jeni do të duhet të shkarkoni veç e veç. 59 00:03:51,940 --> 00:03:55,460 Në një Mac, ju mund të përdorni vetëm duke terminalin e prezgjedhur, ose ju mund të shkarkoni iTerm2, 60 00:03:55,460 --> 00:03:58,490 e cila është si një Terminal bukur, zbukuruar. 61 00:03:58,490 --> 00:04:03,780 Nëse ju shkoni në manual.cs50.net ju do të shihni një lidhje në Notepad + +, 62 00:04:03,780 --> 00:04:07,120 e cila është ajo që ju mund të përdorni në një PC. 63 00:04:07,120 --> 00:04:13,340 Kjo ju lejon të SFTP nga Notepad + +, e cila është në thelb SSH. 64 00:04:13,340 --> 00:04:17,750 Çfarë kjo do të ju lejojnë të bëni është të redaktoni fotografi tuaja në vend, 65 00:04:17,750 --> 00:04:20,670 dhe pastaj kur ju doni të ruani ato, ajo do të ruajtur nice.fas, 66 00:04:20,670 --> 00:04:23,670 ku ju mund të pastaj të drejtuar ata. 67 00:04:23,670 --> 00:04:26,880 Dhe ekuivalente në një Mac do të jetë TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Pra, kjo ju lejon të bëni të njëjtën gjë. 69 00:04:28,760 --> 00:04:32,800 Kjo ju lejon të redaktoni fotografi në nivel lokal dhe ruani ato në nice.fas, 70 00:04:32,800 --> 00:04:35,730 ku ju mund të pastaj të drejtuar ata. 71 00:04:35,730 --> 00:04:40,400 Pra, nëse ju jeni të mbërthyer ndonjëherë pa një aplikim, ju keni këto opsione 72 00:04:40,400 --> 00:04:44,230 për të ende bëjnë grupe tuaja problem. 73 00:04:44,230 --> 00:04:48,250 Një problem do të jetë që ju nuk do të ketë bibliotekën CS50 74 00:04:48,250 --> 00:04:51,580 sepse nice.fas nuk kanë se by default. 75 00:04:51,580 --> 00:04:55,970 Ju mund ta shkarkoni bibliotekën CS50 - 76 00:04:55,970 --> 00:04:58,470 Unë nuk mendoj se kam nevojë që në këtë pikë. 77 00:04:58,470 --> 00:05:03,270 Ju mund ta shkarkoni bibliotekën CS50 dhe kopje atë mbi të nice.fas, 78 00:05:03,270 --> 00:05:07,450 ose unë mendoj se në këtë pikë ne nuk e përdorin atë më anyway. 79 00:05:07,450 --> 00:05:12,720 Ose në qoftë se ne bëjmë, ju mund të për herë të zëvendësojë atë me 80 00:05:12,720 --> 00:05:18,480 e implementimit të funksioneve në bibliotekë CS50 anyway. 81 00:05:18,480 --> 00:05:21,370 Kështu që nuk duhet të jetë se shumë nga një kufizim. 82 00:05:21,370 --> 00:05:23,710 Dhe kjo është se. 83 00:05:26,460 --> 00:05:29,820 >> Unë do të shkoj përsëri në aplikim tani, ne do të bëjmë gjithçka në aplikim. 84 00:05:29,820 --> 00:05:37,510 Kërkoni në seksionin tonë të pyetjeve, në fillim, siç thashë në email tim 85 00:05:37,510 --> 00:05:43,620 ne duhet të flasim për një të shkurtër keni qenë dashur të shikojnë. 86 00:05:43,620 --> 00:05:51,980 Ne kemi Përcjellin & tuba dhe këto tre pyetje. 87 00:05:51,980 --> 00:05:56,070 >> Në të cilën nuk funksionon si lumë printf shkruani by default? 88 00:05:56,070 --> 00:05:59,130 Pra lumë. Çfarë është një lumë? 89 00:06:06,520 --> 00:06:15,100 Një lumë është në thelb si ajo është vetëm disa - 90 00:06:15,100 --> 00:06:21,450 Kjo nuk është edhe një burim i 1s dhe 0s. 91 00:06:21,450 --> 00:06:24,920 Lumë është e kërkuar për këtu është jashtë standardeve. 92 00:06:24,920 --> 00:06:27,250 Dhe jashtë në mënyrë standarde është një rrjedhë se kur ju shkruani në të, 93 00:06:27,250 --> 00:06:30,940 duket në ekran. 94 00:06:30,940 --> 00:06:36,860 Nga standardi, me rrymë, do të thotë që ju të shkruani vetëm 1s dhe 0s për atë, 95 00:06:36,860 --> 00:06:40,220 dhe në fund të tjera të jashtë standardit vetëm lexon nga ai lumë. 96 00:06:40,220 --> 00:06:43,540 Kjo është vetëm një varg i 1s dhe 0s. 97 00:06:43,540 --> 00:06:45,570 Ju mund të shkruani për rrjedhat ose ju mund të lexohet nga rrjedhat 98 00:06:45,570 --> 00:06:47,950 në varësi të asaj lumë të vërtetë është. 99 00:06:47,950 --> 00:06:52,800 Të tjera dy lumenj default janë standard në gabim dhe standarde. 100 00:06:52,800 --> 00:06:57,540 Standard në është kur ju bëni getString, është duke pritur për ju për gjëra të dhëna. 101 00:06:57,540 --> 00:07:01,570 Pra, kjo duke pritur për ju, kjo është në fakt duke pritur në standard në, 102 00:07:01,570 --> 00:07:04,880 e cila është me të vërtetë ajo që ju merrni kur ju shtypni në tastierë. 103 00:07:04,880 --> 00:07:07,530 Ju jeni të shtypni në standardin in 104 00:07:07,530 --> 00:07:10,050 Gabim standarde është në thelb ekuivalente me jashtë standardit, 105 00:07:10,050 --> 00:07:13,280 por është e specializuar në atë që, kur keni shkruar gabim të standardit, 106 00:07:13,280 --> 00:07:16,770 ju jeni menduar të shtypura vetëm mesazhet e gabimit për këtë 107 00:07:16,770 --> 00:07:20,200 kështu që ju mund të dallojnë në mes të mesazheve të rregullta të shtypura në ekran 108 00:07:20,200 --> 00:07:24,560 kundrejt mesazhet e gabimit në varësi të nëse ata shkuan jashtë standardit apo gabimi standard. 109 00:07:24,560 --> 00:07:28,660 Fotografi shumë. 110 00:07:28,660 --> 00:07:32,440 Nga standardi, standard në, dhe gabimi standarde janë vetëm lumenj të veçanta, 111 00:07:32,440 --> 00:07:36,810 por me të vërtetë ndonjë file, kur ju hapni një skedar, ajo bëhet një lumë bytes 112 00:07:36,810 --> 00:07:40,740 ku ju mund vetëm të lexohet nga ai lumë. 113 00:07:40,740 --> 00:07:47,770 Ju, për pjesën më të madhe, vetëm mund të mendojnë për një fotografi si një rrjedhë e bytes. 114 00:07:47,770 --> 00:07:51,190 Pra streams për çfarë shkruajnë ata që by default? Nga standardi. 115 00:07:51,190 --> 00:07:56,980 >> Çfarë është dallimi në mes> dhe >>? 116 00:07:58,140 --> 00:08:03,710 A e dikush të shikuar këtë video paraprakisht? Rregull. 117 00:08:03,710 --> 00:08:10,960 > Do të jetë si ju përcjellim në fotografi, 118 00:08:10,960 --> 00:08:15,240 dhe >> është gjithashtu do të përcjellim në dalje fotografi, 119 00:08:15,240 --> 00:08:17,820 por ajo në vend që do të append në dosjen. 120 00:08:17,820 --> 00:08:23,430 Për shembull, le të thonë se unë të ndodhë që të ketë Dict drejtë këtu, 121 00:08:23,430 --> 00:08:27,020 dhe sende të vetëm brenda Dict është mace mace, qen, peshk, qen. 122 00:08:27,020 --> 00:08:31,530 Një komandë që ju keni në command line është mace, 123 00:08:31,530 --> 00:08:34,539 e cila është vetëm do të shtypura atë që është në një skedar. 124 00:08:34,539 --> 00:08:40,679 Kështu që kur unë them Dict mace, ajo do të shtypura, mace mace, qen, qen, peshk. Kjo është e gjitha cat bën. 125 00:08:40,679 --> 00:08:46,280 Që do të thotë se ai printuar në standard, nga mace mace, qen qen, peshk,. 126 00:08:46,280 --> 00:08:53,240 Në qoftë se unë dua të përcjellim në vend që në një skedar, unë mund të përdorni> dhe përcjellim atë në çfarëdo file është. 127 00:08:53,240 --> 00:08:56,460 Unë do të thërrasë të fotografisë. 128 00:08:56,460 --> 00:09:00,320 Deri tani, nëse unë ls, unë do të shihni se unë kam një skedar të ri të quajtur file. 129 00:09:00,320 --> 00:09:05,700 Dhe në qoftë se unë të hapur atë, ajo do të ketë pikërisht ajo macja vënë në rreshtin e komandave. 130 00:09:05,700 --> 00:09:11,040 Kështu që tani, nëse unë ta bëjë këtë përsëri, atëherë ajo do të përcjellim në dalje në dosje, 131 00:09:11,040 --> 00:09:13,930 dhe unë jam i do të ketë të njëjtën gjë e saktë. 132 00:09:13,930 --> 00:09:17,910 Pra teknikisht, ajo tërësisht overrode atë që kemi pasur. 133 00:09:17,910 --> 00:09:22,970 Dhe ne do të shohim nëse unë ndryshoj Dict, I mori qenin. 134 00:09:22,970 --> 00:09:29,980 Tani në qoftë se ne cat dict në dosjen përsëri, ne jemi duke shkuar për ketë versionin e ri me qen hequr. 135 00:09:29,980 --> 00:09:32,400 Pra, ajo tërësisht refuzon atë. 136 00:09:32,400 --> 00:09:36,640 Në vend të kësaj, në qoftë se ne përdorim >>, ajo do të append fotografi. 137 00:09:36,640 --> 00:09:40,860 Tani, duke hapur dosjen, ne shohim kemi vetëm të njëjtën gjë dy herë shtypura 138 00:09:40,860 --> 00:09:44,920 sepse ajo ishte atje një herë, atëherë ne bashkangjitur në origjinal. 139 00:09:44,920 --> 00:09:48,130 Atë mënyrë që të> dhe >> bëni. 140 00:09:48,130 --> 00:09:50,580 A të kërkojë një tjetër - Ajo nuk pyet për atë. 141 00:09:50,580 --> 00:09:59,050 >> Një tjetër që ne kemi është <, i cili në qoftë se> përcjellëse jashtë standardeve, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Le të shohim nëse ne kemi një shembull. 144 00:10:14,750 --> 00:10:16,930 Unë mund të shkruaj një të shpejtë të vërtetë. 145 00:10:17,870 --> 00:10:25,700 Le të marrin ndonjë skedar, hello.c. 146 00:10:56,060 --> 00:10:59,070 Fotografi relativisht i thjeshtë. 147 00:10:59,070 --> 00:11:03,570 Unë jam vetëm duke marrë një varg dhe pastaj shtypjen "Hello" çfarëdo string Unë sapo hyri ishte. 148 00:11:03,570 --> 00:11:07,990 Kështu që bëni përshëndetje dhe pastaj. / Hello. 149 00:11:07,990 --> 00:11:10,720 Tani ajo është bërë mua për të hyrë në diçka, 150 00:11:10,720 --> 00:11:15,070 që do të thotë se është duke pritur për gjëra për të hyrë në standardin in 151 00:11:15,070 --> 00:11:20,450 Kështu që unë dua çdo gjë që hyn në standardin in Ne jemi vetëm do të them Hello, Rob! 152 00:11:20,450 --> 00:11:23,310 Pastaj ai e shtypjes për standarde nga Hello, Rob! 153 00:11:23,310 --> 00:11:28,860 Nëse unë bëj. / Përshëndetje dhe pastaj përcjellëse, 154 00:11:30,740 --> 00:11:34,310 tani për tani ju mund të përcjellim nga një skedar. 155 00:11:34,310 --> 00:11:41,720 Pra, nëse kam vënë në disa dosje, txt, dhe kam vënë Rob, 156 00:11:41,720 --> 00:11:52,300 në qoftë se unë të drejtuar përshëndetje dhe pastaj përcjellëse txt file ne. / hello, ajo do të them Hello, Rob! menjëherë. 157 00:11:52,300 --> 00:11:57,160 Kur ajo të parë merr në getString dhe është duke pritur në standarde në, 158 00:11:57,160 --> 00:12:01,730 standarde në nuk është më duke pritur në tastierë për të dhëna për të marrë hyrë. 159 00:12:01,730 --> 00:12:05,980 Në vend të kësaj, ne kemi ridrejtuar standarde për të lexuar nga txt file. 160 00:12:05,980 --> 00:12:10,290 Dhe kështu ajo do të lexohet nga txt file, e cila është vetëm Rob linjë, 161 00:12:10,290 --> 00:12:13,380 dhe pastaj ajo do të shtypura Hello, Rob! 162 00:12:13,380 --> 00:12:18,180 Dhe nëse kam kërkuar, unë mund të bëj. / Përshëndetje 00:12:21,500 dhe pastaj standarde se kjo shtypje, e cila është Hello, Rob!, 164 00:12:21,500 --> 00:12:24,700 Unë mund të përcjellim se në dosjen e vet. 165 00:12:24,700 --> 00:12:29,790 Unë vetëm do të thërrasë skedarin hello - jo, unë nuk do të, për shkak se është ekzekutues - txt2. 166 00:12:29,790 --> 00:12:40,150 Tani, txt2 do të ketë prodhimin e. / Përshëndetje 00:12:43,520 >> Pyetje? 168 00:12:45,900 --> 00:12:49,090 >> Rregull. Kështu atëherë këtu kemi tubacionin. 169 00:12:49,090 --> 00:12:53,510 Tuba janë njësia e fundit e redirection. 170 00:12:53,510 --> 00:12:58,750 >> Oh. I guess një njësi më shumë nga redirection është në qoftë se në vend të> ju bëni 2>, 171 00:12:58,750 --> 00:13:01,070 që është Përcjellin gabim standarde. 172 00:13:01,070 --> 00:13:06,280 Kështu që nëse diçka shkoi gabim standarde, nuk do të ketë vënë në txt2. 173 00:13:06,280 --> 00:13:12,480 Por vëreni nëse i bëj 2>, atëherë ajo është ende shtypjen Hello, Rob! në command line 174 00:13:12,480 --> 00:13:18,600 sepse unë jam vetëm Përcjellin gabim standarde, unë nuk jam Përcjellin standardin jashtë. 175 00:13:18,600 --> 00:13:22,210 Gabim standarde dhe jashtë standarde janë të ndryshme. 176 00:13:24,210 --> 00:13:27,080 Në qoftë se ju të kërkuar për të shkruar për të vërtetë gabimi standart, 177 00:13:27,080 --> 00:13:35,080 atëherë unë mund të ndryshojë kjo të jetë fprintf të stderr. 178 00:13:35,080 --> 00:13:37,850 Pra printf, by default, shtyp të jashtë standardeve. 179 00:13:37,850 --> 00:13:41,720 Nëse unë dua të shtypura të gabimit standarde dorë, atëherë unë duhet të përdorni fprintf 180 00:13:41,720 --> 00:13:45,010 dhe të përcaktojë se çfarë unë dua të shtypura të. 181 00:13:45,010 --> 00:13:49,720 Nëse në vend të kësaj kam bërë syswrite fprintf, atëherë kjo është në thelb ekuivalente me printf. 182 00:13:49,720 --> 00:13:55,530 Por fprintf të gabimit standard. 183 00:13:57,790 --> 00:14:03,650 Deri tani, në qoftë se unë të përcjellim këtë në txt2, Hello, Rob! është ende duke u shtypur në command line 184 00:14:03,650 --> 00:14:08,270 pasi ajo është duke u shtypur të gabimit standarde dhe unë jam vetëm Përcjellin standardin jashtë. 185 00:14:08,270 --> 00:14:16,420 Nëse unë tani përcjellim gabim standarde, tani ajo nuk ka marrë të shtypura, dhe txt2 do të jetë Hello, Rob! 186 00:14:16,420 --> 00:14:21,910 Deri tani, ju mund të shtypura gabimet tuaja aktuale të gabimit standarde 187 00:14:21,910 --> 00:14:24,720 dhe të shtypura mesazhet tuaja të rregullta për jashtë standardit. 188 00:14:24,720 --> 00:14:31,420 Dhe kështu që kur ju drejtuar programin tuaj, ju mund të kandidojë atë si. / Përshëndetje kjo lloj me 2> 189 00:14:31,420 --> 00:14:33,800 në mënyrë që programi juaj do të kandidojë normalisht, 190 00:14:33,800 --> 00:14:38,400 por çdo mesazhet e gabimit që ju të merrni ju mund të kontrolloni më vonë në log tuaj gabim, 191 00:14:38,400 --> 00:14:44,500 kështu gabime, dhe pastaj të shohim më vonë dhe file gabime juaj do të ketë ndonjë gabim që ka ndodhur. 192 00:14:45,200 --> 00:14:47,540 >> Pyetje? 193 00:14:47,540 --> 00:14:58,070 >> E fundit është tub, të cilat ju mund të mendoni si të marrë standardin nga një komandë 194 00:14:58,070 --> 00:15:01,210 dhe duke e bërë atë standard në të komandës ardhshëm. 195 00:15:01,210 --> 00:15:05,570 Një shembull këtu është Echo është një linjë komande gjë 196 00:15:05,570 --> 00:15:11,840 që është vetëm do të bëjnë jehonë çdo gjë që unë vënë si argument të saj. Unë nuk do të vënë kuotat. 197 00:15:11,840 --> 00:15:16,150 Echo blah, blah, blah është vetëm do të shtypura blah, blah, blah. 198 00:15:16,150 --> 00:15:20,600 Më parë, kur kam thënë unë kam për të vënë Rob në një skedar txt 199 00:15:20,600 --> 00:15:28,830 sepse unë vetëm mund të përcjellim fotografi txt, në vend, / në qoftë se unë jehonë Rob 200 00:15:28,830 --> 00:15:35,520 dhe pastaj atë në tub. / hello, që do të bëjë të njëjtin lloj gjë. 201 00:15:35,520 --> 00:15:39,160 Kjo po e prodhimit të kësaj komande, jehonë Rob, 202 00:15:39,160 --> 00:15:43,610 dhe duke e përdorur atë si input për të. / hello. 203 00:15:44,790 --> 00:15:49,560 Ju mund të mendoni për atë si përcjellëse e parë e jehonës Rob në një skedar 204 00:15:49,560 --> 00:15:54,160 dhe pastaj në input. / Përshëndetje këtë dosje që u outputted vetëm. 205 00:15:54,160 --> 00:15:57,850 Por ajo merr file të përkohshëm nga foto. 206 00:16:01,890 --> 00:16:04,460 >> Pyetjet për këtë? 207 00:16:04,460 --> 00:16:07,150 >> Pyetja tjetër do të përfshijë këtë. 208 00:16:07,150 --> 00:16:15,310 Çfarë mund të tubacionit që ju përdorni për të gjetur numrin e emrave unike në një skedar të quajtur names.txt? 209 00:16:15,310 --> 00:16:24,160 The Komandat ne do të dëshironi të përdorni këtu janë unike, kështu uniq, dhe pastaj WC. 210 00:16:24,160 --> 00:16:28,840 Ju mund të bëni uniq njeri që në fakt shohim se çfarë bën, 211 00:16:28,840 --> 00:16:34,840 dhe kjo vetëm do të filtruar linja ngjitur përputhen nga input. 212 00:16:34,840 --> 00:16:40,690 Dhe njeriu WC do të shtypura newline fjalë,, dhe akuza bajt për çdo dosje. 213 00:16:40,690 --> 00:16:43,760 Dhe e fundit ne do të dëshironi të përdorni është lloj, 214 00:16:43,760 --> 00:16:47,410 e cila është vetëm do të zgjidhë rreshta të txt file. 215 00:16:47,410 --> 00:16:58,080 Nëse unë bëjë disa fotografi txt, names.txt, dhe kjo është Rob, Tommy, Jozefi, Tommy, Jozefi, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 ajo që unë dua të bëj këtu është të gjeni numrin e emrave unik në këtë file. 217 00:17:03,910 --> 00:17:08,750 Pra, çfarë duhet të jetë përgjigja? >> [Student] 4. Po >>. 218 00:17:08,750 --> 00:17:13,780 Ajo duhet të jetë 4 prej Rob, Tommy, Jozefi, RJ janë emrat e vetme unike në këtë file. 219 00:17:13,780 --> 00:17:20,180 Hapi i parë, në qoftë se unë vetëm të bëjë numërimin e fjalës në names.txt, 220 00:17:20,180 --> 00:17:24,290 Kjo është në fakt më thënë gjithçka. 221 00:17:24,290 --> 00:17:32,560 Kjo është në fakt shtypje - le të shohim, njeriu WC - newlines, fjalët, dhe numërimin e bajt. 222 00:17:32,560 --> 00:17:38,270 Nëse unë vetëm kujdesen për linjat, atëherë unë mund të bëjë vetëm wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Pra, kjo është hap 1. 224 00:17:44,300 --> 00:17:50,510 Por unë nuk dua të WC-l names.txt sepse vetëm names.txt përmban të gjitha emrat, 225 00:17:50,510 --> 00:17:54,170 dhe unë dua për të filtruar nga ndonjë jo-unike ato. 226 00:17:54,170 --> 00:18:01,200 Pra, nëse unë bëj names.txt uniq, që nuk mjaft më jep atë që unë dua 227 00:18:01,200 --> 00:18:03,760 sepse emrat dyfishta janë ende atje. 228 00:18:03,760 --> 00:18:07,690 Pse është kjo? Pse nuk është bërë uniq atë që unë dua? 229 00:18:07,690 --> 00:18:10,500 [Student] nuk janë kopje identike [padëgjueshme] >> Yeah. 230 00:18:10,500 --> 00:18:16,370 Kujtohet njeri per faqe uniq thotë linjat filtër ngjitur përputhen. 231 00:18:16,370 --> 00:18:19,680 Ato nuk jeni ngjitur, kështu që nuk do të filtruar ato. 232 00:18:19,680 --> 00:18:31,100 Nëse unë të zgjidhur ato së pari, names.txt lloj do të vënë të gjitha linjat e kopjuar bashku. 233 00:18:31,100 --> 00:18:34,450 Kështu që tani names.txt lloj është se. 234 00:18:34,450 --> 00:18:40,550 Unë jam do të duan të përdorin atë si input për uniq, e cila është | uniq. 235 00:18:40,550 --> 00:18:43,390 Kjo më jep Jozefin, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 dhe unë dua të përdorin atë si input për wc-l, 237 00:18:49,260 --> 00:18:52,740 e cila do të më jepni 4. 238 00:18:52,740 --> 00:18:56,930 Si ajo thotë se këtu, çfarë tubacioni mund të përdorni? 239 00:18:56,930 --> 00:19:01,390 Ju mund të bëni një shumë të gjëra të tilla si duke përdorur një seri e komandave 240 00:19:01,390 --> 00:19:05,130 ku ju përdorni të prodhimit nga një komandë si input në komandën e ardhshëm. 241 00:19:05,130 --> 00:19:08,780 Ju mund të bëni një shumë të gjëra, shumë gjëra të zgjuar. 242 00:19:08,780 --> 00:19:11,440 >> Pyetje? 243 00:19:12,910 --> 00:19:14,600 Rregull. 244 00:19:14,600 --> 00:19:17,880 Kjo është ajo për tuba dhe redirection. 245 00:19:18,370 --> 00:19:24,090 >> Tani ne do të shkojmë për të stuff stuff aktuale, coding. 246 00:19:24,090 --> 00:19:29,100 Brenda kësaj PDF, ju do të shihni këtë komandë, 247 00:19:29,100 --> 00:19:32,950 dhe ju do të doni për të drejtuar këtë komandë në aplikim tuaj. 248 00:19:36,240 --> 00:19:42,250 wget është komanda për vetëm duke marrë diçka nga interneti, në thelb, 249 00:19:42,250 --> 00:19:45,180 kështu wget dhe kjo URL. 250 00:19:45,180 --> 00:19:49,110 Në qoftë se ju shkoi në këtë URL në shfletuesin tuaj, ajo do të shkarkoni këtë fotografi. 251 00:19:49,110 --> 00:19:52,510 Unë vetëm klikuar mbi të, kështu që ajo shkarkuar skedarin për mua. 252 00:19:52,510 --> 00:19:55,650 Por shkrim wget e kësaj gjëje në brendësi të terminalit 253 00:19:55,650 --> 00:19:58,620 është vetëm do të shkarkoni atë në terminalin tuaj. 254 00:19:58,620 --> 00:20:02,750 Unë kam section5.zip, dhe ju do të dëshironi të unzip section5.zip, 255 00:20:02,750 --> 00:20:06,520 e cila do të ju jap një dosje të quajtur section5, 256 00:20:06,520 --> 00:20:11,550 e cila do të ketë të gjitha dosjet që ne do të jeni duke përdorur sot në brendësi të saj. 257 00:20:33,380 --> 00:20:37,710 Si emra këto programe "fotografi sugjerojnë, ata janë një buggy pak, 258 00:20:37,710 --> 00:20:40,990 kështu që misioni juaj është që të kuptoj se pse duke përdorur gdb. 259 00:20:40,990 --> 00:20:44,560 A të gjithë ata kanë shkarkuar / e di se si për të marrë ato shkarkuar 260 00:20:44,560 --> 00:20:47,480 në aplikim të tyre? Rregull. 261 00:20:47,480 --> 00:20:56,400 >> Drejtimin ./buggy1, kjo do të thotë fajin segmentimit (core hedhur), 262 00:20:56,400 --> 00:21:00,500 që çdo herë që të merrni një segfault, kjo është një gjë e keqe. 263 00:21:00,500 --> 00:21:03,810 Në çfarë rrethanash mund të merrni një segfault? 264 00:21:03,810 --> 00:21:08,210 [Student] Dereferencing një tregues null. Po >>. Kështu që është një shembull. 265 00:21:08,210 --> 00:21:11,580 Dereferencing një tregues null ju jeni do të merrni një segfault. 266 00:21:11,580 --> 00:21:16,720 Çfarë do të thotë një segfault është që ju jeni duke prekur kujtesën që ju nuk duhet të jetë prekur. 267 00:21:16,720 --> 00:21:21,350 Pra dereferencing një tregues zero është prekur adresën 0, 268 00:21:21,350 --> 00:21:28,060 dhe në thelb, të gjithë kompjuterët në ditët e sotme thonë se adresa është 0 kujtesës që ju nuk duhet të jetë prekur. 269 00:21:28,060 --> 00:21:31,920 Pra, kjo është arsyeja pse një dereferencing rezultate null pointer në një segfault. 270 00:21:31,920 --> 00:21:37,210 Kur ju ndodh që të mos nisja një tregues, atëherë ajo ka një vlerë plehrash, 271 00:21:37,210 --> 00:21:41,520 dhe kështu kur ju përpiqeni të dereference atë, në të gjitha gjasat ju jeni prekur kujtesën 272 00:21:41,520 --> 00:21:43,540 që është në mes të askund. 273 00:21:43,540 --> 00:21:45,650 Nëse ju ndodh që të merrni me fat dhe vlera e plehrave 274 00:21:45,650 --> 00:21:48,440 ndodhur për pikë në diku në rafte apo diçka, 275 00:21:48,440 --> 00:21:50,820 atëherë kur ju dereference se treguesin që ju nuk e keni initialized, 276 00:21:50,820 --> 00:21:52,730 asgjë nuk do të shkojnë keq. 277 00:21:52,730 --> 00:21:55,480 Por në qoftë se ajo është treguar për të, thonë, diku në mes të rafte dhe të tog, 278 00:21:55,480 --> 00:21:59,850 ose ajo është vënë vetëm për diku që nuk ka qenë e përdorur nga programi juaj ende, 279 00:21:59,850 --> 00:22:02,240 atëherë ju jeni prekur kujtesën që ju nuk duhet të jetë prekur dhe ju segfault. 280 00:22:02,240 --> 00:22:06,370 Kur ju shkruani një funksion gjithkund rekursive dhe kjo recurses shumë herë 281 00:22:06,370 --> 00:22:08,720 dhe rafte juaj rritet shumë e madhe dhe përplaset rafte në gjërat 282 00:22:08,720 --> 00:22:12,270 se ajo nuk duhet të përplasen me të, ju jeni prekur kujtesën që ju nuk duhet të jetë prekur, 283 00:22:12,270 --> 00:22:14,810 kështu që ju segfault. 284 00:22:14,810 --> 00:22:17,010 Kjo është ajo që një segfault është. 285 00:22:17,010 --> 00:22:21,810 >> Kjo është edhe arsyeja njëjtë se në qoftë se ju keni një varg si - 286 00:22:21,810 --> 00:22:23,930 le të kthehemi në programin e mëparshëm. 287 00:22:23,930 --> 00:22:28,530 Në hello.c--Jam vetëm do të bëjë diçka tjetër. 288 00:22:28,530 --> 00:22:33,770 char * s = "Hello World!"; 289 00:22:33,770 --> 00:22:42,310 Nëse unë përdorni * s = diçka ose s [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 prandaj sigurohuni hello,. / hello, pse se segfault? 291 00:22:48,410 --> 00:22:51,250 Pse kjo segfault? 292 00:22:55,660 --> 00:22:57,890 Çfarë do të presin që të ndodhë? 293 00:22:57,890 --> 00:23:06,640 Nëse unë e bëri printf ("% s \ n", s); çfarë do të presin që të jenë të shtypura? 294 00:23:06,640 --> 00:23:09,930 [Student] X hello. Po >>. 295 00:23:09,930 --> 00:23:15,140 Problemi është se kur ju të deklarojë një varg si kjo, 296 00:23:15,140 --> 00:23:18,190 s është një tregues që do të shkojë në rafte, 297 00:23:18,190 --> 00:23:25,880 dhe çfarë s është treguar është ky varg që përmbahet në read-only kujtesës. 298 00:23:25,880 --> 00:23:30,560 Pra, vetëm nga emri, read-only kujtesës, ju duhet të merrni ide 299 00:23:30,560 --> 00:23:33,010 se në qoftë se ju provoni për të ndryshuar atë që është në read-only kujtesës, 300 00:23:33,010 --> 00:23:36,670 ju jeni duke bërë diçka që ju nuk duhet të jetë bërë me kujtesën dhe ju segfault. 301 00:23:36,670 --> 00:23:45,360 Kjo është në fakt një dallim i madh në mes të char * ve dhe char S []. 302 00:23:45,360 --> 00:23:48,790 Pra, char s [], tani ky varg do të jetë vënë në rafte, 303 00:23:48,790 --> 00:23:53,960 dhe rafte nuk është read-only, që do të thotë se kjo duhet të punojnë të përkryer gjobë. 304 00:23:55,500 --> 00:23:57,370 Dhe kjo e bën. 305 00:23:57,370 --> 00:24:06,250 Mos harroni se kur bëj char * s = "Hello World!", S vetvete është në rafte 306 00:24:06,250 --> 00:24:10,390 por s pikë për diku tjetër, dhe se diku tjetër ndodh të jetë read-only. 307 00:24:10,390 --> 00:24:15,640 Por char s [] është vetëm diçka në rafte. 308 00:24:17,560 --> 00:24:21,760 Pra, kjo është një tjetër shembull i një segfault ndodh. 309 00:24:21,760 --> 00:24:27,820 >> Ne pamë se ./buggy1 rezultoi në një segfault. 310 00:24:27,820 --> 00:24:31,810 Në teori, ju nuk duhet të shikoni në buggy1.c menjëherë. 311 00:24:31,810 --> 00:24:35,170 Në vend të kësaj, ne do të shikojmë në atë nëpërmjet GDB. 312 00:24:35,170 --> 00:24:37,750 Vini re se kur ju merrni faj segmentimit (core hedhur), 313 00:24:37,750 --> 00:24:40,850 ju merrni këtë skedë mbi thelbin e quajtur këtu. 314 00:24:40,850 --> 00:24:45,200 Nëse ne ls-l, ne do të shohim se thelbi është zakonisht një file goxha i madh. 315 00:24:45,200 --> 00:24:51,580 Ky është numri i bytes të file, kështu që duket si ajo e 250-diçka kilobytes. 316 00:24:51,580 --> 00:24:56,120 Arsyeja për këtë është se çfarë në fakt është thelbi hale 317 00:24:56,120 --> 00:25:01,410 është kur crashes programin tuaj, shteti i kujtim të programit tuaj 318 00:25:01,410 --> 00:25:05,230 vetëm merr kopjohet dhe të ngjit në këtë file. 319 00:25:05,230 --> 00:25:07,270 Ajo merr hedhur në atë dosje. 320 00:25:07,270 --> 00:25:13,060 Ky program, ndërsa ajo ishte duke ecur, ka ndodhur që të ketë një përdorim memorie prej rreth 250 kilobytes, 321 00:25:13,060 --> 00:25:17,040 dhe kështu kjo është ajo që u hedhur në këtë file. 322 00:25:17,040 --> 00:25:23,630 Tani ju mund të shikoni në atë dosje në qoftë se ne bëjmë Gdb thelbin buggy1. 323 00:25:23,630 --> 00:25:30,130 Ne vetëm mund të bëjmë gdb buggy1, dhe se do të fillojë vetëm deri gdb rregullisht, 324 00:25:30,130 --> 00:25:33,800 buggy1 përdorur si file saj input. 325 00:25:33,800 --> 00:25:38,260 Por në qoftë se ju bëni Gdb thelbin buggy1, atëherë kjo është në mënyrë specifike do të fillojnë deri gdb 326 00:25:38,260 --> 00:25:40,330 duke shikuar në atë dosje core. 327 00:25:40,330 --> 00:25:45,560 Dhe ju thënë buggy1 gdb do të thotë që e di se dosja kryesor vjen nga programi buggy1. 328 00:25:45,560 --> 00:25:49,580 Pra gdb buggy1 core do të na sjellë menjëherë 329 00:25:49,580 --> 00:25:52,060 ku programi ka ndodhur të përfundojë. 330 00:25:57,720 --> 00:26:02,340 Ne shohim këtu Programi i ndërprerë me sinjal 11, faji segmentimit. 331 00:26:02,340 --> 00:26:10,110 Ne të ndodhë për të parë një linjë e asamblesë, e cila ndoshta nuk është shumë e dobishme. 332 00:26:10,110 --> 00:26:15,360 Por në qoftë se ju shkruani ose backtrace BT, që do të jetë funksioni 333 00:26:15,360 --> 00:26:19,430 që na jep listën e kornizave tona rafte aktuale. 334 00:26:19,430 --> 00:26:23,150 Pra backtrace. Ajo duket si ne kemi vetëm dy korniza rafte. 335 00:26:23,150 --> 00:26:26,310 E para është korniza kryesore tonë rafte, 336 00:26:26,310 --> 00:26:29,810 dhe e dyta është korniza rafte për këtë funksion që ne të ndodhë të jetë në, 337 00:26:29,810 --> 00:26:34,440 e cila duket si ne kemi vetëm kodin kuvendit për të. 338 00:26:34,440 --> 00:26:38,050 Pra, le të kthehemi në funksion tonë kryesor, 339 00:26:38,050 --> 00:26:42,300 dhe për të bërë që ne mund të bëjmë kornizë 1, dhe unë mendoj se ne mund të bëjmë poshtë, 340 00:26:42,300 --> 00:26:45,160 por unë kurrë nuk pothuajse të bëni poshtë - ose lart. Po. 341 00:26:45,160 --> 00:26:50,710 Lart dhe poshtë. Deri ju sjell deri një kornizë rafte, poshtë ju sjell poshtë një kornizë rafte. 342 00:26:50,710 --> 00:26:53,240 Unë kurrë nuk kanë tendencë për të përdorur këtë. 343 00:26:53,240 --> 00:26:59,120 Unë vetëm të them konkretisht kornizë 1, e cila është të shkoni në kuadër emërtuar 1. 344 00:26:59,120 --> 00:27:01,750 Frame 1 do të na çojë në kuadër rafte kryesore, 345 00:27:01,750 --> 00:27:05,570 dhe ai thotë se këtu linjë e kodit ne të ndodhë të jetë në. 346 00:27:05,570 --> 00:27:07,950 Nëse ne dëshirojmë linjat një çift shumë të kodit, ne mund të themi listë, 347 00:27:07,950 --> 00:27:11,280 dhe kjo do të na japë të gjitha linjat e kodit rreth saj. 348 00:27:11,280 --> 00:27:13,360 Vija ne segfaulted në ishte 6: 349 00:27:13,360 --> 00:27:17,360 në qoftë se (strcmp ("CS50 shkëmbinj", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Nëse kjo nuk është e qartë ende, ju mund të merrni atë të drejtë nga këtu vetëm duke menduar pse ajo segfaulted. 351 00:27:24,130 --> 00:27:28,800 Por ne mund të marrë atë një hap më tej dhe të thonë: "Pse do argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Print le argv [1], dhe kjo duket si ajo e 0x0, e cila është tregues null. 353 00:27:38,830 --> 00:27:44,750 Ne jemi strcmping CS50 gurë dhe të pavlefshme, dhe kështu që do të segfault. 354 00:27:44,750 --> 00:27:48,280 Dhe pse është argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Student] Sepse ne nuk jepte asnjë komandë-line argumente. 356 00:27:51,280 --> 00:27:53,390 Po. Ne nuk japim asnjë komandë-line argumente. 357 00:27:53,390 --> 00:27:58,460 Pra ./buggy1 është vetëm do të ketë argv [0] ./buggy1 jetë. 358 00:27:58,460 --> 00:28:02,100 Kjo nuk do të ketë një argv [1], në mënyrë që do të segfault. 359 00:28:02,100 --> 00:28:07,450 Por në qoftë se, në vend të kësaj, unë bëj vetëm CS50, kjo do të thotë që ju të merrni një D 360 00:28:07,450 --> 00:28:09,950 sepse kjo është ajo që është menduar për të bërë. 361 00:28:09,950 --> 00:28:15,240 Kërkuar në buggy1.c, ajo është menduar për të shtypur "Ju merrni një D" - 362 00:28:15,240 --> 00:28:20,820 Nëse argv [1] nuk është "CS50 gurë", "Ju merrni një d", tjetër "Ju merrni një A!" 363 00:28:20,820 --> 00:28:25,660 Pra, nëse ne duam një A, ne kemi nevojë për të krahasuar këtë si të vërtetë, 364 00:28:25,660 --> 00:28:28,710 që do të thotë se ajo krahasohet me 0. 365 00:28:28,710 --> 00:28:31,100 Pra, argv [1] duhet të jenë "CS50 shkëmbinj". 366 00:28:31,100 --> 00:28:35,660 Nëse ju doni të bëni që në rreshtin e komandave, ju duhet të përdorni \ për të shpëtuar hapësirë. 367 00:28:35,660 --> 00:28:41,690 Pra CS50 \ shkëmbinj dhe ju merrni një A! 368 00:28:41,690 --> 00:28:44,060 Nëse ju nuk bëni backslash, pse nuk është kjo punë? 369 00:28:44,060 --> 00:28:47,190 [Student] Kjo është dy argumente të ndryshme. Po >>. 370 00:28:47,190 --> 00:28:52,540 Argv [1] do të jetë CS50, dhe argv [2] do të jetë shkëmbinj. Rregull. 371 00:28:52,540 --> 00:28:56,470 >> Tani ./buggy2 do të segfault përsëri. 372 00:28:56,470 --> 00:29:01,880 Në vend të hapjes me dosjen e tij kryesor, ne vetëm do të hapur deri buggy2 direkt, 373 00:29:01,880 --> 00:29:05,000 kështu GDB buggy2. 374 00:29:05,000 --> 00:29:09,590 Tani në qoftë se ne vetëm të drejtuar programin tonë, atëherë ajo do të thotë Programi ka marrë sinjal SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 cila është segfault sinjal, dhe ky është vendi ku ajo ndodhi të ndodhë. 376 00:29:15,530 --> 00:29:21,250 Kërkim në backtrace tonë, shohim se ne kemi qenë në oh_no funksion, 377 00:29:21,250 --> 00:29:23,900 e cila u quajt nga hollë funksion, e cila u quajt nga Binky funksion, 378 00:29:23,900 --> 00:29:26,460 e cila u quajt nga kryesore. 379 00:29:26,460 --> 00:29:31,680 Ne gjithashtu mund të shihni argumentet për këto funksione. 380 00:29:31,680 --> 00:29:34,680 Argumenti për hollë dhe Binky ishte 1. 381 00:29:34,680 --> 00:29:44,390 Nëse ne lista oh_no funksion, ne shohim se oh_no është vetëm duke bërë char ** S = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "BOOM"; 383 00:29:47,410 --> 00:29:50,330 Pse do që të dështojnë? 384 00:29:54,330 --> 00:29:58,380 [Student] Ju nuk mund të dereference në treguesin null? Po >>. 385 00:29:58,380 --> 00:30:06,090 Kjo është vetëm duke thënë s është NULL, pavarësisht nëse kjo ndodh të jetë një char **, 386 00:30:06,090 --> 00:30:12,070 të cilat, në varësi se si ju interpretoni atë, ajo mund të jetë një tregues për një tregues për një varg 387 00:30:12,070 --> 00:30:15,550 ose një grup i vargjet. 388 00:30:15,550 --> 00:30:21,430 Kjo është s është NULL, kështu që * s është një tregues dereferencing null, 389 00:30:21,430 --> 00:30:24,800 dhe kështu që kjo do të rrëzuar. 390 00:30:24,800 --> 00:30:27,540 Kjo është një nga mënyrat e shpejtë që ju ndoshta mund të segfault. 391 00:30:27,540 --> 00:30:31,300 Kjo është vetëm një tregues shpalljen e pavlefshme dhe menjëherë segfaulting. 392 00:30:31,300 --> 00:30:34,570 Kjo është ajo që oh_no është duke bërë. 393 00:30:34,570 --> 00:30:43,400 Nëse ne do të shkojmë deri në një kornizë, atëherë ne jemi duke shkuar për të marrë në funksion që quhet oh_no. 394 00:30:43,400 --> 00:30:44,830 Unë kam nevojë për të bërë këtë poshtë. 395 00:30:44,830 --> 00:30:48,610 Nëse ju nuk hyjnë në një komandë dhe ju vetëm hit Enter përsëri, 396 00:30:48,610 --> 00:30:52,350 ai thjesht do të përsërisë komandën e mëparshme që ju u zhvillua. 397 00:30:52,350 --> 00:30:56,610 Ne jemi në kuadër 1. 398 00:30:56,610 --> 00:31:04,650 Renditur këtë kuadër, ne shohim këtu është funksioni ynë. 399 00:31:04,650 --> 00:31:08,520 Ju mund të goditur listën përsëri, ose ju mund të bëni listën e 20 dhe kjo listë do më shumë. 400 00:31:08,520 --> 00:31:13,640 The hollë Funksioni thotë se në qoftë se unë është 1, atëherë shkoni në funksion oh_no, 401 00:31:13,640 --> 00:31:15,960 tjetër të shkojë në funksion slinky. 402 00:31:15,960 --> 00:31:18,700 Dhe ne e dimë se i është 1 sepse ne të ndodhë të shohim deri këtu 403 00:31:18,700 --> 00:31:22,560 që u quajt hollë me argumentin 1. 404 00:31:22,560 --> 00:31:27,560 Ose ju mund vetëm të shtypura nuk i dhe kjo do të thotë unë është 1. 405 00:31:27,560 --> 00:31:33,770 Ne jemi aktualisht në hollë, dhe në qoftë se ne do të shkojmë deri në një kornizë, ne e dimë që ne do të përfundojë deri në Binky. 406 00:31:33,770 --> 00:31:36,600 Deri. Tani ne jemi në Binky. 407 00:31:36,600 --> 00:31:41,340 Renditur këtë funksion - lista para gjysmë prerë me jashtë - 408 00:31:41,340 --> 00:31:52,670 ai filloi si në qoftë se unë është 0, atëherë ne jemi duke shkuar për të thirrur atë oh_no, tjetër thirrje hollë. 409 00:31:52,670 --> 00:31:57,000 Ne e dimë se i ishte 1, kështu që ai e quajti hollë. 410 00:31:57,000 --> 00:32:05,030 Dhe tani ne jemi kthyer në kryesore, dhe kryesore është vetëm do të jetë int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Kjo është vetëm do të ju jap një numër të rastit që është ose 0, 1, ose 2. 412 00:32:08,790 --> 00:32:12,780 Ajo do të thërrasë Binky me atë numër, dhe ajo do të kthehet 0. 413 00:32:12,780 --> 00:32:16,700 Duke kërkuar në këtë, 414 00:32:16,700 --> 00:32:19,880 vetëm në këmbë përmes programit dorë pa drejtimin atë menjëherë, 415 00:32:19,880 --> 00:32:25,400 ju do të caktojë një pikë pushim në kryesor, që do të thotë se kur ne të drejtuar programin 416 00:32:25,400 --> 00:32:31,020 programi juaj shkon deri ajo hits një pikë pushim. 417 00:32:31,020 --> 00:32:35,450 Pra drejtimin e programit, ajo do të kandidojë dhe pastaj ajo do të goditur funksionin kryesor dhe të ndaluar drejtimin. 418 00:32:35,450 --> 00:32:44,700 Tani ne jemi në brendësi të kryesor, dhe hapi i ardhshëm është ose do të na sjellë në linjë tjetër të kodit. 419 00:32:44,700 --> 00:32:47,050 Ju mund të bëni hapin apo tjetër. 420 00:32:47,050 --> 00:32:51,800 Goditur tjetër, tani i është caktuar që të rand ()% 3, kështu që ne mund të shtypura vlerën e I, 421 00:32:51,800 --> 00:32:55,280 dhe kjo do të thotë unë është 1. 422 00:32:55,280 --> 00:32:58,110 Tani ajo ka rëndësi nëse ne përdorim tjetër ose hap. 423 00:32:58,110 --> 00:33:01,000 Unë mendoj se rëndësi në një të kaluar, por ne do të dëshironi të përdorni ardhshëm. 424 00:33:01,000 --> 00:33:06,000 Nëse ne përdorim hap, ne hap në funksion, që do të thotë vështrim në gjë e vërtetë 425 00:33:06,000 --> 00:33:07,940 që po ndodh brenda Binky. 426 00:33:07,940 --> 00:33:10,510 Nëse ne përdorim tjetër, atëherë kjo do të thotë të shkojë mbi funksionin 427 00:33:10,510 --> 00:33:14,070 dhe vetëm të shkojnë në vijën e ardhshme të kodit në funksion tonë kryesore. 428 00:33:14,070 --> 00:33:17,900 Të drejtë këtu në këtë linjë, unë kam qenë në ku ai tha rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 në qoftë se kam bërë hap, ajo do të shkojë në zbatimin e rand 430 00:33:21,320 --> 00:33:25,110 dhe të shohim se çfarë po ndodh atje, dhe unë mund të hap nëpërmjet funksionit rand. 431 00:33:25,110 --> 00:33:26,920 Por unë nuk e kujdesit në lidhje me funksionin e rand. 432 00:33:26,920 --> 00:33:30,190 Unë vetëm dua të shkojë në rreshtin tjetër të kodit në kryesore, kështu që unë të përdorni të ardhshëm. 433 00:33:30,190 --> 00:33:35,800 Por tani unë bëj kujdes në lidhje me funksionin Binky, kështu që unë dua që të hap në atë. 434 00:33:35,800 --> 00:33:37,730 Tani unë jam në Binky. 435 00:33:37,730 --> 00:33:42,040 Rreshtin e parë të kodit do të thotë në qoftë se (i == 0), kam marrë një hap, 436 00:33:42,040 --> 00:33:44,930 ne shohim ne fund deri në hollë. 437 00:33:44,930 --> 00:33:51,620 Nëse gjërat ne lista, ne shohim se ajo është e kontrolluar i = 0. 438 00:33:51,620 --> 00:33:55,470 Unë nuk është e barabartë me 0, kështu që ai shkoi në gjendjen tjetër, 439 00:33:55,470 --> 00:33:59,540 cila do te thirrje avdall (I). 440 00:33:59,540 --> 00:34:04,030 Ju mund të merrni hutuar. 441 00:34:04,030 --> 00:34:07,380 Nëse ju vetëm shikoni në këto linja direkt, ju mund të mendoni se në qoftë se (i == 0), 442 00:34:07,380 --> 00:34:10,800 në rregull, atëherë unë mori një hap dhe tani unë jam në hollë (i), 443 00:34:10,800 --> 00:34:14,120 ju mund të mendoni se duhet të thotë i = 0 ose diçka. 444 00:34:14,120 --> 00:34:18,980 Nr Kjo thjesht do të thotë se ai e di se mund të rrinë direkt në linjë hollë (i). 445 00:34:18,980 --> 00:34:23,300 Sepse unë nuk është 0, hapi tjetër nuk do të përfundojë në tjetër. 446 00:34:23,300 --> 00:34:26,239 Tjetër nuk është një vijë ajo do të ndalet në. 447 00:34:26,239 --> 00:34:31,570 Është vetëm do të shkojnë në vijën e ardhshëm ajo mund të ekzekutojë në fakt, i cili është i hollë (i). 448 00:34:31,570 --> 00:34:36,090 Shkallaret në avdall (I), ne shih nëse (I == 1). 449 00:34:36,090 --> 00:34:42,670 Ne e dimë i = 1, kështu që kur ne hap, ne e dimë që ne jemi duke shkuar për t'i dhënë fund deri në oh_no 450 00:34:42,670 --> 00:34:46,489 sepse i = 1 quan oh_no funksion, të cilat ju mund të futemi në, 451 00:34:46,489 --> 00:34:52,969 e cila do të vendosë char ** s = Për të pavlefshme dhe menjëherë "BOOM". 452 00:34:54,270 --> 00:34:59,690 Dhe pastaj në të vërtetë duke kërkuar në zbatimin e buggy2, 453 00:34:59,690 --> 00:35:04,590 këtë, i është vetëm duke marrë një numër të rastësishme - 0, 1, ose 2 - thirrja Binky, 454 00:35:04,590 --> 00:35:10,610 të cilat nëse i është 0 ajo e quan oh_no, tjetër ajo e quan hollë, e cila vjen deri këtu. 455 00:35:10,610 --> 00:35:18,100 Në qoftë se i është 1, thirrje oh_no, tjetër thirrje slinky, që vjen deri këtu, 456 00:35:18,100 --> 00:35:20,460 në qoftë se i është 2, thirrje oh_no. 457 00:35:20,460 --> 00:35:24,720 Unë nuk mendoj se edhe ka një mënyrë - 458 00:35:24,720 --> 00:35:30,030 A ka dikush parë një mënyrë për të bërë këtë një program që nuk do segfault? 459 00:35:30,030 --> 00:35:37,530 Sepse nëse unë jam i humbur diçka, në qoftë se i është 0, ju menjëherë do të segfault, 460 00:35:37,530 --> 00:35:41,250 tjetër që ju të shkoni në një funksion që është në qoftë se unë ju segfault 1, 461 00:35:41,250 --> 00:35:44,540 tjetër që ju të shkoni në një funksion ku është në qoftë se unë ju segfault 2. 462 00:35:44,540 --> 00:35:46,810 Pra, pa marrë parasysh atë që ju bëni, ju segfault. 463 00:35:46,810 --> 00:35:52,380 >> I guess një mënyrë për të ndreqim ajo do të jetë në vend të bërë char ** S = NULL, 464 00:35:52,380 --> 00:35:55,610 ju mund të malloc hapësirë ​​për atë varg. 465 00:35:55,610 --> 00:36:04,230 Ne mund të bëjmë malloc (sizeof) - sizeof çfarë? 466 00:36:09,910 --> 00:36:15,190 [Student] (char) * 5? A ka kjo të duket >> drejtë? 467 00:36:15,190 --> 00:36:21,060 Unë jam duke supozuar se kjo do të funksionojë në qoftë se unë në fakt u zhvillua atë, por kjo nuk është ajo që unë jam duke kërkuar për të. 468 00:36:24,400 --> 00:36:32,940 Shikoni në llojin e s. Le të shtoni * int, int * x kështu. 469 00:36:32,940 --> 00:36:35,600 Unë do të bëjë malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Ose në qoftë se unë të kërkuar një grup prej 5, unë do të bëj (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Çka nëse unë kam një int **? 472 00:36:46,260 --> 00:36:49,140 Çfarë do që unë malloc? 473 00:36:49,140 --> 00:36:53,510 [Studenti] Madhësia e pointer. Po >>. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 E njëjta gjë këtu poshtë. 475 00:36:56,960 --> 00:37:01,280 Unë dua (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 Kjo do të ndajë hapësirën për treguesin që tregon për "bum". 477 00:37:12,840 --> 00:37:15,330 Unë nuk kam nevojë për të ndarë hapësirën për "bum" vetë 478 00:37:15,330 --> 00:37:17,210 sepse kjo është në thelb ekuivalente me atë që kam thënë më parë 479 00:37:17,210 --> 00:37:20,870 i char * x = "BOOM". 480 00:37:20,870 --> 00:37:27,950 "BOOM" tashmë ekziston. Kjo ndodh për të ekzistojnë në rajonin e read-only kujtesës. 481 00:37:27,950 --> 00:37:35,200 Por ajo tashmë ekziston, që do të thotë këtë linjë të kodit, në qoftë se s është një char **, 482 00:37:35,200 --> 00:37:43,900 pastaj * s * char është një dhe ju jeni të vendosur këtë char * për pikë në "bum". 483 00:37:43,900 --> 00:37:50,040 Nëse kam kërkuar për të kopje "bum" në ve, atëherë unë do të duhet të ndajë hapësirë ​​për s. 484 00:37:55,170 --> 00:38:03,900 Unë do të bëj * s = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Pse 5? 486 00:38:06,210 --> 00:38:10,860 Pse nuk 4? Ajo duket si "bum" është 4 karaktere. >> [Student] Karakteri null. 487 00:38:10,860 --> 00:38:14,580 Po. Të gjitha vargjet tuaja do të duhet karakterin null. 488 00:38:14,580 --> 00:38:23,590 Tani unë mund të bëjë diçka si strcat - Cili është funksioni për kopjim një varg? 489 00:38:23,590 --> 00:38:28,520 [Student] PKJ-ja? Strcpy >>. 490 00:38:28,520 --> 00:38:32,700 strcpy njeri. 491 00:38:36,120 --> 00:38:39,590 Pra strcpy ose strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy është pak të sigurt që ju mund të përcaktojë saktësisht se sa shumë karaktere, 493 00:38:43,410 --> 00:38:46,190 por këtu nuk ka rëndësi, sepse ne e dimë. 494 00:38:46,190 --> 00:38:50,340 Pra strcpy dhe do të shikojnë në argumente. 495 00:38:50,340 --> 00:38:53,100 Argumenti i parë është destinacioni ynë. 496 00:38:53,100 --> 00:38:56,770 Argumenti i dytë është burimi ynë. 497 00:38:56,770 --> 00:39:10,310 Ne jemi duke shkuar për të kopjuar në * tonë destinacion s treguesin "BOOM". 498 00:39:10,310 --> 00:39:19,820 Pse mund të ju doni të bëni këtë me një strcpy në vend të vetëm atë që kemi pasur më parë 499 00:39:19,820 --> 00:39:22,800 nga * S = "BOOM"? 500 00:39:22,800 --> 00:39:28,630 Ka një arsye që ju mund të dëshironi të bëni këtë, por çfarë është kjo arsye? 501 00:39:28,630 --> 00:39:31,940 [Student] Nëse ju doni të ndryshojë diçka në "bum". Po >>. 502 00:39:31,940 --> 00:39:37,950 Tani unë mund të bëjë diçka si s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 sepse pika s të tog dhe këtë hapësirë ​​në grumbull që s është treguar 504 00:39:48,190 --> 00:39:52,320 është një tregues për më shumë hapësirë ​​në tog, e cila është ruajtja "bum". 505 00:39:52,320 --> 00:39:55,150 Kështu që kjo kopje e "bum" është duke u ruajtur në tog. 506 00:39:55,150 --> 00:39:58,780 Nuk janë teknikisht dy kopje të "bum" në programin tonë. 507 00:39:58,780 --> 00:40:03,500 Ka pari që është dhënë vetëm nga kjo konstante "bum" string, 508 00:40:03,500 --> 00:40:09,250 dhe kopja e dytë e "bum", strcpy krijuar kopje të "bum". 509 00:40:09,250 --> 00:40:13,100 Por kopje e "bum" është duke u ruajtur në grumbull, dhe tog ju jeni të lirë për të ndryshuar. 510 00:40:13,100 --> 00:40:17,250 Tog nuk është read-only, kështu që do të thotë se s [0] 511 00:40:17,250 --> 00:40:20,500 do të ju lejojnë të ndryshojë vlerën e "bum". 512 00:40:20,500 --> 00:40:23,130 Kjo do të ju lejojnë të ndryshojë ato karaktere. 513 00:40:23,130 --> 00:40:26,640 >> Pyetje? 514 00:40:27,740 --> 00:40:29,290 Rregull. 515 00:40:29,290 --> 00:40:35,500 >> Lëvizja për buggy3, buggy3 Gdb le. 516 00:40:35,500 --> 00:40:39,840 Ne vetëm drejtuar atë dhe ne e shohim ne të merrni një segfault. 517 00:40:39,840 --> 00:40:46,550 Nëse ne backtrace, ka vetëm dy funksione. 518 00:40:46,550 --> 00:40:52,970 Nëse ne do të shkojmë deri në funksionin tonë kryesor, ne shohim se ne segfaulted në këtë linjë. 519 00:40:52,970 --> 00:41:00,180 Pra, vetëm duke kërkuar në këtë linjë, për (i int = 0; linjë fgets kjo stuff nuk null barabartë; 520 00:41:00,180 --> 00:41:03,770 Linja + +). 521 00:41:03,770 --> 00:41:08,010 Kornizë tona mëparshme u quajt _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Ju do të shihni se shumë me ndërtuar në funksionet C, 523 00:41:10,720 --> 00:41:15,350 se kur ju merrni segfault, nuk do të jetë me të vërtetë emrat e fshehta funksion 524 00:41:15,350 --> 00:41:18,090 si kjo _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Por kjo do të lidhen me këtë thirrje fgets. 526 00:41:21,770 --> 00:41:25,850 Diku brenda këtu, ne jemi segfaulting. 527 00:41:25,850 --> 00:41:30,340 Nëse ne shikojmë në argumente të fgets, ne mund të shtypura tampon. 528 00:41:30,340 --> 00:41:41,180 Le të shtypura si një - Oh, jo. 529 00:41:48,980 --> 00:41:51,900 Shtyp nuk do të punojë pikërisht si unë dua që ajo të. 530 00:41:55,460 --> 00:41:58,000 Le të shikojmë në programin aktual. 531 00:42:02,200 --> 00:42:09,640 Buffer është një grup karakter. Është një grup karakterin e 128 karaktereve. 532 00:42:09,640 --> 00:42:14,980 Kështu që kur unë them tampon të shtypura, ajo do të shtypura ato 128 karaktere, 533 00:42:14,980 --> 00:42:18,300 e cila unë mendoj se është ajo që pritet. 534 00:42:18,300 --> 00:42:21,390 Ajo që unë isha duke kërkuar për të është shtypur adresën e tampon, 535 00:42:21,390 --> 00:42:23,680 por kjo nuk ka të vërtetë më thoni shumë. 536 00:42:23,680 --> 00:42:30,770 Pra, kur Unë të ndodhë për të thënë deri këtu tampon x, ajo tregon mua 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 të cilat, në qoftë se ju mbani mend nga herët ose disa pika, Oxbffff tenton të jetë një pirg-ish rajonit. 538 00:42:38,690 --> 00:42:46,020 Rafte tenton të fillojë diku vetëm nën 0xc000. 539 00:42:46,020 --> 00:42:51,890 Vetëm duke parë këtë adresë, unë e di se tampon po ndodh në rafte. 540 00:42:51,890 --> 00:43:04,500 Rifillimi programin tim, e drejtuar, deri, tampon pamë ishte kjo sekuence e karaktere 541 00:43:04,500 --> 00:43:06,530 që janë shumë e shumë të pakuptimta. 542 00:43:06,530 --> 00:43:12,270 Pastaj shtypjen fotografi, e çfarë do të duken si fotografi? 543 00:43:15,120 --> 00:43:17,310 [Student] null. Po >>. 544 00:43:17,310 --> 00:43:22,610 File është një nga FILE * tipit, kështu që është një tregues, 545 00:43:22,610 --> 00:43:26,610 dhe vlera e atij tregues është i pavlefshëm. 546 00:43:26,610 --> 00:43:33,240 Pra fgets do të përpiqen për të lexuar nga ajo treguesin në një mënyrë të tërthortë, 547 00:43:33,240 --> 00:43:37,320 por në mënyrë për të hyrë në këtë tregues, ajo ka për të dereference atë. 548 00:43:37,320 --> 00:43:40,550 Ose, në mënyrë për të hyrë në atë që duhet të jetë treguar për të, ajo dereferences atë. 549 00:43:40,550 --> 00:43:43,810 Pra, kjo është një tregues null dereferencing dhe ajo segfaults. 550 00:43:46,600 --> 00:43:48,730 Unë mund të ketë rifilluar atë atje. 551 00:43:48,730 --> 00:43:52,170 Nëse ne të thyer në pikën tonë kryesore dhe të drejtuar, 552 00:43:52,170 --> 00:43:57,320 rreshtin e parë të kodit është char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Që duhet të japë një aluzion goxha i madh se pse ky program dështon. 554 00:44:00,870 --> 00:44:06,080 Typing tjetër sjell mua në linjë tjetër, kur kam hapur këtë skedar, 555 00:44:06,080 --> 00:44:11,140 dhe pastaj unë menjëherë të marrë në linjë tonë, ku dikur kam goditur tjetër, ajo do të segfault. 556 00:44:11,140 --> 00:44:16,880 A ka dikush duan të hedhin një arsye pse ne mund të segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Student] File nuk ekziston. Po >>. 558 00:44:19,130 --> 00:44:22,250 Kjo është menduar të jetë një aluzion 559 00:44:22,250 --> 00:44:29,570 se sa herë ju jeni të hapur një skedar ju duhet të kontrolloni se file në fakt ekziston. 560 00:44:29,570 --> 00:44:31,510 Kështu që këtu, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Kur ne filename fopen për lexim, ne atëherë duhet të them 562 00:44:34,700 --> 00:44:45,870 në qoftë se (== NULL fotografi) dhe thonë printf ("File nuk ekziston!" 563 00:44:45,870 --> 00:44:56,340 ose - më mirë akoma - filename); kthim 1; 564 00:44:56,340 --> 00:45:00,300 Deri tani ne kontrolloni për të parë nëse ajo është NULL 565 00:45:00,300 --> 00:45:03,930 para se të vërtetë duke vazhduar dhe duke u përpjekur për të lexuar nga ajo dosje. 566 00:45:03,930 --> 00:45:08,800 Ne mund të ribëjë atë vetëm për të parë se që punon. 567 00:45:11,020 --> 00:45:14,970 Unë për qëllim të përfshijë një linjë të re. 568 00:45:21,090 --> 00:45:25,290 Deri tani nonexistent.txt nuk ekziston. 569 00:45:26,890 --> 00:45:30,040 Ju duhet të kontrolloni gjithmonë për këtë lloj gjë. 570 00:45:30,040 --> 00:45:33,870 Ju gjithmonë duhet të kontrolloni për të parë nëse fopen kthen null. 571 00:45:33,870 --> 00:45:38,170 Ju duhet të kontrolloni gjithmonë për t'u siguruar se nuk ka kthim malloc NULL, 572 00:45:38,170 --> 00:45:41,410 ose tjetër ju segfault. 573 00:45:42,200 --> 00:45:45,930 >> Tani buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Running. Unë jam guessing kjo është duke pritur për të dhëna ose looping ndoshta pafund. 575 00:45:58,440 --> 00:46:01,870 Po, kjo është looping pafund. 576 00:46:01,870 --> 00:46:05,560 Pra buggy4. Ajo duket si ne jemi looping pafund. 577 00:46:05,560 --> 00:46:12,590 Ne mund të shpërthejë në kryesore, të drejtuar programin tonë. 578 00:46:12,590 --> 00:46:20,180 Në GDB, për aq kohë sa ju përdorni shkurtesa është qartë 579 00:46:20,180 --> 00:46:23,420 ose shkurtesat e veçanta që ata ofrojnë për ju, 580 00:46:23,420 --> 00:46:29,020 atëherë ju mund të përdorni për të përdorur n ardhshëm në vend që të shkruani nga tjetër gjatë gjithë rrugës. 581 00:46:29,020 --> 00:46:33,730 Dhe tani që unë kam goditur n herë, unë mund vetëm të goditur Enter për të do të mbajë ardhshëm 582 00:46:33,730 --> 00:46:36,640 në vend që të goditur n Enter, n Enter, n Enter. 583 00:46:36,640 --> 00:46:44,630 Ajo duket si unë jam në një lloj për lak që është vendosjen array [i] me 0. 584 00:46:44,630 --> 00:46:50,510 Ajo duket si unë kurrë nuk jam thyer nga kjo për lak. 585 00:46:50,510 --> 00:46:54,780 Nëse unë të shtypura i, kështu që i është 2, atëherë unë do të shkoj e ardhshëm. 586 00:46:54,780 --> 00:46:59,250 Unë do të shtypura unë, është 3, atëherë unë do të shkoj e ardhshëm. 587 00:46:59,250 --> 00:47:05,360 Unë do të shtypura dhe unë i është 3. Tjetra, shkruar unë, është 4. 588 00:47:05,360 --> 00:47:14,520 Në fakt, të shtypura sizeof (array), kështu që madhësia e array është 20. 589 00:47:16,310 --> 00:47:32,870 Por duket sikur ka disa komanda të veçanta gdb për të shkuar derisa diçka ndodh. 590 00:47:32,870 --> 00:47:37,620 Është si një kusht për vendosjen e vlerës së ndryshueshme. Por unë nuk e mbani mend se çfarë është ajo. 591 00:47:37,620 --> 00:47:44,100 Pra, nëse ne do të mbajë - 592 00:47:44,100 --> 00:47:47,120 Çfarë po thua? Çfarë keni sjellë deri? 593 00:47:47,120 --> 00:47:50,500 [Student] A i shfaqur add - >> yeah. Kështu që unë mund të të ndihmojë shfaqur. 594 00:47:50,500 --> 00:47:54,530 Nëse ne vetëm i ekranit, ajo do të vënë këtu atë që unë është vlera e 595 00:47:54,530 --> 00:47:56,470 kështu që unë nuk duhet të shtypura it out çdo kohë. 596 00:47:56,470 --> 00:48:02,930 Nëse ne vetëm mbajtur shkon tej, ne shih 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5. 597 00:48:02,930 --> 00:48:08,530 Diçka po shkon tmerrësisht keq, dhe unë po vë në 0. 598 00:48:13,330 --> 00:48:22,220 Kërkuar në buggy4.c, ne shohim të gjitha që ndodh është int array [5]; 599 00:48:22,220 --> 00:48:26,200 për (i = 0; I <= sizeof (array); I + +) 600 00:48:26,200 --> 00:48:28,550 array [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Çfarë ne shohim se është e gabuar këtu? 602 00:48:31,390 --> 00:48:39,480 Si një aluzion, kur unë isha duke bërë gdb buggy4 - le të thyejnë kryesore, drejtuar - 603 00:48:39,480 --> 00:48:45,980 Unë kam shkruar sizeof (array) vetëm për të parë se çfarë kushti është vendi ku unë duhet në fund shpërthen. 604 00:48:47,690 --> 00:48:51,100 Ku jam unë? Nuk kam drejtuar? 605 00:48:51,100 --> 00:48:54,280 Unë nuk e kanë deklaruar ende. 606 00:48:54,280 --> 00:48:58,680 Pra, të shtypura sizeof (array) dhe kjo është 20, 607 00:48:58,680 --> 00:49:06,690 e cila pritet që array im është i madhësisë 5 dhe kjo është 5 yje të integers, 608 00:49:06,690 --> 00:49:12,410 kështu që gjëja e tërë duhet të jetë 5 * sizeof (int), ku bytes sizeof (int) ka tendencë të jetë 4. 609 00:49:12,410 --> 00:49:14,780 Pra, sizeof (array) është 20. 610 00:49:14,780 --> 00:49:17,420 Çfarë duhet të jetë kjo? 611 00:49:17,420 --> 00:49:21,720 [Student] Ndarë nga sizeof (int). >> Yeah, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Ajo duket sikur nuk ka ende një problem këtu. Unë mendoj se kjo duhet të jetë vetëm < 613 00:49:30,630 --> 00:49:36,960 pasi kjo është shumë e shumë të gjithmonë 00:49:44,860 Tani le të mendojmë se pse ky fakt ishte thyer. 615 00:49:44,860 --> 00:49:53,370 Does anyone kanë supozime pse ishte i rivendosur në 0 nëpër çdo ripërsëritje e lak? 616 00:50:01,300 --> 00:50:09,350 E vetmja gjë brenda e këtu se po ndodh është se array [i] është duke u vendosur në 0. 617 00:50:09,350 --> 00:50:15,350 Kështu disi, kjo linjë e kodit është duke shkaktuar int tonë i të vendosur për të 0. 618 00:50:16,730 --> 00:50:23,130 [Student] Mund të jetë për shkak se ajo është thelbësore kujtimin e kësaj pjese të I 619 00:50:23,130 --> 00:50:27,970 kur ajo mendon se është elementi tjetër të grup? >> [Bowden] Po. 620 00:50:27,970 --> 00:50:33,880 Kur ne jemi duke shkuar përtej fund të array tonë, 621 00:50:33,880 --> 00:50:39,870 disi se hapësira që ne jemi mbizotërues është thelbësore në vlerën e i. 622 00:50:39,870 --> 00:50:48,030 Dhe kështu nëse ne shikojmë në buggy4, thyejnë kryesor, afat, 623 00:50:48,030 --> 00:50:53,120 le të shtypura në adresën e i. 624 00:50:53,120 --> 00:50:57,280 Ajo duket si kjo është bffff124. 625 00:50:57,280 --> 00:51:03,930 Tani le të shtypur adresën e array [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Po në lidhje me [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11c, 120. array [5] është bfff124. 629 00:51:14,530 --> 00:51:26,990 Pra, array [5] ka të njëjtën adresë si unë, që do të thotë se array [5] është i. 630 00:51:26,990 --> 00:51:30,720 Në qoftë se ata kanë të njëjtën adresë, ata janë e njëjta gjë. 631 00:51:30,720 --> 00:51:38,410 Pra, kur ne kemi vendosur koleksion [5] në 0, ne jemi të vendosur për të i 0. 632 00:51:38,410 --> 00:51:46,070 Dhe në qoftë se ju mendoni rreth kësaj në aspektin e rafte, 633 00:51:46,070 --> 00:51:55,590 int i është shpallur të parë, që do të thotë i merr disa hapësirë ​​në rafte. 634 00:51:55,590 --> 00:52:04,730 Pastaj array [5] është ndarë, kështu që pas 20 bytes janë ndarë në rafte. 635 00:52:04,730 --> 00:52:08,400 Pra, i merr ndahen parë, atëherë këto 20 bytes merrni ndarë. 636 00:52:08,400 --> 00:52:11,400 Kështu që i ndodh e drejtë para array, 637 00:52:11,400 --> 00:52:19,230 dhe për shkak të rrugës, si i tha javën e kaluar, ku teknikisht rafte rritet poshtë, 638 00:52:19,230 --> 00:52:28,520 kur ju indeksi në një grup, ne jemi të garantuar se qëndrimi 0 në rrjet 639 00:52:28,520 --> 00:52:31,970 ndodh gjithmonë përpara vendin e parë në grup. 640 00:52:31,970 --> 00:52:35,900 Kjo është lloj i si unë tërhoqi atë javën e kaluar. 641 00:52:35,900 --> 00:52:42,210 Vini re se në fund ne kemi adresën dhe 0 në krye kemi Max adresave. 642 00:52:42,210 --> 00:52:44,880 Rafte është gjithmonë në rritje poshtë. 643 00:52:48,100 --> 00:52:53,500 Le të themi se i ndajë. 644 00:52:53,500 --> 00:52:59,680 Ne ndajë integer i, që do të thotë le të them vetëm deri këtu integer i merr ndarë. 645 00:52:59,680 --> 00:53:06,420 Pastaj ne ndajë koleksion tonë prej 5 integers, që do të thotë se nën cilat, 646 00:53:06,420 --> 00:53:11,230 pasi rafte po rritet poshtë, ato 5 integers merrni ndarë. 647 00:53:11,230 --> 00:53:15,900 Por për shkak të asaj se si punojnë vargjeve, ne jemi të garantuar se pozita e parë në grup 648 00:53:15,900 --> 00:53:22,260 gjithmonë ka një adresë më pak se gjëja e dytë në grup. 649 00:53:22,260 --> 00:53:28,270 Pra, pozita array 0 gjithmonë duhet të ndodhë e parë në kujtesë, 650 00:53:28,270 --> 00:53:30,700 ndërsa pozita array 1 duhet të ndodhë pas kësaj 651 00:53:30,700 --> 00:53:33,310 dhe pozita array 2 duhet të ndodhë pas kësaj, 652 00:53:33,310 --> 00:53:37,900 që do të thotë se pozicioni array 0 do të ndodhë diku poshtë këtu, 653 00:53:37,900 --> 00:53:40,690 Pozita array 1 do të ndodhë më lart se 654 00:53:40,690 --> 00:53:45,530 sepse do të thotë duke shkuar deri adresa larta që adresa maksimale është deri këtu. 655 00:53:45,530 --> 00:53:50,490 Pra, array [0] këtu poshtë, array [1] deri këtu, array [2] deri këtu, array [3] deri këtu. 656 00:53:50,490 --> 00:53:55,620 Vini re se si para se të ndahen integer i të gjithë rrugën deri këtu, 657 00:53:55,620 --> 00:54:01,040 si ne shkojmë më tej dhe më tej në grup tonë, ne jemi duke marrë më afër dhe më afër numër të plotë tonë i. 658 00:54:01,040 --> 00:54:07,640 Kjo ndodh pikërisht kështu që Array [5], që është një pozicion përtej array tonë, 659 00:54:07,640 --> 00:54:13,010 është pikërisht aty ku integer i ka ndodhur që të ndahen. 660 00:54:13,010 --> 00:54:16,920 Pra, kjo është pika ku ne të ndodhë të jetë goditur hapësirë ​​në rafte 661 00:54:16,920 --> 00:54:21,680 që është ndarë për integer i, dhe ne jemi të vendosur që të 0. 662 00:54:21,680 --> 00:54:26,160 >> Kjo është se si funksionon. Pyetje? Po. 663 00:54:26,160 --> 00:54:30,710 [Student] Never mind. Rregull. 664 00:54:30,710 --> 00:54:33,090 [Student] Si mund të ju shmangur këto lloj gabime? 665 00:54:33,090 --> 00:54:41,190 Këto lloj gabime? Mos përdorni C, si gjuhën tuaj programimit. 666 00:54:41,190 --> 00:54:45,840 Përdorni një gjuhë që ka kufijtë array kontrolluar. 667 00:54:45,840 --> 00:54:55,900 Për sa kohë që ju jeni të kujdesshëm, ju vetëm duhet për të shmangur duke shkuar kaluar kufijtë e array tuaj. 668 00:54:55,900 --> 00:54:58,300 [Student] Pra, këtu, kur kemi shkuar kaluar kufijtë e array tuaj - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Kjo është ajo ku gjërat fillojnë të shkojnë keq. >> [Student] Oh, në rregull. 670 00:55:01,840 --> 00:55:05,730 Për sa kohë që ju të qëndroni brenda kujtesës ndarë për grup tuaj, ju jeni të mirë. 671 00:55:05,730 --> 00:55:12,400 Por C nuk i bën kontrollin gabimi. Nëse unë bëj koleksion [1000], ajo me kënaqësi do të ndryshojë çfarëdo që të ndodhë vetëm - 672 00:55:12,400 --> 00:55:16,500 Ai shkon në fillim të array, atëherë ajo shkon 1000 poste pas dhe vendos atë në 0. 673 00:55:16,500 --> 00:55:20,000 Ajo nuk ka të bëjë asnjë kontrolluar se oh, kjo nuk ka të vërtetë kanë gjërat në atë 1000. 674 00:55:20,000 --> 00:55:22,750 1000 është rruga përtej asaj që unë duhet të ndryshuar, 675 00:55:22,750 --> 00:55:26,940 kurse Java apo diçka që ju do të merrni rrjet nga indeksi kufijtë 676 00:55:26,940 --> 00:55:29,820 ose indeksin jashtë caqeve përjashtim. 677 00:55:29,820 --> 00:55:33,950 Kjo është arsyeja pse shumë gjuhë të nivelit të lartë kanë këto gjëra 678 00:55:33,950 --> 00:55:37,340 ku në qoftë se ju shkoni përtej kufijve të vektorit, ju nuk 679 00:55:37,340 --> 00:55:40,070 kështu që ju nuk mund të ndryshojë gjërat nga poshtë jush 680 00:55:40,070 --> 00:55:42,590 dhe pastaj gjërat shkojnë shumë më keq se vetëm duke u një përjashtim 681 00:55:42,590 --> 00:55:44,940 duke thënë se ju shkoi përtej përfundimit të vektorit. 682 00:55:44,940 --> 00:55:50,970 [Student] Dhe kështu duhet të kemi ndryshuar vetëm <= të vetëm > [Bowden] Yeah. 683 00:55:50,970 --> 00:55:54,800 Ajo duhet të jetë 00:55:59,560 prej sizeof (array) është 20, por ne duam vetëm 5. >> [Student] E drejta. 685 00:55:59,560 --> 00:56:04,060 Më shumë pyetje? Rregull. 686 00:56:04,060 --> 00:56:07,380 >> [Student] Unë kam një pyetje. Po >>. 687 00:56:07,380 --> 00:56:16,440 [Student] Çfarë është e ndryshueshme aktuale array? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Ashtu si çfarë është grup? 689 00:56:20,000 --> 00:56:24,930 Array vetvete është një simbol. 690 00:56:24,930 --> 00:56:31,490 Ajo është vetëm adresa e fillimit të 20 bytes se ne jemi referenca. 691 00:56:31,490 --> 00:56:38,070 Ju mund të mendoni për atë si një tregues, por kjo është një tregues konstant. 692 00:56:38,070 --> 00:56:44,140 Sa më shpejt që të merrni gjëra të hartuar, array ndryshueshme nuk ekziston më. 693 00:56:44,140 --> 00:56:48,210 [Student] Pra, si e bën atë të gjetur madhësinë e grup? 694 00:56:48,210 --> 00:56:54,130 Madhësia e array referohet madhësinë e atij bllokut se ky simbol i referohet. 695 00:56:54,130 --> 00:57:01,240 Kur unë bëj diçka si printf ("% f \ n", array); 696 00:57:01,240 --> 00:57:05,140 le të drejtuar atë. 697 00:57:12,960 --> 00:57:15,530 Çfarë unë vetëm bëj gabim? 698 00:57:15,530 --> 00:57:19,220 'Array' Array deklaruar këtu. 699 00:57:20,820 --> 00:57:23,200 Oh, deri këtu. 700 00:57:23,200 --> 00:57:31,250 Tingëllimë është zgjuar, dhe kjo ndodh të konstatoj se unë e shpalli si grup 5 elemente 701 00:57:31,250 --> 00:57:34,540 por unë jam në pozitë indeksimin 1000. 702 00:57:34,540 --> 00:57:38,450 Ajo mund ta bëjë këtë për shkak se këto janë vetëm konstante. 703 00:57:38,450 --> 00:57:43,370 Ajo vetëm mund të shkojnë aq larg në vërejtur që unë jam duke shkuar përtej kufijve të vektorit. 704 00:57:43,370 --> 00:57:46,880 Por, para se të vini re, kur ne kishim të jetë i gabuar, 705 00:57:46,880 --> 00:57:51,040 ajo nuk mund të përcaktojë se sa vlerat që unë mund të marrë në, 706 00:57:51,040 --> 00:57:55,540 kështu që nuk mund të përcaktojë se i ishte duke shkuar përtej përfundimit të vektorit. 707 00:57:55,540 --> 00:57:59,430 Kjo është vetëm tingëllimë qenë zgjuar. 708 00:57:59,430 --> 00:58:03,340 >> Por tani të bëjë buggy4. Pra, çfarë tjetër po bëj keq? 709 00:58:03,340 --> 00:58:05,970 Implicite deklaruar Funksioni Biblioteka "printf '. 710 00:58:05,970 --> 00:58:14,960 Unë jam duke shkuar për të duan të përfshijnë # . 711 00:58:14,960 --> 00:58:18,710 Rregull. Tani drejtimin buggy4. 712 00:58:18,710 --> 00:58:24,840 Shtypjen e vlerës së array si kam bërë këtu, shtypjen atë si një tregues 713 00:58:24,840 --> 00:58:30,060 printime diçka që duket si ky - bfb8805c - e cila është disa adresa 714 00:58:30,060 --> 00:58:33,450 që është në rajonin e ish-rafte. 715 00:58:33,450 --> 00:58:41,820 Array vetë është si një tregues, por kjo nuk është një akrep aktuale, 716 00:58:41,820 --> 00:58:45,410 pasi një tregues rregullt ne mund të ndryshojmë. 717 00:58:45,410 --> 00:58:54,700 Array është vetëm disa konstante. Të 20 blloqet e kujtesës fillojë në 0xbfb8805c adresave. 718 00:58:54,700 --> 00:59:09,020 Pra bfb8805c nëpërmjet këtë adresë +20--ose I guess -20 - 719 00:59:09,020 --> 00:59:17,400 është e gjitha e kujtesës ndarë për këtë koleksion. 720 00:59:17,400 --> 00:59:20,350 Array, e ndryshueshme në vetvete nuk është ruajtur kudo. 721 00:59:20,350 --> 00:59:27,660 Kur ju jeni hartimin, përpiluesit - Vala dorë në atë - 722 00:59:27,660 --> 00:59:33,060 por përpilues do të përdorin vetëm kur ai e di array të jetë. 723 00:59:33,060 --> 00:59:36,090 Ai e di se ku fillon array, 724 00:59:36,090 --> 00:59:40,910 dhe kështu ajo gjithmonë mund të bëjë vetëm gjërat në drejtim të offsets nga ajo fillimi. 725 00:59:40,910 --> 00:59:43,960 Ajo nuk ka nevojë për një ndryshore vetë për të përfaqësuar grup. 726 00:59:43,960 --> 00:59:53,730 Por kur bëj diçka si int * p = array, tani p është një tregues që tregon në atë grup, 727 00:59:53,730 --> 00:59:57,830 dhe tani p fakt nuk ekziston në rafte. 728 00:59:57,830 --> 01:00:01,950 Unë jam i lirë të ndryshojë p. Unë mund të bëj p = malloc. 729 01:00:01,950 --> 01:00:06,500 Pra, ajo fillimisht vuri në grup, tani ajo tregon për një hapësirë ​​në tog. 730 01:00:06,500 --> 01:00:09,620 Unë nuk mund ta bëjë array malloc =. 731 01:00:09,620 --> 01:00:13,710 Nëse tingëllimë është i mençur, ai do të bërtas në mua të drejtën off bat. 732 01:00:17,000 --> 01:00:21,430 Në fakt, unë jam goxha i sigurt gcc do të bëjë këtë shumë. 733 01:00:21,430 --> 01:00:25,010 Pra, lloji array 'int [5]' nuk është tjetërsohet. 734 01:00:25,010 --> 01:00:28,040 Ju nuk mund të caktojë një lloj diçka për të array 735 01:00:28,040 --> 01:00:30,500 sepse array është vetëm një konstante. 736 01:00:30,500 --> 01:00:34,760 Ajo është një simbol i cili referencat ato 20 bytes. Unë nuk mund ta ndryshojë atë. 737 01:00:34,760 --> 01:00:37,690 >> [Student] Dhe ku është madhësia e array ruajtur? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Kjo nuk është ruajtur kudo. Kjo është kur është e përpilimit. 739 01:00:40,670 --> 01:00:46,310 Pra, ku është madhësia e array ruajtur? 740 01:00:46,310 --> 01:00:51,870 Ju mund të përdorni vetëm sizeof (array) brenda funksionit që array është deklaruar vetë. 741 01:00:51,870 --> 01:01:03,150 Pra, nëse unë bëj një funksion, foo, dhe unë bëj (int array []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (array)); 743 01:01:10,450 --> 01:01:21,330 dhe pastaj këtu poshtë unë e quaj foo (array); 744 01:01:21,330 --> 01:01:24,840 brenda këtij funksioni - le të drejtuar atë. 745 01:01:34,200 --> 01:01:36,840 Kjo është tingëllimë të qenit zgjuar përsëri. 746 01:01:36,840 --> 01:01:43,890 Është thënë se në sizeof funksion parametër array 747 01:01:43,890 --> 01:01:46,690 do të kthehen madhësinë e '* int'. 748 01:01:46,690 --> 01:01:55,150 Kjo do të jetë një gabim, nëse kjo nuk është ajo që kam kërkuar të ndodhë. 749 01:01:55,150 --> 01:01:58,960 Le të vërtetë të kthehet off Werror. 750 01:02:14,950 --> 01:02:17,590 Paralajmërim. Paralajmërimet janë të mirë. 751 01:02:17,590 --> 01:02:19,960 Ajo do të vazhdojë të përpilojë për aq kohë sa ajo ka një paralajmërim. 752 01:02:19,960 --> 01:02:22,910 . / A.out do të shtypura 4. 753 01:02:22,910 --> 01:02:28,650 Paralajmërimi që u gjeneruar është një tregues i qartë i çfarë shkoi keq. 754 01:02:28,650 --> 01:02:34,120 Ky grup int është vetëm do të shtypura sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Edhe në qoftë se kam vënë array [5] në këtu, ai është ende vetëm do të shtypura sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Pra, sa më shpejt që ju të kalojë atë në një funksion, dallimi midis vargjeve dhe pointers 757 01:02:47,440 --> 01:02:49,670 është që nuk ekzistojnë. 758 01:02:49,670 --> 01:02:52,640 Kjo ndodh të jetë një grup që ishte shpallur në rafte, 759 01:02:52,640 --> 01:02:58,300 por sa më shpejt që ne të kalojë atë vlerë që 0xbf blah, blah, blah në këtë funksion, 760 01:02:58,300 --> 01:03:03,350 atëherë ky tregues tregon për atë grup në rafte. 761 01:03:03,350 --> 01:03:08,310 Kështu që do të thotë se sizeof vlen vetëm në funksion që array ishte deklaruar, 762 01:03:08,310 --> 01:03:11,230 që do të thotë se kur ju jeni hartimin e këtij funksioni, 763 01:03:11,230 --> 01:03:17,330 kur tingëllimë shkon përmes këtij funksioni, ai e sheh array është një grup int i madhësisë 5. 764 01:03:17,330 --> 01:03:20,640 Kështu atëherë ajo sheh sizeof (array). E pra, kjo është 20. 765 01:03:20,640 --> 01:03:26,440 Kjo është në fakt si sizeof thelb punon për pothuajse të gjitha rastet. 766 01:03:26,440 --> 01:03:31,150 Sizeof nuk është një funksion, është një operator. 767 01:03:31,150 --> 01:03:33,570 Ju nuk telefononi funksionin sizeof. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), përpiluesit vetëm do të përkthehet se për 4. 769 01:03:41,480 --> 01:03:43,700 Got it? Rregull. 770 01:03:43,700 --> 01:03:47,520 >> [Student] Pra, çfarë është dallimi në mes sizeof (array) në kryesore dhe në foo? 771 01:03:47,520 --> 01:03:52,840 Kjo është për shkak se ne jemi duke thënë sizeof (array), e cila është e tipit int *, 772 01:03:52,840 --> 01:03:57,120 ndërsa array poshtë këtu nuk është e tipit int *, është një grup int. 773 01:03:57,120 --> 01:04:04,540 >> [Student] Pra, nëse keni pasur parametër në grup [] në vend të array int *, 774 01:04:04,540 --> 01:04:09,230 do të thotë që ju ende mund të ndryshojë grup sepse tani kjo është një akrep? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Ashtu si kjo? >> [Student] Yeah. Ju mund të ndryshojë koleksion brenda funksionit tani? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Ju mund të ndryshojë rrjet në të dy rastet. 777 01:04:18,420 --> 01:04:23,130 Në të dyja këto raste ju jeni të lirë për të thënë array [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Student] Por ju mund të bëni pikë array për diçka tjetër? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Po. Në secilin rast - >> [Student] Yeah. 780 01:04:30,230 --> 01:04:38,410 [Bowden] Dallimi ndërmjet array [] dhe një grup int *, nuk ka asnjë. 781 01:04:38,410 --> 01:04:42,570 Ju gjithashtu mund të merrni disa grup shumëdimensionale në këtu 782 01:04:42,570 --> 01:04:47,050 për disa sintaksë të përshtatshëm, por është ende vetëm një tregues. 783 01:04:47,050 --> 01:04:56,400 Kjo do të thotë se unë jam i lirë të bëj koleksion = malloc (sizeof (int)); dhe tani pikë diku tjetër. 784 01:04:56,400 --> 01:04:59,610 Por ashtu si si ky punon përgjithmonë dhe gjithmonë, 785 01:04:59,610 --> 01:05:03,210 ndryshuar këtë koleksion duke e bërë atë të tregojnë për diçka tjetër 786 01:05:03,210 --> 01:05:07,570 nuk e ndryshojnë këtë koleksion këtu poshtë, sepse kjo është një kopje e argumentit, 787 01:05:07,570 --> 01:05:10,780 kjo nuk është një tregues për atë argument. 788 01:05:10,780 --> 01:05:16,070 Dhe në fakt, ashtu si tregues më shumë se ajo është saktësisht e njëjtë - 789 01:05:16,070 --> 01:05:21,100 ne tashmë pamë se çfarë printime array shtypi - 790 01:05:21,100 --> 01:05:31,410 çka nëse kemi shkruar adresën e grup ose adresën e adresën e grup 791 01:05:31,410 --> 01:05:36,290 për njërin prej atyre? 792 01:05:41,770 --> 01:05:45,220 Le të injorojë këtë. 793 01:05:48,140 --> 01:05:51,660 Rregull. Kjo është e mirë. Është tani running. A.out /. 794 01:05:51,660 --> 01:06:00,220 Array shtypjen, atëherë shtypjen adresën e array, janë e njëjta gjë. 795 01:06:00,220 --> 01:06:02,870 Array thjesht nuk ekziston. 796 01:06:02,870 --> 01:06:08,190 Ai e di kur ju jeni shtypjen koleksion, ju jeni shtypjen simbol që i referohen këtyre 20 bytes. 797 01:06:08,190 --> 01:06:11,940 Shtypi adresën e array, mirë, array nuk ekziston. 798 01:06:11,940 --> 01:06:17,200 Ajo nuk ka një adresë, kështu që vetëm shtyp adresën e atyre 20 bytes. 799 01:06:20,820 --> 01:06:28,150 Sa më shpejt që ju të përpilojnë poshtë, si në buggy4 tuaj hartuar. / A.out, 800 01:06:28,150 --> 01:06:30,340 array është që nuk ekzistojnë. 801 01:06:30,340 --> 01:06:33,640 Pointers ekzistojnë. Vargjeve nuk e bëjnë. 802 01:06:34,300 --> 01:06:38,060 Blloqet e kujtesës që përfaqësojnë array ende ekzistojnë, 803 01:06:38,060 --> 01:06:43,270 por array ndryshueshme dhe variablat e atij lloji nuk ekzistojnë. 804 01:06:46,260 --> 01:06:50,270 Ata janë si dallimet kryesore midis vargjeve dhe pointers 805 01:06:50,270 --> 01:06:55,590 janë sa më shpejt që ju të bëni thirrje funksion, nuk ka asnjë ndryshim. 806 01:06:55,590 --> 01:07:00,460 Por brenda funksionit që array vetë është deklaruar, sizeof punon ndryshe 807 01:07:00,460 --> 01:07:05,190 pasi ju jeni shtypjen madhësinë e blloqeve në vend të madhësisë të tipit, 808 01:07:05,190 --> 01:07:08,950 dhe ju nuk mund të ndryshojë atë, sepse ajo është një simbol. 809 01:07:08,950 --> 01:07:14,370 Shtypi gjë dhe adresën e gjë shtyp të njëjtën gjë. 810 01:07:14,370 --> 01:07:18,480 Dhe kjo është shumë e shumë ajo. 811 01:07:18,480 --> 01:07:20,820 [Student] A mund të themi se një herë më shumë? 812 01:07:21,170 --> 01:07:24,170 Unë mund të ketë humbur diçka. 813 01:07:24,170 --> 01:07:29,260 Array Printime dhe adresa e array shtyp të njëjtën gjë, 814 01:07:29,260 --> 01:07:33,180 ndërsa nëse keni shkruar një tregues kundrejt adresën e akrep, 815 01:07:33,180 --> 01:07:36,010 një gjë shtyp adresën e asaj që ju jeni duke treguar, 816 01:07:36,010 --> 01:07:40,360 të tjera shtyp adresën e treguesin në rafte. 817 01:07:40,360 --> 01:07:47,040 Ju mund të ndryshojë një tregues, ju nuk mund të ndryshojë një simbol array. 818 01:07:47,740 --> 01:07:53,270 Dhe treguesin sizeof do të shtypur madhësinë e atij lloji akrep. 819 01:07:53,270 --> 01:07:57,470 So int * sizeof p (p) do të shtypura 4, 820 01:07:57,470 --> 01:08:04,110 por int array [5] print sizeof (array) do të shtypura 20. 821 01:08:04,110 --> 01:08:07,480 [Student] Pra int array [5] do të shtypura 20? Po >>. 822 01:08:07,480 --> 01:08:13,300 Kjo është arsyeja pse në brendësi të buggy4 kur ajo përdoret për të sizeof (array) 823 01:08:13,300 --> 01:08:16,660 kjo ishte bërë i <20, e cila nuk është ajo që kemi dashur. 824 01:08:16,660 --> 01:08:20,880 Ne duam I <5. >> [Student] Okay. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Dhe pastaj sa më shpejt që ju të filloni duke kaluar në funksionet, 826 01:08:25,569 --> 01:08:34,340 në qoftë se ne e bëmë int * p = array; 827 01:08:34,340 --> 01:08:39,779 brenda këtij funksioni, ne thelb mund të përdorni dhe p koleksion pikërisht në të njëjtën mënyrë, 828 01:08:39,779 --> 01:08:43,710 përveç problemit sizeof dhe problemi ndryshon. 829 01:08:43,710 --> 01:08:49,810 Por p [0] = 1; është njëlloj si të thuash array [0] = 1; 830 01:08:49,810 --> 01:08:55,600 Dhe sa më shpejt që ne e themi foo (array), ose foo (p); 831 01:08:55,600 --> 01:08:59,760 brenda funksionit foo, kjo është thirrja e njëjtë dy herë. 832 01:08:59,760 --> 01:09:03,350 Nuk ka dallim në mes këtyre dy telefonatave. 833 01:09:07,029 --> 01:09:11,080 >> Gjithkush e mirë për këtë? Rregull. 834 01:09:14,620 --> 01:09:17,950 Ne kemi 10 minuta. 835 01:09:17,950 --> 01:09:28,319 >> Ne do të përpiqemi për të marrë përmes këtij programi Typer Hacker, 836 01:09:28,319 --> 01:09:32,350 Kjo faqe e internetit, e cila doli vitin e kaluar apo diçka. 837 01:09:34,149 --> 01:09:41,100 Ajo është menduar vetëm për të të jetë si ju shkruani rastësisht dhe printime jashtë - 838 01:09:41,100 --> 01:09:46,729 Çfarëdo fotografi ndodh të ketë ngarkuar është ajo që duket si ju jeni shtypur. 839 01:09:46,729 --> 01:09:52,069 Ajo duket si një lloj të kodit të sistemit operativ. 840 01:09:53,760 --> 01:09:56,890 Kjo është ajo që ne duam të zbatojë. 841 01:10:08,560 --> 01:10:11,690 Ju duhet të keni një ekzekutueshme binary quajtur hacker_typer 842 01:10:11,690 --> 01:10:14,350 që merr në një argument të vetëm, fotografi të "tipit hacker". 843 01:10:14,350 --> 01:10:16,480 Drejtimin e ekzekutueshme duhet të qartë në ekran 844 01:10:16,480 --> 01:10:20,850 dhe pastaj të shtypura nga një karakter nga dosja kaloi-në çdo herë që përdoruesi shtyn një kyç. 845 01:10:20,850 --> 01:10:24,990 Pra, çfarëdo që të shtypni kyç, ajo duhet të hedhin larg dhe në vend të shtypur një karakter nga e dosjes 846 01:10:24,990 --> 01:10:27,810 që është argumenti. 847 01:10:29,880 --> 01:10:34,350 Unë do të shumë e shumë të ju tregojnë se çfarë gjëra ne do të duhet të dini janë. 848 01:10:34,350 --> 01:10:36,440 Por ne duam të shikoni bibliotekën termios. 849 01:10:36,440 --> 01:10:44,840 Unë kurrë nuk kam përdorur këtë bibliotekë në tërë jetën time, kështu që ajo ka qëllime shumë minimale. 850 01:10:44,840 --> 01:10:48,610 Por kjo do të jetë biblioteka ne mund të përdorim për të hedhur larg karakterin që ju goditi 851 01:10:48,610 --> 01:10:52,390 kur ju jeni të shtypni në standardin in 852 01:10:56,970 --> 01:11:05,840 Pra hacker_typer.c, dhe ne jemi duke shkuar për të duan të përfshijnë # . 853 01:11:05,840 --> 01:11:12,870 Looking në faqen njeri për termios - Jam guessing terminal ajo e OS ose diçka - 854 01:11:12,870 --> 01:11:16,240 Unë nuk e di se si të lexuar atë. 855 01:11:16,240 --> 01:11:21,040 Duke kërkuar në këtë, ai thotë se për të përfshirë këto 2 fotografi, kështu që ne do të bëjmë këtë. 856 01:11:37,620 --> 01:11:46,820 >> Gjëja e parë e parë, ne duam të marrë në një argument të vetëm, i cili është fotografi ne duhet të hapur. 857 01:11:46,820 --> 01:11:52,420 Pra, çfarë unë dua të bëj? Si mund të kontrolloni për të parë unë kam një argument të vetëm? 858 01:11:52,420 --> 01:11:56,480 [Student] Nëse argc barabartë me atë. >> [Bowden] Yeah. 859 01:11:56,480 --> 01:12:21,250 Pra, nëse (argc = 2!) Printf ("përdorimi:% s [fotografinë për të hapur]"). 860 01:12:21,250 --> 01:12:32,750 Kështu që tani, nëse unë të drejtuar këtë pa dhënë një argument të dytë - oh, kam nevojë për linjë të re - 861 01:12:32,750 --> 01:12:36,240 ju do të shihni se përdorimi thotë:. / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 dhe pastaj Argumenti i dytë duhet të jetë dosja që unë dua të hapur. 863 01:12:58,430 --> 01:13:01,260 Tani çfarë të bëj? 864 01:13:01,260 --> 01:13:08,490 Unë dua për të lexuar nga kjo skedë. Si mund të lexohet nga një skedar? 865 01:13:08,490 --> 01:13:11,920 [Student] Ju hapur atë më parë. Po >>. 866 01:13:11,920 --> 01:13:15,010 Pra fopen. Çfarë do të duken si fopen? 867 01:13:15,010 --> 01:13:22,980 [Student] Emri i dokumentit. >> [Bowden] Emri i dokumentit do të jetë argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Student] Dhe atëherë ajo që ju doni të bëni me të, kështu që - >> [Bowden] Yeah. 869 01:13:26,110 --> 01:13:28,740 Pra, nëse ju nuk e mbani mend, ju vetëm mund të bëni fopen njeri, 870 01:13:28,740 --> 01:13:32,960 ku ajo do të jetë një rrugë e const char *, ku rruga është filename, 871 01:13:32,960 --> 01:13:34,970 const char * Mode. 872 01:13:34,970 --> 01:13:38,660 Nëse ju ndodh që të mos mbani mend se çfarë është mënyra, atëherë ju mund të shikoni për mode. 873 01:13:38,660 --> 01:13:44,660 Brenda faqeve njeriu, karakteri slash është ajo që ju mund të përdorni për të kërkuar për gjërat. 874 01:13:44,660 --> 01:13:49,790 Kështu që unë lloj / mënyrë për të kërkuar për mode. 875 01:13:49,790 --> 01:13:57,130 n dhe N janë ato që ju mund të përdorni për të ciklit përmes ndeshjet e kërkimit. 876 01:13:57,130 --> 01:13:59,800 Këtu ajo thotë se pikat analog argument për një varg 877 01:13:59,800 --> 01:14:01,930 filluar me një nga sekuenca në vijim. 878 01:14:01,930 --> 01:14:06,480 Pra r, file teksti Hapur për lexim. Kjo është ajo që ne duam të bëjmë. 879 01:14:08,930 --> 01:14:13,210 Për të lexuar, dhe unë dua për të ruajtur atë. 880 01:14:13,210 --> 01:14:18,720 Gjëja do të jetë një * FILE. Tani çfarë unë dua të bëj? 881 01:14:18,720 --> 01:14:21,200 Më jepni një të dytë. 882 01:14:28,140 --> 01:14:30,430 Rregull. Tani çfarë unë dua të bëj? 883 01:14:30,430 --> 01:14:32,940 [Student] Kontrolloni nëse është e NULL. >> [Bowden] Yeah. 884 01:14:32,940 --> 01:14:38,690 Çdo herë që ju të hapur një skedar, sigurohuni që ju jeni në gjendje për sukses për të hapur atë. 885 01:14:58,930 --> 01:15:10,460 >> Tani unë dua të bëj gjëra që termios ku unë dua që së pari të lexoni vetitë e mia aktuale 886 01:15:10,460 --> 01:15:14,050 dhe për të shpëtuar ata në diçka, atëherë unë dua të ndryshoj vetitë e mia 887 01:15:14,050 --> 01:15:19,420 për të hedhur larg çdo karakter që unë lloji, 888 01:15:19,420 --> 01:15:22,520 dhe pastaj unë dua të rinovuar këto settings. 889 01:15:22,520 --> 01:15:27,250 Dhe pastaj në fund të programit, unë dua të ndryshojë përsëri në parametrat e mia origjinale. 890 01:15:27,250 --> 01:15:32,080 Pra struct do të jetë e tipit termios, dhe unë jam duke shkuar për të duan dy nga ato. 891 01:15:32,080 --> 01:15:35,600 I pari do të jetë current_settings mi, 892 01:15:35,600 --> 01:15:42,010 dhe pastaj ata do të jenë hacker_settings mi. 893 01:15:42,010 --> 01:15:48,070 Së pari, unë jam duke shkuar për të dëshironi të ruani vetitë e mia aktuale, 894 01:15:48,070 --> 01:15:53,790 atëherë unë jam duke shkuar për të duan për të rinovuar hacker_settings, 895 01:15:53,790 --> 01:16:01,570 dhe pastaj rruga në fund të programit tim, unë dua të kthehet në parametrat aktuale. 896 01:16:01,570 --> 01:16:08,660 Pra, duke kursyer cilësimet aktuale, mënyra se si punon, ne termios njeri. 897 01:16:08,660 --> 01:16:15,810 Ne shohim se ne kemi këtë tcsetattr int, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Unë të kalojë në një struct termios me treguesin e saj. 899 01:16:22,960 --> 01:16:30,640 Në këtë mënyrë do të duket është - I've harruar tashmë se çfarë funksioni është quajtur. 900 01:16:30,640 --> 01:16:34,930 Kopjoni dhe ngjisni atë. 901 01:16:39,150 --> 01:16:45,500 Pra tcgetattr, atëherë unë dua të kalojë në struct që unë jam duke kursyer informacion në, 902 01:16:45,500 --> 01:16:49,650 cila do të jetë current_settings, 903 01:16:49,650 --> 01:16:59,120 dhe argumenti i parë është përshkrues skedar për gjë unë dua të të shpëtuar atributet e. 904 01:16:59,120 --> 01:17:04,360 Çfarë përshkrues file është është si çdo kohë që ju të hapur një skedar, ajo merr një përshkrues skedar. 905 01:17:04,360 --> 01:17:14,560 Kur unë fopen argv [1], ajo merr një përshkrues skedar që ju jeni referenca 906 01:17:14,560 --> 01:17:16,730 sa herë që ju dëshironi të lexoni apo shkruani atë. 907 01:17:16,730 --> 01:17:19,220 Kjo nuk është përshkrues skedar që unë dua të përdorni këtu. 908 01:17:19,220 --> 01:17:21,940 Ka tre Përshkruesit e dokumentit që ju keni si parazgjedhje, 909 01:17:21,940 --> 01:17:24,310 të cilat janë standarde në, jashtë standardeve, dhe gabimi standard. 910 01:17:24,310 --> 01:17:29,960 By default, unë mendoj se është standard në është 0, nga standardi është 1, dhe gabimi standard është 2. 911 01:17:29,960 --> 01:17:33,980 Pra, çfarë unë dua të ndryshojë parametrat e? 912 01:17:33,980 --> 01:17:37,370 Unë dua të ndryshojë parametrat e sa herë që unë goditi një karakter, 913 01:17:37,370 --> 01:17:41,590 Unë dua që ajo të hedhin atë karakterin larg në vend të shtypjes atë në ekran. 914 01:17:41,590 --> 01:17:45,960 Çfarë lumë - standard në, jashtë standardeve, apo gabimeve standarde - 915 01:17:45,960 --> 01:17:52,050 përgjigjet për gjëra kur unë lloji në tastierë? >> [Student] Standard in >> yeah. 916 01:17:52,050 --> 01:17:56,450 Kështu që unë mund ta bëni 0 ose unë mund të bëjë STDIN. 917 01:17:56,450 --> 01:17:59,380 Unë jam duke marrë current_settings e standardit in 918 01:17:59,380 --> 01:18:01,720 >> Tani unë dua të rinovuar këto settings, 919 01:18:01,720 --> 01:18:07,200 Pra, së pari unë do të kopjoni në hacker_settings atë current_settings mi janë. 920 01:18:07,200 --> 01:18:10,430 Dhe si structs puna është se do të vetëm kopje. 921 01:18:10,430 --> 01:18:14,510 Kjo kopje të gjitha fushat, si ju do të presim. 922 01:18:14,510 --> 01:18:17,410 >> Tani unë dua të rinovuar disa prej fushave. 923 01:18:17,410 --> 01:18:21,670 Kërkuar në termios, ju do të keni për të lexuar përmes një shumë të këtij 924 01:18:21,670 --> 01:18:24,110 vetëm për të parë atë që ju do të dëshironi të shikoni për, 925 01:18:24,110 --> 01:18:28,210 por flamujt që ju jeni do të dëshironi të shikoni për janë jehonë, 926 01:18:28,210 --> 01:18:33,110 kështu ECHO karaktere input Echo. 927 01:18:33,110 --> 01:18:37,710 Së pari unë dua të vendosur - I've harruar tashmë se çfarë fusha janë. 928 01:18:45,040 --> 01:18:47,900 Kjo është ajo që duket si struct. 929 01:18:47,900 --> 01:18:51,060 Pra modes input unë mendoj se ne duam të ndryshojmë. 930 01:18:51,060 --> 01:18:54,210 Ne do të shikojmë në zgjidhje të bëni të sigurtë që është ajo që ne duam të ndryshojmë. 931 01:19:04,060 --> 01:19:12,610 Ne duam të ndryshojmë lflag në mënyrë për të parandaluar që kanë nevojë për të kërkuar nëpër të gjitha këto. 932 01:19:12,610 --> 01:19:14,670 Ne duam të ndryshojë modes lokale. 933 01:19:14,670 --> 01:19:17,710 Ju do të keni për të lexuar nëpër këtë gjë për të kuptuar tërë ku çdo gjë i takon 934 01:19:17,710 --> 01:19:19,320 që ne duam të ndryshojmë. 935 01:19:19,320 --> 01:19:24,120 Por është brenda e modes lokale ku ne do të duan që kjo të ndryshojë. 936 01:19:27,080 --> 01:19:33,110 Pra hacker_settings.cc_lmode është ajo që është quajtur. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Kjo është ajo ku ne kemi marrë në operatorët bitwise. 939 01:19:52,280 --> 01:19:54,860 Ne jemi lloj i jashtë kohe, por ne do të kalojnë nëpër të shpejtë të vërtetë. 940 01:19:54,860 --> 01:19:56,600 Kjo është ajo ku ne kemi marrë në bitwise operatorëve, 941 01:19:56,600 --> 01:19:59,950 ku unë mendoj se kam thënë një herë kohë më parë se sa herë që ju filloni që kanë të bëjnë me flamujt, 942 01:19:59,950 --> 01:20:03,370 ju jeni do të jetë duke përdorur operatorit bitwise shumë. 943 01:20:03,370 --> 01:20:08,240 Çdo pak në flamurin korrespondon me një lloj të sjelljes. 944 01:20:08,240 --> 01:20:14,090 Kështu që këtu, ky flamur ka një bandë e gjëra të ndryshme, ku të gjithë prej tyre do të thotë diçka të ndryshme. 945 01:20:14,090 --> 01:20:18,690 Por ajo që unë dua të bëj është vetëm të fikur pak që i korrespondon ECHO. 946 01:20:18,690 --> 01:20:25,440 Mënyrë për ta kthyer atë jashtë të bëj & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 Në fakt, unë mendoj se kjo është si tECHO apo diçka. Unë jam vetëm duke shkuar për të kontrolluar përsëri. 948 01:20:30,110 --> 01:20:34,050 Unë mund termios atë. Është vetëm ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO do të jetë pak e vetme. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO do të thotë të gjitha bit janë të vendosur të 1, që do të thotë të gjithë flamujt janë të vendosur të vërtetë 951 01:20:44,230 --> 01:20:47,140 me përjashtim të pak ECHO. 952 01:20:47,140 --> 01:20:53,830 Duke i dhënë fund flamujt e mia lokale me këtë, kjo do të thotë të gjitha flamujt që janë vendosur aktualisht në vërtetë 953 01:20:53,830 --> 01:20:56,520 do të vazhdojë të jetë e vendosur për të vërtetë. 954 01:20:56,520 --> 01:21:03,240 Nëse flamuri im ECHO është vendosur të vërtetë, atëherë kjo është vendosur domosdoshmërisht të rreme në flamurin ECHO. 955 01:21:03,240 --> 01:21:07,170 Pra, kjo linjë e kodit vetëm fiket flamurin jehonë. 956 01:21:07,170 --> 01:21:16,270 Linjat e tjera të kodit, unë vetëm do të kopjoni ato në interes të kohës dhe pastaj të shpjeguar ato. 957 01:21:27,810 --> 01:21:30,180 Në zgjidhje, tha ai 0. 958 01:21:30,180 --> 01:21:33,880 Kjo është ndoshta më mirë të them në mënyrë eksplicite STDIN. 959 01:21:33,880 --> 01:21:42,100 >> Vini re se unë jam gjithashtu duke bërë jehonë | ICANON këtu. 960 01:21:42,100 --> 01:21:46,650 ICANON referohet diçka të veçantë, që do të thotë regjim kanonike. 961 01:21:46,650 --> 01:21:50,280 Çfarë do të thotë kanonike mode është zakonisht kur ju jeni shtypur nga command line, 962 01:21:50,280 --> 01:21:54,670 standarde në proces nuk asgjë, derisa ju goditi newline. 963 01:21:54,670 --> 01:21:58,230 Kështu që kur ju bëni getString, ju shtypni një bandë e gjëra, atëherë ju goditi newline. 964 01:21:58,230 --> 01:22:00,590 Kjo është kur ajo është dërguar për standardin in 965 01:22:00,590 --> 01:22:02,680 Kjo është paracaktuar. 966 01:22:02,680 --> 01:22:05,830 Kur unë të fikur mënyrë kanonike, tani çdo karakter të vetme që ju shtypni 967 01:22:05,830 --> 01:22:10,910 është ajo merr përpunohet, e cila zakonisht është lloj i keq, sepse kjo është e ngadaltë të procesit këto gjëra, 968 01:22:10,910 --> 01:22:14,330 cila është arsyeja pse ajo është e mirë për të tampon atë në linja të tëra. 969 01:22:14,330 --> 01:22:16,810 Por unë dua çdo karakter të jenë të përpunuara 970 01:22:16,810 --> 01:22:18,810 pasi që unë nuk dua që ajo të prisni për mua për të goditur newline 971 01:22:18,810 --> 01:22:21,280 para se ajo përpunon të gjitha karakteret unë kam qenë shtypur. 972 01:22:21,280 --> 01:22:24,760 Kjo fiket mënyrë kanonike. 973 01:22:24,760 --> 01:22:31,320 Kjo stuff thjesht do të thotë kur ai në fakt përpunon karaktere. 974 01:22:31,320 --> 01:22:35,830 Kjo do të thotë procesin e tyre menjëherë, sa më shpejt që unë jam shtypja e tyre, procesin e tyre. 975 01:22:35,830 --> 01:22:42,510 Dhe ky është funksion i cili është përditësimin vetitë e mia për standarde në, 976 01:22:42,510 --> 01:22:45,480 dhe mjetet TCSA bëjë atë të drejtë tani. 977 01:22:45,480 --> 01:22:50,310 Opsionet e tjera janë të prisni derisa çdo gjë që është aktualisht në lumë është i përpunuar. 978 01:22:50,310 --> 01:22:52,030 Kjo nuk ka rëndësi. 979 01:22:52,030 --> 01:22:56,920 Vetëm tani ndryshoj vetitë e mia që të jetë çdo gjë që është aktualisht në hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 I guess I quajtur atë hacker_settings, kështu që le të ndryshojë këtë. 981 01:23:09,610 --> 01:23:13,500 Ndryshojë çdo gjë në hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Tani në fund të programit tonë ne do të duan të rikthehen 983 01:23:16,870 --> 01:23:20,210 me atë që është aktualisht në brendësi të normal_settings, 984 01:23:20,210 --> 01:23:26,560 e cila është vetëm do të duken si dhe normal_settings. 985 01:23:26,560 --> 01:23:30,650 Njoftim Unë nuk kam ndryshuar asnjë nga normal_settings mi që fillimisht të marrë atë. 986 01:23:30,650 --> 01:23:34,520 Pastaj të vetëm të ndryshojë ato përsëri, unë të kalojë ato përsëri në fund. 987 01:23:34,520 --> 01:23:38,390 Kjo ishte update. Rregull. 988 01:23:38,390 --> 01:23:43,900 >> Tani brenda këtu unë vetëm do të shpjegojë kodin në interes të kohës. 989 01:23:43,900 --> 01:23:46,350 Kjo nuk është se kodi shumë. 990 01:23:50,770 --> 01:24:03,750 Ne e shohim ne lexojmë një karakter nga file. Ne e thirrëm atë f. 991 01:24:03,750 --> 01:24:07,850 Tani ju mund fgetc njeri, por si fgetc do të punojë 992 01:24:07,850 --> 01:24:11,910 është vetëm ajo do të kthehet në karakter që ju vetëm lexuar ose EOF, 993 01:24:11,910 --> 01:24:15,680 që korrespondon në fund të skedarit apo ndonjë gabim ndodh. 994 01:24:15,680 --> 01:24:19,900 Ne jemi looping, duke vazhduar për të lexuar një karakter të vetme nga dosja, 995 01:24:19,900 --> 01:24:22,420 deri sa ne kemi drejtuar nga personazhet për të lexuar. 996 01:24:22,420 --> 01:24:26,650 Dhe, ndërsa ne jemi duke bërë këtë, ne presim për një karakter të vetëm nga standardi in 997 01:24:26,650 --> 01:24:29,090 Çdo herë që ju shkruani diçka e vetme në command line, 998 01:24:29,090 --> 01:24:32,820 që është lexuar në një karakter nga standardi in 999 01:24:32,820 --> 01:24:38,330 Pastaj putchar është vetëm do të vënë char kemi lexuar deri këtu nga file të jashtë standardeve. 1000 01:24:38,330 --> 01:24:42,890 Ju mund putchar njeri, por kjo është vetëm për të vënë standarde nga, ajo shtypje atë karakter. 1001 01:24:42,890 --> 01:24:51,600 Ju gjithashtu mund të bëjë vetëm printf ("% c", c); njëjtën ide. 1002 01:24:53,330 --> 01:24:56,670 Kjo do të bëjë pjesa më e madhe e punës sonë. 1003 01:24:56,670 --> 01:25:00,300 >> Gjëja e fundit që ne do të dëshironi të bëni është vetëm Shkrimi dosjen tonë. 1004 01:25:00,300 --> 01:25:03,310 Nëse ju nuk Shkrimi, që është një rrjedhje kujtim. 1005 01:25:03,310 --> 01:25:06,680 Ne duam të Shkrimi file ne fillim u hap, dhe unë mendoj se kjo është ajo. 1006 01:25:06,680 --> 01:25:13,810 Nëse bëjmë këtë, unë tashmë kam probleme. 1007 01:25:13,810 --> 01:25:17,260 Le të shohim. 1008 01:25:17,260 --> 01:25:19,960 Çfarë e bëri atë të ankoheni? 1009 01:25:19,960 --> 01:25:30,220 Pritej 'int', por argumenti është i tipit 'struct _IO_FILE *'. 1010 01:25:36,850 --> 01:25:39,370 Ne do të shohim nëse që punon. 1011 01:25:45,210 --> 01:25:53,540 Lejohet vetëm në C99. Augh. Mirë, të bëjë hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Tani kemi përshkrime shumë të dobishme. 1013 01:25:57,760 --> 01:25:59,900 Pra, përdorimi i padeklaruar identifikues 'normal_settings'. 1014 01:25:59,900 --> 01:26:04,170 Unë nuk e quaj atë normal_settings. Unë e quajti atë current_settings. 1015 01:26:04,170 --> 01:26:12,090 Pra, le të ndryshojë të gjithë se. 1016 01:26:17,920 --> 01:26:21,710 Tani kalon argument. 1017 01:26:26,290 --> 01:26:29,500 Unë do të bëjë këtë tani për tani 0. 1018 01:26:29,500 --> 01:26:36,720 Rregull. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Unë gjithashtu nuk e qartë në ekran në fillim. 1020 01:26:39,590 --> 01:26:42,960 Por ju mund të shikoni përsëri në setin e fundit të problemit për të parë se si ju të qartë në ekran. 1021 01:26:42,960 --> 01:26:45,160 Është vetëm shtypjen e disa karaktere 1022 01:26:45,160 --> 01:26:47,210 ndërsa kjo është duke bërë atë që unë dua të bëj. 1023 01:26:47,210 --> 01:26:48,900 Rregull. 1024 01:26:48,900 --> 01:26:55,280 Dhe duke menduar se pse kjo duhet të jetë në vend të 0 STDIN, 1025 01:26:55,280 --> 01:27:00,560 të cilat duhet të përcaktojnë # 0, 1026 01:27:00,560 --> 01:27:03,890 kjo është ankuar se - 1027 01:27:13,150 --> 01:27:19,360 Para se kur kam thënë se nuk ka Përshkruesit fotografi, por pastaj ju gjithashtu keni tuaj * File, 1028 01:27:19,360 --> 01:27:23,210 një përshkrues fotografi është vetëm një numër i plotë vetme, 1029 01:27:23,210 --> 01:27:26,970 ndërsa një * FILE ka një bandë e tërë e gjëra që lidhen me të. 1030 01:27:26,970 --> 01:27:30,380 Arsyeja që ne duhet të them në vend të 0 STDIN 1031 01:27:30,380 --> 01:27:37,480 është se është një STDIN * Foto e cila tregon gjë që është referenca përshkrues skedar 0. 1032 01:27:37,480 --> 01:27:45,070 Pra, edhe deri këtu, kur unë bëj fopen (argv [1], unë jam duke marrë një * File prapa. 1033 01:27:45,070 --> 01:27:51,180 Por diku në atë * skedë është një gjë që korrespondon me descriptor skedar për atë dosje. 1034 01:27:51,180 --> 01:27:57,430 Nëse ju shikoni në faqen e njeriut për të hapur, kështu që unë mendoj se ju do të keni për të bërë man 3 e hapur - Jo - 1035 01:27:57,430 --> 01:27:59,380 njeri 2 i hapur - yeah. 1036 01:27:59,380 --> 01:28:06,250 Nëse ju shikoni në faqen e hapur, e hapur është si një fopen të ulët të nivelit, 1037 01:28:06,250 --> 01:28:09,350 dhe është kthyer përshkrues aktuale file. 1038 01:28:09,350 --> 01:28:12,050 fopen bën një bandë e stuff në krye të hapur, 1039 01:28:12,050 --> 01:28:17,640 e cila në vend që të kthehej vetëm se përshkrues skedar kthehet një skedar * treguesin e tërë 1040 01:28:17,640 --> 01:28:20,590 brenda së cilës është përshkrues pak jonë file. 1041 01:28:20,590 --> 01:28:25,020 Pra standarde në referohet gjë FILE *, 1042 01:28:25,020 --> 01:28:29,120 ndërsa 0 vetëm referohet standardeve të descriptor file në vetvete. 1043 01:28:29,120 --> 01:28:32,160 >> Pyetje? 1044 01:28:32,160 --> 01:28:35,930 [Qesh] shpërtheu nëpër atë. 1045 01:28:35,930 --> 01:28:39,140 Dakord. Ne jemi duke bërë. [Qesh] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]