1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Artikel 5 - meer gemaklik] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Harvard Universiteit] 3 00:00:04,690 --> 00:00:07,250 [Hierdie is CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Soos ek gesê het in my e-pos, daar is 'n baie dinge wat jy kan gebruik 5 00:00:14,250 --> 00:00:17,060 anders as die toestel om werklik te doen om die probleem stelle. 6 00:00:17,060 --> 00:00:19,910 Ons beveel aan dat jy dit doen in die toestel net omdat dan kan ons jou help om meer maklik 7 00:00:19,910 --> 00:00:22,070 en ons weet hoe alles gaan om te werk. 8 00:00:22,070 --> 00:00:26,950 Maar as 'n voorbeeld van waar jy dinge kan doen as, sê, het jy nie toegang hê 9 00:00:26,950 --> 00:00:31,570 tot 'n toestel of wat jy wil om te werk in die Science Center kelder - 10 00:00:31,570 --> 00:00:33,090 wat eintlik hulle het die toestel te 11 00:00:33,090 --> 00:00:35,150 as jy wil enige plek werk. 12 00:00:35,150 --> 00:00:42,370 Een voorbeeld hiervan is het jy gesien / gehoor van SSH? 13 00:00:44,380 --> 00:00:47,780 SSH is basies net soos verbinding na iets. 14 00:00:47,780 --> 00:00:51,340 Eintlik, reg nou is ek in die toestel SSHed. 15 00:00:51,340 --> 00:00:54,290 Ek het nog nooit direk in die toestel werk. 16 00:00:55,930 --> 00:01:01,060 Hier is die toestel, en as jy kyk hier neer wat jy sien hierdie IP-adres. 17 00:01:01,060 --> 00:01:03,650 Ek het nog nooit in die toestel self werk; 18 00:01:03,650 --> 00:01:08,840 Ek kom altyd tot 'n iTerm2 venster / terminale venster. 19 00:01:08,840 --> 00:01:15,910 Jy kan SSH aan dat die IP-adres, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Ek onthou dat die getal baie maklik, want dit is so 'n mooi patroon. 21 00:01:20,390 --> 00:01:24,920 Maar dit sal my vra vir my wagwoord, en nou is ek in die toestel. 22 00:01:24,920 --> 00:01:33,060 Basies, op hierdie punt, as jy oopgemaak het 'n terminaal binnekant van die toestel self, 23 00:01:33,060 --> 00:01:36,350 hierdie koppelvlak, maar jy sal dit gebruik, is presies dieselfde 24 00:01:36,350 --> 00:01:40,010 as die koppelvlak ek met behulp van hier, maar nou is jy SSHed. 25 00:01:42,240 --> 00:01:44,920 Jy hoef nie SSH na die toestel. 26 00:01:44,920 --> 00:01:52,360 Een voorbeeld van 'n ander plek waar jy kan SSH is ek is redelik seker dat jy by verstek - 27 00:01:52,360 --> 00:01:55,020 Oh. Groter. 28 00:01:55,020 --> 00:02:01,130 Almal van julle moet by verstek FAS rekeninge op die FAS-bedieners. 29 00:02:01,130 --> 00:02:06,840 Vir my, ek sou SSH tot rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Dit gaan jou dat die eerste keer te vra, en jy sê ja. 31 00:02:11,610 --> 00:02:15,840 My wagwoord is net gaan na my FAS wagwoord wees. 32 00:02:15,840 --> 00:02:22,650 En so moet julle nou, ek SSHed na die mooi bedieners, en ek kan enigiets doen wat Ek wil hier. 33 00:02:22,650 --> 00:02:28,560 'N baie van die klasse wat jy kan neem, soos 124, gaan jou goed oplaai hier 34 00:02:28,560 --> 00:02:30,950 om werklik jou probleem stelle. 35 00:02:30,950 --> 00:02:34,100 Maar sê dat jy nie toegang tot jou apparaat. 36 00:02:34,100 --> 00:02:37,910 Dan kan jy dinge doen, soos hier sal dit sê - 37 00:02:37,910 --> 00:02:42,160 Dit is net ons deel van die vrae. 38 00:02:42,160 --> 00:02:45,070 Dit sal jou vra om dit te doen in die toestel. 39 00:02:45,070 --> 00:02:47,790 In plaas daarvan sal ek doen dit net op die bediener. 40 00:02:47,790 --> 00:02:50,560 Ek gaan om te rits. 41 00:02:50,560 --> 00:02:55,670 Die probleem gaan wees dat jy gebruik om die gebruik van iets soos gedit 42 00:02:55,670 --> 00:02:58,160 of wat ook al binnekant van die toestel. 43 00:02:58,160 --> 00:03:01,830 Jy nie gaan om dit te hê op die FAS-bediener. 44 00:03:01,830 --> 00:03:04,110 Dit is net almal gaan na hierdie tekstuele koppelvlak te wees. 45 00:03:04,110 --> 00:03:09,180 Sodat jy kan óf een, probeer om 'n teks editor wat hulle hoef te leer. 46 00:03:09,180 --> 00:03:12,130 Hulle het Nano. 47 00:03:12,130 --> 00:03:14,990 Nano is gewoonlik redelik maklik om te gebruik. 48 00:03:14,990 --> 00:03:19,470 Jy kan gebruik om jou pyle en tik gewoonlik. 49 00:03:19,470 --> 00:03:21,250 So dit is nie moeilik nie. 50 00:03:21,250 --> 00:03:24,720 As jy wil om te kry regtig fancy wat jy kan gebruik Emacs, 51 00:03:24,720 --> 00:03:29,850 wat ek moet seker nie oopgemaak het, want ek weet nie eens hoe om te sluit Emacs. 52 00:03:29,850 --> 00:03:32,760 Beheer X, Control-C? Ja. 53 00:03:32,760 --> 00:03:35,310 Of jy kan gebruik Vim, dit is wat ek gebruik. 54 00:03:35,310 --> 00:03:37,800 En so wat is jou opsies. 55 00:03:37,800 --> 00:03:43,830 As jy nie wil hê om dit te doen, kan jy ook, as jy kyk na manual.cs50.net - 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Op 'n rekenaar, kan jy SSH met behulp van PuTTY, 58 00:03:49,920 --> 00:03:51,940 wat jy gaan moet apart aflaai. 59 00:03:51,940 --> 00:03:55,460 Op 'n Mac, kan jy net by verstek gebruik Terminal of jy kan aflaai iTerm2, 60 00:03:55,460 --> 00:03:58,490 wat soos 'n mooi, fancy Terminal. 61 00:03:58,490 --> 00:04:03,780 As jy na manual.cs50.net sien jy 'n skakel na Notepad + +, 62 00:04:03,780 --> 00:04:07,120 is wat jy kan gebruik op 'n rekenaar. 63 00:04:07,120 --> 00:04:13,340 Dit kan jy SFTP van Notepad + +, wat is basies SSH. 64 00:04:13,340 --> 00:04:17,750 Wat dit sal laat jy nie wysig jou lêers plaaslik, 65 00:04:17,750 --> 00:04:20,670 en dan wanneer jy wil om hulle te red, sal dit red nice.fas 66 00:04:20,670 --> 00:04:23,670 waar jy kan dan hardloop hulle. 67 00:04:23,670 --> 00:04:26,880 En die ekwivalent op 'n Mac gaan wees TextWrangler. 68 00:04:26,880 --> 00:04:28,760 So dit kan jy doen dieselfde ding. 69 00:04:28,760 --> 00:04:32,800 Dit kan jy wysig lêers plaaslik en stoor dit op nice.fas, 70 00:04:32,800 --> 00:04:35,730 waar jy kan dan hardloop hulle. 71 00:04:35,730 --> 00:04:40,400 So as jy ooit vas sonder 'n toestel, moet jy hierdie opsies 72 00:04:40,400 --> 00:04:44,230 nog steeds nie jou probleem stelle. 73 00:04:44,230 --> 00:04:48,250 Die een probleem gaan wees dat jy nie gaan die CS50 biblioteek te hê 74 00:04:48,250 --> 00:04:51,580 omdat nice.fas nie by verstek. 75 00:04:51,580 --> 00:04:55,970 Jy kan óf aflaai die CS50 biblioteek - 76 00:04:55,970 --> 00:04:58,470 Ek dink nie ek moet op hierdie punt. 77 00:04:58,470 --> 00:05:03,270 Jy kan óf die aflaai van die CS50 biblioteek en kopieer dit na nice.fas, 78 00:05:03,270 --> 00:05:07,450 of ek dink op hierdie punt ons nie gebruik dit nie in elk geval. 79 00:05:07,450 --> 00:05:12,720 Of as ons dit doen, kan jy vir die tyd wat dit vervang met 80 00:05:12,720 --> 00:05:18,480 die implementering van die funksies in die CS50 biblioteek in elk geval. 81 00:05:18,480 --> 00:05:21,370 So wat moet nie dat baie van 'n beperking. 82 00:05:21,370 --> 00:05:23,710 En dis dit. 83 00:05:26,460 --> 00:05:29,820 >> Ek gaan terug na die toestel nou, ons sal alles doen wat in die toestel. 84 00:05:29,820 --> 00:05:37,510 Op soek na ons afdeling van die vrae aan die begin, soos ek gesê het in my e-pos, 85 00:05:37,510 --> 00:05:43,620 ons het om te praat oor die een kort jy veronderstel was om te kyk. 86 00:05:43,620 --> 00:05:51,980 Ons het die Aansturing & Pype en hierdie drie vrae. 87 00:05:51,980 --> 00:05:56,070 >> Tot watter stroom funksies soos skryf printf nie by verstek? 88 00:05:56,070 --> 00:05:59,130 So stroom. Wat is 'n stroom? 89 00:06:06,520 --> 00:06:15,100 'N stroom is basies soos dit is net 'n paar - 90 00:06:15,100 --> 00:06:21,450 Dit is nie eens 'n bron van 1s en 0S. 91 00:06:21,450 --> 00:06:24,920 Die stroom wat dit vra hier is standaard uit. 92 00:06:24,920 --> 00:06:27,250 En so standaard uit 'n stroom wat wanneer jy skryf nie, 93 00:06:27,250 --> 00:06:30,940 dit verskyn op die skerm. 94 00:06:30,940 --> 00:06:36,860 Standaard uit, deur die stroom, beteken dit dat jy net skryf 1s en 0s om dit, 95 00:06:36,860 --> 00:06:40,220 en die ander kant van die standaard uit lees net van daardie stroom. 96 00:06:40,220 --> 00:06:43,540 Dit is net 'n string van 1s en 0S. 97 00:06:43,540 --> 00:06:45,570 Kan u skryf aan strome of jy kan lees van strome 98 00:06:45,570 --> 00:06:47,950 afhangende van wat die stroom is. 99 00:06:47,950 --> 00:06:52,800 Die ander twee standaard strome is standaard en standaard fout. 100 00:06:52,800 --> 00:06:57,540 Standaard in wanneer jy GetString, is dit wag vir jou insette stuff. 101 00:06:57,540 --> 00:07:01,570 So is dit wag vir jou, dit is eintlik wag op standaard in, 102 00:07:01,570 --> 00:07:04,880 wat is werklik wat jy kry wanneer jy tik op die sleutelbord. 103 00:07:04,880 --> 00:07:07,530 Jy tik in standaard. 104 00:07:07,530 --> 00:07:10,050 Standaard fout is basies gelykstaande aan standaard uit, 105 00:07:10,050 --> 00:07:13,280 maar dit is gespesialiseerde in dat wanneer jy druk standaard fout, 106 00:07:13,280 --> 00:07:16,770 jy veronderstel is om net druk fout boodskappe na die 107 00:07:16,770 --> 00:07:20,200 sodat jy kan onderskei tussen gereelde boodskappe gedruk op die skerm 108 00:07:20,200 --> 00:07:24,560 teenoor fout boodskappe, afhangende van of hulle na standaard uit of standaard fout. 109 00:07:24,560 --> 00:07:28,660 Lêers. 110 00:07:28,660 --> 00:07:32,440 Standard uit, standaard en standaard fout is net spesiale strome, 111 00:07:32,440 --> 00:07:36,810 maar regtig 'n lêer, wanneer jy 'n lêer oopmaak, is dit 'n stroom van grepe 112 00:07:36,810 --> 00:07:40,740 waar jy kan net lees van daardie stroom. 113 00:07:40,740 --> 00:07:47,770 U, vir die grootste deel, kan net dink van 'n lêer as 'n stroom van grepe. 114 00:07:47,770 --> 00:07:51,190 So, wat strome skryf hulle nie by verstek? Standard uit. 115 00:07:51,190 --> 00:07:56,980 >> Wat is die verskil tussen> en >>? 116 00:07:58,140 --> 00:08:03,710 Het iemand kyk na die video vooraf? Okay. 117 00:08:03,710 --> 00:08:10,960 > Gaan wees hoe jy redirect in lêers, 118 00:08:10,960 --> 00:08:15,240 en >> ook gaan uitset te lei in lêers, 119 00:08:15,240 --> 00:08:17,820 maar dit plaas gaan toe te voeg aan die lêer. 120 00:08:17,820 --> 00:08:23,430 Byvoorbeeld, kom ons sê ek foutief gebeur hier, 121 00:08:23,430 --> 00:08:27,020 en binnekant van foutief is die enigste dinge kat, kat, hond, vis, hond. 122 00:08:27,020 --> 00:08:31,530 Een opdrag wat jy by die command line is die kat, 123 00:08:31,530 --> 00:08:34,539 wat net gaan om te druk wat in 'n lêer. 124 00:08:34,539 --> 00:08:40,679 So wanneer ek sê kat foutief, dit gaan kat, kat, hond, vis, hond te druk. Dit is al die kat doen. 125 00:08:40,679 --> 00:08:46,280 Dit beteken dat dit gedruk standaard uit kat, kat, hond, vis, hond. 126 00:08:46,280 --> 00:08:53,240 As ek in plaas wil hê dat om te lei na 'n lêer, kan ek gebruik> en lei dit ongeag die lêer is. 127 00:08:53,240 --> 00:08:56,460 Ek bel die lêer lêer. 128 00:08:56,460 --> 00:09:00,320 So nou as ek ls, sal ek sien ek het 'n nuwe lêer met die naam lêer. 129 00:09:00,320 --> 00:09:05,700 En as ek dit oopmaak, gaan dit presies wat kat sit op die command line. 130 00:09:05,700 --> 00:09:11,040 So nou as ek doen wat weer, dan is dit gaan om die uitset te lei in die lêer, 131 00:09:11,040 --> 00:09:13,930 en ek gaan presies dieselfde ding om te hê. 132 00:09:13,930 --> 00:09:17,910 So tegnies, dit heeltemal overrode wat ons gehad het. 133 00:09:17,910 --> 00:09:22,970 En ons sal sien as ek foutief, het ek hond. 134 00:09:22,970 --> 00:09:29,980 Nou as ons kat foutief in die lêer weer, gaan ons die nuwe weergawe met die hond verwyder te hê. 135 00:09:29,980 --> 00:09:32,400 So is dit heeltemal oorheers dit. 136 00:09:32,400 --> 00:09:36,640 In plaas daarvan, as ons >>, dit gaan lêer te voeg. 137 00:09:36,640 --> 00:09:40,860 Nou, die opening van die lêer, sien ons ons het net die dieselfde ding gedruk twee keer 138 00:09:40,860 --> 00:09:44,920 want dit is daar een keer, dan het ons aangeheg aan die oorspronklike. 139 00:09:44,920 --> 00:09:48,130 So dit is wat> en >> doen. 140 00:09:48,130 --> 00:09:50,580 Is die volgende een vra - Dit maak nie vra oor dit. 141 00:09:50,580 --> 00:09:59,050 >> Die ander een wat ons het, is <, wat, indien> aansture standaard uit, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Kom ons kyk of ons 'n voorbeeld. 144 00:10:14,750 --> 00:10:16,930 Ek kan skryf een ware vinnig. 145 00:10:17,870 --> 00:10:25,700 Kom ons neem 'n lêer, hello.c. 146 00:10:56,060 --> 00:10:59,070 Relatief maklik lêer. 147 00:10:59,070 --> 00:11:03,570 Ek is net om 'n string en dan druk "Hallo" wat die string Ek het nou net ingeskryf was. 148 00:11:03,570 --> 00:11:07,990 So hallo en dan hom / hallo. 149 00:11:07,990 --> 00:11:10,720 Nou is dit waarna my iets in te voer, 150 00:11:10,720 --> 00:11:15,070 wat beteken dat dit wag op die dinge wat aangegaan word standaard. 151 00:11:15,070 --> 00:11:20,450 So gaan wat ek wil in standaard. Ons is net gaan om te sê Hello, Rob! 152 00:11:20,450 --> 00:11:23,310 Dan is dit die druk standaard Hallo, Rob! 153 00:11:23,310 --> 00:11:28,860 As ek dit doen / hallo. En dan aanstuur, 154 00:11:30,740 --> 00:11:34,310 jy kan net vir nou Aansturing van 'n lêer. 155 00:11:34,310 --> 00:11:41,720 So as ek in sommige lêer, txt, en ek het Rob, 156 00:11:41,720 --> 00:11:52,300 as ek hallo hardloop en dan lei die lêer txt in / hello, dit gaan om te sê Hello, Rob! onmiddellik. 157 00:11:52,300 --> 00:11:57,160 Wanneer dit kry eerste GetString en dit wag op standaard in, 158 00:11:57,160 --> 00:12:01,730 standaard is nie langer wag op die sleutelbord data te kry ingeskryf. 159 00:12:01,730 --> 00:12:05,980 In plaas daarvan, het ons getrek standaard in te lees van die lêer txt. 160 00:12:05,980 --> 00:12:10,290 En so het dit gaan lees van die lêer txt, wat net die lyn Rob, 161 00:12:10,290 --> 00:12:13,380 en dan is dit gaan Hello, Rob te druk! 162 00:12:13,380 --> 00:12:18,180 En as ek wou, kon ek dit ook doen. / Hallo 00:12:21,500 en dan die standaard daarop dat dit druk, wat Hallo, Rob! 164 00:12:21,500 --> 00:12:24,700 Ek kan jou verwys na wat in sy eie lêer. 165 00:12:24,700 --> 00:12:29,790 Ek sal net noem die lêer hello - Nee, ek sal nie, want dit is die uitvoerbare - txt2. 166 00:12:29,790 --> 00:12:40,150 Nou, is txt2 gaan om die uitset van / hello. 00:12:43,520 >> Vrae? 168 00:12:45,900 --> 00:12:49,090 >> Okay. So, hier is ons 'n pyplyn. 169 00:12:49,090 --> 00:12:53,510 Pype is die laaste eenheid van die Aansturing. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Ek dink een eenheid van die Aansturing is as in plaas van> jy 2> 171 00:12:58,750 --> 00:13:01,070 wat redirecting standaard fout. 172 00:13:01,070 --> 00:13:06,280 So as iets na standaard fout, sou dit nie sit in die txt2. 173 00:13:06,280 --> 00:13:12,480 Maar let as ek dit doen 2>, dan is dit nog steeds druk Hallo, Rob! die command line 174 00:13:12,480 --> 00:13:18,600 omdat ek net standaard fout redirecting, ek is nie redirecting standaard. 175 00:13:18,600 --> 00:13:22,210 Standaard fout en standaard uit is anders. 176 00:13:24,210 --> 00:13:27,080 As jy wou eintlik skryf aan die standaard fout, 177 00:13:27,080 --> 00:13:35,080 dan kan ek dit verander fprintf na stderr te wees. 178 00:13:35,080 --> 00:13:37,850 So printf, by verstek, druk op die standaard uit. 179 00:13:37,850 --> 00:13:41,720 As ek wil na standaard fout met die hand te druk, dan moet ek fprintf gebruik 180 00:13:41,720 --> 00:13:45,010 en spesifiseer wat ek wil uit te druk. 181 00:13:45,010 --> 00:13:49,720 As maar ek het fprintf stdout, dan is dit basies gelykstaande aan printf. 182 00:13:49,720 --> 00:13:55,530 Maar fprintf standaard fout. 183 00:13:57,790 --> 00:14:03,650 So nou, as ek skakel dit in txt2, Hello, Rob! is nog steeds op die command line gedruk 184 00:14:03,650 --> 00:14:08,270 aangesien dit om gedruk op die standaard fout en ek net redirecting standaard uit. 185 00:14:08,270 --> 00:14:16,420 As ek nou standaard fout aanstuur, nou is dit nie gedruk kry, en txt2 gaan wees Hallo, Rob! 186 00:14:16,420 --> 00:14:21,910 So, nou, kan jy druk jou werklike foute te standaard fout 187 00:14:21,910 --> 00:14:24,720 en druk jou gereelde boodskappe standaard uit. 188 00:14:24,720 --> 00:14:31,420 En dus wanneer jy die program loop, kan jy hardloop dit as / hello. Hierdie tipe met die 2> 189 00:14:31,420 --> 00:14:33,800 sodat jou program gaan om normaal te loop, 190 00:14:33,800 --> 00:14:38,400 maar enige fout boodskappe wat jy kry wat jy later kan kyk in jou fout log, 191 00:14:38,400 --> 00:14:44,500 sodat foute, en dan later kyk en jou foute lêer sal enige foute wat gebeur het. 192 00:14:45,200 --> 00:14:47,540 >> Vrae? 193 00:14:47,540 --> 00:14:58,070 >> Die laaste een is pyp, wat jy kan dink as die neem van die standaard uit een opdrag 194 00:14:58,070 --> 00:15:01,210 en maak dit die standaard van die volgende opdrag. 195 00:15:01,210 --> 00:15:05,570 'N voorbeeld hier echo is 'n command line ding 196 00:15:05,570 --> 00:15:11,840 wat net gaan om te eggo wat ek het as sy argument. Ek sal nie kom aanhalings. 197 00:15:11,840 --> 00:15:16,150 Echo blah, blah, blah is net blah, blah, blah te druk. 198 00:15:16,150 --> 00:15:20,600 Voor, toe ek gesê het, ek het Rob in 'n txt lêer te sit 199 00:15:20,600 --> 00:15:28,830 omdat ek net kan aanstuur txt-lêers, in plaas, / as ek eggo Rob 200 00:15:28,830 --> 00:15:35,520 en dan pyp dit in / hello, wat ook die dieselfde soort van ding doen. 201 00:15:35,520 --> 00:15:39,160 Dit is die uitvoer van hierdie opdrag, echo Rob, 202 00:15:39,160 --> 00:15:43,610 en gebruik dit as die inset vir / hallo. 203 00:15:44,790 --> 00:15:49,560 Jy kan dink dit as eerste aanstuur echo Rob in 'n lêer 204 00:15:49,560 --> 00:15:54,160 en dan insette in / Hello dat lêer wat was net outputted. 205 00:15:54,160 --> 00:15:57,850 Maar dit neem om die tydelike lêer uit die prentjie. 206 00:16:01,890 --> 00:16:04,460 >> Vrae oor wat? 207 00:16:04,460 --> 00:16:07,150 >> Die volgende vraag is gaan om dit te betrek. 208 00:16:07,150 --> 00:16:15,310 Wat pyplyn kan jy gebruik om die getal van unieke name in 'n lêer genaamd names.txt te vind? 209 00:16:15,310 --> 00:16:24,160 Die opdragte gaan ons hier wil gebruik is uniek, so Uniq, en dan toilet. 210 00:16:24,160 --> 00:16:28,840 Jy kan 'n mens Uniq doen om werklik te kyk na wat dit beteken, 211 00:16:28,840 --> 00:16:34,840 En dit is net gaan aangrensende ooreenstem met lyne van die insette te filtreer. 212 00:16:34,840 --> 00:16:40,690 En die mens toilet gaan die newline, woord, en byte tellings vir elke lêer te druk. 213 00:16:40,690 --> 00:16:43,760 En die laaste een wat ons gaan wil gebruik is 'n soort, 214 00:16:43,760 --> 00:16:47,410 wat gaan net lyne van txt-lêer sorteer. 215 00:16:47,410 --> 00:16:58,080 As Ek maak 'n paar txt lêer, names.txt, en dit is Rob, Tommy, Joseph, Tommy, Josef, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 wat ek hier wil doen is om die getal van unieke name in hierdie lêer vind. 217 00:17:03,910 --> 00:17:08,750 So, wat moet die antwoord wees? >> [Student] 4. >> Ja. 218 00:17:08,750 --> 00:17:13,780 Dit moet 4 sedert Rob, Tommy, Joseph, RJ is die enigste unieke name in hierdie lêer. 219 00:17:13,780 --> 00:17:20,180 Die eerste stap, as ek net doen woord reken op names.txt, 220 00:17:20,180 --> 00:17:24,290 dit is eintlik vertel my alles. 221 00:17:24,290 --> 00:17:32,560 Dit is eintlik druk - laat ons sien, man wc - newlines, woorde, en byte telling. 222 00:17:32,560 --> 00:17:38,270 As ek maar net omgee lyne, dan kan ek net doen wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 So dit is 'n stap 1. 224 00:17:44,300 --> 00:17:50,510 Maar ek wil nie na wc-l names.txt omdat names.txt net al die name bevat, 225 00:17:50,510 --> 00:17:54,170 en ek wil uit te filtreer enige nie-uniek. 226 00:17:54,170 --> 00:18:01,200 So as ek doen Uniq names.txt, beteken dit nie heeltemal gee my wat ek wil hê 227 00:18:01,200 --> 00:18:03,760 omdat die gedupliseer name is nog steeds daar. 228 00:18:03,760 --> 00:18:07,690 Hoekom is dit? Hoekom is Uniq nie doen wat ek wil? 229 00:18:07,690 --> 00:18:10,500 [Student] Die duplikate is nie [onhoorbaar] >> Ja. 230 00:18:10,500 --> 00:18:16,370 Onthou die man bladsy vir Uniq sê filter aangrensende passende reëls. 231 00:18:16,370 --> 00:18:19,680 Hulle is nie aangrensende, so dit sal hulle filtreer nie. 232 00:18:19,680 --> 00:18:31,100 As ek sorteer hulle eerste soort names.txt gaan al die duplikaat lyne saam te stel. 233 00:18:31,100 --> 00:18:34,450 So nou soort names.txt is. 234 00:18:34,450 --> 00:18:40,550 Ek gaan om te wil om dit te gebruik as die inset na Uniq | Uniq. 235 00:18:40,550 --> 00:18:43,390 Dit gee my Josef, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 en ek wil om dit te gebruik as die inset na wc-l, 237 00:18:49,260 --> 00:18:52,740 wat gaan om te gee my 4. 238 00:18:52,740 --> 00:18:56,930 Soos dit sê hier, wat kan pyplyn jy gebruik? 239 00:18:56,930 --> 00:19:01,390 Jy kan 'n baie van die dinge doen soos die gebruik van 'n reeks instruksies 240 00:19:01,390 --> 00:19:05,130 waar jy die uitset van een opdrag as die insette tot die volgende opdrag. 241 00:19:05,130 --> 00:19:08,780 'N baie van die dinge, 'n baie slim dinge wat jy kan doen. 242 00:19:08,780 --> 00:19:11,440 >> Vrae? 243 00:19:12,910 --> 00:19:14,600 Okay. 244 00:19:14,600 --> 00:19:17,880 Dis dit vir pype en herlei. 245 00:19:18,370 --> 00:19:24,090 >> Nou gaan ons na die werklike dinge, die kodering dinge. 246 00:19:24,090 --> 00:19:29,100 Binnekant van die PDF, sien jy hierdie opdrag, 247 00:19:29,100 --> 00:19:32,950 en jy wil om hierdie opdrag uit te voer in jou toestel. 248 00:19:36,240 --> 00:19:42,250 wget is die opdrag, in wese, net om iets van die Internet 249 00:19:42,250 --> 00:19:45,180 so wget en hierdie URL. 250 00:19:45,180 --> 00:19:49,110 As jy na hierdie URL in jou browser, sou dit om die lêer te laai. 251 00:19:49,110 --> 00:19:52,510 Ek het net gekliek op dit, sodat dit vir my die lêer afgelaai. 252 00:19:52,510 --> 00:19:55,650 Maar skrif wget van daardie ding binnekant van die terminale 253 00:19:55,650 --> 00:19:58,620 is net gaan om dit af te laai in jou terminale. 254 00:19:58,620 --> 00:20:02,750 Ek het section5.zip, en jy wil section5.zip te rits, 255 00:20:02,750 --> 00:20:06,520 wat gaan gee jy 'n gids met die naam section5, 256 00:20:06,520 --> 00:20:11,550 wat gaan al die lêers wat ons gaan gebruik vandag binnekant van dit te hê. 257 00:20:33,380 --> 00:20:37,710 As hierdie programme se lêer name dui daarop, hulle is 'n bietjie buggy, 258 00:20:37,710 --> 00:20:40,990 so jou doel is om uit te vind waarom die gebruik van gdb. 259 00:20:40,990 --> 00:20:44,560 Nie almal het hulle afgelaai / weet hoe om hulle te kry afgelaai 260 00:20:44,560 --> 00:20:47,480 in hul toestel? Okay. 261 00:20:47,480 --> 00:20:56,400 >> Running ./buggy1, sal dit sê Segmentasie skuld (kern gestort), 262 00:20:56,400 --> 00:21:00,500 wat enige tyd kry jy 'n segfault, dit is 'n slegte ding. 263 00:21:00,500 --> 00:21:03,810 Onder watter omstandighede kry jy 'n segfault? 264 00:21:03,810 --> 00:21:08,210 [Student] ontwysing 'n null-aanwijzer. >> Ja. So wat is 'n voorbeeld. 265 00:21:08,210 --> 00:21:11,580 Ontwysing 'n null pointer jy gaan 'n segfault te kry. 266 00:21:11,580 --> 00:21:16,720 Wat 'n segfault middel is om jou geheue is te raak, moet jy raak nie. 267 00:21:16,720 --> 00:21:21,350 So ontwysing 'n null pointer raak adres 0, 268 00:21:21,350 --> 00:21:28,060 en basies alle rekenaars deesdae sê dat die adres 0 geheue wat jy moet raak nie. 269 00:21:28,060 --> 00:21:31,920 So dit is waarom ontwysing 'n null-aanwijzer resultate in 'n segfault. 270 00:21:31,920 --> 00:21:37,210 As jy gebeur nie inisialiseer nie 'n wyser, dan is dit 'n gemors waarde, 271 00:21:37,210 --> 00:21:41,520 en so as jy probeer om dereference dit, in alle waarskynlikheid jy raak geheue 272 00:21:41,520 --> 00:21:43,540 dit is in die middel van nêrens. 273 00:21:43,540 --> 00:21:45,650 As jy toevallig te kry gelukkig en die vullis waarde 274 00:21:45,650 --> 00:21:48,440 gebeur om te verwys na iewers op die stapel of iets, 275 00:21:48,440 --> 00:21:50,820 dan wanneer jy dereference dat die wyser wat jy nie geïnisialiseer, 276 00:21:50,820 --> 00:21:52,730 niks verkeerd gaan. 277 00:21:52,730 --> 00:21:55,480 Maar as dit verwys na, sê, iewers tussen die stapel en die hoop, 278 00:21:55,480 --> 00:21:59,850 of dit wys net iewers wat nie gebruik word deur jou program nie, 279 00:21:59,850 --> 00:22:02,240 dan moet jy raak geheue wat jy moet raak nie en jy segfault. 280 00:22:02,240 --> 00:22:06,370 Wanneer jy skryf 'n rekursiewe funksie en dit recurses te veel keer 281 00:22:06,370 --> 00:22:08,720 en jou stapel groei te groot en die stapel bots in die dinge 282 00:22:08,720 --> 00:22:12,270 dat dit nie bots met, jy raak geheue wat jy moet raak nie, 283 00:22:12,270 --> 00:22:14,810 sodat jy segfault. 284 00:22:14,810 --> 00:22:17,010 Dit is wat 'n segfault is. 285 00:22:17,010 --> 00:22:21,810 >> Dit is ook dieselfde rede dat as jy het 'n string soos - 286 00:22:21,810 --> 00:22:23,930 laat ons gaan terug na die vorige program. 287 00:22:23,930 --> 00:22:28,530 In hello.c-Achievement net gaan om iets anders te maak. 288 00:22:28,530 --> 00:22:33,770 char * s = "hello world!"; 289 00:22:33,770 --> 00:22:42,310 As ek * s = iets of e [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 so maak hello, / Hello, hoekom het daardie segfault? 291 00:22:48,410 --> 00:22:51,250 Waarom het hierdie segfault? 292 00:22:55,660 --> 00:22:57,890 Wat sou jy verwag om te gebeur? 293 00:22:57,890 --> 00:23:06,640 As ek gedoen het printf ("% s \ n", s), wat sou jy verwag om gedruk te word? 294 00:23:06,640 --> 00:23:09,930 [Student] X hello. >> Ja. 295 00:23:09,930 --> 00:23:15,140 Die probleem is dat wanneer jy verklaar dat 'n string soos hierdie, 296 00:23:15,140 --> 00:23:18,190 is 'n wyser wat gaan om te gaan op die stapel, 297 00:23:18,190 --> 00:23:25,880 en wat s dui op hierdie string wat vervat is in 'n lees-alleen geheue. 298 00:23:25,880 --> 00:23:30,560 Dus, deur net die naam, read-only memory, moet jy kry die idee 299 00:23:30,560 --> 00:23:33,010 dat as jy probeer om te verander wat in lees-alleen geheue is, 300 00:23:33,010 --> 00:23:36,670 jy doen iets wat jy nie behoort te doen het met die geheue en jy segfault. 301 00:23:36,670 --> 00:23:45,360 Dit is eintlik 'n groot verskil tussen char * s en char s []. 302 00:23:45,360 --> 00:23:48,790 So char s [], nou hierdie string gaan word op die stapel geplaas, 303 00:23:48,790 --> 00:23:53,960 en die stapel is nie lees-alleen, wat beteken dat dit heeltemal fyn werk. 304 00:23:55,500 --> 00:23:57,370 En dit doen. 305 00:23:57,370 --> 00:24:06,250 Onthou dat wanneer ek char * s = "hello world!", S self is op die stapel 306 00:24:06,250 --> 00:24:10,390 maar se punte om iewers anders, en dit gebeur iewers anders lees-alleen te wees. 307 00:24:10,390 --> 00:24:15,640 Maar char s [] is net iets op die stapel. 308 00:24:17,560 --> 00:24:21,760 So dit is nog 'n voorbeeld van 'n segfault gebeur. 309 00:24:21,760 --> 00:24:27,820 >> Ons sien dat ./buggy1 gelei in 'n segfault. 310 00:24:27,820 --> 00:24:31,810 In teorie, moet jy nie kyk na buggy1.c onmiddellik. 311 00:24:31,810 --> 00:24:35,170 In plaas daarvan, sal ons kyk na dit deur gdb. 312 00:24:35,170 --> 00:24:37,750 Let daarop dat wanneer jy Segmentering skuld (kern gestort), 313 00:24:37,750 --> 00:24:40,850 jy hierdie lêer oor hier genoem kern. 314 00:24:40,850 --> 00:24:45,200 As ons ls-l, sal ons sien dat die kern is gewoonlik 'n redelik groot lêer. 315 00:24:45,200 --> 00:24:51,580 Dit is die aantal grepe van die lêer, sodat dit lyk asof dit is 250-iets kilogrepe. 316 00:24:51,580 --> 00:24:56,120 Die rede hiervoor is dat dit wat die kern dump eintlik 317 00:24:56,120 --> 00:25:01,410 is wanneer jou program crashes, die toestand van die geheue van jou program 318 00:25:01,410 --> 00:25:05,230 net kry in hierdie lêer gekopieer en geplak. 319 00:25:05,230 --> 00:25:07,270 Dit word gestort in daardie lêer. 320 00:25:07,270 --> 00:25:13,060 Hierdie program, terwyl dit hardloop, 'n geheue gebruik van ongeveer 250 kilogrepe gebeur het, 321 00:25:13,060 --> 00:25:17,040 en so dit is wat het in hierdie lêer gestort. 322 00:25:17,040 --> 00:25:23,630 Nou kan jy kyk na daardie lêer as ons dit doen gdb buggy1 kern. 323 00:25:23,630 --> 00:25:30,130 Ons kan net doen gdb buggy1, en dit sal net begin gdb gereeld, 324 00:25:30,130 --> 00:25:33,800 deur buggy1 aangesien sy insette lêer. 325 00:25:33,800 --> 00:25:38,260 Maar as jy dit doen gdb buggy1 kern, dan is dit is spesifiek gaan om te begin gdb 326 00:25:38,260 --> 00:25:40,330 deur te kyk op daardie kern lêer. 327 00:25:40,330 --> 00:25:45,560 En jy sê buggy1 middel gdb weet dat kern lêer kom van die buggy1 program. 328 00:25:45,560 --> 00:25:49,580 So gdb buggy1 kern gaan bring ons dadelik 329 00:25:49,580 --> 00:25:52,060 na die plek waar die program gebeur te beëindig. 330 00:25:57,720 --> 00:26:02,340 Ons sien hier Program met sein 11, segmentering skuld beëindig. 331 00:26:02,340 --> 00:26:10,110 Ons gebeur om 'n lyn van die vergadering, wat is waarskynlik nie baie nuttig om te sien. 332 00:26:10,110 --> 00:26:15,360 Maar as jy tik bt of sleepspoor, dit gaan om die funksie te wees 333 00:26:15,360 --> 00:26:19,430 wat gee ons die lys van ons huidige stapel rame. 334 00:26:19,430 --> 00:26:23,150 So sleepspoor. Dit lyk of ons net twee stapel rame. 335 00:26:23,150 --> 00:26:26,310 Die eerste is ons belangrikste stapel raam, 336 00:26:26,310 --> 00:26:29,810 en die tweede is die stapel raam vir hierdie funksie wat ons gebeur te wees in, 337 00:26:29,810 --> 00:26:34,440 wat lyk soos ons net die vergadering kode vir. 338 00:26:34,440 --> 00:26:38,050 So laat ons gaan terug in ons belangrikste funksie, 339 00:26:38,050 --> 00:26:42,300 en te doen wat ons kan raam 1 doen, en ek dink dat ons ook kan doen, 340 00:26:42,300 --> 00:26:45,160 maar ek het byna nooit doen af ​​- of up. Ja. 341 00:26:45,160 --> 00:26:50,710 Op en af. Up bring jy een stapel raam, af bring jy 'n stapel raam. 342 00:26:50,710 --> 00:26:53,240 Ek is geneig om nooit te gebruik dat. 343 00:26:53,240 --> 00:26:59,120 Ek net sê spesifiek raam 1, wat gaan aan die raam gemerk 1. 344 00:26:59,120 --> 00:27:01,750 Frame 1 gaan om ons in te bring in die hoof stapel raam, 345 00:27:01,750 --> 00:27:05,570 en dit sê hier die reël van die kode wat ons gebeur te wees. 346 00:27:05,570 --> 00:27:07,950 As ons wou nog 'n paar reëls van die kode, kan ons sê lys, 347 00:27:07,950 --> 00:27:11,280 en dit is gaan ons al die reëls van die kode om dit te gee. 348 00:27:11,280 --> 00:27:13,360 Die lyn wat ons segfaulted op 6: 349 00:27:13,360 --> 00:27:17,360 if (strcmp ("CS50 rotse", bevat SPASIES [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Indien dit nie voor die hand liggend is nie, kan jy dit direk van hier net deur te dink hoekom dit segfaulted. 351 00:27:24,130 --> 00:27:28,800 Maar ons kan neem dit 'n stap verder en sê, "Waarom sou bevat SPASIES [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Let's print bevat SPASIES [1], en dit lyk soos dit se 0x0, wat is die null pointer. 353 00:27:38,830 --> 00:27:44,750 Ons strcmping CS50 rotse en null, en so wat gaan segfault. 354 00:27:44,750 --> 00:27:48,280 En waarom is bevat SPASIES [1] null? 355 00:27:48,640 --> 00:27:51,280 [Student] Omdat ons nie gee dit 'n command-line argumente. 356 00:27:51,280 --> 00:27:53,390 Ja. Ons het nie gee dit 'n command-line argumente. 357 00:27:53,390 --> 00:27:58,460 So ./buggy1 gaan net bevat SPASIES [0] wees ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Dit gaan nie om 'n bevat SPASIES [1], so wat gaan segfault. 359 00:28:02,100 --> 00:28:07,450 Maar as ek doen in plaas daarvan, net CS50, dit gaan om te sê jy 'n D 360 00:28:07,450 --> 00:28:09,950 want dit is wat dit veronderstel is om te doen. 361 00:28:09,950 --> 00:28:15,240 Looking by buggy1.c, dit veronderstel is om te druk "Jy kry 'n D" - 362 00:28:15,240 --> 00:28:20,820 As bevat SPASIES [1] is nie "CS50 rotse", "Jy kry 'n D", anders "Jy kry 'n A!" 363 00:28:20,820 --> 00:28:25,660 So as ons wil 'n A, ons moet dit as die waarheid met mekaar te vergelyk, 364 00:28:25,660 --> 00:28:28,710 wat beteken dat dit kan vergelyk word met 0. 365 00:28:28,710 --> 00:28:31,100 So bevat SPASIES [1] moet wees "CS50 rotse". 366 00:28:31,100 --> 00:28:35,660 As jy wil om dit te doen op die command line, moet jy \ die ruimte te gebruik om te ontsnap. 367 00:28:35,660 --> 00:28:41,690 So CS50 \ rotse en jy kry 'n A! 368 00:28:41,690 --> 00:28:44,060 As jy nie die back slash doen, waarom dit nie werk nie? 369 00:28:44,060 --> 00:28:47,190 [Student] Dit is twee verskillende argumente. >> Ja. 370 00:28:47,190 --> 00:28:52,540 Bevat SPASIES [1] gaan wees CS50, en bevat SPASIES [2] gaan wees rotse. Okay. 371 00:28:52,540 --> 00:28:56,470 >> Nou ./buggy2 gaan weer segfault. 372 00:28:56,470 --> 00:29:01,880 In plaas daarvan om dit oop te maak met sy kern lêer, ons sal net oop te maak buggy2 direk, 373 00:29:01,880 --> 00:29:05,000 so gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Nou as ons net ons program te hardloop, dan is dit gaan om te sê Program ontvang sein SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 wat is die segfault sein, en dit is waar dit gebeur het om te gebeur. 376 00:29:15,530 --> 00:29:21,250 Soek by ons sleepspoor, sien ons dat ons in die funksie oh_no, 377 00:29:21,250 --> 00:29:23,900 wat geroep is deur die funksie Dinky, wat deur die funksie binky genoem is, 378 00:29:23,900 --> 00:29:26,460 wat deur die hoof geroep is. 379 00:29:26,460 --> 00:29:31,680 Ons kan ook sien die argumente vir hierdie funksies. 380 00:29:31,680 --> 00:29:34,680 Die argument te Dinky en binky was 1. 381 00:29:34,680 --> 00:29:44,390 As ons die lys die funksie oh_no, sien ons dat oh_no net doen char ** s = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "boom"; 383 00:29:47,410 --> 00:29:50,330 Waarom sou dit misluk? 384 00:29:54,330 --> 00:29:58,380 [Student] Jy kan nie dereference die null pointer? >> Ja. 385 00:29:58,380 --> 00:30:06,090 Dit is net te sê s is NULL, ongeag of wat gebeur met 'n char ** 386 00:30:06,090 --> 00:30:12,070 wat, afhangende van hoe jy dit interpreteer, kan dit 'n wyser na 'n wyser na 'n string 387 00:30:12,070 --> 00:30:15,550 of 'n skikking van stringe. 388 00:30:15,550 --> 00:30:21,430 Dit is s is NULL, so * s is ontwysing 'n null pointer, 389 00:30:21,430 --> 00:30:24,800 en so dit gaan om te crash. 390 00:30:24,800 --> 00:30:27,540 Dit is een van die vinnigste maniere waarop jy kan segfault. 391 00:30:27,540 --> 00:30:31,300 Dit is net waarby 'n null pointer en onmiddellik segfaulting. 392 00:30:31,300 --> 00:30:34,570 Dit is wat oh_no doen. 393 00:30:34,570 --> 00:30:43,400 As ons gaan op 'n raam, dan gaan ons te kry in die funksie wat genoem oh_no. 394 00:30:43,400 --> 00:30:44,830 Ek nodig het dat om af te doen. 395 00:30:44,830 --> 00:30:48,610 As jy nie 'n opdrag betree en jy net druk Enter weer 396 00:30:48,610 --> 00:30:52,350 dit sal net herhaal die vorige opdrag wat jy geloop het. 397 00:30:52,350 --> 00:30:56,610 Ons is in raam 1. 398 00:30:56,610 --> 00:31:04,650 Listing hierdie raam, ons sien hier is ons funksie. 399 00:31:04,650 --> 00:31:08,520 Jy kan getref lys weer, of jy kan lys 20 en dit sal 'n lys van meer. 400 00:31:08,520 --> 00:31:13,640 Die funksie Dinky sê as ek 1, dan gaan jy na die oh_no funksie, 401 00:31:13,640 --> 00:31:15,960 anders gaan die slinky funksie. 402 00:31:15,960 --> 00:31:18,700 En ons weet ek is 1 omdat ons gebeur om te sien hier 403 00:31:18,700 --> 00:31:22,560 Dinky is genoem met die argument 1. 404 00:31:22,560 --> 00:31:27,560 Of jy kan net druk moet ek en dit sal sê ek is 1. 405 00:31:27,560 --> 00:31:33,770 Ons is tans in Dinky, en as ons gaan op 'n ander raam, ons weet dat ons sal eindig in binky. 406 00:31:33,770 --> 00:31:36,600 Up. Nou is ons in binky. 407 00:31:36,600 --> 00:31:41,340 Listing hierdie funksie - die lys van voor die helfte van my af te sny - 408 00:31:41,340 --> 00:31:52,670 dit het begin asof ek 0, dan gaan ons noem dit oh_no, anders Dinky noem. 409 00:31:52,670 --> 00:31:57,000 Ons weet ek was 1, sodat dit het Dinky. 410 00:31:57,000 --> 00:32:05,030 En nou is ons terug in die hoof, en die belangrikste is net gaan na int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Dit is net gaan om te gee jou 'n ewekansige getal wat is óf 0, 1 of 2. 412 00:32:08,790 --> 00:32:12,780 Dit gaan binky met daardie getal te noem, en dit sal terugkeer 0. 413 00:32:12,780 --> 00:32:16,700 Kyk na hierdie, 414 00:32:16,700 --> 00:32:19,880 net loop sonder dat dit onmiddellik deur middel van die program met die hand, 415 00:32:19,880 --> 00:32:25,400 jy sal 'n breek punt stel by die hoof, wat beteken dat wanneer ons hardloop die program 416 00:32:25,400 --> 00:32:31,020 jou program loop tot dit 'n breek punt tref. 417 00:32:31,020 --> 00:32:35,450 So het die loop van die program, sal dit hardloop en dan sal dit die belangrikste funksie getref en ophou om te hardloop. 418 00:32:35,450 --> 00:32:44,700 Nou is ons binnekant van die hoof, en stap of langs gaan om ons in te bring na die volgende lyn van die kode. 419 00:32:44,700 --> 00:32:47,050 Jy stap of volgende kan doen. 420 00:32:47,050 --> 00:32:51,800 Slaan volgende, nou het ek is rand ()% 3, sodat ons kan die waarde van i print, 421 00:32:51,800 --> 00:32:55,280 en dit sal sê ek is 1. 422 00:32:55,280 --> 00:32:58,110 Nou is dit maak nie saak of gebruik ons ​​volgende of stap. 423 00:32:58,110 --> 00:33:01,000 Ek dink dit saak in die vorige een, maar ons wil om volgende te gebruik. 424 00:33:01,000 --> 00:33:06,000 As ons gebruik stap, ons stap in die funksie, wat beteken 'n blik op die werklike ding 425 00:33:06,000 --> 00:33:07,940 wat gebeur binnekant van binky. 426 00:33:07,940 --> 00:33:10,510 As ons gebruik die volgende, dan beteken dit gaan oor die funksie 427 00:33:10,510 --> 00:33:14,070 en gaan jy na die volgende lyn van kode in ons belangrikste funksie. 428 00:33:14,070 --> 00:33:17,900 Reg hier op hierdie lyn, ek was waar dit gesê rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 as ek stap, sou dit in die implementering van die rand 430 00:33:21,320 --> 00:33:25,110 en kyk na wat daar gebeur, en ek kon stap vir stap deur die rand-funksie. 431 00:33:25,110 --> 00:33:26,920 Maar ek gee nie om oor die rand-funksie. 432 00:33:26,920 --> 00:33:30,190 Ek wil net om te gaan na die volgende lyn van die kode in die belangrikste, so ek gebruik die volgende. 433 00:33:30,190 --> 00:33:35,800 Maar nou doen ek sorg oor die binky funksie, so ek wil om te stap in daardie. 434 00:33:35,800 --> 00:33:37,730 Nou is ek in binky. 435 00:33:37,730 --> 00:33:42,040 Die eerste reël van die kode gaan om te sê as (i == 0), Ek neem 'n stap, 436 00:33:42,040 --> 00:33:44,930 sien ons ons beland by Dinky. 437 00:33:44,930 --> 00:33:51,620 As ons lys dinge, sien ons dat dit nagegaan is i = 0. 438 00:33:51,620 --> 00:33:55,470 ek is nie gelyk aan 0, so dit het aan die ander toestand, 439 00:33:55,470 --> 00:33:59,540 wat gaan Dinky (i) te roep. 440 00:33:59,540 --> 00:34:04,030 Jy kan deurmekaar raak. 441 00:34:04,030 --> 00:34:07,380 As jy net kyk na hierdie lyne direk, kan jy dink as (i == 0), 442 00:34:07,380 --> 00:34:10,800 okay, dan het ek 'n stap en nou is ek by Dinky (i), 443 00:34:10,800 --> 00:34:14,120 jy kan dink wat beteken i = 0 of iets. 444 00:34:14,120 --> 00:34:18,980 Nee, dit beteken net dat hy weet dit direk kan vashou aan die lyn Dinky (i). 445 00:34:18,980 --> 00:34:23,300 Omdat ek nie 0 is nie, is die volgende stap gaan nie by die ander aan die einde. 446 00:34:23,300 --> 00:34:26,239 Anders is nie 'n lyn wat dit gaan om te stop by. 447 00:34:26,239 --> 00:34:31,570 Dit is net gaan om te gaan na die volgende lyn kan dit eintlik te voer, wat Dinky (i). 448 00:34:31,570 --> 00:34:36,090 Stepping in Dinky (i), sien ons as (i == 1). 449 00:34:36,090 --> 00:34:42,670 Ons weet i = 1, sodat wanneer ons stap, ons weet dat ons gaan om te eindig in oh_no 450 00:34:42,670 --> 00:34:46,489 omdat i = 1 noem die funksie oh_no, wat jy kan stap in, 451 00:34:46,489 --> 00:34:52,969 wat gaan stel char ** s = nul en onmiddellik "boom". 452 00:34:54,270 --> 00:34:59,690 En dan eintlik op soek na die implementering van buggy2, 453 00:34:59,690 --> 00:35:04,590 hierdie, ek is maar net 'n ewekansige getal - 0, 1 of 2 - roeping binky, 454 00:35:04,590 --> 00:35:10,610 wat as ek 0 dit noem oh_no, anders is dit keurig noem, wat kom hier. 455 00:35:10,610 --> 00:35:18,100 As ek 1, bel oh_no, anders roep slinky, wat hier kom, 456 00:35:18,100 --> 00:35:20,460 as ek 2, bel oh_no. 457 00:35:20,460 --> 00:35:24,720 Ek het nie eens dink daar is 'n manier - 458 00:35:24,720 --> 00:35:30,030 Is daar iemand sien 'n manier van die maak van hierdie 'n program wat sal nie segfault? 459 00:35:30,030 --> 00:35:37,530 Want tensy ek mis iets, as ek 0, sal jy onmiddellik segfault, 460 00:35:37,530 --> 00:35:41,250 anders gaan jy na 'n funksie wat as ek is 1 wat jy segfault, 461 00:35:41,250 --> 00:35:44,540 anders gaan jy na 'n funksie waar as ek is 2 segfault. 462 00:35:44,540 --> 00:35:46,810 So maak nie saak wat jy doen, jy segfault. 463 00:35:46,810 --> 00:35:52,380 >> Ek dink een manier om van die vasstelling van dit sou wees in plaas van doen char ** s = NULL, 464 00:35:52,380 --> 00:35:55,610 jy kan malloc ruimte vir daardie string. 465 00:35:55,610 --> 00:36:04,230 Wat ons kan doen malloc (sizeof) - sizeof wat? 466 00:36:09,910 --> 00:36:15,190 [Student] (char) * 5? >> Is dit reg is? 467 00:36:15,190 --> 00:36:21,060 Ek neem aan dit sal werk as ek eintlik dit het, maar dit is nie wat ek soek nie. 468 00:36:24,400 --> 00:36:32,940 Kyk na die tipe van s. Kom ons voeg int *, so int * x. 469 00:36:32,940 --> 00:36:35,600 Ek sou doen malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Of as ek wou 'n skikking van 5, sal ek doen (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Wat as ek 'n int **? 472 00:36:46,260 --> 00:36:49,140 Wat sou ek malloc? 473 00:36:49,140 --> 00:36:53,510 [Student] Grootte van die wyser. >> Ja. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Dieselfde ding hier onder. 475 00:36:56,960 --> 00:37:01,280 Ek wil (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 Dit gaan om ruimte toe te ken vir die wyser wat verwys na "boom". 477 00:37:12,840 --> 00:37:15,330 Ek hoef nie ruimte toe te ken vir "boom" self 478 00:37:15,330 --> 00:37:17,210 want dit is basies gelykstaande aan wat ek vroeër gesê het 479 00:37:17,210 --> 00:37:20,870 char * x = "boom". 480 00:37:20,870 --> 00:37:27,950 "Boom" bestaan ​​reeds. Dit gebeur om te bestaan ​​in die lees-alleen streek van die geheue. 481 00:37:27,950 --> 00:37:35,200 Maar dit bestaan ​​reeds, wat beteken dat hierdie lyn van kode, indien s is 'n char ** 482 00:37:35,200 --> 00:37:43,900 * s is 'n char * en jy die opstel van hierdie char * om te verwys na "boom". 483 00:37:43,900 --> 00:37:50,040 As ek wou "BOOM" in s te kopieer, dan sou ek moet ruimte vir s toe te ken. 484 00:37:55,170 --> 00:38:03,900 Ek sal doen * s = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Hoekom 5? 486 00:38:06,210 --> 00:38:10,860 Hoekom nie 4? Dit lyk soos "boom" is 4 karakters. >> [Student] Die null karakter. 487 00:38:10,860 --> 00:38:14,580 Ja. Al jou snare gaan die null karakter nodig. 488 00:38:14,580 --> 00:38:23,590 Nou kan ek iets doen soos strcat - Wat is die funksie vir die kopiëring van 'n string? 489 00:38:23,590 --> 00:38:28,520 [Student] CPY? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 man strcpy. 491 00:38:36,120 --> 00:38:39,590 So strcpy of strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy is 'n bietjie veiliger omdat jy kan spesifiseer presies hoeveel karakters, 493 00:38:43,410 --> 00:38:46,190 maar hier is dit maak nie saak nie, want ons weet nie. 494 00:38:46,190 --> 00:38:50,340 So strcpy en kyk in die argumente. 495 00:38:50,340 --> 00:38:53,100 Die eerste argument is ons bestemming. 496 00:38:53,100 --> 00:38:56,770 Die tweede argument is ons bron. 497 00:38:56,770 --> 00:39:10,310 Ons gaan om te kopieer in ons bestemming * s die pointer "BOOM". 498 00:39:10,310 --> 00:39:19,820 Hoekom wil jy dalk om dit te doen met 'n strcpy in plaas van net wat ons gehad het voordat 499 00:39:19,820 --> 00:39:22,800 * s = "boom"? 500 00:39:22,800 --> 00:39:28,630 Daar is 'n rede waarom jy dalk wil om dit te doen, maar wat is die rede? 501 00:39:28,630 --> 00:39:31,940 [Student] As jy iets wil verander in "BOOM". >> Ja. 502 00:39:31,940 --> 00:39:37,950 Nou kan ek doen iets s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 want se punte aan die hoop en dat spasie op die hoop dat s word verwys na 504 00:39:48,190 --> 00:39:52,320 is 'n wyser om meer spasie op die hoop wat die stoor van "boom". 505 00:39:52,320 --> 00:39:55,150 So hierdie kopie van "boom" word gestoor in die hoop. 506 00:39:55,150 --> 00:39:58,780 Daar is tegnies twee kopieë van "BOOM" in ons program. 507 00:39:58,780 --> 00:40:03,500 Daar is die eerste een wat net deur hierdie "boom" string konstante, 508 00:40:03,500 --> 00:40:09,250 en die tweede afskrif van "boom", strcpy die afskrif van "boom" geskep het. 509 00:40:09,250 --> 00:40:13,100 Maar die afskrif van "boom" word gestoor op die hoop en die hoop wat jy is vry om te verander. 510 00:40:13,100 --> 00:40:17,250 Die hoop het nie lees-alleen, so dit beteken dat s [0] 511 00:40:17,250 --> 00:40:20,500 gaan om jou te laat die waarde van "boom" te verander. 512 00:40:20,500 --> 00:40:23,130 Dit gaan om jou te laat die karakters verander. 513 00:40:23,130 --> 00:40:26,640 >> Vrae? 514 00:40:27,740 --> 00:40:29,290 Okay. 515 00:40:29,290 --> 00:40:35,500 >> Beweeg op tot buggy3, laat se gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Ons het net hardloop dit en ons sien ons kry 'n segfault. 517 00:40:39,840 --> 00:40:46,550 As ons sleepspoor, is daar slegs twee funksies. 518 00:40:46,550 --> 00:40:52,970 As ons gaan in ons belangrikste funksie, sien ons dat ons op hierdie lyn segfaulted. 519 00:40:52,970 --> 00:41:00,180 Dus net op soek na hierdie lyn, int lyn = 0 vir (; fgets hierdie dinge nie gelyk aan NULL; 520 00:41:00,180 --> 00:41:03,770 lyn + +). 521 00:41:03,770 --> 00:41:08,010 Ons vorige raam is genoem _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Sal jy sien dat 'n baie met ingeboude C funksies, 523 00:41:10,720 --> 00:41:15,350 dat wanneer jy die segfault, sal daar regtig 'n kriptiese funksie name 524 00:41:15,350 --> 00:41:18,090 soos hierdie _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Maar dit gaan in verband te bring hierdie fgets oproep. 526 00:41:21,770 --> 00:41:25,850 Iewers in hier, is ons segfaulting. 527 00:41:25,850 --> 00:41:30,340 As ons kyk na die argumente fgets, kan ons druk buffer. 528 00:41:30,340 --> 00:41:41,180 Kom ons druk as 'n O, nee. 529 00:41:48,980 --> 00:41:51,900 Print gaan nie werk presies soos ek dit wil. 530 00:41:55,460 --> 00:41:58,000 Kom ons kyk na die werklike program. 531 00:42:02,200 --> 00:42:09,640 Buffer is 'n karakter skikking. Dit is 'n karakter verskeidenheid van 128 karakters. 532 00:42:09,640 --> 00:42:14,980 So wanneer ek sê print buffer, gaan dit die 128 karakters te druk, 533 00:42:14,980 --> 00:42:18,300 wat ek dink is wat verwag word. 534 00:42:18,300 --> 00:42:21,390 Wat ek soek is druk die adres van die buffer, 535 00:42:21,390 --> 00:42:23,680 maar dit beteken nie regtig vir my sê baie. 536 00:42:23,680 --> 00:42:30,770 So toe ek toevallig om te sê hier x buffer, dit wys my 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 wat, as jy onthou van vroeër of 'n sekere punt, Oxbffff is geneig om 'n stapel-ish streek. 538 00:42:38,690 --> 00:42:46,020 Die stapel is geneig om iewers te begin net onder 0xc000. 539 00:42:46,020 --> 00:42:51,890 Net deur hierdie adres te sien, ek weet dat buffer gebeur op die stapel. 540 00:42:51,890 --> 00:43:04,500 Weer te begin my program, hardloop, buffer, wat ons gesien het, was om die volgorde van die karakters 541 00:43:04,500 --> 00:43:06,530 wat pretty much betekenisloos. 542 00:43:06,530 --> 00:43:12,270 Dan druk-lêer, wat beteken lêer lyk? 543 00:43:15,120 --> 00:43:17,310 [Student] null. >> Ja. 544 00:43:17,310 --> 00:43:22,610 Lêer is 'n soort lêer *, so dit is 'n wyser, 545 00:43:22,610 --> 00:43:26,610 en die waarde van die wyser is leeg. 546 00:43:26,610 --> 00:43:33,240 So fgets gaan om te probeer om te lees dat die wyser op 'n indirekte manier, 547 00:43:33,240 --> 00:43:37,320 maar sodat wyser om toegang te verkry tot, moet dit dereference dit. 548 00:43:37,320 --> 00:43:40,550 Of, ten einde toegang tot wat dit behoort te wys word, is dit dereferences dit. 549 00:43:40,550 --> 00:43:43,810 So dit is 'n null-aanwijzer en dit segfaults ontwysing. 550 00:43:46,600 --> 00:43:48,730 Ek kon weer begin het. 551 00:43:48,730 --> 00:43:52,170 As ons breek op ons belangrikste punt en hardloop, 552 00:43:52,170 --> 00:43:57,320 die eerste reël van die kode is char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Dit moet 'n mooi groot wenk as waarom hierdie program nie. 554 00:44:00,870 --> 00:44:06,080 Tik die volgende bring my by die volgende reël, waar ek hierdie lêer oopmaak, 555 00:44:06,080 --> 00:44:11,140 en dan het ek dadelik in ons lyn, waar ek jou eenmaal getref volgende, gaan dit segfault. 556 00:44:11,140 --> 00:44:16,880 Is daar iemand wil gooi uit 'n rede waarom ons kan segfaulting word? 557 00:44:16,880 --> 00:44:19,130 [Student] Lêer bestaan ​​nie. >> Ja. 558 00:44:19,130 --> 00:44:22,250 Dit is veronderstel om 'n wenk 559 00:44:22,250 --> 00:44:29,570 dat wanneer jy 'n lêer opening van wat jy nodig het om seker te maak dat die lêer bestaan. 560 00:44:29,570 --> 00:44:31,510 So hier is, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Wanneer ons fopen lêernaam vir lees, moet ons dan om te sê 562 00:44:34,700 --> 00:44:45,870 if (lêer == null) en sê printf ("Lêer bestaan ​​nie!" 563 00:44:45,870 --> 00:44:56,340 of - nog beter - lêernaam); terugkeer 1; 564 00:44:56,340 --> 00:45:00,300 So nou het ons gaan om te sien of dit is NULL 565 00:45:00,300 --> 00:45:03,930 voor eintlik voort en probeer om te lees van daardie lêer. 566 00:45:03,930 --> 00:45:08,800 Ons kan remake dit net dat werke te sien. 567 00:45:11,020 --> 00:45:14,970 Ek bedoel 'n nuwe reël in te sluit. 568 00:45:21,090 --> 00:45:25,290 So nou nonexistent.txt bestaan ​​nie. 569 00:45:26,890 --> 00:45:30,040 Jy moet altyd kyk vir hierdie soort van ding. 570 00:45:30,040 --> 00:45:33,870 Jy moet altyd kyk om te sien of fopen terugkeer NULL. 571 00:45:33,870 --> 00:45:38,170 Jy moet altyd kyk om seker te maak dat malloc nie terugkeer NULL, 572 00:45:38,170 --> 00:45:41,410 of anders wat jy segfault. 573 00:45:42,200 --> 00:45:45,930 >> Nou buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Hardloop. Ek vermoed dit is wag vir insette of dalk oneindige herhaling. 575 00:45:58,440 --> 00:46:01,870 Ja, dit is oneindige herhaling. 576 00:46:01,870 --> 00:46:05,560 So buggy4. Dit lyk soos ons is oneindige herhaling. 577 00:46:05,560 --> 00:46:12,590 Ons kan by die hoof breek, hardloop ons program. 578 00:46:12,590 --> 00:46:20,180 Gdb, so lank as wat die afkorting wat jy gebruik het, is ondubbelsinnig 579 00:46:20,180 --> 00:46:23,420 of spesiale afkortings wat hulle verskaf vir jou, 580 00:46:23,420 --> 00:46:29,020 dan kan jy n volgende te gebruik in plaas van om uit te tik die volgende al die pad. 581 00:46:29,020 --> 00:46:33,730 En nou dat ek getref is n een keer, ek kan net druk Enter om voort te gaan volgende 582 00:46:33,730 --> 00:46:36,640 in plaas van om te tref 'n Enter, n Enter, n Enter. 583 00:46:36,640 --> 00:46:44,630 Dit lyk asof ek in 'n soort van loop wat die oprigting array [i] na 0. 584 00:46:44,630 --> 00:46:50,510 Dit lyk soos ek nog nooit is uit te breek van hierdie lus. 585 00:46:50,510 --> 00:46:54,780 As ek i druk, so ek is 2, dan sal ek volgende gaan. 586 00:46:54,780 --> 00:46:59,250 Ek sal druk ek, ek is 3, dan sal ek volgende gaan. 587 00:46:59,250 --> 00:47:05,360 Ek sal druk ek en ek is 3. Volgende, druk ek, ek is 4. 588 00:47:05,360 --> 00:47:14,520 Eintlik, print sizeof (array), so die grootte van die skikking is 20. 589 00:47:16,310 --> 00:47:32,870 Maar dit lyk of daar is 'n paar spesiale gdb opdrag om te gaan totdat iets gebeur. 590 00:47:32,870 --> 00:47:37,620 Dit is soos die opstel van 'n toestand op die waarde van die veranderlike. Maar Ek kan nie onthou wat dit is. 591 00:47:37,620 --> 00:47:44,100 So as ons gaan - 592 00:47:44,100 --> 00:47:47,120 Wat sê jy? Wat het jou laat opkom? 593 00:47:47,120 --> 00:47:50,500 [Student] Is vertoon ek byvoeg - >> Ja. So wys ek kan help. 594 00:47:50,500 --> 00:47:54,530 As ons net i vertoon, sal dit sit hier wat die waarde van i is 595 00:47:54,530 --> 00:47:56,470 so ek hoef dit nie uit te druk elke keer. 596 00:47:56,470 --> 00:48:02,930 As ons net gaan hou langs, dan sien ons 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 Iets gaan verskriklik verkeerd, en ek is stel na 0. 598 00:48:13,330 --> 00:48:22,220 Looking by buggy4.c, ons sien al wat gebeur is int array [5]; 599 00:48:22,220 --> 00:48:26,200 (i = 0; i <= sizeof (array); i + +) 600 00:48:26,200 --> 00:48:28,550 array [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Wat sien ons dat is verkeerd hier? 602 00:48:31,390 --> 00:48:39,480 As 'n wenk, toe ek die gdb buggy4 besig was om te doen - laat ons hoof breek, run - 603 00:48:39,480 --> 00:48:45,980 Ek print sizeof (array) het net om te sien wat die toestand is waar ek moet uiteindelik breek uit. 604 00:48:47,690 --> 00:48:51,100 Waar's ek? Het ek loop? 605 00:48:51,100 --> 00:48:54,280 Ek het nog nie verklaar nie. 606 00:48:54,280 --> 00:48:58,680 So print sizeof (array) en dit is 20, 607 00:48:58,680 --> 00:49:06,690 wat na verwagting sedert my skikking van grootte 5 en dit is 5 heelgetalle, 608 00:49:06,690 --> 00:49:12,410 so die hele ding moet 5 * sizeof (int) bytes, waar sizeof (int) is geneig om te wees 4. 609 00:49:12,410 --> 00:49:14,780 So sizeof (array) is 20. 610 00:49:14,780 --> 00:49:17,420 Wat moet dit wees? 611 00:49:17,420 --> 00:49:21,720 [Student] verdeel deur sizeof (int). >> Ja, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Dit lyk asof daar is nog steeds 'n probleem hier. Ek dink dit moet net wees < 613 00:49:30,630 --> 00:49:36,960 want dit is pretty much altyd 00:49:44,860 Nou laat ons dink oor die rede waarom dit was eintlik gebreek. 615 00:49:44,860 --> 00:49:53,370 Is daar iemand waarom raaiskote was ek weer tot 0 deur elke iterasie van die lus? 616 00:50:01,300 --> 00:50:09,350 Die enigste ding wat binnekant van hier wat gebeur is dat die skikking met die [i] 0 gestel word. 617 00:50:09,350 --> 00:50:15,350 So een of ander manier, is hierdie lyn van die kode wat veroorsaak dat ons int i ingestel word na 0. 618 00:50:16,730 --> 00:50:23,130 [Student] Kan dit wees, want dit is oorheersende die geheue van hierdie deel van die i 619 00:50:23,130 --> 00:50:27,970 wanneer dit dink dit is die volgende skikkingselement? >> [Bowden] Ja. 620 00:50:27,970 --> 00:50:33,880 Wanneer gaan ons verby die einde van ons verskeidenheid, 621 00:50:33,880 --> 00:50:39,870 een of ander manier dat die ruimte wat ons oorheersende oorheersende van die waarde van i. 622 00:50:39,870 --> 00:50:48,030 En so, as ons kyk na buggy4, breek belangrikste, hardloop, 623 00:50:48,030 --> 00:50:53,120 Kom ons druk die adres van i. 624 00:50:53,120 --> 00:50:57,280 Dit lyk soos dit is bffff124. 625 00:50:57,280 --> 00:51:03,930 Laat ons nou druk die adres van array [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Wat van [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] bfff124. 629 00:51:14,530 --> 00:51:26,990 So array [5] het die dieselfde adres as ek, wat beteken dat array [5] i. 630 00:51:26,990 --> 00:51:30,720 As hulle het dieselfde adres, hulle is dieselfde ding. 631 00:51:30,720 --> 00:51:38,410 So wanneer ons array [5] tot 0, is ons die opstel i tot 0. 632 00:51:38,410 --> 00:51:46,070 En as jy dink oor dit in terme van die stapel, 633 00:51:46,070 --> 00:51:55,590 Int ek vir die eerste keer verklaar, wat beteken ek kry 'n paar ruimte op die stapel. 634 00:51:55,590 --> 00:52:04,730 Dan array [5] toegeken is, so is daar dan 20 bytes word toegeken op die stapel. 635 00:52:04,730 --> 00:52:08,400 Ek kry dus eerste keer toegeken is, dan hierdie 20 bytes kry toegeken. 636 00:52:08,400 --> 00:52:11,400 So i gebeur reg voor die skikking, 637 00:52:11,400 --> 00:52:19,230 en as gevolg van die manier, soos ek verlede week gesê, waar dit tegnies die stapel af groei, 638 00:52:19,230 --> 00:52:28,520 wanneer jy die werf in 'n skikking, is ons gewaarborg dat die 0 posisie in die skikking 639 00:52:28,520 --> 00:52:31,970 altyd gebeur voor die eerste posisie in die skikking. 640 00:52:31,970 --> 00:52:35,900 Dit is 'n soort van hoe ek verlede week het dit uitgetrek. 641 00:52:35,900 --> 00:52:42,210 Let daarop dat ons aan die onderkant adres 0 en aan die bokant ons adres Max. 642 00:52:42,210 --> 00:52:44,880 Die stapel is altyd groeiende. 643 00:52:48,100 --> 00:52:53,500 Kom ons sê ons toeken i. 644 00:52:53,500 --> 00:52:59,680 Ons toeken heelgetal i, wat beteken laat ons net sê hier heelgetal i kry toegeken. 645 00:52:59,680 --> 00:53:06,420 Dan sal ons ken ons verskeidenheid van 5 heelgetalle, wat beteken dat onder daardie, 646 00:53:06,420 --> 00:53:11,230 sedert die stapel groei af, kry die 5 heelgetalle toegeken. 647 00:53:11,230 --> 00:53:15,900 Maar gevolg van hoe skikkings werk, ons gewaarborg dat die eerste posisie in die skikking 648 00:53:15,900 --> 00:53:22,260 altyd 'n adres wat minder is as die tweede ding in die skikking. 649 00:53:22,260 --> 00:53:28,270 So array posisie 0 het altyd na die eerste gebeur in die geheue, 650 00:53:28,270 --> 00:53:30,700 terwyl array posisie 1 het gebeur nadat 651 00:53:30,700 --> 00:53:33,310 en skikking posisie 2 het daarna gebeur, 652 00:53:33,310 --> 00:53:37,900 wat beteken dat die skikking posisie 0 iewers hier onder gebeur, 653 00:53:37,900 --> 00:53:40,690 array posisie 1 hierbo wat sou gebeur 654 00:53:40,690 --> 00:53:45,530 want beweeg op 'n hoër die adresse sedert die maksimum adres is hier. 655 00:53:45,530 --> 00:53:50,490 So array [0] sit hier, array [1] tot hier, array [2] tot hier, array [3] hier. 656 00:53:50,490 --> 00:53:55,620 Let op hoe voordat ons toegeken integer i al die pad tot hier, 657 00:53:55,620 --> 00:54:01,040 soos ons beweeg verder en verder in ons verskeidenheid, word ons al hoe nader en nader aan ons heelgetal i. 658 00:54:01,040 --> 00:54:07,640 Dit gebeur net so dat array [5], wat is een posisie buite ons verskeidenheid, 659 00:54:07,640 --> 00:54:13,010 is presies waar heelgetal i gebeur toegeken word. 660 00:54:13,010 --> 00:54:16,920 So wat is die punt waar ons gebeur te wees slaan die ruimte op die stapel 661 00:54:16,920 --> 00:54:21,680 wat is toegeken vir integer i, en ons wat aan 0. 662 00:54:21,680 --> 00:54:26,160 >> Dit is hoe dit werk. Vrae? Ja. 663 00:54:26,160 --> 00:54:30,710 [Student] Never mind. Okay. 664 00:54:30,710 --> 00:54:33,090 [Student] Hoe vermy jy hierdie soort van foute? 665 00:54:33,090 --> 00:54:41,190 Hierdie soort van foute? Gebruik nie C as jou programmeertaal. 666 00:54:41,190 --> 00:54:45,840 Gebruik 'n taal wat skikking grense nagaan. 667 00:54:45,840 --> 00:54:55,900 So lank as wat jy versigtig, jy hoef net te vermy gaan verby die grense van jou skikking. 668 00:54:55,900 --> 00:54:58,300 [Student] So hier toe ons verby die grense van jou verskeidenheid - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Dit is waar dinge begin skeefloop. >> [Student] O, okay. 670 00:55:01,840 --> 00:55:05,730 Solank as wat jy bly in die geheue geallokeer vir jou array, jy is fine. 671 00:55:05,730 --> 00:55:12,400 Maar C geen fout kontrole. As ek dit doen array [1000], sal dit graag net verander wat ook al gebeur - 672 00:55:12,400 --> 00:55:16,500 Dit gaan na die begin van die skikking, dan is dit gaan 1000 poste na en stel dit aan 0. 673 00:55:16,500 --> 00:55:20,000 Dit nie doen enige kontrolering dat oh, dit is eintlik nie 1000 dinge in dit. 674 00:55:20,000 --> 00:55:22,750 1000 is 'n manier as wat ek moet verander, 675 00:55:22,750 --> 00:55:26,940 terwyl Java of iets wat jy kry array perke indeks 676 00:55:26,940 --> 00:55:29,820 of indeks buite grense uitsondering. 677 00:55:29,820 --> 00:55:33,950 Dit is die rede waarom 'n baie hoër vlak tale het hierdie dinge 678 00:55:33,950 --> 00:55:37,340 waar as jy gaan buite die grense van die skikking, u versuim om 679 00:55:37,340 --> 00:55:40,070 sodat jy nie kan verander dinge onder julle 680 00:55:40,070 --> 00:55:42,590 en dan dinge gaan veel erger as net om 'n uitsondering 681 00:55:42,590 --> 00:55:44,940 sê dat jy gaan na die einde van die skikking. 682 00:55:44,940 --> 00:55:50,970 [Student] En so moet ons het net verander die <= net > [Bowden] Ja. 683 00:55:50,970 --> 00:55:54,800 Dit moet wees 00:55:59,560 sedert sizeof (array) is 20, maar ons wil net 5. >> [Student] Reg. 685 00:55:59,560 --> 00:56:04,060 Nog vrae? Okay. 686 00:56:04,060 --> 00:56:07,380 >> [Student] Ek het 'n vraag. >> Ja. 687 00:56:07,380 --> 00:56:16,440 [Student] Wat is die werklike verskeidenheid veranderlike? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Soos wat array? 689 00:56:20,000 --> 00:56:24,930 Array self is 'n simbool. 690 00:56:24,930 --> 00:56:31,490 Dit is net die adres van die begin van die 20 bytes dat ons verwysingstegnieke. 691 00:56:31,490 --> 00:56:38,070 Jy kan dink aan dit as 'n wyser nie, maar dit is 'n konstante wyser. 692 00:56:38,070 --> 00:56:44,140 So gou as dinge saamgestel, het die veranderlike skikking nie meer bestaan ​​nie. 693 00:56:44,140 --> 00:56:48,210 [Student] So hoe werk dit die grootte van die skikking? 694 00:56:48,210 --> 00:56:54,130 Grootte van die skikking verwys na die grootte van daardie blok dat simbool verwys na. 695 00:56:54,130 --> 00:57:01,240 Wanneer ek iets doen soos printf ("% p \ n" skikking); 696 00:57:01,240 --> 00:57:05,140 laat se loop dit. 697 00:57:12,960 --> 00:57:15,530 Wat ek het net verkeerd doen? 698 00:57:15,530 --> 00:57:19,220 Array "array" verklaar. 699 00:57:20,820 --> 00:57:23,200 O, hier. 700 00:57:23,200 --> 00:57:31,250 Kletteren is slim, en dit gebeur om op te let dat ek verklaar dat die skikking as 5 elemente 701 00:57:31,250 --> 00:57:34,540 maar ek kruip in posisie 1000. 702 00:57:34,540 --> 00:57:38,450 Dit kan doen nie, want dit is net konstantes. 703 00:57:38,450 --> 00:57:43,370 Dit kan net so ver gaan merk dat ek gaan buite die grense van die skikking. 704 00:57:43,370 --> 00:57:46,880 Maar let voor wanneer ons het ek verkeerd wees, 705 00:57:46,880 --> 00:57:51,040 dit kan nie bepaal hoeveel waardes i kan neem, 706 00:57:51,040 --> 00:57:55,540 so dit kan nie bepaal dat ek gaan na die einde van die skikking. 707 00:57:55,540 --> 00:57:59,430 Dit is net kletteren synde slim. 708 00:57:59,430 --> 00:58:03,340 >> Maar nou maak buggy4. So wat anders doen ek verkeerd? 709 00:58:03,340 --> 00:58:05,970 Implisiet verklaar biblioteek funksie printf ". 710 00:58:05,970 --> 00:58:14,960 Ek gaan om te wil # sluit. 711 00:58:14,960 --> 00:58:18,710 Okay. Nou hardloop buggy4. 712 00:58:18,710 --> 00:58:24,840 Die druk van die waarde van die skikking soos ek hier gedoen het, druk dit as 'n wyser 713 00:58:24,840 --> 00:58:30,060 afdrukke iets wat lyk soos hierdie - bfb8805c - wat is 'n paar adres 714 00:58:30,060 --> 00:58:33,450 dis in die stack-ish streek. 715 00:58:33,450 --> 00:58:41,820 Array self is soos 'n wyser, maar dit is nie 'n werklike pointer, 716 00:58:41,820 --> 00:58:45,410 sedert 'n gereelde pointer ons kan verander. 717 00:58:45,410 --> 00:58:54,700 Skikking is net 'n paar konstante. Die 20 blokke van geheue begin by adres 0xbfb8805c. 718 00:58:54,700 --> 00:59:09,020 So bfb8805c deur hierdie adres +20- of ek dink -20 - 719 00:59:09,020 --> 00:59:17,400 is al die geheue geallokeer vir hierdie skikking. 720 00:59:17,400 --> 00:59:20,350 Skikking, is die veranderlike self nie gestoor oral. 721 00:59:20,350 --> 00:59:27,660 Wanneer jy die opstel van die samesteller - hand golf op dit - 722 00:59:27,660 --> 00:59:33,060 maar die vertaler sal net gebruik waar dit weet skikking te wees. 723 00:59:33,060 --> 00:59:36,090 Dit weet waar daardie skikking begin, 724 00:59:36,090 --> 00:59:40,910 en so dit kan net altyd dinge doen in terme van offsets van daardie begin. 725 00:59:40,910 --> 00:59:43,960 Dit hoef nie 'n veranderlike self skikking te verteenwoordig. 726 00:59:43,960 --> 00:59:53,730 Maar wanneer ek iets doen soos int * p = array p is nou 'n wyser wat daarop dui dat die skikking, 727 00:59:53,730 --> 00:59:57,830 en nou p eintlik nie bestaan ​​op die stapel. 728 00:59:57,830 --> 01:00:01,950 Ek is vry om p te verander. Ek kan doen p = malloc. 729 01:00:01,950 --> 01:00:06,500 So het dit oorspronklik verwys na verskeidenheid, nou is dit wys na 'n ruimte op die hoop. 730 01:00:06,500 --> 01:00:09,620 Ek kan dit nie doen skikking = malloc. 731 01:00:09,620 --> 01:00:13,710 As kletteren is slim, sal dit op my skreeu regs af die vlermuis. 732 01:00:17,000 --> 01:00:21,430 Eintlik is ek redelik seker dat gcc sal dit ook doen. 733 01:00:21,430 --> 01:00:25,010 So verskeidenheid tipe int [5] "is nie oordraagbaar nie. 734 01:00:25,010 --> 01:00:28,040 Jy kan nie iets aan 'n verskeidenheid tipe 735 01:00:28,040 --> 01:00:30,500 want die skikking is net 'n konstante. 736 01:00:30,500 --> 01:00:34,760 Dit is 'n simbool wat verwysings daardie 20 grepe. Ek kan dit nie verander nie. 737 01:00:34,760 --> 01:00:37,690 >> [Student] En waar is die grootte van die skikking gestoor? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Dit is nie gestoor oral. Dit is wanneer dit die opstel van. 739 01:00:40,670 --> 01:00:46,310 So waar is die grootte van die skikking gestoor? 740 01:00:46,310 --> 01:00:51,870 Kan jy net gebruik sizeof (array) binnekant van die funksie wat die skikking self verklaar word. 741 01:00:51,870 --> 01:01:03,150 So as ek dit doen paar funksie, cat, en wat ek doen (int array []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (array)); 743 01:01:10,450 --> 01:01:21,330 en dan af Ek noem hier cat (array); 744 01:01:21,330 --> 01:01:24,840 binnekant van hierdie funksie laat loop dit. 745 01:01:34,200 --> 01:01:36,840 Dit is kletteren slim weer. 746 01:01:36,840 --> 01:01:43,890 Dit vertel my dat sizeof array funksie parameter 747 01:01:43,890 --> 01:01:46,690 die grootte van 'int *' sal terugkeer. 748 01:01:46,690 --> 01:01:55,150 Dit sou 'n fout wees as dit is nie wat ek wou om te gebeur. 749 01:01:55,150 --> 01:01:58,960 Kom ons eintlik afskakel Werror. 750 01:02:14,950 --> 01:02:17,590 Waarskuwing. Waarskuwings is fine. 751 01:02:17,590 --> 01:02:19,960 Dit sal nog steeds stel solank dit het 'n waarskuwing. 752 01:02:19,960 --> 01:02:22,910 Gaan. / A.out is uit te druk 4. 753 01:02:22,910 --> 01:02:28,650 Die waarskuwing wat gegenereer is 'n duidelike aanduiding van wat verkeerd geloop het. 754 01:02:28,650 --> 01:02:34,120 Hierdie int skikking net gaan sizeof (int *) te druk. 755 01:02:34,120 --> 01:02:39,790 Selfs as ek array [5] hier, dit is nog steeds net gaan sizeof (int *) te druk. 756 01:02:39,790 --> 01:02:47,440 So gou as jy verby dit in 'n funksie, die onderskeid tussen skikkings en wysers 757 01:02:47,440 --> 01:02:49,670 nie bestaan ​​nie. 758 01:02:49,670 --> 01:02:52,640 Dit gebeur om 'n skikking wat op die stapel verklaar is, 759 01:02:52,640 --> 01:02:58,300 maar sodra ons daardie waarde slaag, dat 0xbf blah, blah, blah in hierdie funksie, 760 01:02:58,300 --> 01:03:03,350 dan is dit wyser wys dat die skikking op die stapel. 761 01:03:03,350 --> 01:03:08,310 So dit beteken dat sizeof slegs van toepassing in die funksie wat die skikking verklaar is, 762 01:03:08,310 --> 01:03:11,230 wat beteken dat wanneer jy die opstel van hierdie funksie, 763 01:03:11,230 --> 01:03:17,330 wanneer die geratel gaan deur middel van hierdie funksie, sien skikking is 'n int verskeidenheid van grootte 5. 764 01:03:17,330 --> 01:03:20,640 So hang dit dan sien sizeof (array). Wel, dit is 20. 765 01:03:20,640 --> 01:03:26,440 Dit is eintlik hoe sizeof basies werk vir byna alle gevalle. 766 01:03:26,440 --> 01:03:31,150 Sizeof is nie 'n funksie nie, dit is 'n operateur. 767 01:03:31,150 --> 01:03:33,570 Jy noem dit nie die sizeof funksie. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), die vertaler sal net vertaal wat aan 4. 769 01:03:41,480 --> 01:03:43,700 Het jy dit? Okay. 770 01:03:43,700 --> 01:03:47,520 >> [Student] So wat is die verskil tussen sizeof (array) in hoof-en foo? 771 01:03:47,520 --> 01:03:52,840 Dit is omdat ons sê sizeof (array), wat van tipe int * 772 01:03:52,840 --> 01:03:57,120 terwyl die skikking af hier is nie van die tipe int *, dit is 'n int verskeidenheid. 773 01:03:57,120 --> 01:04:04,540 >> [Student] So as jy het die parameter in array [] in plaas van int * skikking, 774 01:04:04,540 --> 01:04:09,230 sou dit beteken dat jy nog steeds kan verander array want nou is dit 'n wyser? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Soos hierdie? >> [Student] Ja. Kan jy verskeidenheid binne die funksie nou? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Jy kan verander skikking in beide gevalle. 777 01:04:18,420 --> 01:04:23,130 In beide hierdie gevalle is jy vry om te sê array [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Student] Maar kan jy array punt na iets anders? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Ja. In ieder geval - >> [student] Ja. 780 01:04:30,230 --> 01:04:38,410 [Bowden] Die onderskeid tussen array [] en 'n int * verskeidenheid, is daar niemand. 781 01:04:38,410 --> 01:04:42,570 Jy kan ook 'n multi-dimensionele skikking hier 782 01:04:42,570 --> 01:04:47,050 vir 'n paar gerieflike sintaksis, maar dit is nog steeds net 'n wyser. 783 01:04:47,050 --> 01:04:56,400 Dit beteken dat ek vry skikking te doen = malloc (sizeof (int)), en nou iewers anders wys. 784 01:04:56,400 --> 01:04:59,610 Maar net soos hoe dit werk vir ewig en altyd, 785 01:04:59,610 --> 01:05:03,210 hierdie verskeidenheid deur dit te verander na iets anders 786 01:05:03,210 --> 01:05:07,570 verander nie hierdie array hier af, want dit is 'n afskrif van die argument, 787 01:05:07,570 --> 01:05:10,780 dit is nie 'n wyser na daardie argument. 788 01:05:10,780 --> 01:05:16,070 En eintlik, net soos meer aanduiding dat dit presies is dieselfde - 789 01:05:16,070 --> 01:05:21,100 ons reeds gesien het wat druk array druk - 790 01:05:21,100 --> 01:05:31,410 Wat gebeur as ons die druk van die adres van die skikking of die adres van die adres van die skikking 791 01:05:31,410 --> 01:05:36,290 een van dié? 792 01:05:41,770 --> 01:05:45,220 Kom ons ignoreer hierdie een. 793 01:05:48,140 --> 01:05:51,660 Okay. Dit is 'n boete. Dit is nou hardloop / a.out. 794 01:05:51,660 --> 01:06:00,220 Druk skikking, dan druk van die adres van die skikking, is dieselfde ding. 795 01:06:00,220 --> 01:06:02,870 Array net nie bestaan ​​nie. 796 01:06:02,870 --> 01:06:08,190 Dit weet wanneer jy skikking wil druk, moet jy die simbool wat verwys na die 20 bytes wil druk. 797 01:06:08,190 --> 01:06:11,940 Die druk van die adres van die skikking, goed, skikking bestaan ​​nie. 798 01:06:11,940 --> 01:06:17,200 Dit hoef nie 'n adres, sodat dit net druk die adres van die 20 bytes. 799 01:06:20,820 --> 01:06:28,150 So gou as wat jy stel, soos in jou saamgestel buggy4 / a.out. 800 01:06:28,150 --> 01:06:30,340 skikking is nie bestaan ​​nie. 801 01:06:30,340 --> 01:06:33,640 Pointers bestaan. Skikkings nie. 802 01:06:34,300 --> 01:06:38,060 Die blokke van geheue wat die skikking steeds bestaan, 803 01:06:38,060 --> 01:06:43,270 maar die veranderlike verskeidenheid en veranderlikes van daardie soort nie bestaan ​​nie. 804 01:06:46,260 --> 01:06:50,270 Dit is soos die belangrikste verskille tussen skikkings en wysers 805 01:06:50,270 --> 01:06:55,590 so gou as wat jy maak funksie oproepe, daar is geen verskil nie. 806 01:06:55,590 --> 01:07:00,460 Maar binnekant van die funksie wat die skikking self verklaar word, sizeof werk anders 807 01:07:00,460 --> 01:07:05,190 omdat jy die druk van die grootte van die blokke in plaas van die grootte van die tipe, 808 01:07:05,190 --> 01:07:08,950 en jy kan dit nie verander nie, want dit is 'n simbool. 809 01:07:08,950 --> 01:07:14,370 Die druk van die ding en die adres van die ding druk dieselfde ding. 810 01:07:14,370 --> 01:07:18,480 En dit is pretty much dit. 811 01:07:18,480 --> 01:07:20,820 [Student] Kan jy sê dat 'n mens meer tyd? 812 01:07:21,170 --> 01:07:24,170 Ek dalk iets gemis het. 813 01:07:24,170 --> 01:07:29,260 Druk skikking en adres van skikking druk dieselfde ding, 814 01:07:29,260 --> 01:07:33,180 terwyl as jy die druk van 'n wyser teenoor die adres van die wyser, 815 01:07:33,180 --> 01:07:36,010 die een ding druk die adres van die wat jy verwys na, 816 01:07:36,010 --> 01:07:40,360 die ander druk die adres van die wyser op die stapel. 817 01:07:40,360 --> 01:07:47,040 Jy kan 'n wyser verander, jy kan nie 'n skikking simbool verander. 818 01:07:47,740 --> 01:07:53,270 En sizeof wyser gaan om die grootte van daardie tipe wyser te druk. 819 01:07:53,270 --> 01:07:57,470 So int * p sizeof (p) gaan uit te druk 4, 820 01:07:57,470 --> 01:08:04,110 maar int array [5] print sizeof (array) is gaan te druk 20. 821 01:08:04,110 --> 01:08:07,480 [Student] So int array [5] sal druk 20? >> Ja. 822 01:08:07,480 --> 01:08:13,300 Dit is die rede waarom binnekant van buggy4 wanneer dit gebruik word om sizeof (array) 823 01:08:13,300 --> 01:08:16,660 dit besig was om te doen i <20, wat is nie wat ons wou. 824 01:08:16,660 --> 01:08:20,880 Ons wil i <5. >> [Student] Goed. 825 01:08:20,880 --> 01:08:25,569 [Bowden] En dan so gou as jy begin wat in die funksies, 826 01:08:25,569 --> 01:08:34,340 as ons het int * p = array; 827 01:08:34,340 --> 01:08:39,779 binnekant van hierdie funksie, kan ons basies p en verskeidenheid in presies dieselfde manier, 828 01:08:39,779 --> 01:08:43,710 behalwe vir die sizeof probleem en die veranderende probleem. 829 01:08:43,710 --> 01:08:49,810 Maar p [0] = 1, is dieselfde as om te sê array [0] = 1; 830 01:08:49,810 --> 01:08:55,600 En so gou as ons sê cat (array); of foo (p); 831 01:08:55,600 --> 01:08:59,760 binne van die cat funksie, dit is twee keer dieselfde oproep. 832 01:08:59,760 --> 01:09:03,350 Daar is geen verskil tussen hierdie twee oproepe. 833 01:09:07,029 --> 01:09:11,080 >> Almal goed op? Okay. 834 01:09:14,620 --> 01:09:17,950 Ons het 10 minute. 835 01:09:17,950 --> 01:09:28,319 >> Ons sal probeer om te kry deur middel van hierdie Hacker Typer program, 836 01:09:28,319 --> 01:09:32,350 hierdie webwerf, wat gekom het uit verlede jaar of iets. 837 01:09:34,149 --> 01:09:41,100 Dit is net veronderstel om te wees soos jy tik lukraak en dit druk uit - 838 01:09:41,100 --> 01:09:46,729 Wat ook al lêer gelaai gebeur het, is wat dit lyk soos jy tik. 839 01:09:46,729 --> 01:09:52,069 Dit lyk soos 'n soort van die bedryfstelsel-kode. 840 01:09:53,760 --> 01:09:56,890 Dit is wat ons wil uit te voer. 841 01:10:08,560 --> 01:10:11,690 Jy moet 'n program uitvoerbaar met die naam hacker_typer 842 01:10:11,690 --> 01:10:14,350 wat neem in 'n enkele argument, om die lêer te "hacker tipe." 843 01:10:14,350 --> 01:10:16,480 Die loop van die uitvoerbare moet duidelik die skerm 844 01:10:16,480 --> 01:10:20,850 en dan 'n karakter van die vraestel in die lêer elke keer wanneer die gebruiker druk 'n sleutel druk. 845 01:10:20,850 --> 01:10:24,990 So watter sleutel wat jy druk, moet dit weg te gooi en plaas druk van 'n karakter uit die lêer 846 01:10:24,990 --> 01:10:27,810 wat is die argument. 847 01:10:29,880 --> 01:10:34,350 Ek sal pretty much vir jou sê wat die dinge wat ons gaan nodig om te weet. 848 01:10:34,350 --> 01:10:36,440 Maar ons wil om te kyk na die termios biblioteek. 849 01:10:36,440 --> 01:10:44,840 Ek het nog nooit gebruik word om hierdie biblioteek in my hele lewe, so dit het 'n baie minimale doeleindes. 850 01:10:44,840 --> 01:10:48,610 Maar dit gaan om die biblioteek wat ons kan gebruik om weg te gooi nie die karakter wat jy getref 851 01:10:48,610 --> 01:10:52,390 wanneer jy tik in standaard. 852 01:10:56,970 --> 01:11:05,840 So hacker_typer.c, en ons gaan om te wil # sluit. 853 01:11:05,840 --> 01:11:12,870 Op soek na die man bladsy vir termios - ek raai dit se terminale OS of iets - 854 01:11:12,870 --> 01:11:16,240 Ek weet nie hoe om dit te lees. 855 01:11:16,240 --> 01:11:21,040 Kyk na hierdie, sê dit hierdie 2 lêers in te sluit, so sal ons doen. 856 01:11:37,620 --> 01:11:46,820 >> Eerste ding wat die eerste, ons wil te neem in 'n enkele argument, wat is die lêer wat ons behoort te open. 857 01:11:46,820 --> 01:11:52,420 So wat doen wat ek wil doen? Hoe maak ek om te sien ek het 'n enkele argument? 858 01:11:52,420 --> 01:11:56,480 [Student] As argc gelyk aan dit. >> [Bowden] Ja. 859 01:11:56,480 --> 01:12:21,250 So if (argc = 2!) Printf ("Gebruik:% s [lêer oop te maak]"). 860 01:12:21,250 --> 01:12:32,750 So nou as ek hardloop sonder die verskaffing van 'n tweede argument - oh, ek nodig het die nuwe lyn - 861 01:12:32,750 --> 01:12:36,240 sien jy sê dit gebruik: / hacker_typer. 862 01:12:36,240 --> 01:12:39,770 en dan die tweede argument moet die lêer wat ek wil oopmaak. 863 01:12:58,430 --> 01:13:01,260 Nou wat moet ek doen? 864 01:13:01,260 --> 01:13:08,490 Ek wil van hierdie lêer te lees. Hoe lees ek van 'n lêer? 865 01:13:08,490 --> 01:13:11,920 [Student] Jy maak dit eerste. >> Ja. 866 01:13:11,920 --> 01:13:15,010 So fopen. Wat beteken fopen lyk? 867 01:13:15,010 --> 01:13:22,980 [Student] Filename. >> [Bowden] Filename gaan wees bevat SPASIES [1]. 868 01:13:22,980 --> 01:13:26,110 [Student] En dan wat jy wil om dit te doen met, so die >> [Bowden] Ja. 869 01:13:26,110 --> 01:13:28,740 So as jy nie onthou nie, kan jy net doen man fopen, 870 01:13:28,740 --> 01:13:32,960 waar dit gaan om 'n const char * pad waar die pad is lêernaam, 871 01:13:32,960 --> 01:13:34,970 const char * af. 872 01:13:34,970 --> 01:13:38,660 As jy toevallig nie onthou wat af is, dan kan jy kyk vir die mode. 873 01:13:38,660 --> 01:13:44,660 Binnekant van die man bladsye, die slash karakter is wat jy kan gebruik om te soek vir dinge. 874 01:13:44,660 --> 01:13:49,790 So ek tik / af te soek vir die mode. 875 01:13:49,790 --> 01:13:57,130 N en N is wat jy kan gebruik om fiets te ry deur die search wedstryde. 876 01:13:57,130 --> 01:13:59,800 Hier is dit, sê die argument af punte na 'n string 877 01:13:59,800 --> 01:14:01,930 begin met een van die volgende reekse. 878 01:14:01,930 --> 01:14:06,480 So r, Open teks lêer vir lees. Dit is wat ons wil doen. 879 01:14:08,930 --> 01:14:13,210 Vir die lees, en ek wil op te slaan. 880 01:14:13,210 --> 01:14:18,720 Die ding is gaan na 'n lêer *. Nou wat ek wil om dit te doen? 881 01:14:18,720 --> 01:14:21,200 Gee my 'n tweede. 882 01:14:28,140 --> 01:14:30,430 Okay. Nou wat ek wil om dit te doen? 883 01:14:30,430 --> 01:14:32,940 [Student] Gaan na of dit is NULL. >> [Bowden] Ja. 884 01:14:32,940 --> 01:14:38,690 Enige tyd as jy 'n lêer oopmaak, maak seker dat jy suksesvol is in staat om dit oop te maak. 885 01:14:58,930 --> 01:15:10,460 >> Nou wil ek daardie termios dinge te doen waar ek wil lees eers my huidige instellings 886 01:15:10,460 --> 01:15:14,050 en stoor in iets, dan wil ek my voorkeure te verander 887 01:15:14,050 --> 01:15:19,420 weg te gooi nie 'n karakter wat ek tik, 888 01:15:19,420 --> 01:15:22,520 en dan wil ek daardie instellings te werk. 889 01:15:22,520 --> 01:15:27,250 En dan aan die einde van die program, ek wil terug na my oorspronklike instellings te verander. 890 01:15:27,250 --> 01:15:32,080 So het die struct gaan te wees van die tipe termios, en ek gaan twee van die wil. 891 01:15:32,080 --> 01:15:35,600 Die eerste een gaan wees my current_settings, 892 01:15:35,600 --> 01:15:42,010 en dan gaan hulle my hacker_settings te wees. 893 01:15:42,010 --> 01:15:48,070 Eerste, gaan ek wil my huidige instellings te red, 894 01:15:48,070 --> 01:15:53,790 dan gaan ek wil hacker_settings te werk, 895 01:15:53,790 --> 01:16:01,570 en dan aan die einde van my program, ek wil terugkeer na huidige instellings. 896 01:16:01,570 --> 01:16:08,660 So spaar huidige instellings, die manier wat werk, ons man termios. 897 01:16:08,660 --> 01:16:15,810 Ons sien dat ons hierdie int tcsetattr, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Ek slaag in 'n termios struct deur die wyser. 899 01:16:22,960 --> 01:16:30,640 Die manier om dit sal lyk is - I've reeds vergeet wat die funksie is geroep. 900 01:16:30,640 --> 01:16:34,930 Kopieer en plak dit. 901 01:16:39,150 --> 01:16:45,500 So tcgetattr, dan wil ek in die struct dat ek die inligting is op besparing in, 902 01:16:45,500 --> 01:16:49,650 wat gaan wees current_settings, 903 01:16:49,650 --> 01:16:59,120 en die eerste argument is die lêer descriptor vir die ding wat ek wil die eienskappe van te red. 904 01:16:59,120 --> 01:17:04,360 Wat die lêer descriptor is soos enige tyd as jy 'n lêer oopmaak, dit kry 'n lêer descriptor. 905 01:17:04,360 --> 01:17:14,560 Toe ek fopen bevat SPASIES [1], raak dit 'n lêer descriptor wat jy verwys 906 01:17:14,560 --> 01:17:16,730 wanneer jy wil lees of skryf nie. 907 01:17:16,730 --> 01:17:19,220 Dit is nie die lêer descriptor ek hier wil gebruik. 908 01:17:19,220 --> 01:17:21,940 Daar is drie lêer beskrywings wat jy by verstek, 909 01:17:21,940 --> 01:17:24,310 wat is standaard in, standaard uit, en standaard fout. 910 01:17:24,310 --> 01:17:29,960 By verstek, ek dink dit is standaard in is 0, standaard uit 1 en standaard fout is 2. 911 01:17:29,960 --> 01:17:33,980 So, wat wil ek die instellings te verander? 912 01:17:33,980 --> 01:17:37,370 Ek wil die instellings te verander wanneer ek 'n karakter getref, 913 01:17:37,370 --> 01:17:41,590 Ek wil dit dat die karakter om weg te gooi in plaas van druk dit op die skerm. 914 01:17:41,590 --> 01:17:45,960 Wat baan - standaard, standaard uit, of standaard fout - 915 01:17:45,960 --> 01:17:52,050 reageer op dinge wanneer ek tik op die sleutelbord? >> [Student] Standard. >> Ja. 916 01:17:52,050 --> 01:17:56,450 Sodat ek dit kan doen, hetsy 0 of ek kan doen stdin. 917 01:17:56,450 --> 01:17:59,380 Ek kry die current_settings standaard. 918 01:17:59,380 --> 01:18:01,720 >> Nou wil ek hierdie instellings te werk, 919 01:18:01,720 --> 01:18:07,200 so ek sal eers kopieer in hacker_settings wat my current_settings is. 920 01:18:07,200 --> 01:18:10,430 En hoe structs werk is dit sal net kopieer. 921 01:18:10,430 --> 01:18:14,510 Dit afskrifte van al die velde, soos jy sou verwag. 922 01:18:14,510 --> 01:18:17,410 >> Nou wil ek sommige van die velde te werk. 923 01:18:17,410 --> 01:18:21,670 Soek by termios, sal jy het om te lees deur middel van 'n baie van hierdie 924 01:18:21,670 --> 01:18:24,110 net om te sien wat jy wil om te kyk vir, 925 01:18:24,110 --> 01:18:28,210 maar die vlae wat jy gaan om te wil om te kyk vir is echo, 926 01:18:28,210 --> 01:18:33,110 so ECHO Echo insette karakters. 927 01:18:33,110 --> 01:18:37,710 Eerstens wil ek te stel - I've reeds vergeet wat die velde is. 928 01:18:45,040 --> 01:18:47,900 Dit is wat die struct lyk. 929 01:18:47,900 --> 01:18:51,060 So insette modi Ek dink wat ons wil verander. 930 01:18:51,060 --> 01:18:54,210 Ons sal kyk na die oplossing om seker te maak dit is wat ons wil verander. 931 01:19:04,060 --> 01:19:12,610 Ons wil lflag te verander ten einde te verhoed hoef te kyk deur al hierdie dinge. 932 01:19:12,610 --> 01:19:14,670 Ons wil plaaslike modes te verander. 933 01:19:14,670 --> 01:19:17,710 Jy wil hê deur hierdie hele ding te lees om te verstaan ​​waar alles behoort 934 01:19:17,710 --> 01:19:19,320 dat ons wil verander. 935 01:19:19,320 --> 01:19:24,120 Maar dit is binnekant van die plaaslike modes waar ons gaan om te wil om dit te verander. 936 01:19:27,080 --> 01:19:33,110 So hacker_settings.cc_lmode is wat dit genoem word. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Dit is waar ons in bis-operateurs. 939 01:19:52,280 --> 01:19:54,860 Ons is soort van uit die tyd, maar ons gaan dit regtig vinnig. 940 01:19:54,860 --> 01:19:56,600 Dit is waar ons in bis-operateurs, 941 01:19:56,600 --> 01:19:59,950 waar ek dink ek het 'n tyd lank gelede gesê dat wanneer jy begin handel met vlae, 942 01:19:59,950 --> 01:20:03,370 jy gaan word met behulp van bis-operateur 'n baie. 943 01:20:03,370 --> 01:20:08,240 Elke bietjie in die vlag ooreenstem met 'n soort van gedrag. 944 01:20:08,240 --> 01:20:14,090 So hier is, hierdie vlag het 'n klomp van verskillende dinge, waar almal van hulle beteken iets anders. 945 01:20:14,090 --> 01:20:18,690 Maar wat ek wil doen is om net die bietjie wat ooreenstem met ECHO afskakel. 946 01:20:18,690 --> 01:20:25,440 So om te draai af Ek doen & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 Eintlik, dink ek dit is soos Techo of iets. Ek gaan net weer te keur. 948 01:20:30,110 --> 01:20:34,050 Ek kan dit termios. Dit is net eggo. 949 01:20:34,050 --> 01:20:38,440 ECHO gaan om 'n bietjie. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO gaan beteken dat al die stukkies is ingestel op 1, wat beteken dat al die vlae na ware 951 01:20:44,230 --> 01:20:47,140 behalwe vir die ECHO bietjie. 952 01:20:47,140 --> 01:20:53,830 Deur die beëindiging van my plaaslike vlae met hierdie, beteken dit dat al die vlae wat tans op ware 953 01:20:53,830 --> 01:20:56,520 sal steeds gestel word om ware. 954 01:20:56,520 --> 01:21:03,240 As my ECHO vlag op waar gestel is, dan is dit nie noodwendig op VALS ingestel is op die ECHO vlag. 955 01:21:03,240 --> 01:21:07,170 So hierdie lyn van die kode draai net af die ECHO vlag. 956 01:21:07,170 --> 01:21:16,270 Die ander reëls van die kode, ek sal net kopieer dit in die belang van die tyd en dan verduidelik. 957 01:21:27,810 --> 01:21:30,180 In die oplossing, het hy gesê 0. 958 01:21:30,180 --> 01:21:33,880 Dit is waarskynlik beter om te sê uitdruklik stdin. 959 01:21:33,880 --> 01:21:42,100 >> Let daarop dat ek ook ek doen ECHO | ICANON hier. 960 01:21:42,100 --> 01:21:46,650 ICANON verwys na iets skei, wat beteken kanoniese af. 961 01:21:46,650 --> 01:21:50,280 Wat kanoniese mode middel is gewoonlik wanneer jy tik die command line, 962 01:21:50,280 --> 01:21:54,670 standaard nie verwerk enigiets totdat jy getref newline. 963 01:21:54,670 --> 01:21:58,230 So wanneer jy GetString, jy tik 'n klomp van die dinge, dan is jy getref newline. 964 01:21:58,230 --> 01:22:00,590 Dit is wanneer dit gestuur is standaard. 965 01:22:00,590 --> 01:22:02,680 Dit is die standaard. 966 01:22:02,680 --> 01:22:05,830 Toe ek afskakel kanoniese af, nou elke enkele karakter wat jy druk 967 01:22:05,830 --> 01:22:10,910 wat kry verwerk, wat is gewoonlik soort swak, want dit is stadig om hierdie dinge te verwerk, 968 01:22:10,910 --> 01:22:14,330 wat is die rede waarom dit is goed om dit in die hele lyne te buffer. 969 01:22:14,330 --> 01:22:16,810 Maar ek wil elke karakter te verwerk 970 01:22:16,810 --> 01:22:18,810 want ek wil dit nie om te wag vir my newline te tref 971 01:22:18,810 --> 01:22:21,280 voordat dit verwerk al die karakters wat ek tik. 972 01:22:21,280 --> 01:22:24,760 Dit skakel kanoniese af. 973 01:22:24,760 --> 01:22:31,320 Hierdie dinge beteken net wanneer dit werklik karakters verwerk. 974 01:22:31,320 --> 01:22:35,830 Dit beteken dat dit verwerk onmiddellik, so gou as ek hulle is tik, verwerk hulle. 975 01:22:35,830 --> 01:22:42,510 En dit is die funksie wat die opdatering van my verstellings vir standaard in, 976 01:22:42,510 --> 01:22:45,480 en TCSA middel doen dit sommer nou. 977 01:22:45,480 --> 01:22:50,310 Die ander opsies is wag totdat alles wat tans op die stroom is verwerk. 978 01:22:50,310 --> 01:22:52,030 Wat nie regtig saak nie. 979 01:22:52,030 --> 01:22:56,920 Net nou verander my instellings te wees wat tans in hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Ek dink ek het dit genoem hacker_settings, so laat verander. 981 01:23:09,610 --> 01:23:13,500 Verander alles te hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Nou gaan ons aan die einde van ons program om te wil om terug te keer 983 01:23:16,870 --> 01:23:20,210 wat tans binnekant van normal_settings, 984 01:23:20,210 --> 01:23:26,560 wat gaan kyk net soos & normal_settings. 985 01:23:26,560 --> 01:23:30,650 Let op ek het nie verander nie enige van my normal_settings sedert oorspronklik om dit. 986 01:23:30,650 --> 01:23:34,520 Dan net verander hulle terug, ek slaag hulle weer aan die einde. 987 01:23:34,520 --> 01:23:38,390 Dit was die update. Okay. 988 01:23:38,390 --> 01:23:43,900 >> Binnekant van hier sal ek net verduidelik die kode in die belang van die tyd. 989 01:23:43,900 --> 01:23:46,350 Dit is nie dat 'n groot-kode. 990 01:23:50,770 --> 01:24:03,750 Ons sien ons 'n karakter uit die lêer lees. Ons noem dit f. 991 01:24:03,750 --> 01:24:07,850 Nou kan jy man fgetc, maar hoe fgetc is gaan om te werk 992 01:24:07,850 --> 01:24:11,910 dit is net gaan om terug te keer van die karakter wat jy net lees of EOF, 993 01:24:11,910 --> 01:24:15,680 wat ooreenstem met die einde van die lêer of 'n fout gebeur. 994 01:24:15,680 --> 01:24:19,900 Ons is herhaling, die voortsetting van 'n enkele karakter van die lêer te lees, 995 01:24:19,900 --> 01:24:22,420 totdat ons het hardloop uit van die karakters te lees. 996 01:24:22,420 --> 01:24:26,650 En terwyl ons dit doen, ons wag op 'n enkele karakter van standaard. 997 01:24:26,650 --> 01:24:29,090 Elke keer as jy tik iets op die command line, 998 01:24:29,090 --> 01:24:32,820 wat lees in 'n karakter van die standaard. 999 01:24:32,820 --> 01:24:38,330 Dan putchar is net gaan die char Ons lees hier van die lêer na standaard uit te sit. 1000 01:24:38,330 --> 01:24:42,890 Jy kan 'n mens putchar, maar dit is net om standaard uit, is dit die druk van die karakter. 1001 01:24:42,890 --> 01:24:51,600 Jy kan ook net printf doen ("% c", c), dieselfde idee. 1002 01:24:53,330 --> 01:24:56,670 Dit gaan om die grootste deel van ons werk te doen. 1003 01:24:56,670 --> 01:25:00,300 >> Die laaste ding wat ons gaan om te wil doen is om net fclose ons lêer. 1004 01:25:00,300 --> 01:25:03,310 As jy nie fclose, dis 'n geheugenlek. 1005 01:25:03,310 --> 01:25:06,680 Ons wil hê dat die lêer wat ons oorspronklik geopen fclose, en ek dink dit is dit. 1006 01:25:06,680 --> 01:25:13,810 As ons, ek het reeds probleme. 1007 01:25:13,810 --> 01:25:17,260 Kom ons kyk. 1008 01:25:17,260 --> 01:25:19,960 Wat het dit kla oor? 1009 01:25:19,960 --> 01:25:30,220 Verwagte "int", maar argument is van die soort 'struct _IO_FILE * ". 1010 01:25:36,850 --> 01:25:39,370 Ons sal sien of dit werk. 1011 01:25:45,210 --> 01:25:53,540 Slegs toegelaat in C99. Augh. Okay, maak hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Nou kry ons meer bruikbare beskrywings. 1013 01:25:57,760 --> 01:25:59,900 So gebruik van onverklaarde identifiseerder 'normal_settings ". 1014 01:25:59,900 --> 01:26:04,170 Ek het nie geroep dit normal_settings. Ek het geroep dit current_settings. 1015 01:26:04,170 --> 01:26:12,090 So laat verander al van dat. 1016 01:26:17,920 --> 01:26:21,710 Nou verby argument. 1017 01:26:26,290 --> 01:26:29,500 Ek sal hierdie 0 vir nou. 1018 01:26:29,500 --> 01:26:36,720 Okay. / Hacker_typer. Cp.c. 1019 01:26:36,720 --> 01:26:39,590 Ek het ook nie duidelik die skerm aan die begin. 1020 01:26:39,590 --> 01:26:42,960 Maar jy kan terugkyk na die laaste probleem stel om te sien hoe jy duidelik die skerm. 1021 01:26:42,960 --> 01:26:45,160 Dit is net die druk van sommige van die karakters 1022 01:26:45,160 --> 01:26:47,210 terwyl dit te doen wat ek wil doen. 1023 01:26:47,210 --> 01:26:48,900 Okay. 1024 01:26:48,900 --> 01:26:55,280 En dink oor die rede waarom dit nodig is om 0 in plaas van stdin, 1025 01:26:55,280 --> 01:27:00,560 wat # define 0, 1026 01:27:00,560 --> 01:27:03,890 dit is kla dat - 1027 01:27:13,150 --> 01:27:19,360 Voor toe ek gesê het dat daar lêer beskrywings nie, maar dan moet jy ook jou lêer * 1028 01:27:19,360 --> 01:27:23,210 'n lêer descriptor is net 'n heelgetal, 1029 01:27:23,210 --> 01:27:26,970 terwyl 'n lêer * het 'n hele klomp van die dinge wat verband hou met dit. 1030 01:27:26,970 --> 01:27:30,380 Die rede waarom ons moet 0 om te sê in plaas van stdin 1031 01:27:30,380 --> 01:27:37,480 is dat stdin is 'n lêer * wat wys na die ding wat verwysingstegnieke lêer descriptor 0. 1032 01:27:37,480 --> 01:27:45,070 Sodat selfs hier wanneer ek dit doen fopen (bevat SPASIES [1], ek kry 'n lêer *. 1033 01:27:45,070 --> 01:27:51,180 Maar iewers in daardie lêer * is 'n ding wat ooreenstem met die lêer descriptor vir daardie lêer. 1034 01:27:51,180 --> 01:27:57,430 As jy kyk na die man bladsy vir 'n oop, so ek dink jy hoef te doen, man 3 oop - nope - 1035 01:27:57,430 --> 01:27:59,380 man 2 oop - ja. 1036 01:27:59,380 --> 01:28:06,250 As jy kyk op die bladsy vir 'n oop, oop soos 'n laer vlak fopen, 1037 01:28:06,250 --> 01:28:09,350 en dit is die terugkeer van die werklike file descriptor. 1038 01:28:09,350 --> 01:28:12,050 fopen 'n klomp van die dinge op die top van 'n oop, 1039 01:28:12,050 --> 01:28:17,640 wat in plaas van die terugkeer net dat die file descriptor gee 'n hele lêer * wyser 1040 01:28:17,640 --> 01:28:20,590 binnekant van wat ons klein file descriptor. 1041 01:28:20,590 --> 01:28:25,020 So standaard verwys na die lêer * ding, 1042 01:28:25,020 --> 01:28:29,120 terwyl 0 verwys na net die lêer descriptor standaard op sigself. 1043 01:28:29,120 --> 01:28:32,160 >> Vrae? 1044 01:28:32,160 --> 01:28:35,930 [Lag] blaas deur. 1045 01:28:35,930 --> 01:28:39,140 Alles reg. Ons klaar is. [Lag] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]