1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Adran 5 - Mwy cyfforddus] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Harvard University] 3 00:00:04,690 --> 00:00:07,250 [Mae hyn yn CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Fel y dywedais yn fy e-bost, mae llawer o bethau y gallwch eu defnyddio 5 00:00:14,250 --> 00:00:17,060 heblaw am yr offer i mewn gwirionedd wneud y setiau broblem. 6 00:00:17,060 --> 00:00:19,910 Rydym yn argymell eich bod yn ei wneud yn y peiriant dim ond oherwydd wedyn gallwn yn haws yn eich helpu i 7 00:00:19,910 --> 00:00:22,070 ac rydym yn gwybod sut mae popeth yn mynd i weithio. 8 00:00:22,070 --> 00:00:26,950 Ond fel un enghraifft o ble y gallwch wneud pethau os, er enghraifft, nad oes gennych fynediad 9 00:00:26,950 --> 00:00:31,570 i ddyfais neu os ydych eisiau gweithio yn y Ganolfan Gwyddoniaeth islawr - 10 00:00:31,570 --> 00:00:33,090 sydd mewn gwirionedd mae ganddynt yr offer hefyd - 11 00:00:33,090 --> 00:00:35,150 os ydych chi am weithio yn unrhyw le. 12 00:00:35,150 --> 00:00:42,370 Un enghraifft yw a ydych wedi gweld / clywed am SSH? 13 00:00:44,380 --> 00:00:47,780 SSH yn y bôn yn union fel cysylltu â rhywbeth. 14 00:00:47,780 --> 00:00:51,340 Mewn gwirionedd, ar hyn o bryd rwy'n SSHed i mewn i'r ddyfais. 15 00:00:51,340 --> 00:00:54,290 Dwi byth yn gweithio'n uniongyrchol yn y peiriant. 16 00:00:55,930 --> 00:01:01,060 Yma yn y peiriant, ac os ydych yn edrych i lawr yma byddwch yn gweld yr gyfeiriad IP. 17 00:01:01,060 --> 00:01:03,650 Dwi byth yn gweithio yn y peiriant ei hun; 18 00:01:03,650 --> 00:01:08,840 Rwyf bob amser yn dod drosodd i iTerm2 ffenestr / terminal ffenestr. 19 00:01:08,840 --> 00:01:15,910 Gallwch SSH i'r cyfeiriad hwnnw IP, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Rwy'n cofio bod nifer yn hawdd iawn oherwydd ei fod yn gymaint o batrwm 'n glws. 21 00:01:20,390 --> 00:01:24,920 Ond a fydd yn gofyn i mi am fy nghyfrinair, ac erbyn hyn rwy'n yn y peiriant. 22 00:01:24,920 --> 00:01:33,060 Yn y bôn, ar y pwynt hwn, os byddwch yn agor terfynell tu mewn i'r peiriant ei hun, 23 00:01:33,060 --> 00:01:36,350 rhyngwyneb hwn, fodd bynnag, y byddech yn ei ddefnyddio, yn union yr un fath 24 00:01:36,350 --> 00:01:40,010 fel y rhyngwyneb rwy'n ei ddefnyddio dros yma, ond nawr dych chi'n SSHed. 25 00:01:42,240 --> 00:01:44,920 Nid oes rhaid i chi SSH i'r ddyfais. 26 00:01:44,920 --> 00:01:52,360 Un enghraifft o ryw le arall y gallech SSH i yw fy mod i'n eithaf siŵr fod gennych yn ddiofyn - 27 00:01:52,360 --> 00:01:55,020 Oh. Mwy. 28 00:01:55,020 --> 00:02:01,130 Dylai pob un ohonoch gael gan gyfrifon FAS ddiofyn ar y gweinyddion FAS. 29 00:02:01,130 --> 00:02:06,840 I mi, byddwn SSH i rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Mae'n mynd i ofyn i chi fod y tro cyntaf, ac rydych yn dweud ie. 31 00:02:11,610 --> 00:02:15,840 Mae fy nghyfrinair yn unig yn mynd i fod yn fy nghyfrinair FAS. 32 00:02:15,840 --> 00:02:22,650 Ac felly yn awr, rwy'n SSHed i'r gweinyddwyr 'n glws, a gallaf wneud unrhyw beth yr wyf eisiau ar yma. 33 00:02:22,650 --> 00:02:28,560 Mae llawer o ddosbarthiadau gallech eu cymryd, fel 124, yn mynd i gael i chi lwytho pethau i yma 34 00:02:28,560 --> 00:02:30,950 mewn gwirionedd gyflwyno eich setiau problem. 35 00:02:30,950 --> 00:02:34,100 Ond yn dweud nad oes gennych fynediad at eich offer. 36 00:02:34,100 --> 00:02:37,910 Yna, gallwch wneud pethau, fel ar fan hyn, bydd yn dweud - 37 00:02:37,910 --> 00:02:42,160 Mae hyn yn unig yw ein hadran o gwestiynau. 38 00:02:42,160 --> 00:02:45,070 Bydd yn gofyn i chi wneud hyn yn y peiriant. 39 00:02:45,070 --> 00:02:47,790 Yn hytrach, 'n annhymerus' jyst yn gwneud hynny ar y gweinydd. 40 00:02:47,790 --> 00:02:50,560 Rydw i'n mynd i unzip hynny. 41 00:02:50,560 --> 00:02:55,670 Mae'r broblem yn mynd i fod yn eich bod yn gyfarwydd â defnyddio rhywbeth fel gedit 42 00:02:55,670 --> 00:02:58,160 neu beth bynnag tu mewn i'r offer. 43 00:02:58,160 --> 00:03:01,830 Nid ydych yn mynd i gael hynny ar y gweinydd FAS. 44 00:03:01,830 --> 00:03:04,110 Mae i gyd yn unig yn mynd i fod y rhyngwyneb testunol. 45 00:03:04,110 --> 00:03:09,180 Felly, gallech naill ai un, ceisiwch ddysgu golygydd testun y maent yn cael. 46 00:03:09,180 --> 00:03:12,130 Mae ganddynt Nano. 47 00:03:12,130 --> 00:03:14,990 Nano fel arfer yn eithaf hawdd i'w defnyddio. 48 00:03:14,990 --> 00:03:19,470 Gallwch ddefnyddio eich saethau a deipio fel arfer. 49 00:03:19,470 --> 00:03:21,250 Felly nid yw hynny'n anodd. 50 00:03:21,250 --> 00:03:24,720 Os ydych am ca 'n sylweddol ffansi y gallwch eu defnyddio Emacs, 51 00:03:24,720 --> 00:03:29,850 yr wyf yn debyg na ddylai wedi agor oherwydd nid wyf yn hyd yn oed yn gwybod sut i gau Emacs. 52 00:03:29,850 --> 00:03:32,760 Rheoli X, Rheoli C? Yeah. 53 00:03:32,760 --> 00:03:35,310 Neu gallwch ddefnyddio Vim, sef yr hyn yr wyf yn ei ddefnyddio. 54 00:03:35,310 --> 00:03:37,800 Ac felly dyna yw eich opsiynau. 55 00:03:37,800 --> 00:03:43,830 Os nad ydych am wneud hynny, gallwch hefyd, os edrychwch ar manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Ar PC, gallwch ddefnyddio SSH pwti, 58 00:03:49,920 --> 00:03:51,940 yr ydych yn mynd i gael i lawrlwytho ar wahân. 59 00:03:51,940 --> 00:03:55,460 Ar Mac, gallwch dim ond drwy ddefnyddio Terminal ddiofyn neu gallwch lawrlwytho iTerm2, 60 00:03:55,460 --> 00:03:58,490 sydd fel a 'n glws, Terminal ffansi. 61 00:03:58,490 --> 00:04:03,780 Os byddwch yn mynd i manual.cs50.net byddwch yn gweld dolen i Notepad + +, 62 00:04:03,780 --> 00:04:07,120 sef yr hyn y gallwch ei ddefnyddio ar gyfrifiadur personol. 63 00:04:07,120 --> 00:04:13,340 Mae'n gadael i chi SFTP o Notepad + +, sydd yn y bôn SSH. 64 00:04:13,340 --> 00:04:17,750 Beth fydd hyn yn gadael i chi ei wneud yw olygu eich ffeiliau yn lleol, 65 00:04:17,750 --> 00:04:20,670 ac yna pryd bynnag yr ydych am arbed iddynt, bydd yn arbed i nice.fas, 66 00:04:20,670 --> 00:04:23,670 lle gallwch wedyn eu rhedeg. 67 00:04:23,670 --> 00:04:26,880 Ac yr hyn sy'n cyfateb ar Mac yn mynd i fod TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Felly mae'n gadael i chi wneud yr un peth. 69 00:04:28,760 --> 00:04:32,800 Mae'n gadael i chi golygu ffeiliau yn lleol ac yn eu cadw i nice.fas, 70 00:04:32,800 --> 00:04:35,730 lle gallwch wedyn eu rhedeg. 71 00:04:35,730 --> 00:04:40,400 Felly, os ydych yn sownd erioed heb offer, mae gennych yr opsiynau hyn 72 00:04:40,400 --> 00:04:44,230 dal i wneud eich setiau problem. 73 00:04:44,230 --> 00:04:48,250 Mae'r un broblem yn mynd i fod nad ydych chi'n mynd i gael y llyfrgell CS50 74 00:04:48,250 --> 00:04:51,580 oherwydd nad oes nice.fas yn ddiofyn wedi hynny. 75 00:04:51,580 --> 00:04:55,970 Gallwch naill ai lawrlwytho'r llyfrgell CS50 - 76 00:04:55,970 --> 00:04:58,470 Nid wyf yn credu fy mod angen bod ar y pwynt hwn. 77 00:04:58,470 --> 00:05:03,270 Gallwch naill ai lawrlwytho'r llyfrgell CS50 ac anfon copi ohono drosodd i nice.fas, 78 00:05:03,270 --> 00:05:07,450 neu wyf yn meddwl ar hyn o bryd nid ydym yn ei ddefnyddio anymore beth bynnag. 79 00:05:07,450 --> 00:05:12,720 Neu, os ydym yn ei wneud, gallwch chi am y tro yn ei le 80 00:05:12,720 --> 00:05:18,480 y gweithrediadau o'r swyddogaethau yn y llyfrgell CS50 beth bynnag. 81 00:05:18,480 --> 00:05:21,370 Felly, ni ddylai hynny fod gymaint o gyfyngiad. 82 00:05:21,370 --> 00:05:23,710 A dyna hynny. 83 00:05:26,460 --> 00:05:29,820 >> 'N annhymerus' mynd yn ôl i'r peiriant hyn o bryd; byddwn yn gwneud popeth yn y peiriant. 84 00:05:29,820 --> 00:05:37,510 Edrych ar ein hadran o gwestiynau, ar y dechrau, fel y dywedais yn fy e-bost, 85 00:05:37,510 --> 00:05:43,620 mae'n rhaid i ni siarad am yr un byr oeddech yn fod i wylio. 86 00:05:43,620 --> 00:05:51,980 Mae gennym y ailgyfeirio & Pipes ac mae'r rhain tri chwestiwn. 87 00:05:51,980 --> 00:05:56,070 >> I ba ffrwd yn swyddogaethau fel printf ysgrifennu yn ddiofyn? 88 00:05:56,070 --> 00:05:59,130 Felly ffrwd. Beth yw ffrwd? 89 00:06:06,520 --> 00:06:15,100 Mae nant yn y bôn fel ei fod dim ond rhai - 90 00:06:15,100 --> 00:06:21,450 Nid yw'n hyd yn oed yn ffynhonnell o 1s a 0au. 91 00:06:21,450 --> 00:06:24,920 Mae'r nant mae'n gofyn amdano yma yw allan safonol. 92 00:06:24,920 --> 00:06:27,250 Ac felly safonol yn ffrwd pan fyddwch yn ysgrifennu ato, 93 00:06:27,250 --> 00:06:30,940 mae'n ymddangos ar y sgrin. 94 00:06:30,940 --> 00:06:36,860 Allan Safonol, gan nant, mae'n golygu eich bod dim ond ysgrifennu 1s 0s ac iddo, 95 00:06:36,860 --> 00:06:40,220 a'r pen arall y tu allan safonol yn unig yn darllen o'r nant. 96 00:06:40,220 --> 00:06:43,540 Mae'n dim ond cyfres o 1s a 0au. 97 00:06:43,540 --> 00:06:45,570 Gallwch ysgrifennu at nentydd neu gallwch ddarllen o ffrydiau 98 00:06:45,570 --> 00:06:47,950 yn dibynnu ar yr hyn y nant mewn gwirionedd. 99 00:06:47,950 --> 00:06:52,800 Mae'r ffrydiau diofyn ddau arall yn safonol mewn ac gwall safonol. 100 00:06:52,800 --> 00:06:57,540 Safonol mewn pryd bynnag y byddwch yn yn GetString, mae'n aros i chi i bethau mewnbwn. 101 00:06:57,540 --> 00:07:01,570 Felly, mae'n aros i chi, mae'n mewn gwirionedd yn aros ar safon mewn, 102 00:07:01,570 --> 00:07:04,880 sydd mewn gwirionedd yr hyn a gewch pan fyddwch yn teipio ar y bysellfwrdd. 103 00:07:04,880 --> 00:07:07,530 Rydych yn teipio i mewn i safon mewn 104 00:07:07,530 --> 00:07:10,050 Gwall safonol yn y bôn cyfateb i allan safonol, 105 00:07:10,050 --> 00:07:13,280 ond mae'n arbenigo mewn bod pan fyddwch yn argraffu i gwall safonol, 106 00:07:13,280 --> 00:07:16,770 rydych yn fod i pheidiwch ag argraffu negeseuon gwall i'r 107 00:07:16,770 --> 00:07:20,200 fel y gallwch wahaniaethu rhwng negeseuon rheolaidd printiedig i'r sgrin 108 00:07:20,200 --> 00:07:24,560 yn erbyn negeseuon gwall yn dibynnu ar p'un a ydynt yn mynd i allan safonol neu wall safonol. 109 00:07:24,560 --> 00:07:28,660 Ffeiliau hefyd. 110 00:07:28,660 --> 00:07:32,440 Allan Safonol, safon mewn, a gwall safonol yn unig ffrydiau arbennig, 111 00:07:32,440 --> 00:07:36,810 ond mewn gwirionedd unrhyw ffeil, pan fyddwch yn agor ffeil, mae'n dod yn ffrwd o bytes 112 00:07:36,810 --> 00:07:40,740 lle gallwch newydd ei ddarllen o'r nant. 113 00:07:40,740 --> 00:07:47,770 Rydych chi, ar gyfer y rhan fwyaf yn gallu, dim ond meddwl am ffeil fel ffrwd o bytes. 114 00:07:47,770 --> 00:07:51,190 Felly, pa ffrydiau maent yn ysgrifennu at ddiofyn? Allan Safonol. 115 00:07:51,190 --> 00:07:56,980 >> Beth yw'r gwahaniaeth rhwng> ac >>? 116 00:07:58,140 --> 00:08:03,710 A oedd unrhyw un wylio'r fideo ymlaen llaw? Iawn. 117 00:08:03,710 --> 00:08:10,960 > Yn mynd i fod sut yr ydych yn ailgyfeirio i mewn i ffeil, 118 00:08:10,960 --> 00:08:15,240 a >> hefyd yn mynd i ailgyfeirio allbwn i mewn i ffeil, 119 00:08:15,240 --> 00:08:17,820 ond mae yn hytrach yn mynd i atodi i'r ffeil. 120 00:08:17,820 --> 00:08:23,430 Er enghraifft, gadewch i ni ddweud fy mod yn digwydd i gael ngeiriadur i'r dde yma, 121 00:08:23,430 --> 00:08:27,020 a'r pethau yn unig y tu mewn o ngeiriadur yn gath, cath, ci, pysgod, ci. 122 00:08:27,020 --> 00:08:31,530 Un gorchymyn bod gennych ar y llinell orchymyn yn gath, 123 00:08:31,530 --> 00:08:34,539 sydd yn unig yn mynd i argraffu beth sydd mewn ffeil. 124 00:08:34,539 --> 00:08:40,679 Felly, pan fyddaf yn dweud ngeiriadur cath, mae'n mynd i argraffu cath, cath, ci, pysgod, ci. Dyna'r cyfan gath ei wneud. 125 00:08:40,679 --> 00:08:46,280 Mae hynny'n golygu ei bod yn argraffu i safon allan gath cath,, ci, pysgod, ci. 126 00:08:46,280 --> 00:08:53,240 Os ydw i yn lle hynny am ailgyfeirio hynny i ffeil, gallaf ddefnyddio> a'i ailgyfeirio i beth bynnag y ffeil yn. 127 00:08:53,240 --> 00:08:56,460 'N annhymerus' galw y ffeil ffeil. 128 00:08:56,460 --> 00:09:00,320 Felly, yn awr, os wyf ls, 'n annhymerus' gweld gen i ffeil newydd o'r enw ffeil. 129 00:09:00,320 --> 00:09:05,700 Ac os byddaf yn agor i fyny, mae'n mynd i gael union beth gath ei roi ar y llinell orchymyn. 130 00:09:05,700 --> 00:09:11,040 Felly, yn awr os wyf yn gwneud hynny eto, yna mae'n mynd i ailgyfeirio'r allbwn i mewn i ffeil, 131 00:09:11,040 --> 00:09:13,930 ac rwy'n mynd i gael yr union beth yr un. 132 00:09:13,930 --> 00:09:17,910 Felly, yn dechnegol, yn gyfan gwbl overrode yr hyn a oedd gennym. 133 00:09:17,910 --> 00:09:22,970 A byddwn yn gweld os byddaf yn newid ngeiriadur, yr wyf yn cymryd allan ci. 134 00:09:22,970 --> 00:09:29,980 Nawr, os ydym yn gath ngeiriadur i mewn i ffeil eto, rydym yn mynd i gael y fersiwn newydd gyda ci symud. 135 00:09:29,980 --> 00:09:32,400 Felly, mae'n gwbl drech arno. 136 00:09:32,400 --> 00:09:36,640 Yn lle hynny, os ydym yn defnyddio >>, mae'n mynd i atodi ffeil. 137 00:09:36,640 --> 00:09:40,860 Yn awr, yn agor ffeil, gwelwn ydym newydd yr un peth ddwywaith argraffu 138 00:09:40,860 --> 00:09:44,920 oherwydd ei fod yno unwaith, yna rydym yn atodiad i'r gwreiddiol. 139 00:09:44,920 --> 00:09:48,130 Felly, dyna beth> a >> yn ei wneud. 140 00:09:48,130 --> 00:09:50,580 A yw'r un nesaf gofyn - Nid yw'n gofyn am y peth. 141 00:09:50,580 --> 00:09:59,050 >> Mae un arall sydd gennym yw <, ac os> ailgyfeiriadau allan safonol, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Gadewch i ni weld os oes gennym enghraifft. 144 00:10:14,750 --> 00:10:16,930 Gallaf ysgrifennu un cyflym go iawn. 145 00:10:17,870 --> 00:10:25,700 Gadewch i ni gymryd unrhyw ffeil, hello.c. 146 00:10:56,060 --> 00:10:59,070 Ffeil gymharol syml. 147 00:10:59,070 --> 00:11:03,570 Im 'jyst yn cael llinyn ac yna argraffu "Helo" beth bynnag y llinyn Fi jyst mynd yn. 148 00:11:03,570 --> 00:11:07,990 Felly gwnewch yn helo, ac yna. / Helo. 149 00:11:07,990 --> 00:11:10,720 Nawr mae'n annog i mi i fynd i mewn rhywbeth, 150 00:11:10,720 --> 00:11:15,070 sy'n golygu ei fod yn aros ar bethau i gael ei wneud mewn safon 151 00:11:15,070 --> 00:11:20,450 Felly, rhoi beth bynnag rwyf am i safon ynddo Rydym yn jyst yn mynd i ddweud Helo, Rob! 152 00:11:20,450 --> 00:11:23,310 Yna, mae'n argraffu i safon allan Helo, Rob! 153 00:11:23,310 --> 00:11:28,860 Os byddaf yn ei wneud. / Helo, ac yna ailgyfeirio, 154 00:11:30,740 --> 00:11:34,310 ar hyn o bryd gallwch ailgyfeirio o ffeil. 155 00:11:34,310 --> 00:11:41,720 Felly, os ydw i'n rhoi mewn rhai ffeil, txt, ac yr wyf yn rhoi Rob, 156 00:11:41,720 --> 00:11:52,300 os byddaf yn rhedeg helo, ac yna ailgyfeirio'r txt ffeil i mewn. / helo, mae'n mynd i ddweud Helo, Rob! ar unwaith. 157 00:11:52,300 --> 00:11:57,160 Pan yn gyntaf yn cyrraedd GetString ac mae'n aros ar safon mewn, 158 00:11:57,160 --> 00:12:01,730 safonol yw mwyach yn aros ar y bysellfwrdd ar gyfer data i gael ei gofnodi. 159 00:12:01,730 --> 00:12:05,980 Yn lle hynny, rydym wedi ailgyfeirio safonol i ddarllen o'r txt ffeil. 160 00:12:05,980 --> 00:12:10,290 Ac felly mae'n mynd i ddarllen o'r txt ffeil, sydd ychydig y Rob llinell, 161 00:12:10,290 --> 00:12:13,380 ac yna mae'n mynd i argraffu Helo, Rob! 162 00:12:13,380 --> 00:12:18,180 Ac os oeddwn i eisiau, gallwn hefyd wneud. / Helo 00:12:21,500 ac yna y safon y ffaith ei argraffu, sef Hello, Rob!, 164 00:12:21,500 --> 00:12:24,700 Gallaf ailgyfeirio bod yn ei ffeil ei hun. 165 00:12:24,700 --> 00:12:29,790 'N annhymerus' jyst ffoniwch y ffeil hello - na, ni wnaf, oherwydd dyna y gweithredadwy - txt2. 166 00:12:29,790 --> 00:12:40,150 Yn awr, txt2 yn mynd i gael yr allbwn. / Helo 00:12:43,520 >> Cwestiynau? 168 00:12:45,900 --> 00:12:49,090 >> Iawn. Felly, yna yma mae gennym biblinell. 169 00:12:49,090 --> 00:12:53,510 Pipes yn yr uned olaf ailgyfeiriad. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Amcana un uned mwy o ailgyfeirio yw os yn hytrach na> ydych yn ei wneud 2>, 171 00:12:58,750 --> 00:13:01,070 sydd wedi ailgyfeirio gwall safonol. 172 00:13:01,070 --> 00:13:06,280 Felly os oes rhywbeth yn mynd i wall safonol, ni fyddai'n cael ei roi i mewn i txt2. 173 00:13:06,280 --> 00:13:12,480 Ond rhybudd os wyf yn gwneud 2>, yna mae'n dal i argraffu Helo, Rob! i 'r archa bannod 174 00:13:12,480 --> 00:13:18,600 gan fy mod yn unig ailgyfeirio gwall safonol, dydw i ddim yn ailgyfeirio safon allan. 175 00:13:18,600 --> 00:13:22,210 Gwall safonol ac allan safonol yn wahanol. 176 00:13:24,210 --> 00:13:27,080 Os ydych eisiau mewn gwirionedd yn ysgrifennu at gwall safonol, 177 00:13:27,080 --> 00:13:35,080 yna gallwn newid hyn i fod yn fprintf i stderr. 178 00:13:35,080 --> 00:13:37,850 Felly printf, yn ddiofyn, printiau i allan safonol. 179 00:13:37,850 --> 00:13:41,720 Os ydw i eisiau argraffu i gwall safonol â llaw, yna rhaid i mi ddefnyddio fprintf 180 00:13:41,720 --> 00:13:45,010 ac yn pennu'r hyn yr wyf am i argraffu iddo. 181 00:13:45,010 --> 00:13:49,720 Os yn lle hynny wnes i stdout fprintf, yna mae hynny'n bôn cyfateb i printf. 182 00:13:49,720 --> 00:13:55,530 Ond fprintf i wall safonol. 183 00:13:57,790 --> 00:14:03,650 Felly yn awr, os wyf yn ailgyfeirio hyn i txt2, Helo, Rob! yn dal i gael ei argraffu ar y llinell orchymyn 184 00:14:03,650 --> 00:14:08,270 gan ei fod yn cael ei argraffu i'r gwall safonol ac rwy'n dim ond ailgyfeirio safon allan. 185 00:14:08,270 --> 00:14:16,420 Os wyf yn awr yn ailgyfeirio gwall safonol, yn awr nid oedd yn cael eu hargraffu, a txt2 yn mynd i fod Helo, Rob! 186 00:14:16,420 --> 00:14:21,910 Felly nawr, gallwch argraffu eich camgymeriadau gwirioneddol gwall safonol 187 00:14:21,910 --> 00:14:24,720 ac argraffu eich negeseuon rheolaidd i allan safonol. 188 00:14:24,720 --> 00:14:31,420 Ac felly pan fyddwch yn rhedeg eich rhaglen, gallwch redeg fel. / Hello math hwn gyda'r 2> 189 00:14:31,420 --> 00:14:33,800 fel bod eich rhaglen yn mynd i redeg fel arfer, 190 00:14:33,800 --> 00:14:38,400 ond gall unrhyw negeseuon gwall eich bod yn cael eich bod yn gwirio yn ddiweddarach yn eich cofnod camgymeriadau, 191 00:14:38,400 --> 00:14:44,500 cynifer o gamgymeriadau, ac yna edrych yn ddiweddarach a bydd eich camgymeriadau ffeil yn unrhyw wallau sydd wedi digwydd. 192 00:14:45,200 --> 00:14:47,540 >> Cwestiynau? 193 00:14:47,540 --> 00:14:58,070 >> Mae'r un olaf yn bibell, y gallwch feddwl â chymryd y safon allan o un gorchymyn 194 00:14:58,070 --> 00:15:01,210 a'i gwneud yn y safon yn y gorchymyn nesaf. 195 00:15:01,210 --> 00:15:05,570 Mae enghraifft yma yn cael ei adleisio yn gorchymyn beth llinell 196 00:15:05,570 --> 00:15:11,840 bod yn unig yn mynd i adleisio beth bynnag yr wyf yn rhoi yn ei ddadl. Ni fyddaf yn rhoi dyfyniadau. 197 00:15:11,840 --> 00:15:16,150 Echo blah, blah, blah yn unig yn mynd i argraffu blah, blah, blah. 198 00:15:16,150 --> 00:15:20,600 Cyn, pan ddywedais fy mod wedi i roi Rob i ffeil txt 199 00:15:20,600 --> 00:15:28,830 oherwydd ni allaf ond ailgyfeirio ffeiliau txt, yn hytrach, / os ategaf Rob 200 00:15:28,830 --> 00:15:35,520 ac yna i mewn i bibell. / helo, a fydd hefyd yn gwneud yr un math o beth. 201 00:15:35,520 --> 00:15:39,160 Mae hyn yn cymryd y cynnyrch hwn yn gorchymyn, adlais Rob, 202 00:15:39,160 --> 00:15:43,610 a'i defnyddio fel mewnbwn ar gyfer. / helo. 203 00:15:44,790 --> 00:15:49,560 Gallwch feddwl am y peth fel gyntaf ailgyfeirio adlais Rob i mewn i ffeil 204 00:15:49,560 --> 00:15:54,160 ac yna mewnbwn i. / helo y ffeil a outputted yn unig. 205 00:15:54,160 --> 00:15:57,850 Ond mae'n cymryd y ffeil dros dro allan o'r llun. 206 00:16:01,890 --> 00:16:04,460 >> Cwestiynau ar hynny? 207 00:16:04,460 --> 00:16:07,150 >> Mae'r cwestiwn nesaf yn mynd i gynnwys hyn. 208 00:16:07,150 --> 00:16:15,310 Beth allech biblinell ei ddefnyddio i ddod o hyd i'r nifer o enwau unigryw mewn ffeil o'r enw names.txt? 209 00:16:15,310 --> 00:16:24,160 Mae'r gorchmynion rydym yn mynd i eisiau i ddefnyddio yma yn unigryw, felly uniq, ac yna toiled. 210 00:16:24,160 --> 00:16:28,840 Gallwch wneud uniq dyn i mewn gwirionedd yn edrych ar beth yw hynny, 211 00:16:28,840 --> 00:16:34,840 ac mai dim ond yn mynd i hidlo llinellau cyfateb cyfagos o fewnbwn. 212 00:16:34,840 --> 00:16:40,690 Ac mae dyn toiled yn mynd i argraffu'r Newline, gair, ac yn cyfrif beit ar gyfer pob ffeil. 213 00:16:40,690 --> 00:16:43,760 Ac yr un olaf rydym yn mynd i eisiau ei ddefnyddio yn fath, 214 00:16:43,760 --> 00:16:47,410 sydd yn mynd i ychydig didoli llinellau txt ffeil. 215 00:16:47,410 --> 00:16:58,080 Os byddaf yn gwneud rhai, ffeil txt names.txt, ac mae'n Rob, Tommy, Joseph, Tommy, Joseph, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 hyn yr wyf eisiau ei wneud yma yw dod o hyd i nifer o enwau unigryw yn y ffeil hon. 217 00:17:03,910 --> 00:17:08,750 Felly, beth ddylai'r ateb fod? >> [Myfyrwyr] 4. >> Yeah. 218 00:17:08,750 --> 00:17:13,780 Dylai fod yn 4 ers Rob, Tommy, Joseph, RJ yw'r unig enwau unigryw yn y ffeil hon. 219 00:17:13,780 --> 00:17:20,180 Y cam cyntaf, os Fi jyst yn gwneud nifer y geiriau ar names.txt, 220 00:17:20,180 --> 00:17:24,290 hyn mewn gwirionedd yn dweud wrthyf bopeth. 221 00:17:24,290 --> 00:17:32,560 Mae hyn mewn gwirionedd argraffu - gadewch i ni weld, dyn toiled - newlines, geiriau, ac yn cyfrif beit. 222 00:17:32,560 --> 00:17:38,270 Os mai dim ond gofalu am linellau, yna gallaf ei wneud toiled-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Felly dyna cam 1. 224 00:17:44,300 --> 00:17:50,510 Ond nid wyf am toiled-l names.txt oherwydd names.txt yn unig yn cynnwys yr holl enwau, 225 00:17:50,510 --> 00:17:54,170 ac rydw i eisiau i hidlo allan unrhyw rai nad ydynt yn unigryw. 226 00:17:54,170 --> 00:18:01,200 Felly, os wyf yn gwneud uniq names.txt, nid yw hynny'n hollol yn rhoi i mi yr hyn yr wyf eisiau 227 00:18:01,200 --> 00:18:03,760 oherwydd bod yr enwau dyblygu yn dal i fod yno. 228 00:18:03,760 --> 00:18:07,690 Pam hynny? Pam nad yw uniq gwneud yr hyn rwyf eisiau? 229 00:18:07,690 --> 00:18:10,500 [Myfyrwyr] Nid yw'r dyblygu yn [Anghlywadwy] >> Yeah. 230 00:18:10,500 --> 00:18:16,370 Cofiwch y dudalen dyn am uniq yn dweud llinellau cyfateb cyfagos hidlo. 231 00:18:16,370 --> 00:18:19,680 Nid ydynt yn gyfagos, felly ni fydd yn hidlo iddynt. 232 00:18:19,680 --> 00:18:31,100 Os byddaf yn trefnu iddynt yn gyntaf, names.txt fath yn mynd i roi'r holl linellau wedi'u dyblygu ei gilydd. 233 00:18:31,100 --> 00:18:34,450 Felly nawr names.txt fath yw hynny. 234 00:18:34,450 --> 00:18:40,550 Rydw i'n mynd i eisiau defnyddio hynny fel y mewnbwn i uniq, sef | uniq. 235 00:18:40,550 --> 00:18:43,390 Mae hynny'n rhoi i mi Joseph, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 ac rydw i eisiau defnyddio hynny fel mewnbwn i wc-l, 237 00:18:49,260 --> 00:18:52,740 sydd yn mynd i roi i mi 4. 238 00:18:52,740 --> 00:18:56,930 Fel mae'n dweud yma, pa bibell rydych yn ei ddefnyddio? 239 00:18:56,930 --> 00:19:01,390 Gallwch wneud llawer o bethau fel defnyddio cyfres o orchmynion 240 00:19:01,390 --> 00:19:05,130 lle rydych yn defnyddio'r allbwn o un gorchymyn fel y mewnbwn i'r gorchymyn nesaf. 241 00:19:05,130 --> 00:19:08,780 Gallwch wneud llawer o bethau, mae llawer o bethau clyfar. 242 00:19:08,780 --> 00:19:11,440 >> Cwestiynau? 243 00:19:12,910 --> 00:19:14,600 Iawn. 244 00:19:14,600 --> 00:19:17,880 Dyna ni am pibellau a ailgyfeiriad. 245 00:19:18,370 --> 00:19:24,090 >> Nawr rydym yn mynd ar y pethau gwirioneddol, y stwff codio. 246 00:19:24,090 --> 00:19:29,100 Y tu mewn o hyn PDF, byddwch yn gweld y gorchymyn, 247 00:19:29,100 --> 00:19:32,950 a youll 'angen at hidla hon archa yn eich offer. 248 00:19:36,240 --> 00:19:42,250 wget yw'r gorchymyn ar gyfer dim ond cael rhywbeth oddi ar y Rhyngrwyd, yn y bôn, 249 00:19:42,250 --> 00:19:45,180 felly wget ac mae hyn yn URL. 250 00:19:45,180 --> 00:19:49,110 Os byddwch yn mynd i'r URL yn eich porwr, byddai'n llwytho i lawr y ffeil. 251 00:19:49,110 --> 00:19:52,510 Fi jyst clicio arno, felly ei lwytho i lawr y ffeil i mi. 252 00:19:52,510 --> 00:19:55,650 Ond ysgrifennu wget y peth y tu mewn i'r derfynell 253 00:19:55,650 --> 00:19:58,620 yn unig yn mynd i lwytho i lawr i mewn i'ch terfynol. 254 00:19:58,620 --> 00:20:02,750 Mae gen i section5.zip, a youll 'angen at unzip section5.zip, 255 00:20:02,750 --> 00:20:06,520 sydd yn mynd i roi ffolder o'r enw section5, 256 00:20:06,520 --> 00:20:11,550 sydd yn mynd i gael yr holl ffeiliau rydym yn mynd i gael ei ddefnyddio heddiw tu mewn iddo. 257 00:20:33,380 --> 00:20:37,710 Gan fod enwau ffeiliau rhaglenni hyn 'yn awgrymu, maen nhw'n bygi ychydig, 258 00:20:37,710 --> 00:20:40,990 fel bod eich cenhadaeth yw i chyfrif i maes pam mae defnyddio gdb. 259 00:20:40,990 --> 00:20:44,560 Ydy pawb wedi eu llwytho i lawr / yn gwybod sut i gael eu llwytho i lawr 260 00:20:44,560 --> 00:20:47,480 yn eu teclyn? Iawn. 261 00:20:47,480 --> 00:20:56,400 >> Rhedeg ./buggy1, bydd yn dweud fai Segmentiad (craidd gadael), 262 00:20:56,400 --> 00:21:00,500 y mae unrhyw tro y byddwch yn cael segfault, mae'n beth drwg. 263 00:21:00,500 --> 00:21:03,810 O dan ba amgylchiadau rydych chi'n cael segfault? 264 00:21:03,810 --> 00:21:08,210 [Myfyrwyr] Dereferencing pwyntydd nwl. >> Yeah. Felly dyna un enghraifft. 265 00:21:08,210 --> 00:21:11,580 Dereferencing pwyntydd null ydych yn mynd i gael segfault. 266 00:21:11,580 --> 00:21:16,720 Beth yw segfault yn ei olygu yw eich bod yn cyffwrdd cof na ddylech fod yn cyffwrdd. 267 00:21:16,720 --> 00:21:21,350 Felly dereferencing pwyntydd nwl yn cyffwrdd gyfeiriad 0, 268 00:21:21,350 --> 00:21:28,060 ac yn y bôn, yr holl gyfrifiaduron y dyddiau hyn yn dweud bod 0 cyfeiriad cof na ddylech fod yn cyffwrdd. 269 00:21:28,060 --> 00:21:31,920 Felly dyna pam dereferencing o ganlyniadau pwyntydd nwl mewn segfault. 270 00:21:31,920 --> 00:21:37,210 Pan fyddwch yn digwydd i ni gychwyn y pwyntydd, yna mae ganddo werth garbage, 271 00:21:37,210 --> 00:21:41,520 ac felly pan fyddwch yn ceisio dereference hynny, yn ôl pob tebyg rydych chi'n cyffwrdd cof 272 00:21:41,520 --> 00:21:43,540 sydd yn y nghanol unlle. 273 00:21:43,540 --> 00:21:45,650 Os ydych yn digwydd i gael lwcus a gwerth garbage 274 00:21:45,650 --> 00:21:48,440 ddigwyddodd i bwyntio at rywle ar y simnai neu rywbeth, 275 00:21:48,440 --> 00:21:50,820 Yna, pan fyddwch yn dereference y pwyntydd nad ydych wedi ymgychwyn, 276 00:21:50,820 --> 00:21:52,730 Bydd unrhyw beth yn mynd o'i le. 277 00:21:52,730 --> 00:21:55,480 Ond os caiff ei bwyntio i, dyweder, rhywle rhwng y pentwr a'r domen, 278 00:21:55,480 --> 00:21:59,850 neu mae'n pwyntio yn unig i rywle nad yw wedi cael ei ddefnyddio gan eich rhaglen eto, 279 00:21:59,850 --> 00:22:02,240 yna rydych chi'n cyffwrdd cof na ddylech fod yn cyffwrdd a chi segfault. 280 00:22:02,240 --> 00:22:06,370 Pan fyddwch yn ysgrifennu swyddogaeth recursive ac mae'n recurses gormod o weithiau 281 00:22:06,370 --> 00:22:08,720 a bod eich simnai yn tyfu yn rhy fawr ac mae'r gwrthdaro pentwr i mewn i bethau 282 00:22:08,720 --> 00:22:12,270 na ddylid ei wrthdaro gyda, rydych chi'n cyffwrdd cof na ddylech fod yn cyffwrdd, 283 00:22:12,270 --> 00:22:14,810 er mwyn i chi segfault. 284 00:22:14,810 --> 00:22:17,010 Dyna beth yw segfault yw. 285 00:22:17,010 --> 00:22:21,810 >> Mae hefyd yr un rheswm, os oes gennych llinyn fel - 286 00:22:21,810 --> 00:22:23,930 gadewch i ni fynd yn ôl at y rhaglen flaenorol. 287 00:22:23,930 --> 00:22:28,530 Yn hello.c--I'm jyst yn mynd i wneud rhywbeth arall. 288 00:22:28,530 --> 00:22:33,770 torgoch * s = "helo byd!"; 289 00:22:33,770 --> 00:22:42,310 Os byddaf yn defnyddio * s = rhywbeth neu s [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 felly gwnewch yn helo,. / helo, pam oedd hynny'n segfault? 291 00:22:48,410 --> 00:22:51,250 Pam oedd hyn yn segfault? 292 00:22:55,660 --> 00:22:57,890 Beth fyddech chi'n disgwyl i ddigwydd? 293 00:22:57,890 --> 00:23:06,640 Os byddaf yn gwneud printf ("% s \ n", s); beth fyddech chi'n disgwyl eu hargraffu? 294 00:23:06,640 --> 00:23:09,930 [Myfyrwyr] X helo. >> Yeah. 295 00:23:09,930 --> 00:23:15,140 Y broblem yw bod pan fyddwch yn datgan llinyn fel hyn, 296 00:23:15,140 --> 00:23:18,190 s yn pwyntydd sy'n mynd i fynd ar y simnai, 297 00:23:18,190 --> 00:23:25,880 a'r hyn y s yn pwyntio i yw hyn llinyn sydd wedi'i chynnwys yn darllen yn unig cof. 298 00:23:25,880 --> 00:23:30,560 Felly, yn unig gan yr enw, darllen yn unig cof, dylech gael y syniad 299 00:23:30,560 --> 00:23:33,010 os ydych yn ceisio newid yr hyn sydd yn darllen yn unig cof, 300 00:23:33,010 --> 00:23:36,670 rydych chi'n ei wneud rhywbeth na ddylech fod yn ei wneud gyda'r cof a chi segfault. 301 00:23:36,670 --> 00:23:45,360 Hyn mewn gwirionedd yn wahaniaeth mawr rhwng torgoch * s torgoch a'r s []. 302 00:23:45,360 --> 00:23:48,790 Felly torgoch s [], yn awr, y llinyn yn mynd i gael ei roi ar y corn, 303 00:23:48,790 --> 00:23:53,960 ac nad yw'r pentwr yn darllen yn unig, sy'n golygu y dylai hyn weithio berffaith iawn. 304 00:23:55,500 --> 00:23:57,370 Ac mae'n ei wneud. 305 00:23:57,370 --> 00:24:06,250 Cofiwch fod pan fyddaf yn gwneud golosg * s = "helo byd!", S ei hun ar y simnai 306 00:24:06,250 --> 00:24:10,390 ond mae'n tynnu sylw s i rywle arall, a bod yn rhywle arall yn digwydd bod yn darllen-yn-unig. 307 00:24:10,390 --> 00:24:15,640 Ond cols s [] yn unig rhywbeth ar y pentwr. 308 00:24:17,560 --> 00:24:21,760 Felly dyna enghraifft arall o segfault digwydd. 309 00:24:21,760 --> 00:24:27,820 >> Gwelsom fod ./buggy1 arwain at segfault. 310 00:24:27,820 --> 00:24:31,810 Mewn theori, ni ddylech edrych ar buggy1.c ar unwaith. 311 00:24:31,810 --> 00:24:35,170 Yn hytrach, byddwn yn edrych arno drwy gdb. 312 00:24:35,170 --> 00:24:37,750 Hysbysiad bod pan fyddwch yn cael nam Segmentiad (craidd gadael), 313 00:24:37,750 --> 00:24:40,850 byddwch yn cael y ffeil dros craidd a elwir yma. 314 00:24:40,850 --> 00:24:45,200 Os byddwn yn ls-l, byddwn yn gweld y craidd hwnnw fel arfer ffeil eithaf mawr. 315 00:24:45,200 --> 00:24:51,580 Mae hyn yn y nifer o bytes y ffeil, felly mae'n edrych fel ei fod yn 250-rhywbeth kilobytes. 316 00:24:51,580 --> 00:24:56,120 Y rheswm am hyn yw bod yr hyn y domen craidd mewn gwirionedd yn 317 00:24:56,120 --> 00:25:01,410 yw pan fydd eich damweiniau rhaglen, cyflwr cof eich rhaglen 318 00:25:01,410 --> 00:25:05,230 yn unig yn cael copïo a gludo i mewn i'r ffeil. 319 00:25:05,230 --> 00:25:07,270 Mae'n cael ei adael i mewn i'r ffeil. 320 00:25:07,270 --> 00:25:13,060 Mae'r rhaglen hon, er ei fod yn rhedeg, ddigwyddodd i gael defnydd cof am tua 250 cilobeit, 321 00:25:13,060 --> 00:25:17,040 ac felly dyna beth gafodd eu gadael i mewn i'r ffeil. 322 00:25:17,040 --> 00:25:23,630 Nawr gallwch edrych ar y ffeil os ydym yn ei wneud gdb buggy1 craidd. 323 00:25:23,630 --> 00:25:30,130 Gall Rydym yn unig yn gwneud gdb buggy1, a fydd ond yn dechrau i fyny gdb yn rheolaidd, 324 00:25:30,130 --> 00:25:33,800 defnyddio buggy1 fel ei ffeil mewnbwn. 325 00:25:33,800 --> 00:25:38,260 Ond os ydych chi'n gdb buggy1 craidd, yna mae'n benodol yn mynd i ddechrau gdb 326 00:25:38,260 --> 00:25:40,330 drwy edrych ar y ffeil craidd. 327 00:25:40,330 --> 00:25:45,560 A ydych yn dweud buggy1 gdb golygu gwybod bod y ffeil craidd yn dod o'r rhaglen buggy1. 328 00:25:45,560 --> 00:25:49,580 Felly gdb buggy1 craidd yn mynd i ddod â ni ar unwaith 329 00:25:49,580 --> 00:25:52,060 i ble digwyddodd y rhaglen i derfynu. 330 00:25:57,720 --> 00:26:02,340 Rydym yn gweld yma Rhaglen terfynu gyda signal 11, nam Segmentiad. 331 00:26:02,340 --> 00:26:10,110 Rydym yn digwydd i weld llinell cynulliad, sydd yn debyg nad yn ddefnyddiol iawn. 332 00:26:10,110 --> 00:26:15,360 Ond os ydych yn teipio bt neu olrheiniad, mae hynny'n mynd i fod yn swyddogaeth 333 00:26:15,360 --> 00:26:19,430 sy'n rhoi i ni y rhestr o ein fframiau stac ar hyn o bryd. 334 00:26:19,430 --> 00:26:23,150 Felly olrheiniad. Mae'n edrych fel mai dim ond dwy ffrâm pentwr. 335 00:26:23,150 --> 00:26:26,310 Y cyntaf yw ein prif ffrâm pentwr, 336 00:26:26,310 --> 00:26:29,810 ac mae'r ail yn y ffrâm pentwr gyfer y swyddogaeth hon yr ydym yn digwydd bod yn, 337 00:26:29,810 --> 00:26:34,440 sy'n edrych fel mai dim ond y cod cynulliad ar gyfer. 338 00:26:34,440 --> 00:26:38,050 Felly, gadewch i ni fynd yn ôl i mewn i'n prif swyddogaeth, 339 00:26:38,050 --> 00:26:42,300 ac i wneud hynny y gallwn ei wneud ffrâm 1, ac rwy'n credu y gallwn ni hefyd wneud i lawr, 340 00:26:42,300 --> 00:26:45,160 ond dydw i erioed bron yn ei wneud i lawr - neu hyd. Yeah. 341 00:26:45,160 --> 00:26:50,710 Ar hyd a lled. Up yn dod â chi i fyny un ffrâm stac, i lawr yn dod â chi i lawr ffrâm pentwr. 342 00:26:50,710 --> 00:26:53,240 Dwi'n tueddu i byth yn defnyddio hynny. 343 00:26:53,240 --> 00:26:59,120 Fi jyst yn dweud yn benodol ffrâm 1, sy'n cael ei mynd i'r ffrâm labelu 1. 344 00:26:59,120 --> 00:27:01,750 Ffrâm 1 yn mynd i ddod â ni i mewn i ffrâm pentwr prif 345 00:27:01,750 --> 00:27:05,570 ac mae'n dweud dde yma y llinell o god ydym yn digwydd bod yn. 346 00:27:05,570 --> 00:27:07,950 Os ydym eisiau llinellau ychydig mwy o god, gallwn ddweud rhestr, 347 00:27:07,950 --> 00:27:11,280 ac mae hynny'n mynd i roi i ni yr holl linellau o god o'i amgylch. 348 00:27:11,280 --> 00:27:13,360 Mae'r llinell rydym yn segfaulted arno oedd 6: 349 00:27:13,360 --> 00:27:17,360 os (strcmp ("CS50 creigiau", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Os nad yw'n amlwg eto, gallwch ei gael yn syth o'r fan yma yn unig gan feddwl pam ei segfaulted. 351 00:27:24,130 --> 00:27:28,800 Ond gallwn fynd ag ef un cam ymhellach a dweud, "Pam y byddai argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Gadewch i ni print argv [1], ac mae'n edrych fel ei fod yn 0x0, sef y pwyntydd nwl. 353 00:27:38,830 --> 00:27:44,750 Rydym yn strcmping CS50 greigiau a null, ac felly mae hynny'n mynd i segfault. 354 00:27:44,750 --> 00:27:48,280 A pham mae argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Myfyrwyr] Gan nad ydym yn rhoi unrhyw ddadleuon gorchymyn-lein. 356 00:27:51,280 --> 00:27:53,390 Yeah. Doedden ni ddim yn rhoi unrhyw ddadleuon gorchymyn-lein. 357 00:27:53,390 --> 00:27:58,460 Felly ./buggy1 yn unig yn mynd i gael argv [0] fod ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Dyw hi ddim yn mynd i gael argv [1], felly mae hynny'n mynd i segfault. 359 00:28:02,100 --> 00:28:07,450 Ond os, yn lle hynny, yr wyf yn jyst CS50, mae'n mynd i ddweud Byddwch yn cael D 360 00:28:07,450 --> 00:28:09,950 oherwydd dyna beth y mae'n ei fod i'w wneud. 361 00:28:09,950 --> 00:28:15,240 O edrych ar buggy1.c, mae'n fod i argraffu "Byddwch yn cael D" - 362 00:28:15,240 --> 00:28:20,820 Os argv [1] Nid yw "CS50 creigiau", "Byddwch yn cael D", arall "Rydych yn cael A!" 363 00:28:20,820 --> 00:28:25,660 Felly, os ydym am A, mae angen hyn i gymharu yn wir, 364 00:28:25,660 --> 00:28:28,710 sy'n golygu ei fod yn cymharu â 0. 365 00:28:28,710 --> 00:28:31,100 Felly argv [1] Mae angen i fod yn "CS50 creigiau". 366 00:28:31,100 --> 00:28:35,660 Os ydych am wneud hynny ar y llinell orchymyn, bydd angen i chi ddefnyddio \ i ddianc rhag y gofod. 367 00:28:35,660 --> 00:28:41,690 Felly, CS50 \ creigiau a Byddwch yn cael A! 368 00:28:41,690 --> 00:28:44,060 Os nad ydych yn gwneud y slaes, pam nad yw hyn yn gweithio? 369 00:28:44,060 --> 00:28:47,190 [Myfyrwyr] Mae'n dwy ddadl wahanol. >> Yeah. 370 00:28:47,190 --> 00:28:52,540 Argv [1] yn mynd i fod CS50, a argv [2] yn mynd i fod creigiau. Iawn. 371 00:28:52,540 --> 00:28:56,470 >> Nawr ./buggy2 yn mynd i segfault eto. 372 00:28:56,470 --> 00:29:01,880 Yn hytrach na agor 'i ag ei ​​ffeil craidd, byddwn yn jyst agor i fyny buggy2 yn uniongyrchol, 373 00:29:01,880 --> 00:29:05,000 felly gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Nawr, os ydym yn unig yn rhedeg ein rhaglen, yna mae'n mynd i ddweud Rhaglen derbyn signal SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 sef y segfault signal, a dyma lle y digwyddodd i ddigwydd. 376 00:29:15,530 --> 00:29:21,250 Edrych ar ein olrheiniad, gwelwn ein bod yn y oh_no swyddogaeth, 377 00:29:21,250 --> 00:29:23,900 a alwyd gan y Dinky swyddogaeth a elwir gan y binky swyddogaeth, 378 00:29:23,900 --> 00:29:26,460 a gafodd ei alw gan brif. 379 00:29:26,460 --> 00:29:31,680 Gallwn hefyd weld y dadleuon i'r swyddogaethau hyn. 380 00:29:31,680 --> 00:29:34,680 Mae'r ddadl i Dinky a binky oedd 1. 381 00:29:34,680 --> 00:29:44,390 Os byddwn yn rhestru'r oh_no swyddogaeth, rydym yn gweld bod oh_no yn unig yw gwneud torgoch ** s = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "Boom"; 383 00:29:47,410 --> 00:29:50,330 Pam y byddai hynny yn methu? 384 00:29:54,330 --> 00:29:58,380 [Myfyrwyr] Ni allwch dereference y pwyntydd null? >> Yeah. 385 00:29:58,380 --> 00:30:06,090 Mae hyn yn dim ond dweud s NULL, waeth os bydd hynny'n digwydd i fod yn ** torgoch, 386 00:30:06,090 --> 00:30:12,070 sydd, yn dibynnu ar sut yr ydych yn ei ddehongli, gallai fod yn pwyntydd i'r pwyntydd i'r llinyn 387 00:30:12,070 --> 00:30:15,550 neu amrywiaeth o linynnau. 388 00:30:15,550 --> 00:30:21,430 Mae'n s NULL, felly * s yn dereferencing pwyntydd null, 389 00:30:21,430 --> 00:30:24,800 ac felly mae hyn yn mynd i ddamwain. 390 00:30:24,800 --> 00:30:27,540 Mae hwn yn un o'r ffyrdd cyflymaf y gallwch o bosibl segfault. 391 00:30:27,540 --> 00:30:31,300 Mae'n dim ond datgan pwyntydd nwl ac yn union segfaulting. 392 00:30:31,300 --> 00:30:34,570 Dyna beth oh_no yn ei wneud. 393 00:30:34,570 --> 00:30:43,400 Os ydym yn mynd i fyny un ffrâm, yna rydym yn mynd i fynd i mewn i'r swyddogaeth a oedd yn galw oh_no. 394 00:30:43,400 --> 00:30:44,830 Angen i mi wneud hynny i lawr. 395 00:30:44,830 --> 00:30:48,610 Os nad ydych yn mynd i mewn gorchymyn a 'ch jyst daro Enter eto, 396 00:30:48,610 --> 00:30:52,350 bydd ddim ond yn ailadrodd y gorchymyn blaenorol eich bod yn rhedeg. 397 00:30:52,350 --> 00:30:56,610 Rydym yn ffrâm 1. 398 00:30:56,610 --> 00:31:04,650 Rhestru y ffrâm, rydym yn gweld yma yw ein swyddogaeth. 399 00:31:04,650 --> 00:31:08,520 Gallwch daro rhestr eto, neu gallwch wneud rhestr 20 a bydd yn rhestru mwy. 400 00:31:08,520 --> 00:31:13,640 Mae'r Dinky swyddogaeth yn dweud os fi yw 1, yna ewch at y swyddogaeth oh_no, 401 00:31:13,640 --> 00:31:15,960 arall yn mynd i'r swyddogaeth slinky. 402 00:31:15,960 --> 00:31:18,700 Ac rydym yn gwybod i yw 1 oherwydd ein bod yn digwydd i weld hyd yma 403 00:31:18,700 --> 00:31:22,560 bod Dinky galwyd gyda'r ddadl 1. 404 00:31:22,560 --> 00:31:27,560 Neu gallwch yn unig yn argraffu i a bydd yn dweud i yw 1. 405 00:31:27,560 --> 00:31:33,770 Rydym ar hyn o bryd yn Dinky, ac os ydym yn mynd i fyny arall ffrâm, rydym yn gwybod y byddwn yn y pen draw yn binky. 406 00:31:33,770 --> 00:31:36,600 Up. Awr yr ydym mewn binky. 407 00:31:36,600 --> 00:31:41,340 Rhestru swyddogaeth hon - y rhestr o cyn hanner yn fy atal - 408 00:31:41,340 --> 00:31:52,670 iddi ddechrau fel os fi yw 0, yna rydym yn mynd i alw oh_no, arall ffoniwch Dinky. 409 00:31:52,670 --> 00:31:57,000 Rydym yn gwybod fi oedd 1, felly yn galw Dinky. 410 00:31:57,000 --> 00:32:05,030 Ac yn awr rydym yn ôl yn y brif, a phrif yn unig yn mynd i fod yn int i = Rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Mae hynny yn unig yn mynd i roi rhif ar hap sydd naill ai'n 0, 1, neu 2. 412 00:32:08,790 --> 00:32:12,780 Mae'n mynd i alw binky â'r rhif hwnnw, a bydd yn dychwelyd 0. 413 00:32:12,780 --> 00:32:16,700 Edrych ar hyn, 414 00:32:16,700 --> 00:32:19,880 gerdded drwy'r rhaglen llaw heb redeg ar unwaith, 415 00:32:19,880 --> 00:32:25,400 byddech yn gosod pwynt torri yn y prif, sy'n golygu bod pan fyddwn yn rhedeg y rhaglen 416 00:32:25,400 --> 00:32:31,020 eich rhaglen yn rhedeg hyd nes ei fod yn taro pwynt egwyl. 417 00:32:31,020 --> 00:32:35,450 Felly rhedeg y rhaglen, bydd yn rhedeg ac yna bydd yn cyrraedd y brif swyddogaeth a rhoi'r gorau i redeg. 418 00:32:35,450 --> 00:32:44,700 Nawr rydym ni'n tu mewn prif, a llys neu nesaf yn mynd i ddod â ni at y llinell nesaf o god. 419 00:32:44,700 --> 00:32:47,050 Gallwch wneud cam neu nesaf. 420 00:32:47,050 --> 00:32:51,800 Taro nesaf, yn awr fi wedi ei osod i rand ()% 3, er mwyn i ni argraffu'r gwerth i, 421 00:32:51,800 --> 00:32:55,280 a bydd yn dweud i yw 1. 422 00:32:55,280 --> 00:32:58,110 Nawr mae'n fater a ydym yn defnyddio nesaf neu gam. 423 00:32:58,110 --> 00:33:01,000 Mae'n debyg ei fod yn bwysig yn yr un blaenorol, ond byddem yn dymuno ei ddefnyddio nesaf. 424 00:33:01,000 --> 00:33:06,000 Os ydym yn defnyddio cam, rydym yn camu i mewn i'r swyddogaeth, sy'n golygu edrych ar y peth go iawn 425 00:33:06,000 --> 00:33:07,940 sy'n digwydd y tu mewn o binky. 426 00:33:07,940 --> 00:33:10,510 Os ydym yn defnyddio nesaf, yna mae'n golygu mynd dros y swyddogaeth 427 00:33:10,510 --> 00:33:14,070 a dim ond mynd at y rheng nesaf o god yn ein prif swyddogaeth. 428 00:33:14,070 --> 00:33:17,900 Hawl yma ar y llinell hon, yr oeddwn ar ble mae'n dweud Rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 os wyf yn gwneud cam, byddai'n mynd i mewn i'r weithredu rand 430 00:33:21,320 --> 00:33:25,110 ac yn edrych ar yr hyn sy'n digwydd yno, a gallwn gamu trwy'r swyddogaeth rand. 431 00:33:25,110 --> 00:33:26,920 Ond nid wyf yn poeni am y swyddogaeth rand. 432 00:33:26,920 --> 00:33:30,190 Fi jyst eisiau mynd at y llinell nesaf o god yn y brif, felly rwy'n defnyddio nesaf. 433 00:33:30,190 --> 00:33:35,800 Ond yn awr yr wyf yn poeni am y swyddogaeth binky, felly rwy'n awyddus i gamu i mewn i hynny. 434 00:33:35,800 --> 00:33:37,730 Nawr rwy'n yn binky. 435 00:33:37,730 --> 00:33:42,040 Mae'r llinell gyntaf y cod yn mynd i ddweud os (i == 0), yr wyf yn cymryd cam, 436 00:33:42,040 --> 00:33:44,930 gwelwn ni yn y pen draw yn Dinky. 437 00:33:44,930 --> 00:33:51,620 Os bydd pethau'n rhestr ydym ni, rydym yn gweld bod ei wirio yn i = 0. 438 00:33:51,620 --> 00:33:55,470 nid fi yn hafal i 0, felly aeth i gyflwr arall, 439 00:33:55,470 --> 00:33:59,540 sydd yn mynd i alw Dinky (i). 440 00:33:59,540 --> 00:34:04,030 Efallai y byddwch yn cael drysu. 441 00:34:04,030 --> 00:34:07,380 Os ydych yn edrych ar y llinellau hyn yn uniongyrchol, efallai y byddwch yn meddwl os (i == 0), 442 00:34:07,380 --> 00:34:10,800 iawn, yna yr wyf yn cymryd cam ac erbyn hyn rwy'n yn Dinky (i), 443 00:34:10,800 --> 00:34:14,120 efallai y byddwch yn meddwl bod yn rhaid i olygu i = 0 neu rywbeth. 444 00:34:14,120 --> 00:34:18,980 Na jyst yn golygu ei fod yn gwybod y gall glynu uniongyrchol i'r (i) Dinky llinell. 445 00:34:18,980 --> 00:34:23,300 Gan nad yw 0 i, nid yw'r cam nesaf yn mynd i ben ar y arall. 446 00:34:23,300 --> 00:34:26,239 Nid Else yn llinell mae'n mynd i aros yn. 447 00:34:26,239 --> 00:34:31,570 Mae'n dim ond yn mynd i fynd i'r llinell nesaf gall fod mewn gwirionedd yn gweithredu, sy'n Dinky (i). 448 00:34:31,570 --> 00:34:36,090 Camu i mewn i Dinky (i), rydym yn gweld os (i == 1). 449 00:34:36,090 --> 00:34:42,670 Ydym yn gwybod i = 1, felly pan fyddwn yn camu, rydym yn gwybod ein bod yn mynd i roi diwedd ar i fyny yn oh_no 450 00:34:42,670 --> 00:34:46,489 oherwydd i = 1 galw y, oh_no swyddogaeth y gallwch gamu i mewn i, 451 00:34:46,489 --> 00:34:52,969 sydd yn mynd i osod cols ** s = i nwl ac yn syth "Boom". 452 00:34:54,270 --> 00:34:59,690 Ac yna mewn gwirionedd yn edrych ar y gweithredu buggy2, 453 00:34:59,690 --> 00:35:04,590 hyn, i yn unig yw cael rhif ar hap - 0, 1, neu 2 - galw binky, 454 00:35:04,590 --> 00:35:10,610 ac os i yw 0 mae'n galw oh_no, arall y mae'n galw Dinky, sy'n dod i fyny yma. 455 00:35:10,610 --> 00:35:18,100 Os i yw 1, ffoniwch oh_no, arall ffoniwch slinky, sy'n dod i fyny yma, 456 00:35:18,100 --> 00:35:20,460 os fi yw 2, ffoniwch oh_no. 457 00:35:20,460 --> 00:35:24,720 Dydw i ddim hyd yn oed yn meddwl bod ffordd - 458 00:35:24,720 --> 00:35:30,030 A oes unrhyw un yn gweld ffordd o wneud hyn yn rhaglen na fydd yn segfault? 459 00:35:30,030 --> 00:35:37,530 Oherwydd oni bai fy mod i'n methu rhywbeth, os fi yw 0, byddwch yn syth segfault, 460 00:35:37,530 --> 00:35:41,250 arall byddwch yn mynd i swyddogaeth sy'n os fi yw 1 chi segfault, 461 00:35:41,250 --> 00:35:44,540 arall byddwch yn mynd i swyddogaeth lle os fi yw 2 eich bod yn segfault. 462 00:35:44,540 --> 00:35:46,810 Felly, dim ots beth ydych yn ei wneud, rydych segfault. 463 00:35:46,810 --> 00:35:52,380 >> Amcana un ffordd o osod y byddai'n hytrach na gwneud torgoch ** s = NULL, 464 00:35:52,380 --> 00:35:55,610 gallech malloc le ar gyfer y llinyn. 465 00:35:55,610 --> 00:36:04,230 Gallem wneud malloc (sizeof) - sizeof beth? 466 00:36:09,910 --> 00:36:15,190 [Myfyrwyr] (torgoch) * 5? >> A yw hyn yn ymddangos yn iawn? 467 00:36:15,190 --> 00:36:21,060 Rwy'n tybio y bydd hyn yn gweithio os wyf mewn gwirionedd yn rhedeg, ond nid yw'n hyn yr wyf i'n chwilio amdano. 468 00:36:24,400 --> 00:36:32,940 Edrychwch ar y math o s. Gadewch i ni ychwanegu * int, felly int * x. 469 00:36:32,940 --> 00:36:35,600 Byddwn yn gwneud malloc (sizeof (canolradd)). 470 00:36:35,600 --> 00:36:40,490 Neu os oeddwn i eisiau amrywiaeth o 5, byddwn yn ei wneud (sizeof (canolradd) * 5); 471 00:36:40,490 --> 00:36:44,210 Beth os oes gennyf ** int? 472 00:36:46,260 --> 00:36:49,140 Beth fyddwn i'n malloc? 473 00:36:49,140 --> 00:36:53,510 [Myfyrwyr] Maint y pwyntydd. >> Yeah. (Sizeof (canolradd *)); 474 00:36:53,510 --> 00:36:56,960 Un peth i lawr yma. 475 00:36:56,960 --> 00:37:01,280 Rwyf am (sizeof (torgoch *)); 476 00:37:06,170 --> 00:37:12,840 Mae hyn yn mynd i neilltuo lle ar gyfer y pwyntydd sy'n cyfeirio at "Boom". 477 00:37:12,840 --> 00:37:15,330 Nid oes angen i mi neilltuo lle ar gyfer "Boom" ei hun 478 00:37:15,330 --> 00:37:17,210 oherwydd mae hyn yn y bôn cyfateb i'r hyn a ddywedais o'r blaen 479 00:37:17,210 --> 00:37:20,870 o torgoch * x = "Boom". 480 00:37:20,870 --> 00:37:27,950 "Boom" yn bodoli eisoes. Mae'n digwydd i fodoli yn y rhanbarth darllen yn unig cof. 481 00:37:27,950 --> 00:37:35,200 Ond mae'n bodoli eisoes, sy'n golygu y llinell hon o god, os yw yn ** torgoch, 482 00:37:35,200 --> 00:37:43,900 yna * s yn * torgoch ac rydych yn gosod y * torgoch i bwyntio at "Boom". 483 00:37:43,900 --> 00:37:50,040 Os byddaf yn awyddus i gopïo "Boom" yn s, yna byddai angen i mi neilltuo lle ar s. 484 00:37:55,170 --> 00:38:03,900 Fe ddylwn i ei wneud * s = malloc (sizeof (torgoch) * 5); 485 00:38:03,900 --> 00:38:06,210 Pam 5? 486 00:38:06,210 --> 00:38:10,860 Pam na 4? Mae'n edrych fel "Boom" yw 4 cymeriadau. >> [Myfyrwyr] Y cymeriad nwl. 487 00:38:10,860 --> 00:38:14,580 Yeah. Mae eich holl llinynnau yn mynd i angen y cymeriad null. 488 00:38:14,580 --> 00:38:23,590 Nawr gallaf wneud rhywbeth fel strcat - Beth yw swyddogaeth ar gyfer copïo llinyn? 489 00:38:23,590 --> 00:38:28,520 [Myfyrwyr] cpy? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 strcpy dyn. 491 00:38:36,120 --> 00:38:39,590 Felly strcpy neu strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy yn ychydig yn fwy diogel gan y gall eich bod yn nodi yn union faint o gymeriadau, 493 00:38:43,410 --> 00:38:46,190 ond yma nid oes ots oherwydd ein bod yn gwybod. 494 00:38:46,190 --> 00:38:50,340 Felly strcpy ac yn edrych yn y dadleuon. 495 00:38:50,340 --> 00:38:53,100 Y ddadl cyntaf yw ein cyrchfan. 496 00:38:53,100 --> 00:38:56,770 Yr ail ddadl yw ein ffynhonnell. 497 00:38:56,770 --> 00:39:10,310 Rydym yn mynd i gopïo i mewn i'n * cyrchfan s y pwyntydd "Boom". 498 00:39:10,310 --> 00:39:19,820 Pam y gallai byddwch am wneud hyn gyda strcpy hytrach na dim ond yr hyn a oedd gennym o'r blaen 499 00:39:19,820 --> 00:39:22,800 o * s = "Boom"? 500 00:39:22,800 --> 00:39:28,630 Mae yna reswm efallai y byddwch am wneud hyn, ond beth yw y rheswm? 501 00:39:28,630 --> 00:39:31,940 [Myfyrwyr] Os ydych chi am newid rhywbeth yn "Boom". >> Yeah. 502 00:39:31,940 --> 00:39:37,950 Nawr gallaf wneud rhywbeth fel s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 oherwydd mae pwyntiau s at y domen a bod lle ar y domen fod ef yn pwyntio at 504 00:39:48,190 --> 00:39:52,320 rhoi syniad inni am mwy o le ar y domen, sy'n cael ei storio "Boom". 505 00:39:52,320 --> 00:39:55,150 Felly, mae hyn copi o "Boom" yn cael ei storio yn y domen. 506 00:39:55,150 --> 00:39:58,780 Mae dechnegol dau gopi o "Boom" yn ein rhaglen. 507 00:39:58,780 --> 00:40:03,500 Mae yr un cyntaf sydd wedi rhoi dim ond gan y cyson llinyn "Boom", 508 00:40:03,500 --> 00:40:09,250 a'r ail gopi o "Boom", strcpy greodd y copi o "Boom". 509 00:40:09,250 --> 00:40:13,100 Ond mae'r copi o "Boom" yn cael ei storio ar y domen, a'r domen rydych chi'n rhydd i newid. 510 00:40:13,100 --> 00:40:17,250 Nid yw'r domen yn darllen yn unig, felly mae hynny'n golygu bod s [0] 511 00:40:17,250 --> 00:40:20,500 yn mynd i adael i chi newid y gwerth o "Boom". 512 00:40:20,500 --> 00:40:23,130 Mae'n mynd i adael i chi newid y cymeriadau. 513 00:40:23,130 --> 00:40:26,640 >> Cwestiynau? 514 00:40:27,740 --> 00:40:29,290 Iawn. 515 00:40:29,290 --> 00:40:35,500 >> Symud ymlaen at buggy3, gadewch i gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Rydym yn unig yn rhedeg a gwelwn ni gael segfault. 517 00:40:39,840 --> 00:40:46,550 Os ydym yn olrheiniad, dim ond dwy swyddogaeth. 518 00:40:46,550 --> 00:40:52,970 Os ydym yn mynd i fyny i mewn i'n prif swyddogaeth, rydym yn gweld ein bod yn segfaulted yn y llinell hon. 519 00:40:52,970 --> 00:41:00,180 Felly, dim ond edrych ar y llinell hon, am (int llinell = 0; fgets y pethau hyn yn NULL nid cyfartal; 520 00:41:00,180 --> 00:41:03,770 llinell + +). 521 00:41:03,770 --> 00:41:08,010 Mae ein ffrâm flaenorol a elwir yn _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Byddwch yn gweld bod llawer gyda adeiledig mewn swyddogaethau C, 523 00:41:10,720 --> 00:41:15,350 pan fyddwch yn cael y segfault, bydd enwau swyddogaeth wirioneddol cryptig 524 00:41:15,350 --> 00:41:18,090 fel hyn _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Ond mae hynny'n mynd i ymwneud â'r alwad hon fgets. 526 00:41:21,770 --> 00:41:25,850 Rhywle y tu mewn yma, rydym yn segfaulting. 527 00:41:25,850 --> 00:41:30,340 Os ydym yn edrych ar y dadleuon i fgets, gallwn argraffu byffer. 528 00:41:30,340 --> 00:41:41,180 Gadewch i ni argraffu fel a - O, na. 529 00:41:48,980 --> 00:41:51,900 Nid Print yn mynd i weithio yn union fel yr wyf am iddo. 530 00:41:55,460 --> 00:41:58,000 Gadewch i ni edrych ar y rhaglen ei hun. 531 00:42:02,200 --> 00:42:09,640 Byffer yn amrywiaeth cymeriad. Mae'n gymeriad amrywiaeth o 128 nod. 532 00:42:09,640 --> 00:42:14,980 Felly, pan fyddaf yn dweud byffer print, mae'n mynd i argraffu rhai 128 nod, 533 00:42:14,980 --> 00:42:18,300 yr wyf yn dyfalu yn yr hyn a ddisgwylir. 534 00:42:18,300 --> 00:42:21,390 Hyn yr oeddwn yn chwilio amdano yw argraffu'r cyfeiriad byffer, 535 00:42:21,390 --> 00:42:23,680 ond nid yw hynny'n wir dweud wrthyf lawer. 536 00:42:23,680 --> 00:42:30,770 Felly, pan fyddaf yn digwydd i ddweud hyd yma x byffer, mae'n dangos i mi 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 sydd, os ydych yn cofio o gyfnod cynharach neu ryw bwynt, Oxbffff yn tueddu i fod yn rhanbarth bentwr-ish. 538 00:42:38,690 --> 00:42:46,020 Mae'r stac yn tueddu i ddechrau yn rhywle ychydig o dan 0xc000. 539 00:42:46,020 --> 00:42:51,890 Dim ond trwy weld y cyfeiriad hwn, yr wyf yn gwybod bod byffer sy'n digwydd ar y pentwr. 540 00:42:51,890 --> 00:43:04,500 Ailddechrau fy rhaglen, a gynhelir, i fyny, clustogi a welsom yn y dilyniant o gymeriadau 541 00:43:04,500 --> 00:43:06,530 sy'n 'n bert lawer ddiystyr. 542 00:43:06,530 --> 00:43:12,270 Yna argraffu ffeil, beth yw ffeil yn edrych fel? 543 00:43:15,120 --> 00:43:17,310 [Myfyrwyr] Null. >> Yeah. 544 00:43:17,310 --> 00:43:22,610 Ffeil yn o * FILE fath, felly mae'n pwyntydd, 545 00:43:22,610 --> 00:43:26,610 a gwerth y pwyntydd yn null. 546 00:43:26,610 --> 00:43:33,240 Felly fgets yn mynd i geisio i ddarllen o'r pwyntydd mewn ffordd anuniongyrchol, 547 00:43:33,240 --> 00:43:37,320 ond er mwyn cael mynediad y pwyntydd, mae'n rhaid iddo dereference iddo. 548 00:43:37,320 --> 00:43:40,550 Neu, er mwyn cael mynediad yr hyn y dylid ei fod yn pwyntio ato, dereferences hynny. 549 00:43:40,550 --> 00:43:43,810 Felly, mae'n dereferencing pwyntydd nwl ac mae'n segfaults. 550 00:43:46,600 --> 00:43:48,730 Gallwn fod wedi ailgychwyn yn y fan honno. 551 00:43:48,730 --> 00:43:52,170 Os ydym yn ei dorri yn ein prif bwynt a rhedeg, 552 00:43:52,170 --> 00:43:57,320 y llinell gyntaf cod yn torgoch * enw ffeil = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Dylai hynny roi awgrym eithaf mawr o ran pam y rhaglen hon yn methu. 554 00:44:00,870 --> 00:44:06,080 Teipio nesaf dod â mi at y llinell nesaf, lle yr wyf yn agor y ffeil, 555 00:44:06,080 --> 00:44:11,140 ac yna yn syth mynd i mewn ein llinell, lle ar ôl i mi daro nesaf, mae'n mynd i segfault. 556 00:44:11,140 --> 00:44:16,880 A oes unrhyw un eisiau i daflu allan rheswm pam y byddwn yn segfaulting? 557 00:44:16,880 --> 00:44:19,130 Nid yw [myfyrwyr] Ffeil yn bodoli. >> Yeah. 558 00:44:19,130 --> 00:44:22,250 Mae hyn yn dybiedig i fod yn awgrym 559 00:44:22,250 --> 00:44:29,570 bod unrhyw un rydych chi'n agor ffeil angen i chi wirio bod y ffeil yn bodoli mewn gwirionedd. 560 00:44:29,570 --> 00:44:31,510 Felly yma, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Pan fyddwn yn enw'r ffeil fopen ar gyfer darllen, bydd wedyn angen i ddweud 562 00:44:34,700 --> 00:44:45,870 os (ffeil == NULL) a dweud printf ("Nid yw'r ffeil yn bodoli!" 563 00:44:45,870 --> 00:44:56,340 neu - yn well eto - enw ffeil); dychwelyd 1; 564 00:44:56,340 --> 00:45:00,300 Felly, nawr rydym yn gwirio i weld os yw'n NULL 565 00:45:00,300 --> 00:45:03,930 cyn mewn gwirionedd yn parhau ac yn ceisio darllen o'r ffeil. 566 00:45:03,930 --> 00:45:08,800 Gallwn ei ail-lunio dim ond i weld fod hynny'n gweithio. 567 00:45:11,020 --> 00:45:14,970 Oeddwn yn bwriadu i gynnwys llinell newydd. 568 00:45:21,090 --> 00:45:25,290 Felly erbyn hyn nid nonexistent.txt yn bodoli. 569 00:45:26,890 --> 00:45:30,040 Dylech bob tro edrych am y math hwn o beth. 570 00:45:30,040 --> 00:45:33,870 Dylech bob amser wirio i weld os fopen dychwelyd null. 571 00:45:33,870 --> 00:45:38,170 Dylech bob amser wirio i wneud yn siŵr nad yw malloc yn dychwelyd NULL, 572 00:45:38,170 --> 00:45:41,410 neu arall rydych segfault. 573 00:45:42,200 --> 00:45:45,930 >> Nawr buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Rhedeg. Rwy'n dyfalu hyn yn aros am fewnbwn neu dolennu o bosibl ddiddiwedd. 575 00:45:58,440 --> 00:46:01,870 Ydy, mae'n dolennu ddiddiwedd. 576 00:46:01,870 --> 00:46:05,560 Felly buggy4. Mae'n edrych fel ein bod dolennu ddiddiwedd. 577 00:46:05,560 --> 00:46:12,590 Gallwn dorri ar y prif, yn rhedeg ein rhaglen. 578 00:46:12,590 --> 00:46:20,180 Yn gdb, cyn belled â bod y talfyriad rydych yn ei ddefnyddio yn ddiamwys 579 00:46:20,180 --> 00:46:23,420 neu dalfyriadau arbennig y maent yn ei ddarparu i chi, 580 00:46:23,420 --> 00:46:29,020 yna gallwch ddefnyddio n defnyddio nesaf yn hytrach na gorfod teipio allan wrth yr holl ffordd. 581 00:46:29,020 --> 00:46:33,730 Ac yn awr fy mod i wedi taro n unwaith, gall Fi jyst daro Enter i gadw i fynd nesaf 582 00:46:33,730 --> 00:46:36,640 yn hytrach na gorfod daro n Mewnbynnu, n Mewnbynnu, n Enter. 583 00:46:36,640 --> 00:46:44,630 Mae'n edrych fel fy mod yn rhyw fath o ddolen i sydd wedi gosod amrywiaeth [i] i 0. 584 00:46:44,630 --> 00:46:50,510 Mae'n edrych fel erioed fy mod yn torri allan o hyn ar gyfer dolen. 585 00:46:50,510 --> 00:46:54,780 Os byddaf yn argraffu i, felly fi yw 2, yna byddaf yn mynd nesaf. 586 00:46:54,780 --> 00:46:59,250 'N annhymerus' argraffu i, fi yn 3, yna byddaf yn mynd nesaf. 587 00:46:59,250 --> 00:47:05,360 'N annhymerus' argraffu i a fi yw 3. Nesaf, argraffu i, i yw 4. 588 00:47:05,360 --> 00:47:14,520 Mewn gwirionedd, print sizeof (array), felly faint o amrywiaeth yw 20. 589 00:47:16,310 --> 00:47:32,870 Ond mae'n edrych fel mae rhywfaint o gorchymyn gdb arbennig ar gyfer mynd nes bod rhywbeth yn digwydd. 590 00:47:32,870 --> 00:47:37,620 Mae fel gosod amod ar y gwerth y newidyn. Ond nid wyf yn cofio yr hyn ydyw. 591 00:47:37,620 --> 00:47:44,100 Felly, os ydym yn dal i fynd - 592 00:47:44,100 --> 00:47:47,120 Beth oeddech chi'n ei ddweud? Beth wnaethoch chi ddod i fyny? 593 00:47:47,120 --> 00:47:50,500 [Myfyrwyr] yw dangos i ychwanegu - >> Yeah. Felly arddangos gallu i helpu. 594 00:47:50,500 --> 00:47:54,530 Os ydym yn unig arddangos i, bydd yn rhoi i fyny dyma beth yw gwerth i yw 595 00:47:54,530 --> 00:47:56,470 felly nid oes rhaid i mi ei hargraffu bob tro. 596 00:47:56,470 --> 00:48:02,930 Os ydym yn unig yn cadw mynd nesaf, rydym yn gweld 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 Mae rhywbeth yn mynd o'i le ofnadwy, a fi yn cael ei ailosod i 0. 598 00:48:13,330 --> 00:48:22,220 O edrych ar buggy4.c, gwelwn cyfan sy'n digwydd yw amrywiaeth int [5]; 599 00:48:22,220 --> 00:48:26,200 ar gyfer (i = 0; i <= sizeof (arae): i + +) 600 00:48:26,200 --> 00:48:28,550 array [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Beth rydyn ni'n gweld bod yn anghywir yma? 602 00:48:31,390 --> 00:48:39,480 Fel awgrym, pan oeddwn yn gwneud y gdb buggy4 - gadewch i ni dorri prif, rhedeg - 603 00:48:39,480 --> 00:48:45,980 Wnes i ddim print sizeof (arae) dim ond i weld beth yw'r cyflwr yn lle y dylai yn olaf torri allan. 604 00:48:47,690 --> 00:48:51,100 Ble ydw i? Wnes i redeg? 605 00:48:51,100 --> 00:48:54,280 Doeddwn i ddim yn datgan eto. 606 00:48:54,280 --> 00:48:58,680 Felly argraffu sizeof (amrywiaeth) a dyna 20, 607 00:48:58,680 --> 00:49:06,690 a ddisgwylir ers fy amrywiaeth o faint 5 a mae'n o 5 cyfanrifau, 608 00:49:06,690 --> 00:49:12,410 felly dylai y peth cyfan yn 5 * sizeof (canolradd) bytes, lle sizeof (canolradd) yn tueddu i fod yn 4. 609 00:49:12,410 --> 00:49:14,780 Felly sizeof (arae) yw 20. 610 00:49:14,780 --> 00:49:17,420 Beth ddylai hyn fod? 611 00:49:17,420 --> 00:49:21,720 [Myfyrwyr] wedi ei rannu â sizeof (canolradd). >> Yeah, / sizeof (canolradd). 612 00:49:21,720 --> 00:49:30,630 Mae'n edrych fel mae dal i fod yn broblem yma. Rwy'n credu y dylai hon fod < 613 00:49:30,630 --> 00:49:36,960 gan ei fod yn 'n bert lawer bob amser byth 00:49:44,860 Nawr, gadewch i ni feddwl am pam fod hyn wedi torri mewn gwirionedd. 615 00:49:44,860 --> 00:49:53,370 A oes unrhyw un wedi dyfalu pam yr oedd i ailosod i 0 drwy bob fersiwn o'r ddolen? 616 00:50:01,300 --> 00:50:09,350 Yr unig beth y tu mewn yma sy'n digwydd yw bod amrywiaeth [i] yn cael ei osod i 0. 617 00:50:09,350 --> 00:50:15,350 Felly, rhywsut, y llinell hon o god yn achosi ein int i gael ei osod i 0. 618 00:50:16,730 --> 00:50:23,130 A allai [myfyrwyr] yn cael ei oherwydd ei fod yn bwysicach y cof am y rhan hon o i 619 00:50:23,130 --> 00:50:27,970 pan fydd yn meddwl ei fod yn elfen nesaf o amrywiaeth? >> [Bowden] Ydw. 620 00:50:27,970 --> 00:50:33,880 Pan fyddwn ni'n mynd y tu hwnt i ddiwedd ein amrywiaeth, 621 00:50:33,880 --> 00:50:39,870 rywsut lle hwnnw ein bod yn bwysicach yn gwrthwneud y gwerth i. 622 00:50:39,870 --> 00:50:48,030 Ac felly os ydym yn edrych i mewn buggy4, torri prif, rhedeg, 623 00:50:48,030 --> 00:50:53,120 gadewch i ni argraffu'r cyfeiriad i. 624 00:50:53,120 --> 00:50:57,280 Mae'n edrych fel ei fod bffff124. 625 00:50:57,280 --> 00:51:03,930 Nawr gadewch i ni argraffu'r cyfeiriad amrywiaeth [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Beth am [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] yn bfff124. 629 00:51:14,530 --> 00:51:26,990 Felly amrywiaeth [5] yn yr un cyfeiriad fel fi, sy'n golygu bod amrywiaeth [5] yn i. 630 00:51:26,990 --> 00:51:30,720 Os oes ganddynt yr un cyfeiriad, maent yn yr un peth. 631 00:51:30,720 --> 00:51:38,410 Felly, pan fyddwn yn gosod amrywiaeth [5] i 0, rydym yn gosod i i 0. 632 00:51:38,410 --> 00:51:46,070 Ac os ydych yn meddwl am hyn o ran y simnai, 633 00:51:46,070 --> 00:51:55,590 int i gael ei ddatgan yn gyntaf, sy'n golygu i cael rhywfaint o le ar y pentwr. 634 00:51:55,590 --> 00:52:04,730 Yna array [5] yn cael ei ddyrannu, felly nag 20 bytes yn cael eu dyrannu ar y pentwr. 635 00:52:04,730 --> 00:52:08,400 Felly, fi yn cael ei ddyrannu yn gyntaf, yna yr 20 bytes cael ddyrannu. 636 00:52:08,400 --> 00:52:11,400 Felly, fi fydd yn digwydd i'r dde cyn y array, 637 00:52:11,400 --> 00:52:19,230 ac oherwydd y ffordd, fel y dywedais yr wythnos diwethaf, pan fo hynny'n dechnegol y pentwr tyfu am i lawr, 638 00:52:19,230 --> 00:52:28,520 pan fyddwch yn fynegai i mewn i amrywiaeth, rydym yn gwarantu fod y sefyllfa 0 yn yr amrywiaeth 639 00:52:28,520 --> 00:52:31,970 bob amser yn digwydd cyn y safle cyntaf yn y rhesi. 640 00:52:31,970 --> 00:52:35,900 Mae hyn yn fath o sut yr wyf yn tynnodd yr wythnos diwethaf. 641 00:52:35,900 --> 00:52:42,210 Sylwch fod ar y gwaelod mae gennym gyfeiriad 0 a ar y brig mae gennym Max gyfeiriad. 642 00:52:42,210 --> 00:52:44,880 Mae'r stac bob amser yn tyfu i lawr. 643 00:52:48,100 --> 00:52:53,500 Lets 'ddeud yr ydym yn dyrannu i. 644 00:52:53,500 --> 00:52:59,680 Rydym yn neilltuo cyfanrif i, sy'n golygu gadewch i 'jyst dweud yma cyfanrif i yn cael ei ddyrannu. 645 00:52:59,680 --> 00:53:06,420 Yna yr ydym yn dyrannu ein amrywiaeth o 5 cyfanrifau, sy'n golygu bod o dan hynny, 646 00:53:06,420 --> 00:53:11,230 gan fod y pentwr yn tyfu i lawr, rhai 5 cyfanrif yn cael eu dyrannu. 647 00:53:11,230 --> 00:53:15,900 Ond oherwydd y ffordd y araeau yn gweithio, rydym yn gwarantu bod y safle cyntaf yn y casgliad 648 00:53:15,900 --> 00:53:22,260 bob amser hwnnw gyfeiriad llai na'r ail beth yn y rhesi. 649 00:53:22,260 --> 00:53:28,270 Felly 0 sefyllfa amrywiaeth bob amser i ddigwydd yn gyntaf er cof, 650 00:53:28,270 --> 00:53:30,700 tra bod 1 Sefyllfa amrywiaeth rhaid i ddigwydd ar ôl hynny 651 00:53:30,700 --> 00:53:33,310 a 2 safle array rhaid i ddigwydd ar ôl hynny, 652 00:53:33,310 --> 00:53:37,900 sy'n golygu y byddai amrywiaeth 0 sefyllfa yn digwydd yn rhywle i lawr yma, 653 00:53:37,900 --> 00:53:40,690 byddai 1 swydd amrywiaeth yn digwydd uwch na'r hyn a 654 00:53:40,690 --> 00:53:45,530 oherwydd gall symud i fyny yn golygu cyfeiriadau yn uwch ers i'r cyfeiriad mwyaf yw i fyny yma. 655 00:53:45,530 --> 00:53:50,490 Felly amrywiaeth [0] i lawr yma, array [1] i fyny yma, array [2] i fyny yma, array [3] i fyny yma. 656 00:53:50,490 --> 00:53:55,620 Hysbysiad sut cyn i ni ddyrannu cyfanrif i holl ffordd i fyny yma, 657 00:53:55,620 --> 00:54:01,040 wrth i ni symud ymhellach ac ymhellach i mewn i'n amrywiaeth, rydym yn dod yn nes ac yn nes at ein cyfanrif i. 658 00:54:01,040 --> 00:54:07,640 Fel mae'n digwydd bod amrywiaeth [5], sy'n un sefyllfa y tu hwnt i'n array, 659 00:54:07,640 --> 00:54:13,010 yn union ble i gyfanrif digwydd i'w ddyrannu. 660 00:54:13,010 --> 00:54:16,920 Felly, dyna'r pwynt lle rydym yn digwydd bod yn taro y gofod ar y pentwr 661 00:54:16,920 --> 00:54:21,680 a ddyrannwyd ar gyfer cyfanrif i, ac rydym yn gosod y i 0. 662 00:54:21,680 --> 00:54:26,160 >> Dyna sut mae hynny'n gweithio. Cwestiynau? Yeah. 663 00:54:26,160 --> 00:54:30,710 [Myfyrwyr] Peidiwch byth â meddwl. Iawn. 664 00:54:30,710 --> 00:54:33,090 [Myfyrwyr] Sut ydych chi'n osgoi y math yma o wallau? 665 00:54:33,090 --> 00:54:41,190 Mae'r rhain yn fath o wallau? Peidiwch â defnyddio C fel eich iaith raglennu. 666 00:54:41,190 --> 00:54:45,840 Defnyddiwch iaith sydd â ffiniau amrywiaeth gwirio. 667 00:54:45,840 --> 00:54:55,900 Cyn belled ag y byddwch chi'n ofalus, 'ch jyst angen i osgoi mynd heibio ffiniau eich casgliad. 668 00:54:55,900 --> 00:54:58,300 [Myfyrwyr] Felly dyma pan fyddwn yn mynd heibio i ffiniau eich amrywiaeth - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Dyna ble mae pethau yn dechrau mynd o'i le. >> [Myfyrwyr] O, iawn. 670 00:55:01,840 --> 00:55:05,730 Cyn belled ag y byddwch yn aros o fewn y cof dyrannu ar gyfer eich array, eich bod yn iawn. 671 00:55:05,730 --> 00:55:12,400 Ond C ni wna unrhyw wirio gwall. Os byddaf yn gwneud amrywiaeth [1000], bydd yn llawen dim ond addasu beth bynnag sy'n digwydd - 672 00:55:12,400 --> 00:55:16,500 Mae'n mynd i ddechrau'r array, yna mae'n mynd ar ôl 1000 swyddi ac yn gosod i 0. 673 00:55:16,500 --> 00:55:20,000 Nid yw'n gwneud unrhyw gwirio nad oh, nid yw hyn yn mewn gwirionedd yn wedi 1000 bethau ynddo. 674 00:55:20,000 --> 00:55:22,750 1000 ymhell y tu hwnt yr hyn y dylwn ei newid, 675 00:55:22,750 --> 00:55:26,940 tra Java neu rywbeth fe gewch amrywiaeth yn waharddedig mynegai 676 00:55:26,940 --> 00:55:29,820 neu fynegai y tu allan i ffiniau eithriad. 677 00:55:29,820 --> 00:55:33,950 Dyna pam mae llawer o ieithoedd ar lefel uwch yn cael y pethau hyn 678 00:55:33,950 --> 00:55:37,340 lle os byddwch yn mynd y tu hwnt i ffiniau'r array, byddwch yn methu 679 00:55:37,340 --> 00:55:40,070 fel nad oes modd i chi newid pethau o dan eich 680 00:55:40,070 --> 00:55:42,590 ac yna pethau'n mynd yn waeth o lawer na dim ond cael eithriad 681 00:55:42,590 --> 00:55:44,940 dweud eich bod yn mynd y tu hwnt i ddiwedd y rhesi. 682 00:55:44,940 --> 00:55:50,970 [Myfyrwyr] A ddylai felly rydym wedi newid dim ond y <= i ychydig > [Bowden] Yeah. 683 00:55:50,970 --> 00:55:54,800 Dylai fod yn 00:55:59,560 ers sizeof (arae) yw 20, ond dim ond am 5. >> [Myfyrwyr] Hawl. 685 00:55:59,560 --> 00:56:04,060 Mwy o gwestiynau? Iawn. 686 00:56:04,060 --> 00:56:07,380 >> [Myfyrwyr] Mae gen i gwestiwn. >> Yeah. 687 00:56:07,380 --> 00:56:16,440 [Myfyrwyr] Beth yw'r newidyn amrywiaeth gwirioneddol? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Fel beth yw amrywiaeth? 689 00:56:20,000 --> 00:56:24,930 Array ei hun yn symbol. 690 00:56:24,930 --> 00:56:31,490 Mae'n dim ond y cyfeiriad y dechrau yr 20 bytes yr ydym yn eu cyfeirio. 691 00:56:31,490 --> 00:56:38,070 Gallwch feddwl amdano fel pwyntydd, ond mae'n rhoi syniad cyson. 692 00:56:38,070 --> 00:56:44,140 Cyn gynted ag pethau'n cael eu llunio, nid yw'r casgliad amrywiol yn bodoli anymore. 693 00:56:44,140 --> 00:56:48,210 [Myfyrwyr] Felly, sut mae'n dod o hyd i'r faint o amrywiaeth? 694 00:56:48,210 --> 00:56:54,130 Maint o amrywiaeth yn cyfeirio at faint y bloc bod y symbol yn cyfeirio at. 695 00:56:54,130 --> 00:57:01,240 Pan fyddaf yn gwneud rhywbeth fel printf ("% p \ n", array); 696 00:57:01,240 --> 00:57:05,140 gadewch i ni redeg. 697 00:57:12,960 --> 00:57:15,530 Beth wnes i jyst yn ei wneud o'i le? 698 00:57:15,530 --> 00:57:19,220 'Array' Array datgan yma. 699 00:57:20,820 --> 00:57:23,200 O, i fyny yma. 700 00:57:23,200 --> 00:57:31,250 Clang yn glyfar, ac mae'n digwydd i sylwi fy mod yn datgan y casgliad fel 5 elfen 701 00:57:31,250 --> 00:57:34,540 ond rwy'n mynegeio i mewn i sefyllfa 1000. 702 00:57:34,540 --> 00:57:38,450 Gall wneud hynny oherwydd bod yn unig yw'r rhain gysonion. 703 00:57:38,450 --> 00:57:43,370 Gall dim ond fynd mor bell yn sylwi fy mod yn mynd y tu hwnt i ffiniau'r y rhesi. 704 00:57:43,370 --> 00:57:46,880 Ond cyn i sylwi pan oedd gennym i fod yn anghywir, 705 00:57:46,880 --> 00:57:51,040 Ni all fod o bosibl yn penderfynu faint o werthoedd gallai i gymryd ar, 706 00:57:51,040 --> 00:57:55,540 felly ni all benderfynu bod fi yn mynd tu hwnt i ddiwedd y rhesi. 707 00:57:55,540 --> 00:57:59,430 Dyna Clang fod yn glyfar. 708 00:57:59,430 --> 00:58:03,340 >> Ond yn awr yn gwneud buggy4. Felly beth arall ydw i'n ei wneud o'i le? 709 00:58:03,340 --> 00:58:05,970 Ymhlyg yn datgan swyddogaeth llyfrgell 'printf'. 710 00:58:05,970 --> 00:58:14,960 Rydw i'n mynd i eisiau i # cynnwys . 711 00:58:14,960 --> 00:58:18,710 Iawn. Nawr yn rhedeg buggy4. 712 00:58:18,710 --> 00:58:24,840 Argraffu gwerth yr amrywiaeth fel y gwnes i yma, ei brintio fel pwyntydd 713 00:58:24,840 --> 00:58:30,060 printiau rhywbeth sy'n edrych fel hyn - bfb8805c - sydd tua gyfeiriad 714 00:58:30,060 --> 00:58:33,450 sydd yn y rhanbarth pentwr-ish. 715 00:58:33,450 --> 00:58:41,820 Array ei hun fel pwyntydd, ond nid yw'n pwyntydd go iawn, 716 00:58:41,820 --> 00:58:45,410 gan fod pwyntydd rheolaidd gallwn newid. 717 00:58:45,410 --> 00:58:54,700 Array yn unig yw rhai cyson. Mae'r 20 blociau o gof yn dechrau am 0xbfb8805c cyfeiriad. 718 00:58:54,700 --> 00:59:09,020 Felly bfb8805c drwy'r cyfeiriad +20--neu yr wyf yn dyfalu -20 - 719 00:59:09,020 --> 00:59:17,400 yw pob un o'r cof dyrannu ar gyfer y casgliad. 720 00:59:17,400 --> 00:59:20,350 Array, nid yw'r newidyn ei hun yn cael ei storio yn unrhyw le. 721 00:59:20,350 --> 00:59:27,660 Pan fyddwch chi'n casglu, y casglwr - don llaw arno - 722 00:59:27,660 --> 00:59:33,060 ond bydd y casglwr yn ei ddefnyddio lle mae'n gwybod amrywiaeth i fod. 723 00:59:33,060 --> 00:59:36,090 Mae'n gwybod i ble mae'r amrywiaeth yn dechrau, 724 00:59:36,090 --> 00:59:40,910 ac felly mae'n gallu bob amser yn unig yn gwneud pethau yn nhermau gwrthbwyso o'r dechrau. 725 00:59:40,910 --> 00:59:43,960 Nid oes angen newidyn ei hun i gynrychioli amrywiaeth. 726 00:59:43,960 --> 00:59:53,730 Ond pan fyddaf yn gwneud rhywbeth fel int * p = array; yn awr p yn pwyntydd sy'n cyfeirio at y array, 727 00:59:53,730 --> 00:59:57,830 ac yn awr p mewn gwirionedd yn bodoli ar y pentwr. 728 00:59:57,830 --> 01:00:01,950 Rwy'n rhad ac am ddim i newid t. Gallaf ei wneud p = malloc. 729 01:00:01,950 --> 01:00:06,500 Felly, yn wreiddiol yn tynnu sylw at amrywiaeth, yn awr mae'n cyfeirio at ychydig o le ar y domen. 730 01:00:06,500 --> 01:00:09,620 Ni allaf wneud amrywiaeth = malloc. 731 01:00:09,620 --> 01:00:13,710 Os Clang yn glyfar, bydd yn gweiddi arnaf dde oddi ar y ystlumod. 732 01:00:17,000 --> 01:00:21,430 A dweud y gwir, rwy'n eithaf siwr y byddai gcc wneud hyn hefyd. 733 01:00:21,430 --> 01:00:25,010 Felly fath array 'int [5]' Nid yn aseiniadwy. 734 01:00:25,010 --> 01:00:28,040 Ni allwch neilltuo rhywbeth i fath amrywiaeth 735 01:00:28,040 --> 01:00:30,500 oherwydd amrywiaeth yn unig yw gyson. 736 01:00:30,500 --> 01:00:34,760 Mae'n symbol sy'n cyfeiriadau yr 20 bytes. Nid wyf yn gallu ei newid. 737 01:00:34,760 --> 01:00:37,690 >> [Myfyrwyr] A ble mae'r maint y rhesi storio? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Dyw hi ddim yn cael ei storio yn unrhyw le. Mae'n pan fydd yn llunio. 739 01:00:40,670 --> 01:00:46,310 Felly, ble mae'r maint o amrywiaeth storio? 740 01:00:46,310 --> 01:00:51,870 Gallwch ddefnyddio sizeof (arae) tu mewn i'r swyddogaeth y mae'r casgliad yn cael ei ddatgan ei hun. 741 01:00:51,870 --> 01:01:03,150 Felly, os wyf yn gwneud rhywfaint o swyddogaeth, foo, ac yr wyf yn ei wneud (int array []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (arae)); 743 01:01:10,450 --> 01:01:21,330 ac yna i lawr yma galwaf foo (arae); 744 01:01:21,330 --> 01:01:24,840 tu mewn swyddogaeth hon - gadewch i ni redeg. 745 01:01:34,200 --> 01:01:36,840 Mae hyn yn Clang fod yn glyfar eto. 746 01:01:36,840 --> 01:01:43,890 Mae'n dweud wrthyf fod sizeof ar paramedr swyddogaeth amrywiaeth 747 01:01:43,890 --> 01:01:46,690 bydd yn dychwelyd maint o '* int'. 748 01:01:46,690 --> 01:01:55,150 Byddai hyn yn gwall os nad yw'n hyn yr wyf eisiau iddo ddigwydd. 749 01:01:55,150 --> 01:01:58,960 Gadewch i ni mewn gwirionedd yn diffodd Werror. 750 01:02:14,950 --> 01:02:17,590 Rhybudd. Rhybuddion yn iawn. 751 01:02:17,590 --> 01:02:19,960 Bydd yn dal i lunio cyn belled â'i fod yn cael rhybudd. 752 01:02:19,960 --> 01:02:22,910 . / A.out yn mynd i argraffu 4. 753 01:02:22,910 --> 01:02:28,650 Mae'r rhybudd a gynhyrchwyd yn ddangosydd clir o'r hyn a aeth o'i le. 754 01:02:28,650 --> 01:02:34,120 Mae'r amrywiaeth int yn unig yn mynd i argraffu sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Hyd yn oed os wyf yn rhoi amrywiaeth [5] i mewn yma, mae'n dal i jyst yn mynd i argraffu sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Felly, cyn gynted ag y byddwch yn ei drosglwyddo i mewn i swyddogaeth, mae'r gwahaniaeth rhwng araeau ac awgrymiadau 757 01:02:47,440 --> 01:02:49,670 yn ddim yn bodoli. 758 01:02:49,670 --> 01:02:52,640 Mae hyn yn digwydd i fod yn amrywiaeth a datgan ar y simnai, 759 01:02:52,640 --> 01:02:58,300 ond cyn gynted ag y byddwn yn rhoi y gwerth, y 0xbf blah, blah, blah yn y swyddogaeth hon, 760 01:02:58,300 --> 01:03:03,350 yna mae hyn pwyntydd cyfeirio at y casgliad ar y pentwr. 761 01:03:03,350 --> 01:03:08,310 Felly golyga hyn bod sizeof ond yn berthnasol yn y swyddogaeth y mae'r amrywiaeth gael ei ddatgan, 762 01:03:08,310 --> 01:03:11,230 sy'n golygu, pan fyddwch yn casglu swyddogaeth hon, 763 01:03:11,230 --> 01:03:17,330 pan Clang mynd drwy'r swyddogaeth hon, mae'n gweld amrywiaeth yn int amrywiaeth o ran maint 5. 764 01:03:17,330 --> 01:03:20,640 Felly, yna mae'n gweld sizeof (arae). Wel, dyna 20. 765 01:03:20,640 --> 01:03:26,440 Dyna mewn gwirionedd sut y sizeof yn y bôn yn gweithio ar gyfer bron pob achos. 766 01:03:26,440 --> 01:03:31,150 Nid yw Sizeof yn swyddogaeth; ei fod yn weithredwr. 767 01:03:31,150 --> 01:03:33,570 Nid ydych yn galw swyddogaeth sizeof. 768 01:03:33,570 --> 01:03:38,280 Sizeof (canolradd), bydd y casglwr yn unig drosi hynny i 4. 769 01:03:41,480 --> 01:03:43,700 Got hyn? Iawn. 770 01:03:43,700 --> 01:03:47,520 >> [Myfyrwyr] Felly beth yw'r gwahaniaeth rhwng sizeof (arae) yn y brif ac yn foo? 771 01:03:47,520 --> 01:03:52,840 Mae hyn oherwydd ein bod yn dweud sizeof (array), sydd o * int fath, 772 01:03:52,840 --> 01:03:57,120 tra bod y casgliad i lawr yma yw nid * int fath, mae'n arae int. 773 01:03:57,120 --> 01:04:04,540 >> [Myfyrwyr] Felly, os ydych wedi cael y paramedr mewn amrywiaeth [] yn hytrach na amrywiaeth * int, 774 01:04:04,540 --> 01:04:09,230 Byddai hynny'n golygu y gallech ddal i newid amrywiaeth oherwydd erbyn hyn mae'n pwyntydd? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Fel hyn? >> [Myfyrwyr] Yeah. Allwch chi newid amrywiaeth o fewn y swyddogaeth nawr? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Gallech newid amrywiaeth yn y ddau achos. 777 01:04:18,420 --> 01:04:23,130 Yn y ddau achos hyn rydych yn rhydd i ddweud amrywiaeth [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Myfyrwyr] Ond gallwch wneud pwynt amrywiaeth i rywbeth arall? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Yeah. Yn y naill achos neu'r llall - >> [myfyrwyr] Yeah. 780 01:04:30,230 --> 01:04:38,410 [Bowden] Mae'r gwahaniaeth rhwng amrywiaeth [] ac amrywiaeth * int, nid oes dim. 781 01:04:38,410 --> 01:04:42,570 Gallwch hefyd gael rhywfaint o amrywiaeth amlddimensiwn yma 782 01:04:42,570 --> 01:04:47,050 ar gyfer rhai cystrawen cyfleus, ond mae'n dal i fod dim ond pwyntydd. 783 01:04:47,050 --> 01:04:56,400 Mae hyn yn golygu fy mod yn rhydd i wneud array = malloc (sizeof (canolradd)); ac yn awr pwyntio rhywle arall. 784 01:04:56,400 --> 01:04:59,610 Ond yn union fel sut mae hyn yn gweithio am byth a bob amser, 785 01:04:59,610 --> 01:05:03,210 newid y casgliad trwy ei gwneud yn cyfeirio at rywbeth arall 786 01:05:03,210 --> 01:05:07,570 nid yw'n newid y casgliad i lawr yma am ei fod yn gopi o'r ddadl, 787 01:05:07,570 --> 01:05:10,780 nid yw'n rhoi syniad inni am y ddadl honno. 788 01:05:10,780 --> 01:05:16,070 Ac mewn gwirionedd, yn union fel arwydd mwy ei fod yn union yr un fath - 789 01:05:16,070 --> 01:05:21,100 rydym eisoes yn gweld yr hyn a phrintiau argraffu amrywiaeth - 790 01:05:21,100 --> 01:05:31,410 beth os ydym yn argraffu'r cyfeiriad y rhesi neu gyfeiriad y cyfeiriad y rhesi 791 01:05:31,410 --> 01:05:36,290 naill ai o'r rheiny? 792 01:05:41,770 --> 01:05:45,220 Gadewch i ni anwybyddu'r hwn. 793 01:05:48,140 --> 01:05:51,660 Iawn. Mae hyn yn iawn. Mae'n awr yn rhedeg. / A.out. 794 01:05:51,660 --> 01:06:00,220 Array argraffu, ac yna argraffu'r cyfeiriad y rhesi, yn yr un peth. 795 01:06:00,220 --> 01:06:02,870 Array nid yn unig yn bodoli. 796 01:06:02,870 --> 01:06:08,190 Mae'n gwybod pan fyddwch chi'n argraffu array, rydych yn argraffu'r symbol sy'n cyfeirio at yr 20 bytes. 797 01:06:08,190 --> 01:06:11,940 Argraffu y cyfeiriad y rhesi, wel, nid amrywiaeth yn bodoli. 798 01:06:11,940 --> 01:06:17,200 Nid oes ganddo gyfeiriad, felly mae'n dim ond argraffu'r cyfeiriad o blith yr 20 bytes. 799 01:06:20,820 --> 01:06:28,150 Cyn gynted ag y byddwch yn llunio i lawr, fel yn eich buggy4 luniwyd. / A.out, 800 01:06:28,150 --> 01:06:30,340 amrywiaeth yn ddim yn bodoli. 801 01:06:30,340 --> 01:06:33,640 Pointers bodoli. Nid yw araeau wneud. 802 01:06:34,300 --> 01:06:38,060 Mae blociau o gof sy'n cynrychioli amrywiaeth yn dal i fodoli, 803 01:06:38,060 --> 01:06:43,270 ond nid yr amrywiaeth amrywiol a newidynnau o'r fath yn bodoli. 804 01:06:46,260 --> 01:06:50,270 Dyna fel y prif wahaniaethau rhwng araeau ac awgrymiadau 805 01:06:50,270 --> 01:06:55,590 yn cael eu cyn gynted ag y byddwch yn gwneud galwadau swyddogaeth, nid oes gwahaniaeth. 806 01:06:55,590 --> 01:07:00,460 Ond tu mewn i'r swyddogaeth y mae'r casgliad ei hun yn ei ddatgan, sizeof yn gweithio yn wahanol 807 01:07:00,460 --> 01:07:05,190 ers i chi yn argraffu maint y blociau yn hytrach na maint y math, 808 01:07:05,190 --> 01:07:08,950 ac ni allwch ei newid am ei fod yn symbol. 809 01:07:08,950 --> 01:07:14,370 Argraffu y peth a chyfeiriad y peth printiau yr un peth. 810 01:07:14,370 --> 01:07:18,480 A dyna 'n bert lawer iddo. 811 01:07:18,480 --> 01:07:20,820 [Myfyrwyr] Allech chi ddweud bod un mwy o amser? 812 01:07:21,170 --> 01:07:24,170 Efallai fy mod wedi colli rhywbeth. 813 01:07:24,170 --> 01:07:29,260 Amrywiaeth Argraffu a chyfeiriad amrywiaeth yn argraffu'r un peth, 814 01:07:29,260 --> 01:07:33,180 ond os ydych yn argraffu pwyntydd yn erbyn cyfeiriad y pwyntydd, 815 01:07:33,180 --> 01:07:36,010 yr un peth yn argraffu'r cyfeiriad hyn yr ydych yn cyfeirio at, 816 01:07:36,010 --> 01:07:40,360 y llall yn argraffu'r cyfeiriad y pwyntydd ar y pentwr. 817 01:07:40,360 --> 01:07:47,040 Gallwch newid pwyntydd, nad ydych yn gallu newid yn symbol arae. 818 01:07:47,740 --> 01:07:53,270 Ac sizeof pwyntydd yn mynd i argraffu faint y math pwyntydd. 819 01:07:53,270 --> 01:07:57,470 Felly int * p sizeof (p) yn mynd i argraffu 4, 820 01:07:57,470 --> 01:08:04,110 ond int array [5] print sizeof (arae) yn mynd i argraffu 20. 821 01:08:04,110 --> 01:08:07,480 [Myfyrwyr] Felly, int array [5] yn argraffu 20? >> Ydy. 822 01:08:07,480 --> 01:08:13,300 Dyna pam y tu mewn o buggy4 pryd yr arferai fod sizeof (arae) 823 01:08:13,300 --> 01:08:16,660 hyn yn ei wneud i <20, nad yw hyn yr ydym ei eisiau. 824 01:08:16,660 --> 01:08:20,880 Rydym am i <5. >> [Myfyrwyr] Iawn. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Ac yna cyn gynted ag y byddwch yn dechrau pasio yn y swyddogaethau, 826 01:08:25,569 --> 01:08:34,340 os ydym yn gwneud int * p = array; 827 01:08:34,340 --> 01:08:39,779 y tu mewn swyddogaeth hon, gallwn ddefnyddio bôn p ac amrywiaeth yn union yr un ffordd, 828 01:08:39,779 --> 01:08:43,710 heblaw am y broblem sizeof a'r broblem sy'n newid. 829 01:08:43,710 --> 01:08:49,810 Ond p [0] = 1; yr un fath â dweud array [0] = 1; 830 01:08:49,810 --> 01:08:55,600 A chyn gynted ag yr ydym yn dweud foo (arae), neu foo (p); 831 01:08:55,600 --> 01:08:59,760 tu mewn i'r swyddogaeth foo, dyma'r alwad un ddwywaith. 832 01:08:59,760 --> 01:09:03,350 Nid oes unrhyw wahaniaeth rhwng y ddwy alwad. 833 01:09:07,029 --> 01:09:11,080 >> Mae pawb yn dda ar hynny? Iawn. 834 01:09:14,620 --> 01:09:17,950 Mae gennym 10 munud. 835 01:09:17,950 --> 01:09:28,319 >> Byddwn yn ceisio cael drwy'r Typer Hacker rhaglen, 836 01:09:28,319 --> 01:09:32,350 y wefan hon, a ddaeth allan y flwyddyn ddiwethaf neu rywbeth. 837 01:09:34,149 --> 01:09:41,100 Mae 'n dybiedig yn unig i fod yn debyg i chi ei deipio ar hap ac y bydd yn argraffu allan - 838 01:09:41,100 --> 01:09:46,729 Beth bynnag ffeil mae'n digwydd i fod wedi eu llwytho yn yr hyn y mae'n edrych fel eich bod yn teipio. 839 01:09:46,729 --> 01:09:52,069 Mae'n edrych fel rhyw fath o god system weithredu. 840 01:09:53,760 --> 01:09:56,890 Dyna beth yr ydym am ei weithredu. 841 01:10:08,560 --> 01:10:11,690 Dylai fod gennych gweithredadwy deuaidd a enwir hacker_typer 842 01:10:11,690 --> 01:10:14,350 sy'n cymryd mewn dadl sengl, y ffeil i "fath haciwr." 843 01:10:14,350 --> 01:10:16,480 Dylai Rhedeg y cyflawnadwy clirio'r sgrin 844 01:10:16,480 --> 01:10:20,850 ac yna ei argraffu ar un cymeriad o'r ffeil basio i mewn bob tro y mae'r defnyddiwr yn pwyso allweddol. 845 01:10:20,850 --> 01:10:24,990 Felly, beth bynnag allweddol fyddwch yn y wasg, dylai ei daflu i ffwrdd ac yn lle argraffu cymeriad o'r ffeil 846 01:10:24,990 --> 01:10:27,810 hynny yw y ddadl. 847 01:10:29,880 --> 01:10:34,350 'N annhymerus' 'n bert lawer yn dweud wrthych beth y pethau yr ydym yn mynd i angen i chi wybod yn. 848 01:10:34,350 --> 01:10:36,440 Ond rydym am edrych ar y llyfrgell termios. 849 01:10:36,440 --> 01:10:44,840 Nid wyf erioed wedi defnyddio'r llyfrgell yn fy mywyd cyfan, felly mae wedi ddibenion fach iawn. 850 01:10:44,840 --> 01:10:48,610 Ond mae hyn yn mynd i fod y llyfrgell gallwn ei ddefnyddio i daflu i ffwrdd y cymeriad chi daro 851 01:10:48,610 --> 01:10:52,390 pan fyddwch yn teipio i mewn i safon mewn 852 01:10:56,970 --> 01:11:05,840 Felly hacker_typer.c, ac rydym yn mynd i eisiau i # gynnwys . 853 01:11:05,840 --> 01:11:12,870 O edrych ar y dudalen dyn am termios - I'm dyfalu ei derfynell OS neu rywbeth - 854 01:11:12,870 --> 01:11:16,240 Nid wyf yn gwybod sut i ddarllen. 855 01:11:16,240 --> 01:11:21,040 Edrych ar hyn, mae'n dweud i gynnwys y 2 ffeil, felly byddwn yn gwneud hynny. 856 01:11:37,620 --> 01:11:46,820 >> Y peth cyntaf yn gyntaf, rydym am eu cymryd wrth dadl sengl, sef y ffeil dylem agor. 857 01:11:46,820 --> 01:11:52,420 Felly, beth ydw i eisiau ei wneud? Sut ydw i'n gwirio i weld gen i ddadl sengl? 858 01:11:52,420 --> 01:11:56,480 [Myfyrwyr] Os argc yn dychwelyd iddo. >> [Bowden] Yeah. 859 01:11:56,480 --> 01:12:21,250 Felly, os (argc = 2!) Printf ("defnydd:% s [Ffeil i agor]"). 860 01:12:21,250 --> 01:12:32,750 Felly, nawr os byddaf yn rhedeg hyn heb ddarparu ail ddadl - oh, yr wyf angen y llinell newydd - 861 01:12:32,750 --> 01:12:36,240 byddwch yn gweld ei fod yn dweud defnydd:. / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 ac yna dylai'r ail ddadl yn y ffeil gallaf eisiau agor. 863 01:12:58,430 --> 01:13:01,260 Nawr beth ddylwn i ei wneud? 864 01:13:01,260 --> 01:13:08,490 Rwyf am i ddarllen o'r ffeil hon. Sut ydw i'n darllen o ffeil? 865 01:13:08,490 --> 01:13:11,920 [Myfyrwyr] Byddwch yn agor ei gyntaf. >> Yeah. 866 01:13:11,920 --> 01:13:15,010 Felly fopen. Beth mae fopen yn edrych fel? 867 01:13:15,010 --> 01:13:22,980 [Myfyrwyr] Filename. >> [Bowden] Filename yn mynd i fod argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Myfyrwyr] Ac yna beth rydych am ei wneud ag ef, felly y - >> [Bowden] Yeah. 869 01:13:26,110 --> 01:13:28,740 Felly os nad ydych yn cofio, dim ond gallech wneud fopen dyn, 870 01:13:28,740 --> 01:13:32,960 lle mae'n mynd i fod yn llwybr * torgoch Etholaeth lle mae'r llwybr yn enw'r ffeil, 871 01:13:32,960 --> 01:13:34,970 modd * torgoch Etholaeth. 872 01:13:34,970 --> 01:13:38,660 Os ydych yn digwydd i ddim yn cofio pa fodd, yna gallwch chi chwilio am fodd. 873 01:13:38,660 --> 01:13:44,660 Y tu mewn o dudalennau dyn, y cymeriad slaes yn yr hyn y gallwch ei ddefnyddio i chwilio am bethau. 874 01:13:44,660 --> 01:13:49,790 Felly, yr wyf deipio / fodd i chwilio am modd. 875 01:13:49,790 --> 01:13:57,130 n ac E yn yr hyn y gallwch ei ddefnyddio i feicio drwy gemau chwilio. 876 01:13:57,130 --> 01:13:59,800 Yma, mae'n dweud y pwyntiau ddadl modd i linyn 877 01:13:59,800 --> 01:14:01,930 ddechrau gydag un o'r dilyniannau canlynol. 878 01:14:01,930 --> 01:14:06,480 Felly r, ffeil testun Agored ar gyfer darllen. Dyna beth yr ydym am ei wneud. 879 01:14:08,930 --> 01:14:13,210 Am ddarllen, ac rwyf am i storio hynny. 880 01:14:13,210 --> 01:14:18,720 Y peth yw mynd i fod yn * FILE. Nawr beth ydw i eisiau ei wneud? 881 01:14:18,720 --> 01:14:21,200 Rhowch i mi ail. 882 01:14:28,140 --> 01:14:30,430 Iawn. Nawr beth ydw i eisiau ei wneud? 883 01:14:30,430 --> 01:14:32,940 [Myfyrwyr] Edrychwch i weld a yw'n null. >> [Bowden] Yeah. 884 01:14:32,940 --> 01:14:38,690 Unrhyw bryd y byddwch yn agor ffeil, gwnewch yn siŵr eich bod yn llwyddiannus yn gallu ei agor. 885 01:14:58,930 --> 01:15:10,460 >> Nawr rwyf am wneud hynny pethau termios i ble yr hoffwn yn gyntaf ddarllen fy gosodiadau cyfredol 886 01:15:10,460 --> 01:15:14,050 ac arbed rhai i mewn i rywbeth, yna rwyf am newid fy lleoliadau 887 01:15:14,050 --> 01:15:19,420 i daflu i ffwrdd unrhyw gymeriad fy mod yn teipio, 888 01:15:19,420 --> 01:15:22,520 ac yna rwyf am i ddiweddaru y lleoliadau hynny. 889 01:15:22,520 --> 01:15:27,250 Ac yna ar ddiwedd y rhaglen, yr wyf am newid yn ôl i fy lleoliadau gwreiddiol. 890 01:15:27,250 --> 01:15:32,080 Felly, mae'r strwythur yn mynd i fod o termios fath, ac yr wyf i'n mynd i eisiau dau o'r rheiny. 891 01:15:32,080 --> 01:15:35,600 Mae'r un cyntaf yn mynd i fod fy current_settings, 892 01:15:35,600 --> 01:15:42,010 ac yna maent yn mynd i fod fy hacker_settings. 893 01:15:42,010 --> 01:15:48,070 Yn gyntaf, yr wyf i'n mynd i am arbed fy gosodiadau cyfredol, 894 01:15:48,070 --> 01:15:53,790 yna rwy'n mynd i eisiau i ddiweddaru hacker_settings, 895 01:15:53,790 --> 01:16:01,570 ac yna ffordd ar ddiwedd fy rhaglen, yr wyf eisiau dychwelyd i'r gosodiadau cyfredol. 896 01:16:01,570 --> 01:16:08,660 Felly arbed gosodiadau cyfredol, y ffordd sy'n gweithio, termios dyn ni. 897 01:16:08,660 --> 01:16:15,810 Rydym yn gweld bod gennym y tcsetattr int, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Rwy'n pasio mewn strwythur termios gan ei pwyntydd. 899 01:16:22,960 --> 01:16:30,640 Mae'r ffordd y bydd hyn yn edrych yn - I've anghofio eisoes beth yw swyddogaeth ei alw. 900 01:16:30,640 --> 01:16:34,930 Copïwch a gludwch ef. 901 01:16:39,150 --> 01:16:45,500 Felly tcgetattr, yna rwyf am i basio yn y strwythur fy mod yn arbed y wybodaeth i mewn, 902 01:16:45,500 --> 01:16:49,650 sydd yn mynd i fod yn current_settings, 903 01:16:49,650 --> 01:16:59,120 ac mae'r ddadl gyntaf yw'r disgrifydd ffeil ar gyfer y peth yr wyf am gadw'r nodweddion. 904 01:16:59,120 --> 01:17:04,360 Beth mae'r disgrifydd ffeil yn debyg i unrhyw tro y byddwch yn agor ffeil, ei fod yn cael disgrifydd ffeil. 905 01:17:04,360 --> 01:17:14,560 Pan fyddaf yn fopen argv [1], ei fod yn cael disgrifydd ffeil yr ydych yn cyfeirio 906 01:17:14,560 --> 01:17:16,730 pryd bynnag y dymunwch i ddarllen neu ysgrifennu ato. 907 01:17:16,730 --> 01:17:19,220 Nid dyna'r disgrifydd ffeil Rwyf eisiau defnyddio yma. 908 01:17:19,220 --> 01:17:21,940 Mae tri disgrifiadau ffeil sydd gennych yn ddiofyn, 909 01:17:21,940 --> 01:17:24,310 sy'n safonol mewn, allan safonol, a gwallau safonol. 910 01:17:24,310 --> 01:17:29,960 Yn ddiofyn, yr wyf yn meddwl ei fod yn safonol yw 0, safon allan yw 1, ac gwall safonol yw 2. 911 01:17:29,960 --> 01:17:33,980 Felly, beth ddylwn i ei eisiau newid y gosodiadau o? 912 01:17:33,980 --> 01:17:37,370 Rwyf am i newid y gosodiadau o bryd bynnag yr wyf yn taro cymeriad, 913 01:17:37,370 --> 01:17:41,590 Yr wyf am iddo daflu i ffwrdd y cymeriad yn hytrach na argraffu i'r sgrin. 914 01:17:41,590 --> 01:17:45,960 Pa ffrwd - safonol mewn, allan safonol, neu wall safonol - 915 01:17:45,960 --> 01:17:52,050 yn ymateb i bethau pan fyddaf yn teipio ar y bysellfwrdd? >> [Myfyrwyr] Safon i mewn >> Yeah. 916 01:17:52,050 --> 01:17:56,450 Felly gallaf naill ai wneud 0 neu y gallaf ei wneud stdin. 917 01:17:56,450 --> 01:17:59,380 Rwy'n cael y current_settings o safon mewn 918 01:17:59,380 --> 01:18:01,720 >> Nawr rwyf am i ddiweddaru lleoliadau hynny, 919 01:18:01,720 --> 01:18:07,200 felly yn gyntaf byddaf yn copïo i mewn i hacker_settings beth yw fy current_settings yn cael eu. 920 01:18:07,200 --> 01:18:10,430 A sut structs gwaith y bydd yn ei ddynwared. 921 01:18:10,430 --> 01:18:14,510 Mae hyn copïau holl feysydd, fel y byddech yn ei ddisgwyl. 922 01:18:14,510 --> 01:18:17,410 >> Nawr rwyf am i ddiweddaru rhai o'r caeau. 923 01:18:17,410 --> 01:18:21,670 Edrych ar termios, byddai'n rhaid i chi ddarllen trwy lawer o hyn 924 01:18:21,670 --> 01:18:24,110 dim ond i weld beth fyddech chi eisiau i chwilio am, 925 01:18:24,110 --> 01:18:28,210 ond mae'r baneri ydych yn mynd i eisiau i chwilio am eu adlais, 926 01:18:28,210 --> 01:18:33,110 felly ECHO cymeriadau mewnbwn Echo. 927 01:18:33,110 --> 01:18:37,710 Yn gyntaf hoffwn nodi - I've anghofio eisoes beth yw'r caeau yn cael eu. 928 01:18:45,040 --> 01:18:47,900 Dyma beth mae'r strwythur yn edrych fel. 929 01:18:47,900 --> 01:18:51,060 Felly dulliau mewnbwn Rwy'n credu ein bod eisiau newid. 930 01:18:51,060 --> 01:18:54,210 Byddwn yn edrych ar yr ateb i wneud yn siŵr bod beth yr ydym am ei newid. 931 01:19:04,060 --> 01:19:12,610 Rydym yn awyddus i newid lflag er mwyn atal yr angen i edrych trwy hyn i gyd. 932 01:19:12,610 --> 01:19:14,670 Rydym yn awyddus i newid dulliau lleol. 933 01:19:14,670 --> 01:19:17,710 Byddai'n rhaid i chi ddarllen drwy'r peth cyfan i ddeall lle mae popeth yn perthyn 934 01:19:17,710 --> 01:19:19,320 yr ydym am ei newid. 935 01:19:19,320 --> 01:19:24,120 Ond mae'n tu mewn dulliau lleol lle rydym yn mynd i am newid hynny. 936 01:19:27,080 --> 01:19:33,110 Felly hacker_settings.cc_lmode hyn fe'i gelwir. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Dyma lle rydym yn mynd i mewn i weithredwyr bitwise. 939 01:19:52,280 --> 01:19:54,860 Rydym yn fath o allan o amser, ond byddwn yn mynd drwyddo gyflym go iawn. 940 01:19:54,860 --> 01:19:56,600 Dyma lle rydym yn mynd i mewn i weithredwyr bitwise, 941 01:19:56,600 --> 01:19:59,950 lle rwy'n meddwl fy mod dywedodd un amser maith yn ôl pryd bynnag y byddwch yn dechrau delio gyda baneri, 942 01:19:59,950 --> 01:20:03,370 rydych yn mynd i gael ei ddefnyddio bitwise gweithredwr llawer. 943 01:20:03,370 --> 01:20:08,240 Mae pob rhan yn y faner yn cyfateb i ryw fath o ymddygiad. 944 01:20:08,240 --> 01:20:14,090 Felly yma, y ​​faner hon wedi i griw o bethau gwahanol, lle mae pob un ohonynt yn golygu rhywbeth gwahanol. 945 01:20:14,090 --> 01:20:18,690 Ond yr hyn rwyf am ei wneud yn unig yw troi oddi ar y darn sy'n cyfateb i ECHO. 946 01:20:18,690 --> 01:20:25,440 Felly, i droi bod i ffwrdd ddylwn i ei wneud & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 A dweud y gwir, yr wyf yn meddwl ei fod yn debyg tECHO neu rywbeth. Im 'jyst yn mynd i wirio eto. 948 01:20:30,110 --> 01:20:34,050 Gallaf termios hynny. Mae'n dim ond ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO yn mynd i fod ychydig yn sengl. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO yn mynd i olygu pob ddarnau yn cael eu gosod i 1, sy'n golygu bod yr holl baneri yn cael eu gosod i gwir 951 01:20:44,230 --> 01:20:47,140 ac eithrio ar gyfer y rhan ECHO. 952 01:20:47,140 --> 01:20:53,830 Drwy dod i ben fy baneri lleol â hyn, mae'n golygu'r holl faneri sy'n cael eu gosod ar hyn o bryd yn wir 953 01:20:53,830 --> 01:20:56,520 yn dal i gael eu gosod i gwir. 954 01:20:56,520 --> 01:21:03,240 Os bydd fy baner ECHO yn cael ei gosod i gwir, yna mae hyn yn cael ei osod o reidrwydd i ffug ar y faner ECHO. 955 01:21:03,240 --> 01:21:07,170 Felly y llinell hon o god dim ond troi oddi ar y faner ECHO. 956 01:21:07,170 --> 01:21:16,270 Mae'r llinellau eraill o god, 'n annhymerus' jyst adysgrifia yn y diddordeb o amser ac yna egluro iddynt. 957 01:21:27,810 --> 01:21:30,180 Yn ateb, dywedodd 0. 958 01:21:30,180 --> 01:21:33,880 Mae'n debyg well i ddweud yn benodol stdin. 959 01:21:33,880 --> 01:21:42,100 >> Hysbysiad fy mod hefyd yn gwneud ECHO | ICANON yma. 960 01:21:42,100 --> 01:21:46,650 ICANON yn cyfeirio at rywbeth ar wahân, sy'n golygu dull canonaidd. 961 01:21:46,650 --> 01:21:50,280 Pa fodd dull canonaidd fel arfer pan fyddwch chi'n teipio allan y llinell orchymyn, 962 01:21:50,280 --> 01:21:54,670 Nid safonol mewn yn prosesu unrhyw beth nes i chi daro Newline. 963 01:21:54,670 --> 01:21:58,230 Felly, pan fyddwch yn gwneud GetString, byddwch yn teipio criw o bethau, yna byddwch yn taro Newline. 964 01:21:58,230 --> 01:22:00,590 Dyna pan gaiff ei anfon i safon mewn 965 01:22:00,590 --> 01:22:02,680 Dyna 'r ball. 966 01:22:02,680 --> 01:22:05,830 Pan wyf yn troi oddi modd canonaidd, yn awr bob cymeriad unigol fyddwch yn y wasg 967 01:22:05,830 --> 01:22:10,910 yn hyn sy'n cael ei brosesu, sydd fel arfer yn fath o ddrwg oherwydd ei fod yn araf i brosesu y pethau hyn, 968 01:22:10,910 --> 01:22:14,330 a dyna pam mae'n beth da i glustogi i mewn i linellau cyfan. 969 01:22:14,330 --> 01:22:16,810 Ond yr wyf am i bob cymeriad i gael eu prosesu 970 01:22:16,810 --> 01:22:18,810 gan nad wyf am iddo aros i mi daro Newline 971 01:22:18,810 --> 01:22:21,280 cyn iddo prosesu'r holl gymeriadau rwyf wedi bod yn teipio. 972 01:22:21,280 --> 01:22:24,760 Mae hyn yn troi'r dull canonaidd. 973 01:22:24,760 --> 01:22:31,320 Mae hyn yn stwff yn unig yn golygu pan fydd mewn gwirionedd yn prosesu cymeriadau. 974 01:22:31,320 --> 01:22:35,830 Mae hyn yn golygu eu prosesu ar unwaith; cyn gynted ag yr wyf yn eu teipio, prosesu. 975 01:22:35,830 --> 01:22:42,510 Ac mae hyn yn swyddogaeth sy'n cael ei diweddaru fy lleoliadau ar gyfer safon mewn, 976 01:22:42,510 --> 01:22:45,480 a dulliau TCSA yn ei wneud ar hyn o bryd. 977 01:22:45,480 --> 01:22:50,310 Mae'r opsiynau eraill yn aros nes bod popeth sydd ar hyn o bryd ar y nant yn cael ei brosesu. 978 01:22:50,310 --> 01:22:52,030 Nid yw hynny'n wirioneddol bwysig. 979 01:22:52,030 --> 01:22:56,920 Dim ond ar hyn o bryd yn newid fy lleoliadau i fod beth bynnag ar hyn o bryd yn hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Amcana ei alw'n hacker_settings, felly gadewch i ni newid hynny. 981 01:23:09,610 --> 01:23:13,500 Newid popeth i hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Nawr yn y diwedd ein rhaglen rydym yn mynd i eisiau mynd yn ôl 983 01:23:16,870 --> 01:23:20,210 i'r hyn sydd ar hyn o bryd y tu mewn o normal_settings, 984 01:23:20,210 --> 01:23:26,560 sy'n mynd i dim ond yn edrych fel & ar normal_settings. 985 01:23:26,560 --> 01:23:30,650 Hysbysiad Nid wyf wedi newid unrhyw un o fy normal_settings ers wreiddiol gael. 986 01:23:30,650 --> 01:23:34,520 Yna i ddim ond eu newid yn ôl, yr wyf pasio yn ôl ar y diwedd. 987 01:23:34,520 --> 01:23:38,390 Hwn oedd y diweddariad. Iawn. 988 01:23:38,390 --> 01:23:43,900 >> Nawr tu mewn yma byddaf dim ond esbonio y cod yn y diddordeb o amser. 989 01:23:43,900 --> 01:23:46,350 Nid yw'n bod llawer cod. 990 01:23:50,770 --> 01:24:03,750 Rydym yn gweld rydym yn darllen cymeriad o'r ffeil. Byddem ni'n ei alw f. 991 01:24:03,750 --> 01:24:07,850 Awron alli fgetc ddyn, ond sut fgetc yn mynd i weithio 992 01:24:07,850 --> 01:24:11,910 yn unig mae'n mynd i ddychwelyd y cymeriad yr ydych newydd ei ddarllen neu EOF, 993 01:24:11,910 --> 01:24:15,680 sy'n cyfateb i ddiwedd y ffeil neu ryw yn digwydd wall. 994 01:24:15,680 --> 01:24:19,900 Rydym yn dolennu, gan barhau i ddarllen cymeriad unigol o'r ffeil, 995 01:24:19,900 --> 01:24:22,420 nes ein bod wedi rhedeg allan o gymeriadau i'w ddarllen. 996 01:24:22,420 --> 01:24:26,650 Ac er ein bod ni'n gwneud hynny, rydym yn aros ar gymeriad unigol o safon mewn 997 01:24:26,650 --> 01:24:29,090 Bob tro sengl i chi deipio rhywbeth ar y llinell orchymyn, 998 01:24:29,090 --> 01:24:32,820 sef darllen mewn cymeriad o safon mewn 999 01:24:32,820 --> 01:24:38,330 Yna putchar yn unig yn mynd i roi'r torgoch rydym yn darllen i fyny yma o'r ffeil i allan safonol. 1000 01:24:38,330 --> 01:24:42,890 Gallwch putchar dyn, ond mae'n dim ond rhoi i safon allan, mae'n argraffu y cymeriad hwnnw. 1001 01:24:42,890 --> 01:24:51,600 Gallech hefyd dim ond gwneud printf ("% c", c); syniad Same. 1002 01:24:53,330 --> 01:24:56,670 Mae hynny'n mynd i wneud y rhan fwyaf o'n gwaith. 1003 01:24:56,670 --> 01:25:00,300 >> Y peth olaf rydym yn mynd i eisiau ei wneud yw unig mmap ein ffeil. 1004 01:25:00,300 --> 01:25:03,310 Os nad ydych yn mmap, mae hynny'n gollwng cof. 1005 01:25:03,310 --> 01:25:06,680 Rydym yn awyddus i mmap y ffeil yn wreiddiol agor, ac yr wyf yn meddwl dyna ni. 1006 01:25:06,680 --> 01:25:13,810 Os byddwn yn gwneud hynny, yr wyf eisoes yn cael problemau. 1007 01:25:13,810 --> 01:25:17,260 Gadewch i ni weld. 1008 01:25:17,260 --> 01:25:19,960 Beth oedd ei gwyno amdano? 1009 01:25:19,960 --> 01:25:30,220 Disgwyl 'int' ond dadl yw o fath 'strwythur _IO_FILE *'. 1010 01:25:36,850 --> 01:25:39,370 Byddwn yn gweld os sy'n gweithio. 1011 01:25:45,210 --> 01:25:53,540 Dim ond yn y C99. Augh. Iawn, yn gwneud hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Nawr rydym yn cael disgrifiadau mwy defnyddiol. 1013 01:25:57,760 --> 01:25:59,900 Felly, y defnydd o dynodwr heb eu datgan 'normal_settings'. 1014 01:25:59,900 --> 01:26:04,170 Doeddwn i ddim yn ei alw normal_settings. Gelwais ei current_settings. 1015 01:26:04,170 --> 01:26:12,090 Felly, gadewch i ni newid hynny i gyd. 1016 01:26:17,920 --> 01:26:21,710 Nawr pasio ddadl. 1017 01:26:26,290 --> 01:26:29,500 Byddaf yn gwneud hyn yn 0 ar gyfer yn awr. 1018 01:26:29,500 --> 01:26:36,720 Iawn. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Rwyf hefyd nad oedd yn glir y sgrin ar y dechrau. 1020 01:26:39,590 --> 01:26:42,960 Ond gallwch edrych yn ôl at y broblem a osodwyd olaf i weld sut rydych yn glir y sgrin. 1021 01:26:42,960 --> 01:26:45,160 Mae'n dim ond argraffu rhai cymeriadau 1022 01:26:45,160 --> 01:26:47,210 tra bod hyn yn gwneud yr hyn rwyf eisiau ei wneud. 1023 01:26:47,210 --> 01:26:48,900 Iawn. 1024 01:26:48,900 --> 01:26:55,280 Ac yn meddwl am pam fod hyn sydd ei angen i fod yn 0 yn hytrach na stdin, 1025 01:26:55,280 --> 01:27:00,560 y dylid eu diffinio # 0, 1026 01:27:00,560 --> 01:27:03,890 mae hyn yn cwyno bod - 1027 01:27:13,150 --> 01:27:19,360 Cyn pan ddywedais fod yna disgrifwyr ffeil ond yna byddwch hefyd yn cael eich * FILE, 1028 01:27:19,360 --> 01:27:23,210 disgrifydd ffeil yn unig yw cyfanrif sengl, 1029 01:27:23,210 --> 01:27:26,970 tra bod * FILE Mae criw cyfan o bethau sy'n gysylltiedig ag ef. 1030 01:27:26,970 --> 01:27:30,380 Y rheswm mae angen inni ddweud 0 yn hytrach na stdin 1031 01:27:30,380 --> 01:27:37,480 yw bod stdin yn * FILE sy'n cyfeirio at y peth sy'n cael ei gyfeirio 0 disgrifydd ffeil. 1032 01:27:37,480 --> 01:27:45,070 Felly hyd yn oed i fyny yma pan ddylwn i ei wneud fopen (argv [1], rwy'n cael * FILE yn ôl. 1033 01:27:45,070 --> 01:27:51,180 Ond rhywle yn y * FILE yn beth sy'n cyfateb i'r disgrifydd ffeil ar gyfer y ffeil. 1034 01:27:51,180 --> 01:27:57,430 Os edrychwch chi ar y dudalen dyn am agored, felly rwy'n credu y bydd yn rhaid i chi wneud dyn 3 ar agor - Na - 1035 01:27:57,430 --> 01:27:59,380 dyn 2 ar agor - yeah. 1036 01:27:59,380 --> 01:28:06,250 Os edrychwch ar y dudalen i agor, agored yn debyg i fopen lefel is, 1037 01:28:06,250 --> 01:28:09,350 ac mae'n dychwelyd y disgrifydd ffeil ei hun. 1038 01:28:09,350 --> 01:28:12,050 fopen mae criw o bethau ar ben agored, 1039 01:28:12,050 --> 01:28:17,640 sydd yn lle dychwelyd hynny ddisgrifydd ffeil yn dychwelyd FFEIL cyfan * pwyntydd 1040 01:28:17,640 --> 01:28:20,590 tu mewn sydd yn ein disgrifydd ffeil bach. 1041 01:28:20,590 --> 01:28:25,020 Felly safonol yn cyfeirio at y FFEIL peth *, 1042 01:28:25,020 --> 01:28:29,120 tra 0 yn cyfeirio at jyst safon ffeil disgrifydd ynddo'i hun. 1043 01:28:29,120 --> 01:28:32,160 >> Cwestiynau? 1044 01:28:32,160 --> 01:28:35,930 [Chwerthin] Blew drwy hynny. 1045 01:28:35,930 --> 01:28:39,140 Mae pob hawl. Rydym yn gwneud. [Chwerthin] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]