1 00:00:00,000 --> 00:00:10,970 >> [Speel van musiek] 2 00:00:10,970 --> 00:00:12,536 >> David J. MALAN: Alle reg. 3 00:00:12,536 --> 00:00:13,392 >> [Gelag] 4 00:00:13,392 --> 00:00:14,240 >> Welkom terug. 5 00:00:14,240 --> 00:00:14,990 Dit is CS50. 6 00:00:14,990 --> 00:00:16,890 En dit sal die einde van die vyfde week. 7 00:00:16,890 --> 00:00:20,020 En tot nou toe, ons het pretty much is die neem as vanselfsprekend aanvaar dat daar 8 00:00:20,020 --> 00:00:23,480 bestaan ​​die samesteller, klang, dat jy nog is beroep deur middel van hierdie 9 00:00:23,480 --> 00:00:27,100 ander hulpmiddel genaamd Maak dat een of ander manier Nou, vat jou bron-kode 10 00:00:27,100 --> 00:00:31,350 in voorwerp-kode, die nulle en ene dat jou rekenaar CPU, sentrale 11 00:00:31,350 --> 00:00:33,410 verwerking van eenheid, verstaan ​​eintlik. 12 00:00:33,410 --> 00:00:36,770 Maar dit blyk daar is 'n getal wat is gaan op onder die enjinkap in 13 00:00:36,770 --> 00:00:38,690 tussen inset en uitset. 14 00:00:38,690 --> 00:00:41,800 >> En ek wil graag dat ons vlees voorstel wat in 'n bietjie meer detail in 15 00:00:41,800 --> 00:00:45,130 hierdie vier stappe, het iets genoem pre-verwerking, iets 16 00:00:45,130 --> 00:00:48,300 genoem opstel, wat ons gesien het, iets genoem vervaardiging, en 17 00:00:48,300 --> 00:00:49,420 iets wat die naam verbind. 18 00:00:49,420 --> 00:00:53,270 So tot nou toe, in 'n paar van ons programme, het ons het skerp sluit. 19 00:00:53,270 --> 00:00:56,650 Meer onlangs het ons het 'n paar skerp definieer vir konstantes. 20 00:00:56,650 --> 00:01:00,660 So dit blyk dat die dinge wat is voorafgegaan met die hash simbool of 21 00:01:00,660 --> 00:01:04,150 die pond simbool is pre-verwerker riglyne. 22 00:01:04,150 --> 00:01:07,960 Dit is net 'n fancy manier om te sê dit is 'n reël van die kode wat eintlik 23 00:01:07,960 --> 00:01:12,280 omskep in iets anders voor die rekenaar eens probeer om te sit jou 24 00:01:12,280 --> 00:01:13,800 program in nulle en ene. 25 00:01:13,800 --> 00:01:19,000 >> Byvoorbeeld, skerp sluit standaard I / O. H, pretty much beteken net gaan 26 00:01:19,000 --> 00:01:24,010 voorlê, gryp die inhoud van die lêers stdio.h en plak dit reg daar. 27 00:01:24,010 --> 00:01:25,880 Sodat daar geen nulle en ene op daardie stadium nog nie. 28 00:01:25,880 --> 00:01:27,470 Dit is regtig net 'n vervanging. 29 00:01:27,470 --> 00:01:30,790 En dit is gedoen tydens die sogenaamde pre-verwerking stadium, wanneer jy 30 00:01:30,790 --> 00:01:34,230 eintlik loop klang of spesifiek Maak in die meeste gevalle. 31 00:01:34,230 --> 00:01:36,950 So dit het alles gebeur eerste outomaties tot dusver. 32 00:01:36,950 --> 00:01:38,800 >> Dan kom die samestelling stap. 33 00:01:38,800 --> 00:01:40,920 Maar ons het al oorvereenvoudig samestelling. 34 00:01:40,920 --> 00:01:45,060 Samestelling van 'n program beteken regtig te neem dit van iets soos C, die 35 00:01:45,060 --> 00:01:48,430 bron-kode wat ons het is skryf, af om iets genoem die gemeente. 36 00:01:48,430 --> 00:01:52,900 Vergadering taal is 'n laer vlak taal wat, gelukkig, ons sal nie 37 00:01:52,900 --> 00:01:55,480 meebring veel te skryf hierdie semester. 38 00:01:55,480 --> 00:01:59,100 Maar dit is op die laagste vlak in die sin dat jy letterlik begin skryf 39 00:01:59,100 --> 00:02:04,270 optel en aftrek en vermeerder en laai uit die geheue en red geheue, die 40 00:02:04,270 --> 00:02:08,259 baie basiese instruksies wat 'n rekenaar, onder die enjinkap, 41 00:02:08,259 --> 00:02:09,639 eintlik verstaan. 42 00:02:09,639 --> 00:02:14,930 >> Laastens, vervaardiging neem dat taal om die nulle en ene wat ons het is 43 00:02:14,930 --> 00:02:16,190 beskryf wat tot dusver. 44 00:02:16,190 --> 00:02:19,270 En werklik laastens is daar die sogenaamde skakel fase, wat ons 45 00:02:19,270 --> 00:02:22,360 sien in net 'n oomblik, wat kombineer jou nulle en kinders met nulle en 46 00:02:22,360 --> 00:02:24,870 mense ander mense voor jy geskep het. 47 00:02:24,870 --> 00:02:26,660 >> So beskou hierdie super eenvoudige program. 48 00:02:26,660 --> 00:02:27,560 Dit was van Week 1. 49 00:02:27,560 --> 00:02:29,610 Dit het net gesê, Hello World, op die skerm. 50 00:02:29,610 --> 00:02:30,920 Ons het dit deur klang. 51 00:02:30,920 --> 00:02:33,200 Of ons het dit deur Maak wat hardloop klang. 52 00:02:33,200 --> 00:02:36,170 En outputted in die tyd waar 'n paar nulle en ene. 53 00:02:36,170 --> 00:02:38,100 Maar dit blyk daar is ' 'n intermediêre stap. 54 00:02:38,100 --> 00:02:40,460 As ek gaan hier - oops, het nie wil hom nog sien. 55 00:02:40,460 --> 00:02:44,800 As ek gaan hier aan my toestel en ek oopmaak hello.c, hier 56 00:02:44,800 --> 00:02:46,160 is dat dieselfde program. 57 00:02:46,160 --> 00:02:48,600 En wat gaan ek doen in my terminale venster hier is ek gaan 58 00:02:48,600 --> 00:02:51,430 hardloop klang eerder as om, wat automatiseert al vier 59 00:02:51,430 --> 00:02:52,870 daardie stappe vir ons. 60 00:02:52,870 --> 00:02:58,620 En ek gaan klang-S te doen en dan hello.c en dan betree. 61 00:02:58,620 --> 00:03:00,590 >> En ek kry 'n flikkerende vinnige weer, wat goed is. 62 00:03:00,590 --> 00:03:05,280 En nou in 'n effens groter venster Ek gaan om oop te maak gedit in hier. 63 00:03:05,280 --> 00:03:09,610 En ek gaan om oop te maak 'n lêer wat, blyk, word genoem hello.s hierdie 64 00:03:09,610 --> 00:03:11,870 bevat dat die vergadering taal Ek verwys na vroeër. 65 00:03:11,870 --> 00:03:15,060 En dit is wat genoem vergadering taal, redelik lae vlak 66 00:03:15,060 --> 00:03:18,470 instruksies wat jou Intel CPU of wat dit ookal is wat is binne 67 00:03:18,470 --> 00:03:19,350 verstaan. 68 00:03:19,350 --> 00:03:24,480 En mov is vir skuif. oproep is vir bel, 'n baie lae vlak funksioneer. 69 00:03:24,480 --> 00:03:26,380 sub is vir aftrek. 70 00:03:26,380 --> 00:03:30,370 >> So wanneer jy 'n bepaalde CPU binne van jou rekenaar, wat maak dit 71 00:03:30,370 --> 00:03:34,300 duidelike, teenoor ander CPUs op die mark, is wat instruksies dit 72 00:03:34,300 --> 00:03:39,460 verstaan ​​en dikwels hoe doeltreffend dit is, hoe vinnig dit is ten uitvoering van 'n 73 00:03:39,460 --> 00:03:40,380 van die instruksies. 74 00:03:40,380 --> 00:03:45,150 Nou vir meer inligting oor hierdie, kan jy volgende val CS61 by die kollege. 75 00:03:45,150 --> 00:03:48,170 Maar hier het ons, byvoorbeeld, 'n paar eienskappe wat dalk bekend lyk. 76 00:03:48,170 --> 00:03:50,150 hello.c is die naam van die program. 77 00:03:50,150 --> 00:03:51,070 >> . Teks - 78 00:03:51,070 --> 00:03:54,190 daar is nie veel van belang is daar nou net, onthou dat die teks 79 00:03:54,190 --> 00:03:59,190 segment, soos op Maandag, is waar in geheue jou program eindig eintlik up. 80 00:03:59,190 --> 00:04:01,330 So dit is ten minste vaagweg vertroud is daar. 81 00:04:01,330 --> 00:04:03,730 Hier, natuurlik, is 'n melding van ons belangrikste funksie. 82 00:04:03,730 --> 00:04:07,220 Blaai af, dit verwys na dinge sogenaamde registers, baie klein stukkies 83 00:04:07,220 --> 00:04:09,190 geheue binnekant van jou werklike CPU. 84 00:04:09,190 --> 00:04:12,930 En as ek blaai af selfs verder, sien ek 'n soort 85 00:04:12,930 --> 00:04:14,240 indirekte melding gemaak van ASCII. 86 00:04:14,240 --> 00:04:17,120 En daar, inderdaad, is dat die snaar, hallo, komma, wêreld. 87 00:04:17,120 --> 00:04:20,079 >> So lang storie kort, dit was gebeur vir jou, outomaties, 88 00:04:20,079 --> 00:04:22,140 onder die enjinkap al hierdie tyd. 89 00:04:22,140 --> 00:04:26,450 En wat gebeur is werklik een keer jy hardloop klang, of by wyse van 90 00:04:26,450 --> 00:04:29,150 Maak, jy eers kry, van die bron-kode, die 91 00:04:29,150 --> 00:04:30,700 sogenaamde saamsteltaal. 92 00:04:30,700 --> 00:04:35,210 Dan klang is die omskakeling van hierdie vergadering taal af na nulle en ene. 93 00:04:35,210 --> 00:04:38,340 En dit is die skyfie wat ons begin het ons bespreking in Week 0 op - 94 00:04:38,340 --> 00:04:39,840 en dan Week 1 op. 95 00:04:39,840 --> 00:04:44,030 En dan uiteindelik, die nulle en ene gekombineer met die nulle en ene 96 00:04:44,030 --> 00:04:47,190 van dié biblioteke het ons neem vanselfsprekend aanvaar soos Standard I / O of die 97 00:04:47,190 --> 00:04:50,010 String Library of selfs die CS50 biblioteek. 98 00:04:50,010 --> 00:04:54,200 >> So hierdie foto om meer te verf visueel, ons het hello.c. 99 00:04:54,200 --> 00:04:57,220 En, natuurlik, maak gebruik van die printf funksioneer om te sê, hallo wêreld. 100 00:04:57,220 --> 00:05:01,810 Die samestelling stap neem om dit af te dat lêer sien ons net hello.s, selfs 101 00:05:01,810 --> 00:05:04,290 al is dit tipies geskrap outomaties vir jou. 102 00:05:04,290 --> 00:05:06,050 Maar dit is die vergadering kode in die middel stap. 103 00:05:06,050 --> 00:05:09,750 En dan wanneer ons het die vergadering taal, so te sê, dit is wanneer jy 104 00:05:09,750 --> 00:05:10,830 kry die nulle en ene. 105 00:05:10,830 --> 00:05:13,920 So het ons ingezoomd effektief vandag op wat ons het is die neem as vanselfsprekend aanvaar, 106 00:05:13,920 --> 00:05:16,430 beteken gaan bron-kode kode te beswaar. 107 00:05:16,430 --> 00:05:18,850 >> Maar laastens, nou dat dieselfde prentjie - Kom ons stoot dit oor te 108 00:05:18,850 --> 00:05:20,020 die linkerkant. 109 00:05:20,020 --> 00:05:22,880 En daarop te let dat in die top is daar Ek het genoem stdio.h. 110 00:05:22,880 --> 00:05:25,030 Dit is 'n lêer wat ons het ingesluit in byna al die 111 00:05:25,030 --> 00:05:26,250 programme wat ons geskryf het. 112 00:05:26,250 --> 00:05:28,830 En dit is die lêer waarvan die inhoud kry kopie geplak, 113 00:05:28,830 --> 00:05:30,350 effektief bo jou kode. 114 00:05:30,350 --> 00:05:34,170 Maar dit blyk dat, op 'n rekenaar stelsel iewers, daar is vermoedelik 'n 115 00:05:34,170 --> 00:05:39,150 stdio.c lêer wat iemand geskryf jaar gelede dat implemente al die 116 00:05:39,150 --> 00:05:41,870 funksies wat verklaar in stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Nou in werklikheid is dit waarskynlik nie op jou Mac of jou rekenaar of selfs in die 118 00:05:45,465 --> 00:05:47,660 CS50 toestel is 'n rou C-kode. 119 00:05:47,660 --> 00:05:52,710 Iemand wat reeds opgestel en dit sluit O lêer vir voorwerp kode. Of. 'N 120 00:05:52,710 --> 00:05:56,020 lêer, wat verwys na 'n gedeelde biblioteek wat al vooraf geïnstalleer en 121 00:05:56,020 --> 00:05:57,240 vooraf opgestel vir jou. 122 00:05:57,240 --> 00:06:01,950 Maar veronderstel dat daar wel bestaan op ons rekenaar stdio.c in parallel 123 00:06:01,950 --> 00:06:02,650 met klang. 124 00:06:02,650 --> 00:06:04,960 Jou kode is opgestel en vergader. 125 00:06:04,960 --> 00:06:09,200 stdio.c se kode word saamgestel en vergader, sodat hierdie heel laaste 126 00:06:09,200 --> 00:06:13,730 stap, hier, ons het een of ander manier skakel, so te sê, jou nulle en ene 127 00:06:13,730 --> 00:06:18,430 met sy of haar nulle en kinders in 'n eenvoudige program wat uiteindelik is 128 00:06:18,430 --> 00:06:20,540 genoem net Hello. 129 00:06:20,540 --> 00:06:23,340 >> So dit is al die magic wat gebeur het tot dusver. 130 00:06:23,340 --> 00:06:26,430 En sal voortgaan om dit te neem prosesse as vanselfsprekend aanvaar nie, maar besef 131 00:06:26,430 --> 00:06:28,750 daar is 'n baie sappige besonderhede gaan op onder daar. 132 00:06:28,750 --> 00:06:31,920 En dit is wat maak jou rekenaar met 'n Intel binne 133 00:06:31,920 --> 00:06:33,940 veral onderskei. 134 00:06:33,940 --> 00:06:37,020 >> So op daardie noot, as jy wil saam met ons vir middagete hierdie Vrydag, doen gaan 135 00:06:37,020 --> 00:06:41,570 na die gewone plek cs50.net/rsvp, 13:15 die Vrydag. 136 00:06:41,570 --> 00:06:43,400 En nou 'n paar aankondigings. 137 00:06:43,400 --> 00:06:44,670 So het ons 'n paar goeie nuus. 138 00:06:44,670 --> 00:06:45,970 En ons het 'n paar slegte nuus. 139 00:06:45,970 --> 00:06:47,260 Begin met 'n paar goeie nuus hier. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Kreun] 142 00:06:54,510 --> 00:06:54,710 >> Alle regte. 143 00:06:54,710 --> 00:06:56,670 Wel, dit is tegnies 'n vakansie, so dit is nie soseer 'n geskenk van ons. 144 00:06:56,670 --> 00:06:58,030 Maar dan moet die slegte nuus van die kursus. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Kreun] 147 00:07:01,880 --> 00:07:03,530 >> Ek spandeer baie tyd op hierdie animasie. 148 00:07:03,530 --> 00:07:04,690 >> [Gelag] 149 00:07:04,690 --> 00:07:07,000 >> Daar sal 'n hersiening sessie eerskomende Maandag. 150 00:07:07,000 --> 00:07:08,340 Dit gaan wees by 05:30. 151 00:07:08,340 --> 00:07:11,210 Ons sal julle herinner aan al hierdie besonderhede via e-pos op die kursus se 152 00:07:11,210 --> 00:07:13,470 webwerf in net 'n paar dae tyd. 153 00:07:13,470 --> 00:07:16,610 Dit sal verfilm word en beskikbaar gestel word kort daarna. 154 00:07:16,610 --> 00:07:19,200 So as jy nie kan maak dat Maandag nag slot, moenie bekommerd wees nie. 155 00:07:19,200 --> 00:07:22,270 Artikels hierdie komende week sal ook fokus op hersiening vir die toets. 156 00:07:22,270 --> 00:07:25,670 As jou artikel is op Maandag, wat inderdaad universiteit vakansie is, sal ons 157 00:07:25,670 --> 00:07:26,920 steeds aan in afdeling. 158 00:07:26,920 --> 00:07:28,890 As jy kan eenvoudig nie maak dat die artikel, want jy gaan 159 00:07:28,890 --> 00:07:29,860 weg, dit is goed. 160 00:07:29,860 --> 00:07:33,710 'N Sondag of Dinsdag artikel of tune-in Jason se artikel, wat 161 00:07:33,710 --> 00:07:35,110 aanlyn beskikbaar. 162 00:07:35,110 --> 00:07:37,490 >> So, meer slegte nuus. 163 00:07:37,490 --> 00:07:41,960 So volgens die leerplan, ons lesing volgende Vrydag. 164 00:07:41,960 --> 00:07:43,690 Maar die goeie nuus - 165 00:07:43,690 --> 00:07:44,860 duidelik, ek spandeer te veel tyd op hierdie. 166 00:07:44,860 --> 00:07:45,280 >> [Gelag] 167 00:07:45,280 --> 00:07:47,140 >> Ons sal kanselleer volgende Vrydag se lesings. 168 00:07:47,140 --> 00:07:50,590 So wat sal 'n geskenk vir ons gemaak, sodat jy kan nie regtig 'n lekker blaaskans in 169 00:07:50,590 --> 00:07:52,990 tussen hierdie week en twee weke vandaar. 170 00:07:52,990 --> 00:07:57,460 Sodat daar geen lesings volgende week, net 'n klein bietjie toets, waarvoor jy moet wees 171 00:07:57,460 --> 00:07:59,030 raak al hoe meer opgewonde. 172 00:07:59,030 --> 00:08:03,870 >> So laat ons nou ons aandag te iets wat inderdaad meer visuele 173 00:08:03,870 --> 00:08:06,990 en meer opwindend en die verhoog op te stel vir wat gaan wees op die horison 174 00:08:06,990 --> 00:08:08,420 in net 'n paar weke. 175 00:08:08,420 --> 00:08:12,160 Na die eerste quiz, sal ons draai die fokus van ons probleem stelle na 'n ander 176 00:08:12,160 --> 00:08:16,710 domein spesifieke probleem, wat van forensiese of sekuriteit meer algemeen. 177 00:08:16,710 --> 00:08:19,550 >> Trouens, die tradisie met hierdie probleem stel is vir my een van die 178 00:08:19,550 --> 00:08:24,850 onderrig mede-of geoktrooieerde rekenmeesters te loop oor kampus te neem 'n paar foto's van 179 00:08:24,850 --> 00:08:29,450 geïdentifiseer, maar nie voor die hand liggend mense, plekke of dinge, dan is elke jaar het ek 180 00:08:29,450 --> 00:08:34,520 een of ander manier daarin slaag om per ongeluk verwyder of handel dryf met die digitale media kaart 181 00:08:34,520 --> 00:08:35,720 dit is binne-in ons kamera. 182 00:08:35,720 --> 00:08:36,860 Maar nie 'n groot deal. 183 00:08:36,860 --> 00:08:39,200 Ek kan voort te gaan en prop wat in my rekenaar. 184 00:08:39,200 --> 00:08:43,010 Ek kan 'n forensiese beeld van dit maak, sodat om te praat, deur die kopiëring van die nulle en 185 00:08:43,010 --> 00:08:46,830 mense af van die geheue kaart, of Dit is 'n SD kaart of kompakte flits kaart of 186 00:08:46,830 --> 00:08:48,100 alles wat jy vertroud is met. 187 00:08:48,100 --> 00:08:49,300 En dan kan ons hand wat uit. 188 00:08:49,300 --> 00:08:53,190 >> En so is die uitdaging wat voorlê, onder andere dinge vir jou sal wees om te skryf 189 00:08:53,190 --> 00:08:58,630 C-kode wat herstel 'n hele klomp van die JPEG vir my en geopenbaar sal wees 190 00:08:58,630 --> 00:09:00,190 daardie mense, plekke of dinge. 191 00:09:00,190 --> 00:09:03,340 En ons sal ook praat, in hierdie probleem stel en in die dae wat kom, oor 192 00:09:03,340 --> 00:09:04,440 grafiese meer algemeen. 193 00:09:04,440 --> 00:09:06,140 Ons het dit gebruik het, 'n kursus, vir uitbreek. 194 00:09:06,140 --> 00:09:09,080 Maar jy het soort van as vanselfsprekend aanvaar bestaan ​​daar op hoë vlak idees 195 00:09:09,080 --> 00:09:10,680 van reghoeke en ovale. 196 00:09:10,680 --> 00:09:12,450 Maar onder die enjinkap daar is pixels. 197 00:09:12,450 --> 00:09:14,370 En jy het om te begin dink oor daardie. 198 00:09:14,370 --> 00:09:18,800 Of jy sal p-stel vir 4 het om te dink oor die gaping tussen jul bakstene, hoe 199 00:09:18,800 --> 00:09:21,990 vinnig jy bal beweeg oor die skerm vir breek uit. 200 00:09:21,990 --> 00:09:24,830 So daar is hierdie idee van die kolle op jou skerm wat 201 00:09:24,830 --> 00:09:26,290 in die spel kom reeds. 202 00:09:26,290 --> 00:09:29,430 >> Nou wat jy sien, al is, is wat jy op 'n rekenaar skerm. 203 00:09:29,430 --> 00:09:33,680 As jy al ooit gesien hoe 'n paar goeie of slegte TV, is die kans wat hulle pretty much 204 00:09:33,680 --> 00:09:36,280 behandel die gehoor soos technophobes wat nie werklik 205 00:09:36,280 --> 00:09:37,630 weet nie veel oor die rekenaar. 206 00:09:37,630 --> 00:09:40,840 En so is dit baie maklik vir die polisie speurder te sê, kan jy 207 00:09:40,840 --> 00:09:41,710 skoon te maak wat vir my? 208 00:09:41,710 --> 00:09:42,710 Of te verbeter, reg? 209 00:09:42,710 --> 00:09:45,550 Verbeter, is soos die buzz woord in die meeste 'n misdaad verwante show. 210 00:09:45,550 --> 00:09:49,240 En die werklikheid is as jy 'n baie vaag prentjie van 'n verdagte te doen 211 00:09:49,240 --> 00:09:51,620 iets wat sleg is, kan jy nie net verbeter dit. 212 00:09:51,620 --> 00:09:53,080 Jy kan nie vergroot oneindig. 213 00:09:53,080 --> 00:09:56,350 Jy kan nie sien in die skynsel van iemand se oog wat gepleeg wat 214 00:09:56,350 --> 00:09:59,860 besondere misdaad, ten spyte van die voorkoms van hierdie op TV. 215 00:09:59,860 --> 00:10:04,110 >> En so met die laat motiveer dat komende probleem gestel met 'n blik op 216 00:10:04,110 --> 00:10:05,765 'n paar shows waarmee jy dalk bekend wees. 217 00:10:05,765 --> 00:10:06,500 >> [Video speel] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Nou, laat ons 'n goeie blik op wat jy kry. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Hou dit. 222 00:10:17,766 --> 00:10:18,658 Hardloop dit terug. 223 00:10:18,658 --> 00:10:19,550 >> -Wag 'n minuut. 224 00:10:19,550 --> 00:10:21,580 Gaan regs. 225 00:10:21,580 --> 00:10:21,800 >> -Daar. 226 00:10:21,800 --> 00:10:22,690 Vries dit. 227 00:10:22,690 --> 00:10:23,692 >> -Full screen. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Vries dit. 230 00:10:24,154 --> 00:10:25,140 >> Span-up op daardie, sal ya? 231 00:10:25,140 --> 00:10:27,090 >> Vector-in op die man deur die agterwiel. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom in reg hier op hierdie plek. 233 00:10:29,730 --> 00:10:33,700 >> -Met die regte toerusting, die ver-beeld kan word uitgebrei en verskerp. 234 00:10:33,700 --> 00:10:34,490 >> -Wat is dit? 235 00:10:34,490 --> 00:10:35,870 >> -Dit is 'n verbetering program. 236 00:10:35,870 --> 00:10:36,793 >> -Kan jy duidelik dat tot enige? 237 00:10:36,793 --> 00:10:38,560 >> -Ek weet nie. 238 00:10:38,560 --> 00:10:39,090 Kom ons verbeter dit. 239 00:10:39,090 --> 00:10:41,690 >> Verbeter-afdeling A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Ek versterk die detail en - 241 00:10:43,510 --> 00:10:44,456 >> -Ek dink nie daar is genoeg om te verbeter. 242 00:10:44,456 --> 00:10:45,402 Stel dit aan my skerm. 243 00:10:45,402 --> 00:10:47,300 >> -Verbeter die weerspieëling in haar oë. 244 00:10:47,300 --> 00:10:49,330 >> -Laat ons dit deur die loop video verbetering. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, kan jy dié? 246 00:10:50,340 --> 00:10:52,320 >> Hang op. 247 00:10:52,320 --> 00:10:54,290 >> -I've is besig om op hierdie weergawe. 248 00:10:54,290 --> 00:10:55,560 >> -Iemand se nadenke. 249 00:10:55,560 --> 00:10:56,440 >> -Besinning. 250 00:10:56,440 --> 00:10:57,940 >> -Daar is 'n weerspieëling van die man se gesig. 251 00:10:57,940 --> 00:10:58,860 >> -Die nadenke. 252 00:10:58,860 --> 00:10:59,710 >> -Daar is 'n weerspieëling. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom in op die spieël. 254 00:11:00,900 --> 00:11:03,500 >> -Jy kan sien 'n weerspieëling. 255 00:11:03,500 --> 00:11:04,700 >> -Kan jy die verbetering van die beeld van hier af? 256 00:11:04,700 --> 00:11:05,700 >> -Kan jy verbeter hom reg hier? 257 00:11:05,700 --> 00:11:06,500 >> -Kan jy verbeter dit? 258 00:11:06,500 --> 00:11:07,380 >> -Kan jy verbeter dit? 259 00:11:07,380 --> 00:11:08,190 >> -Kan ons verbeter dit? 260 00:11:08,190 --> 00:11:08,940 >> -Kan jy verbeter dit? 261 00:11:08,940 --> 00:11:10,280 >> -Hou op 'n tweede, sal ek verbeter. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom in op die deur. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Gelag] 266 00:11:13,197 --> 00:11:14,360 >> -Skuif in 267 00:11:14,360 --> 00:11:15,100 >> -Wag, stop. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Stop dit. 270 00:11:16,290 --> 00:11:19,390 >> -Draai 'n 75 grade rondom die vertikale asseblief. 271 00:11:19,390 --> 00:11:19,886 >> [Gelag] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, en terug na die deel oor die deur weer. 273 00:11:24,350 --> 00:11:26,330 >> -Het jy 'n beeld verbete wat kan bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Miskien kan ons gebruik maak van die Pradeep Sen metode om te sien in die vensters. 275 00:11:28,990 --> 00:11:30,680 >> -Hierdie sagteware is toestand van die kuns. 276 00:11:30,680 --> 00:11:31,676 >> -Die ikoon waarde is af. 277 00:11:31,676 --> 00:11:34,166 >> -Met die regte kombinasie van algoritmes. 278 00:11:34,166 --> 00:11:38,399 >> -Hy is geneem verligting algoritmes te die volgende vlak en ek kan gebruik om hulle te 279 00:11:38,399 --> 00:11:38,648 verbeter die foto. 280 00:11:38,648 --> 00:11:42,050 >> -Slot op en vergroot die z-as. 281 00:11:42,050 --> 00:11:42,760 >> -Verhoog. 282 00:11:42,760 --> 00:11:43,060 >> -Verhoog. 283 00:11:43,060 --> 00:11:43,760 >> -Verhoog. 284 00:11:43,760 --> 00:11:45,010 >> -Vries en te verbeter. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [Einde video-vertoning] 287 00:11:47,910 --> 00:11:51,470 >> David J. MALAN: So Probleem Stel 5 is wat voorlê daar. 288 00:11:51,470 --> 00:11:55,260 So ons sal binnekort 'n beter begrip van wanneer en waarom jy nie kan 289 00:11:55,260 --> 00:11:57,300 en ons kan nie verbeter op dié manier. 290 00:11:57,300 --> 00:12:00,090 Maar eers, laat ons teruggaan ons aandag om 'n paar van die boustene ons sal 291 00:12:00,090 --> 00:12:02,250 moet in staat wees om daardie storie te vertel. 292 00:12:02,250 --> 00:12:05,580 >> So onthou dat ons het hierdie foto op Maandag en 'n bietjie verlede week. 293 00:12:05,580 --> 00:12:09,970 En dit beskryf die uitleg van die dinge wat in jou rekenaar se geheue 294 00:12:09,970 --> 00:12:11,000 n programme te hardloop. 295 00:12:11,000 --> 00:12:14,310 Die tegnologie segment tot bo, onthou, verwys om die werklike nulle en ene 296 00:12:14,310 --> 00:12:16,000 waaruit jou program. 297 00:12:16,000 --> 00:12:19,340 Daar is, onder wat, sommige geïnisialiseer of ongedaan data, wat tipies 298 00:12:19,340 --> 00:12:22,910 verwys na dinge soos konstantes of snare of globale veranderlikes wat 299 00:12:22,910 --> 00:12:24,200 verklaar is in advance. 300 00:12:24,200 --> 00:12:26,500 Daar is die hoop klippe, maar ons sal kom Terug na wat in 'n bietjie. 301 00:12:26,500 --> 00:12:27,410 >> En dan is daar die stapel. 302 00:12:27,410 --> 00:12:30,660 Baie soos 'n stapel van die bak in die kafeteria, dit is waar die geheue kry 303 00:12:30,660 --> 00:12:33,610 lae en lae wanneer jy doen wat in 'n program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Wat is die stapel gebruik vir? 306 00:12:37,730 --> 00:12:39,320 >> Ja? 307 00:12:39,320 --> 00:12:40,000 >> Call of funksie. 308 00:12:40,000 --> 00:12:42,890 Enige tyd wat jy noem 'n funksie is, is dit gegee om stukkie van die geheue vir sy 309 00:12:42,890 --> 00:12:45,020 plaaslike veranderlikes of sy parameters. 310 00:12:45,020 --> 00:12:48,810 En picturaal, sien ons dat met elke opeenvolgende funksie geroep het, het 'n 311 00:12:48,810 --> 00:12:52,520 oproepe B oproepe C oproepe D, hulle kry lae op die stapel. 312 00:12:52,520 --> 00:12:55,630 En in elkeen van die snye geheue is in wese 'n unieke omvang 313 00:12:55,630 --> 00:12:58,590 vir daardie funksie, wat, natuurlik, is problematies as jy wil aan die hand 314 00:12:58,590 --> 00:13:01,850 van die een funksie na 'n ander 'n stuk van die data wat jy wil dit 315 00:13:01,850 --> 00:13:03,500 om te muteer of verander. 316 00:13:03,500 --> 00:13:08,060 >> So wat ons oplossing te staat te stel 'N funksie wat deur een hopie 317 00:13:08,060 --> 00:13:11,390 raam die geheue binne te verander van 'n ander stapel raam? 318 00:13:11,390 --> 00:13:14,590 Hoe doen die twee met mekaar te praat? 319 00:13:14,590 --> 00:13:18,510 So deur middel van wysers of adresse, wat, weer, net beskryf waar in 320 00:13:18,510 --> 00:13:22,280 geheue, by wyse van 'n spesifieke byt nommer, die betrokke 321 00:13:22,280 --> 00:13:23,830 waarde gevind kan word. 322 00:13:23,830 --> 00:13:26,860 So onthou laaste tyd ook ons ​​voortgegaan die storie en kyk na 'n 323 00:13:26,860 --> 00:13:28,280 redelik karretjie program. 324 00:13:28,280 --> 00:13:32,900 En hierdie program is karretjie vir 'n paar redes, maar die mees kommerwekkende een is 325 00:13:32,900 --> 00:13:34,620 omdat dit nie wat om te kyk? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ja, dit versuim om die insette te gaan. 328 00:13:40,450 --> 00:13:41,870 Jammer? 329 00:13:41,870 --> 00:13:43,880 >> As dit is meer as 12 karakters. 330 00:13:43,880 --> 00:13:47,260 So baie slim, wanneer ek bel memcopy, wat, soos die naam aandui, net 331 00:13:47,260 --> 00:13:50,630 afskrifte geheue van sy tweede argument in sy eerste argument. 332 00:13:50,630 --> 00:13:54,730 Die derde argument, baie slim, is nagegaan word om seker te maak dat jy nie 333 00:13:54,730 --> 00:13:59,400 kopieer meer as, in hierdie geval, die lengte van die bar, die aantal karakters, 334 00:13:59,400 --> 00:14:03,810 in die bestemming, wat hierdie verskeidenheid C. Maar die probleem is dat dit wat 335 00:14:03,810 --> 00:14:07,230 As C sigself is nie groot genoeg te hanteer nie? 336 00:14:07,230 --> 00:14:09,900 Jy gaan die aantal te kopieer grepe wat jy aan ons gegee is. 337 00:14:09,900 --> 00:14:13,040 Maar wat jy eintlik meer grepe as jy ruimte vir? 338 00:14:13,040 --> 00:14:16,770 >> Wel, hierdie program baie besondig net blindelings voort om te doen wat dit 339 00:14:16,770 --> 00:14:20,650 gegee, hallo agteroorskuisstreep 0 is 'n groot as string is kort 340 00:14:20,650 --> 00:14:22,040 genoeg is nie, soos vyf karakters. 341 00:14:22,040 --> 00:14:26,470 Maar as dit is eintlik 12 karakters of 1200 karakters, sien ons laaste keer 342 00:14:26,470 --> 00:14:29,380 dat jy net gaan om heeltemal vervang die geheue wat 343 00:14:29,380 --> 00:14:30,470 behoort nie aan jou. 344 00:14:30,470 --> 00:14:34,390 En die ergste geval, as jy oor skryf dat rooi gedeelte is daar dat ons bekend as die 345 00:14:34,390 --> 00:14:35,380 terug adres - 346 00:14:35,380 --> 00:14:38,370 dit is net waar die rekenaar outomaties vir jou, agter die 347 00:14:38,370 --> 00:14:43,130 tonele, opnaaisels weg van 'n 32-bit waarde wat herinner om dit te watter adres moet dit 348 00:14:43,130 --> 00:14:47,080 terug te keer wanneer cat, hierdie ander funksie, gedoen word uitgevoer. 349 00:14:47,080 --> 00:14:49,320 Dit is 'n brood krummel van spesies waarna dit terug. 350 00:14:49,320 --> 00:14:52,490 As jy oor skryf dat, potensieel, as jy die slegte man, kan kon 351 00:14:52,490 --> 00:14:54,750 potensieel oorneem iemand se rekenaar. 352 00:14:54,750 --> 00:14:58,020 En jy sal beslis crash dit in die meeste gevalle. 353 00:14:58,020 --> 00:15:01,690 >> Nou die probleem is net vererger as ons begin praat oor die geheue 354 00:15:01,690 --> 00:15:03,010 bestuur meer algemeen. 355 00:15:03,010 --> 00:15:07,150 En malloc, vir die toekenning van geheue, is 'n funksie wat ons kan gebruik om te wys 356 00:15:07,150 --> 00:15:11,260 geheue wanneer ons nie weet vooraf sodat ons kan 'n paar. 357 00:15:11,260 --> 00:15:13,960 So, byvoorbeeld, as ek gaan terug na die toestel hier. 358 00:15:13,960 --> 00:15:21,010 En ek oop vanaf laaste keer hello2.c, onthou hierdie program hier, wat gelyk 359 00:15:21,010 --> 00:15:23,500 'n bietjie iets soos hierdie, net drie lyne - 360 00:15:23,500 --> 00:15:27,940 meld u naam, dan string naam, aan die linkerkant, is gelyk aan getstring. 361 00:15:27,940 --> 00:15:29,690 En dan is ons druk dit uit, die gebruiker se naam. 362 00:15:29,690 --> 00:15:31,170 >> So dit was 'n super eenvoudige program. 363 00:15:31,170 --> 00:15:34,870 Om duidelik te wees, laat my gaan voort en maak hallo-2. 364 00:15:34,870 --> 00:15:36,680 Ek gaan dot streep hallo-2 te doen. 365 00:15:36,680 --> 00:15:37,750 Stel jou naam - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Betree. 368 00:15:38,840 --> 00:15:39,540 Hallo David. 369 00:15:39,540 --> 00:15:41,060 Dit lyk OK werk. 370 00:15:41,060 --> 00:15:43,140 Maar wat regtig aangaan onder kap hier? 371 00:15:43,140 --> 00:15:44,670 Eerste laat se skil terug 'n paar lae. 372 00:15:44,670 --> 00:15:48,380 String is net 'n sinoniem ons het besef vir wat? 373 00:15:48,380 --> 00:15:49,110 Kar ster. 374 00:15:49,110 --> 00:15:52,740 So kom ons maak dit 'n bietjie meer arcane maar meer tegnies korrek is dat hierdie 375 00:15:52,740 --> 00:15:55,570 is 'n kar ster, wat beteken dat naam, ja, 'n veranderlike is. 376 00:15:55,570 --> 00:15:59,920 Maar watter naam winkels is die adres van 'n kar, wat voel 'n bietjie vreemd 377 00:15:59,920 --> 00:16:01,050 want ek kry terug 'n string. 378 00:16:01,050 --> 00:16:03,580 Ek is terug om verskeie karakters nie 'n kar. 379 00:16:03,580 --> 00:16:07,400 >> Maar natuurlik, jy moet net die eerste kar se adres om te onthou waar die 380 00:16:07,400 --> 00:16:08,870 hele string is omdat hoekom? 381 00:16:08,870 --> 00:16:12,700 Hoe vind jy uit waar die einde van die string is om te weet die begin? 382 00:16:12,700 --> 00:16:13,630 Agteroorskuisstreep nul. 383 00:16:13,630 --> 00:16:17,260 So met dié twee leidrade jy uitvind voor die begin en die einde van 384 00:16:17,260 --> 00:16:20,280 enige string is, so lank as wat hulle is behoorlik gevorm met daardie null 385 00:16:20,280 --> 00:16:22,110 Terminator, wat agteroorskuisstreep nul. 386 00:16:22,110 --> 00:16:24,520 >> Maar dit is 'n beroep getstring. 387 00:16:24,520 --> 00:16:28,020 En dit blyk dat getstring al hierdie tyd was soort 388 00:16:28,020 --> 00:16:28,820 kullery vir ons. 389 00:16:28,820 --> 00:16:32,460 Dit is om dit te doen arbeid, om seker te wees, om 'n string van die gebruiker. 390 00:16:32,460 --> 00:16:34,580 Maar waar is dat die geheue is afkomstig van? 391 00:16:34,580 --> 00:16:38,440 As ons terug gaan na die prentjie hier en die toepassing van die definisie van net 'n 392 00:16:38,440 --> 00:16:42,610 oomblik gelede, dat die stapel is waar geheue gaan wanneer funksies word, 393 00:16:42,610 --> 00:16:45,370 deur daardie logika, wanneer jy bel getstring, en dan het ek tik in 394 00:16:45,370 --> 00:16:50,900 D-'n-V-ek-D Voer, waar is D-A-V-ek-D agteroorskuisstreep nul gestoor word, gebaseer op die 395 00:16:50,900 --> 00:16:53,480 storie ons het vertel ons ver? 396 00:16:53,480 --> 00:16:55,190 >> Dit sou blyk te wees in die stapel, reg? 397 00:16:55,190 --> 00:16:58,120 Wanneer jy 'n beroep kry jy 'n string klein deel van die geheue op die stapel. 398 00:16:58,120 --> 00:17:01,630 So is dit vanselfsprekend dat die D-A-V-ek-D agteroorskuisstreep nul gestoor 399 00:17:01,630 --> 00:17:02,770 daar in die stapel. 400 00:17:02,770 --> 00:17:07,680 Maar wag 'n minuut, getstring opbrengste dat die snaar, om so te praat, wat beteken 401 00:17:07,680 --> 00:17:11,700 dit is skinkbord uit die kafeteria is geneem uit die stapel. 402 00:17:11,700 --> 00:17:14,560 En ons het laaste keer dat so gou as 'n funksie gee, en jy neem wat 403 00:17:14,560 --> 00:17:20,109 skinkbord, om so te praat, uit die stapel, wat kan jy aanvaar oor die oorblyfsels van 404 00:17:20,109 --> 00:17:21,819 dat die geheue? 405 00:17:21,819 --> 00:17:25,160 Ek soort van redrew hulle as vraagtekens omdat hulle effektief geword 406 00:17:25,160 --> 00:17:26,250 onbekende waardes. 407 00:17:26,250 --> 00:17:29,500 Hulle kan weer gebruik word wanneer 'n volgende funksie geroep word. 408 00:17:29,500 --> 00:17:31,870 >> Met ander woorde, as ons gebeur word stoor - 409 00:17:31,870 --> 00:17:34,350 Ek sal trek 'n vinnige foto hier van die stapel. 410 00:17:34,350 --> 00:17:38,690 As ons gebeur word die tekens van die onderkant van my geheue segment, en ons sal sê 411 00:17:38,690 --> 00:17:42,230 dat hierdie is die plek van die geheue beset deur die hoof en miskien arg c en 412 00:17:42,230 --> 00:17:46,790 arg v en enigiets anders in die program, wanneer getstring genoem word, 413 00:17:46,790 --> 00:17:51,120 vermoedelik getstring kry 'n stuk van die geheue hier. 414 00:17:51,120 --> 00:17:53,940 En dan is D-A-V-ek-D of ander manier eindig in hierdie funksie. 415 00:17:53,940 --> 00:17:55,320 En ek gaan oversimplify. 416 00:17:55,320 --> 00:18:00,050 Maar laat ons aanvaar dat die D-A-V-ek-D agteroorskuisstreep nul. 417 00:18:00,050 --> 00:18:03,500 So hierdie baie grepe word gebruik in die raam vir getstring. 418 00:18:03,500 --> 00:18:08,270 >> Maar so gou as getstring opbrengste, het ons het gesê die afgelope tyd dat hierdie geheue oor 419 00:18:08,270 --> 00:18:11,340 hier al word - Woeps! - 420 00:18:11,340 --> 00:18:14,270 al word effektief uitgewis. 421 00:18:14,270 --> 00:18:17,220 En ons kan dink van hierdie nou as vraag punte, want wie weet 422 00:18:17,220 --> 00:18:18,720 wat gaan word van die geheue. 423 00:18:18,720 --> 00:18:22,130 Inderdaad, ek het baie dikwels bel funksies anders as getstring. 424 00:18:22,130 --> 00:18:24,750 En so gou as ek noem 'n paar ander funksie as getstring, miskien nie in 425 00:18:24,750 --> 00:18:28,860 hierdie spesifieke program ons nou net gekyk op maar 'n paar ander, sekerlik 'n paar ander 426 00:18:28,860 --> 00:18:34,180 funksie kan beland gegee hierdie volgende plek in die stapel. 427 00:18:34,180 --> 00:18:39,410 >> So kan dit nie wees dat getstring winkels D-'n-V-ek-D op die stapel, want ek sou 428 00:18:39,410 --> 00:18:41,040 onmiddellik verloor toegang tot dit. 429 00:18:41,040 --> 00:18:43,720 Maar ons weet dat hulle getstring net terug wat? 430 00:18:43,720 --> 00:18:47,220 Dit is nie terug te keer na my ses karakters. 431 00:18:47,220 --> 00:18:51,090 Wat is dit werklik terugkeer het ons aflei laaste tyd? 432 00:18:51,090 --> 00:18:52,480 Die adres van die eerste. 433 00:18:52,480 --> 00:18:56,650 So een of ander manier, wanneer jy geroep getstring, dit is die toekenning van 'n stuk van die geheue vir 434 00:18:56,650 --> 00:18:59,620 die tou wat die gebruikers tipe en dan weer terug adres van dit. 435 00:18:59,620 --> 00:19:02,930 En dit blyk dat wanneer jy wil funksioneer geheue in hierdie toe te ken 436 00:19:02,930 --> 00:19:08,390 pad en terug te keer na die persoon wat genoem daardie funksie, die adres van 437 00:19:08,390 --> 00:19:11,870 wat deel van die geheue, het jy absoluut kan dit nie in die stapel op die 438 00:19:11,870 --> 00:19:14,750 bodem, want dit is net funksioneel gaan raak nie joune baie 439 00:19:14,750 --> 00:19:17,800 vinnig, sodat jy kan seker raai waar ons is waarskynlik gaan om dit te gooi 440 00:19:17,800 --> 00:19:20,130 In plaas daarvan, die sogenaamde hoop. 441 00:19:20,130 --> 00:19:25,290 >> So tussen die onderkant van jou geheue se uitleg en die top van jou geheue se 442 00:19:25,290 --> 00:19:26,820 uitleg is 'n hele klomp van die segmente. 443 00:19:26,820 --> 00:19:29,270 Een daarvan is die stapel, en reg bogenoemde is dit die hoop. 444 00:19:29,270 --> 00:19:33,680 En hoop is net 'n ander deel van geheue wat nie gebruik word vir funksies 445 00:19:33,680 --> 00:19:34,770 wanneer hulle geroep. 446 00:19:34,770 --> 00:19:38,100 Dit is gebruik vir 'n langer termyn geheue, wanneer jy wil 'n funksie om te gryp 447 00:19:38,100 --> 00:19:42,700 geheue en in staat wees om op te hang dit sonder om beheer te verloor oor dit. 448 00:19:42,700 --> 00:19:45,550 >> Nou kan jy dalk onmiddellik sien dat dit nie 449 00:19:45,550 --> 00:19:48,060 noodwendig 'n perfekte ontwerp. 450 00:19:48,060 --> 00:19:51,350 As jou program toegeken geheue op die stapel te plaas, of as jy 'n beroep meer en 451 00:19:51,350 --> 00:19:55,540 meer funksies, of as jy ken geheue op die hoop met 'malloc af as 452 00:19:55,540 --> 00:20:00,690 getstring doen, wat duidelik lyk onvermydelik probleem te wees nie? 453 00:20:00,690 --> 00:20:00,860 >> Reg. 454 00:20:00,860 --> 00:20:03,150 Soos die feit dat hierdie pyle is op mekaar gerig 455 00:20:03,150 --> 00:20:04,380 voorspel niks goeds nie. 456 00:20:04,380 --> 00:20:08,630 En inderdaad, kan baie vinnig ons crash 'n program in 'n aantal maniere. 457 00:20:08,630 --> 00:20:12,050 Trouens, ek dink dat ons dalk 'n gedoen het per ongeluk 'n keer. 458 00:20:12,050 --> 00:20:14,020 Of indien nie, kom ons doen dit doelbewus nou. 459 00:20:14,020 --> 00:20:21,330 Laat my gaan voort en skryf super vinnig 'n program genaamd dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 En nou gaan ek hier en nie skerp sluit stdio.h. 461 00:20:26,730 --> 00:20:32,620 Kom ons verklaar funksie cat neem geen argumente, wat 462 00:20:32,620 --> 00:20:34,040 aangedui, asook deur nietig. 463 00:20:34,040 --> 00:20:37,830 >> En die enigste ding cat gaan doen, is om oproep cat, wat waarskynlik nie die 464 00:20:37,830 --> 00:20:39,100 slimste idee nie, maar laat dit so wees. 465 00:20:39,100 --> 00:20:40,490 Ent belangrikste leemte. 466 00:20:40,490 --> 00:20:45,270 Nou is die enigste ding hoof gaan te doen is bel cat as well. 467 00:20:45,270 --> 00:20:51,050 En net vir die skop, ek gaan om te gaan voor hier en printf sê: "Hallo uit 468 00:20:51,050 --> 00:20:52,340 cat. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 So as ek het nie enige foute, Maak dontdothis dot streep. 471 00:21:00,160 --> 00:21:01,960 En kom ons doen dit in 'n groter venster - 472 00:21:01,960 --> 00:21:03,210 dot streep, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Kom op. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh Oh. 477 00:21:11,890 --> 00:21:13,100 Blykbaar het, kan jy dit doen. 478 00:21:13,100 --> 00:21:15,190 Damn dit. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Wag. 481 00:21:16,580 --> 00:21:17,370 Staan. 482 00:21:17,370 --> 00:21:18,270 Het ons - 483 00:21:18,270 --> 00:21:20,110 Ons het dit gebruik om met maak nie. 484 00:21:20,110 --> 00:21:22,050 >> [Sug] 485 00:21:22,050 --> 00:21:25,110 >> Ek weet nie, maar ek dink ons net verwyder dit. 486 00:21:25,110 --> 00:21:28,410 Uh, ja. 487 00:21:28,410 --> 00:21:30,660 Damn dit. 488 00:21:30,660 --> 00:21:32,640 Los hierdie Rob. 489 00:21:32,640 --> 00:21:34,678 Wat? 490 00:21:34,678 --> 00:21:35,928 Dit is baie eenvoudig. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ja, ons het optimalisering af. 493 00:21:47,360 --> 00:21:48,970 OK, staan ​​bye. 494 00:21:48,970 --> 00:21:49,950 Nou voel ek beter. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Alle regte. 497 00:21:51,780 --> 00:21:53,430 >> So laat se heropstel hierdie - 498 00:21:53,430 --> 00:21:55,880 Maak jou dontdothis. 499 00:21:55,880 --> 00:22:00,090 Jy kan hê om dit te verander na dothis.c in net 'n oomblik. 500 00:22:00,090 --> 00:22:00,710 Daar gaan ons. 501 00:22:00,710 --> 00:22:01,240 Dankie. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 So die feit dat ek die druk iets uit was eintlik net 504 00:22:05,480 --> 00:22:08,150 stadiger die proses waardeur ons sou daardie punt bereik. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Sjoe! 507 00:22:08,870 --> 00:22:11,180 >> So, wat is eintlik gaan aan? 508 00:22:11,180 --> 00:22:14,440 Die rede is daar, net soos 'n eenkant, is om iets te doen in terme van insette en 509 00:22:14,440 --> 00:22:17,270 uitset is geneig om stadiger wees, want jy het karakters te skryf aan die 510 00:22:17,270 --> 00:22:18,600 skerm, dit het om te blaai. 511 00:22:18,600 --> 00:22:21,720 So lang storie kort, het ek eintlik gebeur so ongeduldig, sou ons 512 00:22:21,720 --> 00:22:23,260 gesien dat hierdie eindresultaat as well. 513 00:22:23,260 --> 00:22:26,220 Nou dat ek rit van die druk-ups, sien ons dit dadelik. 514 00:22:26,220 --> 00:22:28,410 So is die rede waarom dit gebeur. 515 00:22:28,410 --> 00:22:31,300 Wel, die eenvoudige verduideliking, natuurlik, is dat cat waarskynlik nie 516 00:22:31,300 --> 00:22:32,500 word roeping self. 517 00:22:32,500 --> 00:22:34,470 >> Nou in die algemeen, dit is rekursie. 518 00:22:34,470 --> 00:22:36,970 En ons het gedink 'n paar weke gelede rekursiewe is goed. 519 00:22:36,970 --> 00:22:40,330 Rekursie is hierdie magiese manier om jouself super saaklik. 520 00:22:40,330 --> 00:22:41,400 En dit werk net. 521 00:22:41,400 --> 00:22:45,060 Maar daar is 'n belangrike kenmerk van al die rekursiewe programme wat ons het gepraat 522 00:22:45,060 --> 00:22:48,260 oor en kyk na tot dusver, wat was dat hulle het wat? 523 00:22:48,260 --> 00:22:52,610 'N basis geval, dit was 'n harde gekodeerde geval wat gesê het in sommige gevalle 524 00:22:52,610 --> 00:22:56,210 noem dit nie cat, wat duidelik nie die geval hier. 525 00:22:56,210 --> 00:22:58,920 >> So wat werklik gebeur in terme van hierdie foto? 526 00:22:58,920 --> 00:23:01,790 Wel, as hoof roep cat, is dit kry 'n stuk van die geheue. 527 00:23:01,790 --> 00:23:04,150 Wanneer cat cat noem, raak dit 'n sny van die geheue. 528 00:23:04,150 --> 00:23:06,430 Wanneer cat cat noem, raak dit 'n sny. 529 00:23:06,430 --> 00:23:07,080 Dit kry 'n stuk. 530 00:23:07,080 --> 00:23:08,120 Dit kry 'n stuk. 531 00:23:08,120 --> 00:23:09,460 Omdat cat is nooit terugkeer. 532 00:23:09,460 --> 00:23:12,160 Ons het nooit die skoonmaak van een van daardie rame van die stapel. 533 00:23:12,160 --> 00:23:15,930 So ons waai deur die hoop, nie te noem, wie weet wat anders, en 534 00:23:15,930 --> 00:23:19,600 ons is te ver van die grense van ons sogenaamde segment van die geheue. 535 00:23:19,600 --> 00:23:21,790 Fout gaan segmentering vals. 536 00:23:21,790 --> 00:23:24,110 >> So die oplossing is daar duidelik moenie dit doen nie. 537 00:23:24,110 --> 00:23:28,830 Maar die groter implikasie is dat, ja, daar is absoluut 'n beperking, 538 00:23:28,830 --> 00:23:32,470 selfs al is dit nie goed gedefinieer nie, oor hoe baie funksies wat jy kan bel in 'n 539 00:23:32,470 --> 00:23:34,970 program, hoeveel keer 'n funksie kan noem homself. 540 00:23:34,970 --> 00:23:38,430 So selfs al het ons het verkondig rekursie as dit moontlik magiese ding wat 'n 541 00:23:38,430 --> 00:23:41,870 n paar weke gelede vir die Sigma funksie, en wanneer ons die data 542 00:23:41,870 --> 00:23:45,270 strukture en CS50, sien jy ander aansoeke vir dit, dit is nie 543 00:23:45,270 --> 00:23:46,500 noodwendig die beste ding. 544 00:23:46,500 --> 00:23:50,070 Want as 'n funksie oproepe self, oproepe self, selfs al is daar 'n basis 545 00:23:50,070 --> 00:23:54,860 geval, as jy nie getref dat die basis geval vir 1000 bel of 10,000 oproepe, deur 546 00:23:54,860 --> 00:23:58,800 daardie tyd wat jy kan hardloop het uit die kamer op jou sogenaamde stapel en druk 547 00:23:58,800 --> 00:24:00,400 'n ander segmente van die geheue. 548 00:24:00,400 --> 00:24:03,950 So is dit ook 'n ontwerp trade-off tussen elegansie en tussen 549 00:24:03,950 --> 00:24:06,920 welstand van jou spesifieke implementering. 550 00:24:06,920 --> 00:24:10,780 >> So daar is nog 'n nadeel of 'n ander Gotcha wat ons het 551 00:24:10,780 --> 00:24:11,720 doen tot dusver. 552 00:24:11,720 --> 00:24:12,980 Toe ek genoem getstring - 553 00:24:12,980 --> 00:24:15,120 laat my gaan terug in die hallo-2. 554 00:24:15,120 --> 00:24:18,170 Let daarop dat ek getstring is roep, wat die terugkeer van 'n adres. 555 00:24:18,170 --> 00:24:20,730 En ons eis vandag dat adres is van die wal. 556 00:24:20,730 --> 00:24:24,480 En nou is ek druk uit die string by daardie adres. 557 00:24:24,480 --> 00:24:27,000 Maar ons het nog nooit bekend as die teenoorgestelde van getstring. 558 00:24:27,000 --> 00:24:30,850 Ons het nog nooit 'n funksie soos om calll ungetstring, waar jy hand terug 559 00:24:30,850 --> 00:24:31,610 dat die geheue. 560 00:24:31,610 --> 00:24:33,250 Maar eerlik ons ​​waarskynlik moes gewees het. 561 00:24:33,250 --> 00:24:37,390 Want as ons bly vra die rekenaar vir die geheue, by wyse van iemand soos 562 00:24:37,390 --> 00:24:40,830 getstring maar nooit gee dit terug, sekerlik Dit is ook gebind te lei tot 563 00:24:40,830 --> 00:24:42,970 probleme waardeur ons hardloop uit van die geheue. 564 00:24:42,970 --> 00:24:46,140 >> En in werklikheid, kan ons kyk vir hierdie probleme met die nuwe instrument waarvan die gebruik 565 00:24:46,140 --> 00:24:47,640 is 'n bietjie kripties te tik. 566 00:24:47,640 --> 00:24:50,960 Maar laat my gaan voort en spat dit op op die skerm in net 'n oomblik. 567 00:24:50,960 --> 00:24:56,940 Ek gaan om voort te gaan en uit te voer Valgrind met parameter wie se eerste opdrag 568 00:24:56,940 --> 00:25:00,260 lyn argument is die naam van die program hallo-2. 569 00:25:00,260 --> 00:25:02,650 En ongelukkig is dit produksie is afgrijselijk 570 00:25:02,650 --> 00:25:04,290 kompleks vir geen goeie rede. 571 00:25:04,290 --> 00:25:06,280 So sien ons almal dat die gemors. 572 00:25:06,280 --> 00:25:07,530 David is stel my naam. 573 00:25:07,530 --> 00:25:09,760 So wat is die program eintlik loop. 574 00:25:09,760 --> 00:25:11,180 En nou kry ons dit uitvoer. 575 00:25:11,180 --> 00:25:13,400 >> So Valgrind is soortgelyk in die gees te GDB. 576 00:25:13,400 --> 00:25:14,950 Dit is nie 'n debugger per se. 577 00:25:14,950 --> 00:25:16,270 Maar dit is 'n geheue checker. 578 00:25:16,270 --> 00:25:20,140 Dit is 'n program wat sal loop jou -program en vertel jou as jy gevra om 'n 579 00:25:20,140 --> 00:25:23,860 rekenaar geheue en nooit ingehandig terug, en daardeur wat beteken dat jy 580 00:25:23,860 --> 00:25:24,570 'n geheugenlek. 581 00:25:24,570 --> 00:25:26,240 En geheue lekkasies is geneig om te sleg wees. 582 00:25:26,240 --> 00:25:29,120 En jy is die gebruikers van rekenaars waarskynlik gevoel, of jy het 'n 583 00:25:29,120 --> 00:25:30,300 Mac of 'n rekenaar. 584 00:25:30,300 --> 00:25:33,730 Het jy al ooit gebruik word om jou rekenaar vir terwyl en nie weer begin in verskeie 585 00:25:33,730 --> 00:25:36,820 dae, of jy het net 'n baie programme hardloop, en die damn ding 586 00:25:36,820 --> 00:25:42,360 vertraag tot stilstand, of ten minste dit is super irriterende te gebruik, want 587 00:25:42,360 --> 00:25:44,350 alles net super stadig. 588 00:25:44,350 --> 00:25:46,260 >> Nou wat kan 'n aantal redes wees. 589 00:25:46,260 --> 00:25:49,600 Dit kan 'n oneindige lus, 'n fout in wees iemand se kode, of, meer eenvoudig, dit 590 00:25:49,600 --> 00:25:53,250 kan beteken dat jy meer jy gebruik geheue, of probeer om, as jou 591 00:25:53,250 --> 00:25:54,920 rekenaar het eintlik. 592 00:25:54,920 --> 00:25:57,770 En miskien is daar 'n fout in 'n program wat bly vra vir die geheue. 593 00:25:57,770 --> 00:26:02,480 Browsers vir die jaar was berug vir hierdie, vra vir meer en meer geheue 594 00:26:02,480 --> 00:26:03,870 maar nooit oorhandig dit terug. 595 00:26:03,870 --> 00:26:07,220 Seker, as jy net 'n beperkte hoeveelheid geheue, kan jy nie vra nie 596 00:26:07,220 --> 00:26:09,990 oneindig baie keer vir sommige van die geheue. 597 00:26:09,990 --> 00:26:13,070 >> En so wat jy hier sien, selfs al weer Valgrind se produksie is 598 00:26:13,070 --> 00:26:17,490 onnodig kompleks is om te blik op Eerstens, dit is die interessante deel. 599 00:26:17,490 --> 00:26:18,890 Hoop - 600 00:26:18,890 --> 00:26:20,060 in gebruik by die uitgang. 601 00:26:20,060 --> 00:26:22,810 So hier is hoeveel geheue was in gebruik in die hoop op die 602 00:26:22,810 --> 00:26:24,300 tyd my program afgesluit - 603 00:26:24,300 --> 00:26:27,280 blykbaar ses grepe in een blok. 604 00:26:27,280 --> 00:26:28,710 So ek gaan my hande te waai na wat 'n blok is. 605 00:26:28,710 --> 00:26:31,270 Dink dit is net 'n stuk, 'n meer tegniese woord vir stuk. 606 00:26:31,270 --> 00:26:33,140 Maar ses grepe - 607 00:26:33,140 --> 00:26:36,870 Wat is die ses grepe was steeds in gebruik? 608 00:26:36,870 --> 00:26:37,390 >> Presies. 609 00:26:37,390 --> 00:26:41,520 D-'n-V-ek-D agteroorskuisstreep nul, vyf brief naam plus die nul terminator. 610 00:26:41,520 --> 00:26:46,350 So hierdie program opgemerk Valgrind dat ek gevra om vir ses grepe, blykbaar deur 611 00:26:46,350 --> 00:26:48,950 manier van getstring, maar nooit het hulle terug. 612 00:26:48,950 --> 00:26:52,030 En in waarheid te sê, kan dit nie so wees voor die hand liggend as my program is nie drie 613 00:26:52,030 --> 00:26:53,590 lyne, maar dit is 300 lyne. 614 00:26:53,590 --> 00:26:56,920 Sodat ons kan eintlik gee 'n ander opdrag lyn argument te Valgrind te 615 00:26:56,920 --> 00:26:58,290 maak dit meer verbose. 616 00:26:58,290 --> 00:26:59,760 Dit is 'n bietjie irriterend om te onthou. 617 00:26:59,760 --> 00:27:01,580 Maar as ek doen - 618 00:27:01,580 --> 00:27:01,930 Kom ons kyk. 619 00:27:01,930 --> 00:27:03,540 Lek - 620 00:27:03,540 --> 00:27:05,030 Was dit lek - 621 00:27:05,030 --> 00:27:07,580 selfs ek kan nie onthou wat dit is af hand. 622 00:27:07,580 --> 00:27:08,550 >> - Lek-tjek gelyk vol. 623 00:27:08,550 --> 00:27:10,180 Yep, dankie. 624 00:27:10,180 --> 00:27:12,520 - Lek-tjek gelyk vol. 625 00:27:12,520 --> 00:27:13,800 Betree. 626 00:27:13,800 --> 00:27:14,940 Dieselfde program word uitgevoer. 627 00:27:14,940 --> 00:27:16,180 Tik in Dawid weer. 628 00:27:16,180 --> 00:27:17,660 Nou sien ek 'n bietjie meer detail. 629 00:27:17,660 --> 00:27:20,890 Maar onder die hoop opsomming, wat identies is aan vier - ah, 630 00:27:20,890 --> 00:27:22,120 hierdie is 'n soort van lekker. 631 00:27:22,120 --> 00:27:25,460 Nou Valgrind is eintlik op soek na 'n bietjie harder in my kode. 632 00:27:25,460 --> 00:27:29,580 En dit is te sê dat, blykbaar, malloc by lyn - 633 00:27:29,580 --> 00:27:30,580 ons uit te zoem. 634 00:27:30,580 --> 00:27:31,980 Op die lyn - 635 00:27:31,980 --> 00:27:32,930 ons nie sien nie watter lyn dit is. 636 00:27:32,930 --> 00:27:35,110 Maar malloc is die eerste skuldige. 637 00:27:35,110 --> 00:27:38,630 Daar is 'n blog in malloc. 638 00:27:38,630 --> 00:27:39,810 >> Alle reg? 639 00:27:39,810 --> 00:27:40,450 OK, no. 640 00:27:40,450 --> 00:27:40,940 Reg? 641 00:27:40,940 --> 00:27:42,520 Ek het getstring. 642 00:27:42,520 --> 00:27:44,460 getstring noem blykbaar malloc. 643 00:27:44,460 --> 00:27:47,800 So, wat reël van die kode is blykbaar by die skuld vir die feit dat 644 00:27:47,800 --> 00:27:49,050 toegeken die geheue? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Kom ons neem aan dat elkeen wat geskryf het malloc het lank genoeg dat dit 647 00:27:55,540 --> 00:27:56,390 nie hulle skuld nie. 648 00:27:56,390 --> 00:27:57,520 So is dit waarskynlik myn. 649 00:27:57,520 --> 00:28:02,000 getstring in cs50.c - so dit is 'n lêer iewers op die rekenaar - 650 00:28:02,000 --> 00:28:05,210 in lyn 286 lyk na die skuldige is. 651 00:28:05,210 --> 00:28:08,140 Nou kom ons aanvaar dat cs50 is om vir ordentlike bedrag van die tyd, so 652 00:28:08,140 --> 00:28:09,720 ons ook onfeilbaar. 653 00:28:09,720 --> 00:28:14,080 En so is dit waarskynlik nie in getstring dat die fout lê nie, maar eerder in 654 00:28:14,080 --> 00:28:17,810 hallo-2.c lyn 18. 655 00:28:17,810 --> 00:28:20,670 >> So kom ons neem 'n blik op wat daardie lyn 18 was. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Een of ander manier hierdie lyn is nie noodwendig karretjie, per se, maar dit is die rede 658 00:28:27,130 --> 00:28:28,630 agter dat die geheue lek. 659 00:28:28,630 --> 00:28:32,140 So super eenvoudig, wat sal intuïtief die oplossing hier? 660 00:28:32,140 --> 00:28:34,710 As ons vra vir die geheue, was nog nooit gee dit terug, en wat blyk te wees om 'n 661 00:28:34,710 --> 00:28:37,940 probleem, want met verloop van tyd my rekenaar sou loop uit geheue, dalk stadiger 662 00:28:37,940 --> 00:28:42,110 af, kan slegte dinge gebeur, goed, wat is die eenvoudige intuïtief oplossing? 663 00:28:42,110 --> 00:28:43,140 Net gee dit terug. 664 00:28:43,140 --> 00:28:44,770 >> Hoe vry is jy nie 'dat die geheue? 665 00:28:44,770 --> 00:28:49,970 Wel, gelukkig is dit eenvoudig om net te sê free naam. 666 00:28:49,970 --> 00:28:51,260 En ons het nog nooit gedoen het nie. 667 00:28:51,260 --> 00:28:55,890 Maar jy kan in wese dink vry as die teenoorgestelde van malloc. 668 00:28:55,890 --> 00:28:58,030 vry is die teenoorgestelde van toekenning van die geheue. 669 00:28:58,030 --> 00:28:59,540 So nou laat my heropstel hierdie. 670 00:28:59,540 --> 00:29:02,050 Maak hallo-2. 671 00:29:02,050 --> 00:29:04,620 Laat my loop dit weer. hallo-2 Dawid. 672 00:29:04,620 --> 00:29:07,290 So dit blyk te werk in presies dieselfde manier. 673 00:29:07,290 --> 00:29:11,180 Maar as ek terug te gaan na Valgrind en weer uit te voer dieselfde opdrag op my nuut 674 00:29:11,180 --> 00:29:14,720 saamgestel program, tik in my naam as voor - 675 00:29:14,720 --> 00:29:15,370 Nice. 676 00:29:15,370 --> 00:29:16,760 Hoop opsomming - 677 00:29:16,760 --> 00:29:17,740 in gebruik by die uitgang - 678 00:29:17,740 --> 00:29:19,370 nul grepe in nul blokke. 679 00:29:19,370 --> 00:29:21,840 En dit is super lekker, al hoop blokke vrygelaat is. 680 00:29:21,840 --> 00:29:23,480 Geen lekkasies is moontlik. 681 00:29:23,480 --> 00:29:27,200 >> So kom, nie met die probleem Stel 4, maar met die probleem Stel 5, die forensiese 682 00:29:27,200 --> 00:29:30,740 en verder, dit sal ook 'n maatstaf van die korrektheid van jou 683 00:29:30,740 --> 00:29:33,630 program, ongeag of jy ' of het nie die geheue lekkasies. 684 00:29:33,630 --> 00:29:36,900 Maar gelukkig is, kan jy nie net redeneer deur hulle intuïtief, wat 685 00:29:36,900 --> 00:29:40,430 is, waarskynlik, maklik vir klein programme maar moeiliker vir groter programme, 686 00:29:40,430 --> 00:29:43,860 Valgrind, vir diegene wat groter programme, kan help om te identifiseer 687 00:29:43,860 --> 00:29:45,360 die spesifieke probleem. 688 00:29:45,360 --> 00:29:47,500 >> Maar daar is een ander probleem wat mag ontstaan. 689 00:29:47,500 --> 00:29:51,245 Laat my oopmaak hierdie lêer hier, wat is, weer, 'n ietwat eenvoudige voorbeeld. 690 00:29:51,245 --> 00:29:53,760 Maar laat ons fokus op dit wat hierdie program doen. 691 00:29:53,760 --> 00:29:55,190 Dit is die sogenaamde memory.c. 692 00:29:55,190 --> 00:29:58,380 Ons sal dit later vandag plaas in die rits van vandag se bron-kode. 693 00:29:58,380 --> 00:30:01,610 En sien dat Ek het 'n funksie genoem f wat neem geen argumente en 694 00:30:01,610 --> 00:30:02,800 terugkeer nie. 695 00:30:02,800 --> 00:30:07,240 In lyn 20, ek glo waarby 'n wyser na 'n int en noem dit x. 696 00:30:07,240 --> 00:30:09,570 Ek is die toeken is die terugkeer waarde van malloc. 697 00:30:09,570 --> 00:30:14,590 En net om duidelik te wees, hoeveel grepe am Ek het waarskynlik om terug van malloc 698 00:30:14,590 --> 00:30:17,080 in hierdie situasie? 699 00:30:17,080 --> 00:30:18,040 >> Waarskynlik 40. 700 00:30:18,040 --> 00:30:18,840 Waar kry jy dit uit? 701 00:30:18,840 --> 00:30:22,410 Wel, as jy onthou dat 'n int dikwels 4 grepe, ten minste is dit in die 702 00:30:22,410 --> 00:30:25,110 toestel, 10 keer 4 is natuurlik 40. 703 00:30:25,110 --> 00:30:28,920 So malloc terugkeer 'n adres van 'n stuk van die geheue en berging wat 704 00:30:28,920 --> 00:30:30,800 spreek uiteindelik in x. 705 00:30:30,800 --> 00:30:32,570 So duidelik te wees, wat dan gebeur? 706 00:30:32,570 --> 00:30:34,990 Wel, laat my terug skakel aan ons prentjie hier. 707 00:30:34,990 --> 00:30:38,150 Laat my net nie trek die onderkant van my rekenaar se geheue, laat my gaan voort en 708 00:30:38,150 --> 00:30:42,990 trek die hele reghoek wat verteenwoordig al van my geheue. 709 00:30:42,990 --> 00:30:44,790 >> Ons sal sê dat die stapel is op die onderkant. 710 00:30:44,790 --> 00:30:47,010 En daar is 'n teks segment in die ongedaan data. 711 00:30:47,010 --> 00:30:49,880 Maar ek is net gaan om abstrakte diegene ander dinge weg as dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Ek gaan net om te verwys na hierdie as die hoop op die top. 713 00:30:53,470 --> 00:30:57,070 En dan aan die onderkant van hierdie foto, hoof te verteenwoordig, ek gaan 714 00:30:57,070 --> 00:30:59,880 om te gee dit 'n snye geheue op die stapel. 715 00:30:59,880 --> 00:31:03,150 Vir f, ek gaan om te gee dit 'n sny van die geheue op die stapel. 716 00:31:03,150 --> 00:31:05,140 Nou, ek het my te raadpleeg source code weer. 717 00:31:05,140 --> 00:31:07,170 Wat is die plaaslike veranderlikes vir die hoof? 718 00:31:07,170 --> 00:31:10,710 Blykbaar niks, sodat sny is effektief leeg, of selfs nie so 'n groot 719 00:31:10,710 --> 00:31:11,600 as ek getrek het. 720 00:31:11,600 --> 00:31:15,730 Maar in f, ek het 'n plaaslike veranderlike, wat genoem word x. 721 00:31:15,730 --> 00:31:20,410 So ek gaan om voort te gaan en f gee 'n stuk van die geheue, noem dit x. 722 00:31:20,410 --> 00:31:24,680 >> En nou malloc van 10 keer 4, So malloc 40, waar is dat 723 00:31:24,680 --> 00:31:25,430 geheue vandaan? 724 00:31:25,430 --> 00:31:27,530 Ons het nie getrek 'n foto soos hierdie voor. 725 00:31:27,530 --> 00:31:31,140 Maar laat ons veronderstel dat dit effektief is kom van hier, so een nie, 726 00:31:31,140 --> 00:31:33,170 twee, drie, vier, vyf. 727 00:31:33,170 --> 00:31:34,680 En ek moet nou 40 van hierdie. 728 00:31:34,680 --> 00:31:37,540 So ek sal net doen dot, dot, dot te stel dat daar selfs meer geheue 729 00:31:37,540 --> 00:31:39,350 kom terug van die wal. 730 00:31:39,350 --> 00:31:40,710 Nou wat is die adres? 731 00:31:40,710 --> 00:31:42,620 Kom ons kies om ons arbitrêre spreek soos altyd - 732 00:31:42,620 --> 00:31:46,310 Ox123, selfs al is dit waarskynlik gaan om iets heeltemal anders. 733 00:31:46,310 --> 00:31:50,420 Dit is die adres van die eerste byte in geheue wat ek vra malloc vir. 734 00:31:50,420 --> 00:31:53,630 >> Dus, in kort, een keer line 20 voer, wat letterlik 735 00:31:53,630 --> 00:31:57,170 gestoor binnekant van x hier? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 En die bees is oninteressant. 739 00:32:01,550 --> 00:32:03,200 Dit beteken net hier is 'n heksadesimale getal. 740 00:32:03,200 --> 00:32:06,490 Maar wat is die belangrikste is dat wat ek store in x, wat is 'n plaaslike veranderlike. 741 00:32:06,490 --> 00:32:10,260 Maar sy data tipe, weer, is 'n adres van 'n int. 742 00:32:10,260 --> 00:32:12,710 Wel, ek gaan Ox123 te stoor. 743 00:32:12,710 --> 00:32:16,610 Maar weereens, as dit is 'n bietjie te ingewikkeld onnodig, as ek blaai 744 00:32:16,610 --> 00:32:21,490 terug, kan ons abstrakte hierdie weg baie redelik en net sê dat x 'n 745 00:32:21,490 --> 00:32:23,910 wyser na daardie deel van die geheue. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Nou is die vraag aan die hand is die volgende - 748 00:32:26,230 --> 00:32:29,910 lyn 21, dit blyk, is karretjie. 749 00:32:29,910 --> 00:32:31,160 Hoekom? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Jammer? 752 00:32:36,930 --> 00:32:38,640 Dit hoef nie - 753 00:32:38,640 --> 00:32:40,390 sê dat een keer meer. 754 00:32:40,390 --> 00:32:41,240 Wel, dit beteken nie vry nie. 755 00:32:41,240 --> 00:32:42,350 So dit is die tweede maar. 756 00:32:42,350 --> 00:32:45,000 So is daar 'n ander, maar spesifiek op lyn 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Presies. 759 00:32:50,040 --> 00:32:54,980 Hierdie eenvoudige reël van die kode is net 'n buffer oorloop, 'n Bufferschrijding. 760 00:32:54,980 --> 00:32:57,050 'N buffer beteken net 'n stuk van die geheue. 761 00:32:57,050 --> 00:33:01,520 Maar dit deel van die geheue van grootte 10, 10 heelgetalle, wat beteken dat as ons 762 00:33:01,520 --> 00:33:05,350 indeks in dit met behulp van die sintaktiese suiker van verskeidenheid notering, die vierkant 763 00:33:05,350 --> 00:33:09,220 tussen hakies, jy het toegang tot x bracket 0 x bracket 1 x, 764 00:33:09,220 --> 00:33:10,390 bracket dot, dot, dot. 765 00:33:10,390 --> 00:33:13,270 x bracket 9 is die grootste een. 766 00:33:13,270 --> 00:33:17,680 So as ek doen x bracket 10, waar Ek het eintlik gaan in die geheue? 767 00:33:17,680 --> 00:33:19,120 >> Wel, as ek het 10 int - 768 00:33:19,120 --> 00:33:21,070 Kom ons eintlik trek al van hierdie hier. 769 00:33:21,070 --> 00:33:22,700 So dit was die eerste vyf. 770 00:33:22,700 --> 00:33:24,660 Hier is die ander vyf ints. 771 00:33:24,660 --> 00:33:29,580 So x bracket 0 is hier. x bracket 1 is hier. x bracket 9 is hier. x bracket 772 00:33:29,580 --> 00:33:37,960 10 hier is, wat beteken dat ek sê, in lyn 21, die rekenaar om die te sit 773 00:33:37,960 --> 00:33:39,400 nommer waar? 774 00:33:39,400 --> 00:33:42,010 Die getal 0 waar? 775 00:33:42,010 --> 00:33:43,380 Wel, dit is 0, ja. 776 00:33:43,380 --> 00:33:45,460 Maar net die feit dat sy 0 is 'n soort van 'n toeval. 777 00:33:45,460 --> 00:33:47,140 Dit kan die nommer 50, vir al wat ons omgee. 778 00:33:47,140 --> 00:33:50,480 Maar ons probeer om dit te sit op x bracket 10, en dit is waar hierdie 779 00:33:50,480 --> 00:33:53,700 vraagteken getrek word, wat is nie 'n goeie ding. 780 00:33:53,700 --> 00:33:57,070 Hierdie program kan baie goed crash as 'n resultaat. 781 00:33:57,070 --> 00:33:59,400 >> Nou, laat ons gaan voort en sien of dit is inderdaad wat gebeur. 782 00:33:59,400 --> 00:34:02,600 Maak geheue, aangesien die lêer genoem memory.c. 783 00:34:02,600 --> 00:34:05,950 Kom ons gaan voort en hardloop die program geheue. 784 00:34:05,950 --> 00:34:08,239 So het ons gelukkig is, eintlik, dit lyk. 785 00:34:08,239 --> 00:34:09,340 Ons het gelukkig nie. 786 00:34:09,340 --> 00:34:11,060 Maar laat ons kyk of ons nou Valgrind hardloop. 787 00:34:11,060 --> 00:34:14,170 Met die eerste oogopslag, my program mag blyk te wees heeltemal korrek. 788 00:34:14,170 --> 00:34:18,010 Maar laat my hardloop Valgrind met die - Lek-tjek gelyk volle op geheue. 789 00:34:18,010 --> 00:34:20,110 >> En nou as ek loop hierdie - 790 00:34:20,110 --> 00:34:21,030 interessant. 791 00:34:21,030 --> 00:34:26,800 Ongeldig skryf van grootte 4 by lyn 21 van memory.c. 792 00:34:26,800 --> 00:34:29,284 Line 21 van memory.c is watter een? 793 00:34:29,284 --> 00:34:30,340 O, interessant. 794 00:34:30,340 --> 00:34:31,080 Maar wag. 795 00:34:31,080 --> 00:34:32,389 Grootte 4, wat is dit verwys na? 796 00:34:32,389 --> 00:34:34,969 Ek het een skryf, maar dit is van die grootte 4. 797 00:34:34,969 --> 00:34:36,889 Hoekom is dit 4? 798 00:34:36,889 --> 00:34:39,280 Dit is omdat dit is 'n int, wat is, weer, vier grepe. 799 00:34:39,280 --> 00:34:42,510 So Valgrind gevind 'n fout dat ek, skrams by my kode, gedoen het nie. 800 00:34:42,510 --> 00:34:45,040 En miskien is jou TF wil of nie. 801 00:34:45,040 --> 00:34:48,469 Wat egter Valgrind vir seker bevind dat ons het 'n fout gemaak is daar, selfs 802 00:34:48,469 --> 00:34:52,719 al het ons gelukkig is, en die rekenaar besluit, eh, ek gaan nie te crash 803 00:34:52,719 --> 00:34:57,470 net omdat jy aangeraak een greep, een int se waarde van die geheue wat jy nie gedoen het 804 00:34:57,470 --> 00:34:58,550 eintlik eie. 805 00:34:58,550 --> 00:35:00,380 >> Wel, wat anders is karretjie hier. 806 00:35:00,380 --> 00:35:01,180 Adres - 807 00:35:01,180 --> 00:35:03,190 dit is 'n gek na adres in heksadesimaal. 808 00:35:03,190 --> 00:35:06,890 Dit beteken net iewers in die hoop is nul grepe na 'n blok van grootte 40 809 00:35:06,890 --> 00:35:07,620 toegeken word. 810 00:35:07,620 --> 00:35:10,610 Laat my uitzoem hier en kyk of dit is 'n bietjie meer nuttig. 811 00:35:10,610 --> 00:35:11,410 Interessant. 812 00:35:11,410 --> 00:35:15,600 40 grepe is beslis verlore in verlies rekord 1 van 1. 813 00:35:15,600 --> 00:35:17,840 Weereens, meer as woorde is nuttig hier. 814 00:35:17,840 --> 00:35:21,350 Maar wat gebaseer is op die gemerkte lyne, waar ek moet waarskynlik fokus my 815 00:35:21,350 --> 00:35:24,070 aandag vir 'n ander fout? 816 00:35:24,070 --> 00:35:26,570 Lyk soos 'n lyn 20 van memory.c. 817 00:35:26,570 --> 00:35:30,990 >> So as ons gaan terug na lyn 20, dit is die een wat jy vroeër geïdentifiseer. 818 00:35:30,990 --> 00:35:33,030 En is dit nie noodwendig karretjie. 819 00:35:33,030 --> 00:35:35,160 Maar ons het hierdie omgekeer sy effekte. 820 00:35:35,160 --> 00:35:38,790 So hoe kan ek ten minste korrek een van daardie foute? 821 00:35:38,790 --> 00:35:42,240 Wat kan ek doen na reël 21? 822 00:35:42,240 --> 00:35:47,110 Ek kon doen nie vry van x, is so terug te gee dat die geheue. 823 00:35:47,110 --> 00:35:49,230 En hoe kan ek dit regmaak fout? 824 00:35:49,230 --> 00:35:52,120 Ek moet beslis gaan nie verder as 0. 825 00:35:52,120 --> 00:35:53,670 So laat ek probeer om weer uit te voer nie. 826 00:35:53,670 --> 00:35:56,080 Jammer, beslis gaan nie verder as 9. 827 00:35:56,080 --> 00:35:57,510 Maak geheue. 828 00:35:57,510 --> 00:36:00,650 Laat my tik Valgrind in 'n groter venster. 829 00:36:00,650 --> 00:36:01,580 En nou kyk. 830 00:36:01,580 --> 00:36:02,250 Nice. 831 00:36:02,250 --> 00:36:03,270 Alle hoop blokke vrygelaat is. 832 00:36:03,270 --> 00:36:04,270 Geen lekkasies is moontlik. 833 00:36:04,270 --> 00:36:07,520 En bo hier, is daar geen melding meer van die ongeldig reg. 834 00:36:07,520 --> 00:36:09,820 >> Net om te kry gulsig, en laat sien as nog 'n demonstrasie 835 00:36:09,820 --> 00:36:11,050 gaan nie soos dit bedoel - 836 00:36:11,050 --> 00:36:12,560 Ek het kry gelukkig 'n oomblik gelede. 837 00:36:12,560 --> 00:36:15,530 En die feit dat dit 0 is miskien onnodig misleidend. 838 00:36:15,530 --> 00:36:20,650 Laat ons net 50, 'n ietwat arbitrêre nommer, maak geheue dot streep geheue - 839 00:36:20,650 --> 00:36:21,410 kry nog steeds gelukkig. 840 00:36:21,410 --> 00:36:22,510 Niks is gekraak. 841 00:36:22,510 --> 00:36:26,150 Seker maar net iets doen regtig dwase, en ek doen 100. 842 00:36:26,150 --> 00:36:30,360 Laat my remake geheue, dot streep geheue - 843 00:36:30,360 --> 00:36:31,075 het gelukkig weer. 844 00:36:31,075 --> 00:36:32,800 Hoe oor 1000? 845 00:36:32,800 --> 00:36:35,370 ints verder, min of meer, waar ek moet wees? 846 00:36:35,370 --> 00:36:37,410 Maak geheue - 847 00:36:37,410 --> 00:36:38,570 damn dit. 848 00:36:38,570 --> 00:36:39,920 >> [Gelag] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Laat ons nie gemors rond nie. 851 00:36:43,920 --> 00:36:45,120 Tik geheue. 852 00:36:45,120 --> 00:36:45,840 Daar gaan ons. 853 00:36:45,840 --> 00:36:46,410 Alle regte. 854 00:36:46,410 --> 00:36:52,500 So glo jy indeks 100,000 ints buite waar jy moes gewees het in 855 00:36:52,500 --> 00:36:54,410 geheue, slegte dinge gebeur. 856 00:36:54,410 --> 00:36:56,430 So dit is natuurlik nie 'n harde, vinnige reël. 857 00:36:56,430 --> 00:36:58,190 Ek was soort van die gebruik van verhoor en fout om daar te kom. 858 00:36:58,190 --> 00:37:02,230 Maar dit is omdat, 'n lang storie kort te maak, jou rekenaar se geheue is ook verdeel 859 00:37:02,230 --> 00:37:03,580 in hierdie dinge genoem segmente. 860 00:37:03,580 --> 00:37:07,260 En soms, die rekenaar eintlik het jy 'n bietjie meer geheue 861 00:37:07,260 --> 00:37:08,400 as jy vra. 862 00:37:08,400 --> 00:37:12,170 Maar vir doeltreffendheid, dit is net makliker om te meer geheue, maar net vertel 863 00:37:12,170 --> 00:37:13,780 dat jy kry 'n gedeelte daarvan. 864 00:37:13,780 --> 00:37:16,370 >> En as jy gelukkig is soms, dus, kan jy in staat wees om aan te raak 865 00:37:16,370 --> 00:37:17,795 geheue wat nie aan jou behoort nie. 866 00:37:17,795 --> 00:37:21,860 Jy het geen waarborg dat die waarde wat jy sit daar sal daar bly, want 867 00:37:21,860 --> 00:37:25,080 die rekenaar dink nog steeds dit is nie joune is, maar dit is nie noodwendig gaan 868 00:37:25,080 --> 00:37:29,910 'n ander segment van die geheue te slaan in die rekenaar en veroorsaak 'n fout soos 869 00:37:29,910 --> 00:37:31,710 hierdie een hier. 870 00:37:31,710 --> 00:37:32,060 Alle regte. 871 00:37:32,060 --> 00:37:37,240 Enige vrae en dan op die geheue? 872 00:37:37,240 --> 00:37:37,590 >> Alle regte. 873 00:37:37,590 --> 00:37:40,610 Kom ons neem 'n blik hier, dan, op iets wat ons het is om vir 874 00:37:40,610 --> 00:37:48,361 toegestaan ​​vir 'n geruime tyd, wat is in hierdie lêer genaamd cs50.h. 875 00:37:48,361 --> 00:37:49,420 So, dit is 'n lêer. 876 00:37:49,420 --> 00:37:51,130 Dit is net 'n hele klomp van die kommentaar op top. 877 00:37:51,130 --> 00:37:53,900 En jy kan daar uitgesien het na hierdie as jy steek rond op die toestel. 878 00:37:53,900 --> 00:37:57,000 Maar dit blyk dat al die tyd, wanneer ons gebruik string te gebruik as 'n 879 00:37:57,000 --> 00:38:01,130 sinoniem, die manier waarop ons verklaar wat sinoniem is met hierdie 880 00:38:01,130 --> 00:38:03,990 navraag typedef, vir tipe definisie. 881 00:38:03,990 --> 00:38:07,500 En ons is in wese sê, maak string 'n sinoniem vir kar ster. 882 00:38:07,500 --> 00:38:11,190 Dat die wyse waarop die stapel geskep om hierdie opleiding wiele bekend as 883 00:38:11,190 --> 00:38:12,040 die string. 884 00:38:12,040 --> 00:38:14,830 >> Nou hier is net 'n prototipe vir getChar. 885 00:38:14,830 --> 00:38:17,350 Ons kan gesien het dit voor, maar dit is inderdaad wat dit doen. getChar 886 00:38:17,350 --> 00:38:19,070 neem geen argumente, gee 'n kar. 887 00:38:19,070 --> 00:38:21,340 getdouble neem geen argumente, gee 'n dubbel. 888 00:38:21,340 --> 00:38:24,440 getfloat neem geen argumente, opgawes 'n vlot, en so meer. 889 00:38:24,440 --> 00:38:27,270 getint is hier. getlonglong is in hier. 890 00:38:27,270 --> 00:38:28,820 En getstring is hier. 891 00:38:28,820 --> 00:38:29,420 En dit is dit. 892 00:38:29,420 --> 00:38:33,080 Dit pers lyn is 'n ander preprocessor richtlijn as gevolg van die 893 00:38:33,080 --> 00:38:35,550 hashtag aan die begin van dit. 894 00:38:35,550 --> 00:38:35,870 >> Alle regte. 895 00:38:35,870 --> 00:38:38,380 So nou laat my gaan in cs50.c. 896 00:38:38,380 --> 00:38:40,400 En ons sal nie te lank praat oor hierdie. 897 00:38:40,400 --> 00:38:43,280 Maar om te gee jou 'n kykie van wat is aan die gang al hierdie 898 00:38:43,280 --> 00:38:46,434 tyd, laat my gaan - 899 00:38:46,434 --> 00:38:48,250 Kom ons doen getChar. 900 00:38:48,250 --> 00:38:51,050 So getChar is meestal kommentaar. 901 00:38:51,050 --> 00:38:52,060 Maar dit lyk soos hierdie. 902 00:38:52,060 --> 00:38:54,800 So dit is die werklike funksie getChar dat ons het al 903 00:38:54,800 --> 00:38:56,055 neem as vanselfsprekend aanvaar nie bestaan ​​nie. 904 00:38:56,055 --> 00:38:59,370 En selfs al het ons nie gebruik het hierdie een wat dikwels, indien ooit, is dit ten minste 905 00:38:59,370 --> 00:39:00,470 relatief eenvoudig. 906 00:39:00,470 --> 00:39:02,580 So dit is die moeite werd om 'n vinnige blik op hier. 907 00:39:02,580 --> 00:39:06,540 >> So getChar het 'n oneindige lus, doelbewus so blykbaar. 908 00:39:06,540 --> 00:39:10,050 Dit roep dan - en dit is 'n soort van 'n mooi hergebruik van kode ons onsself geskryf het. 909 00:39:10,050 --> 00:39:11,220 Dit is dan getstring. 910 00:39:11,220 --> 00:39:12,460 Omdat wat dit doen nie beteken dat 'n kar te kry? 911 00:39:12,460 --> 00:39:14,730 Wel, kan net so goed jy probeer om 'n te kry hele lyn van teks van die gebruiker en 912 00:39:14,730 --> 00:39:16,940 dan net kyk na een van die karakters. 913 00:39:16,940 --> 00:39:19,170 In lyn 60, hier is 'n bietjie bietjie van 'n gesonde verstand tjek. 914 00:39:19,170 --> 00:39:21,610 As getstring teruggekeer null, laat ons nie voort te gaan. 915 00:39:21,610 --> 00:39:22,820 Iets wat verkeerd geloop het. 916 00:39:22,820 --> 00:39:28,120 >> En dit is 'n bietjie irriterend, maar konvensionele in C. kar Max waarskynlik 917 00:39:28,120 --> 00:39:29,960 verteenwoordig wat net gebaseer op sy naam? 918 00:39:29,960 --> 00:39:31,670 Dit is 'n konstante. 919 00:39:31,670 --> 00:39:36,040 Dit is soos die numeriese waarde van die grootste kar wat jy kan te stel met 920 00:39:36,040 --> 00:39:40,370 een byt, wat waarskynlik die aantal 255, wat is die grootste getal wat jy 921 00:39:40,370 --> 00:39:42,720 verteenwoordig agt stukkies, vanaf nul. 922 00:39:42,720 --> 00:39:47,460 Daarom het ek dit gebruik, in hierdie funksie, wanneer skryf van hierdie kode, net omdat 923 00:39:47,460 --> 00:39:51,753 as iets verkeerd gaan in getChar maar sy doel in die lewe is 'n terugkeer 924 00:39:51,753 --> 00:39:54,830 kar, moet jy een of ander manier in staat wees om om aan te dui aan die gebruiker wat 925 00:39:54,830 --> 00:39:55,840 iets wat verkeerd geloop het. 926 00:39:55,840 --> 00:39:56,970 Ons kan nie terugkeer null. 927 00:39:56,970 --> 00:39:58,480 Dit blyk dat die nul is 'n muis. 928 00:39:58,480 --> 00:40:01,030 En weer, getChar het 'n kar om terug te keer. 929 00:40:01,030 --> 00:40:04,760 >> So het die konvensie, as iets verkeerd is, is jou, die programmeerder, of in 930 00:40:04,760 --> 00:40:08,160 hierdie geval, my met die biblioteek, het ek 'n regverdige arbitrêr besluit, indien 931 00:40:08,160 --> 00:40:12,230 iets verkeerd gaan, gaan ek terug te keer die getal 255, wat is werklik 932 00:40:12,230 --> 00:40:17,240 beteken dat ons nie kan nie, die gebruiker kan tik nie die karakter verteenwoordig deur die 933 00:40:17,240 --> 00:40:21,410 getal 255 want ons het 'n steel dit as 'n sogenaamde brandwag waarde 934 00:40:21,410 --> 00:40:23,410 verteenwoordig 'n probleem. 935 00:40:23,410 --> 00:40:27,010 Nou blyk dit dat die karakter 255 is nie iets wat jy kan tik op 936 00:40:27,010 --> 00:40:28,380 u sleutelbord, so dit is nie 'n groot deal. 937 00:40:28,380 --> 00:40:30,910 Die gebruiker het nie kennis dat Ek het gesteel hierdie karakter. 938 00:40:30,910 --> 00:40:34,620 Maar as jy al ooit sien in man bladsye op 'n rekenaarstelsel n verwysing na 'n 939 00:40:34,620 --> 00:40:38,560 hoofletters konstant soos hierdie wat sê: in gevalle van dwaling hierdie konstante krag 940 00:40:38,560 --> 00:40:42,720 teruggestuur word, dit is al 'n paar mense gedoen het jaar gelede was arbitrêr besluit om te 941 00:40:42,720 --> 00:40:45,680 terugkeer hierdie spesiale waarde en noem dit 'n konstante in die geval 942 00:40:45,680 --> 00:40:46,840 iets verkeerd gaan. 943 00:40:46,840 --> 00:40:48,580 >> Nou is die magic gebeur hier. 944 00:40:48,580 --> 00:40:52,600 Eerstens, ek verklaar in lyn 67 twee karakters, C1 en C2. 945 00:40:52,600 --> 00:40:57,080 En dan in lyn 68, daar is eintlik 'n reël van die kode wat herinner aan 946 00:40:57,080 --> 00:41:01,140 ons vriend printf, gegee dat dit hoef persent Cs in aanhalingstekens. 947 00:41:01,140 --> 00:41:06,490 Maar let op wat hier gebeur. sscanf beteken string scan - 948 00:41:06,490 --> 00:41:11,690 beteken scan 'n formaat string, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Wat beteken dit? 950 00:41:12,590 --> 00:41:16,310 Dit beteken dat jy verby 'n string te sscanf. 951 00:41:16,310 --> 00:41:18,420 En die lyn is wat die gebruiker in 952 00:41:18,420 --> 00:41:23,520 Jy slaag in 'n formaat string soos om sscanf dit wat vertel Wikipediabespreking wat 953 00:41:23,520 --> 00:41:25,870 jy hoop om die gebruiker getik in 954 00:41:25,870 --> 00:41:29,730 Jy dan slaag-in die adresse van twee stukke van die geheue, in hierdie geval, 955 00:41:29,730 --> 00:41:31,150 want ek het twee plekhouers. 956 00:41:31,150 --> 00:41:34,610 So ek gaan om te gee dit die adres van C1 en die adres van C2. 957 00:41:34,610 --> 00:41:37,700 >> En onthou dat jy 'n funksie van die adres van sommige veranderlike, wat is 958 00:41:37,700 --> 00:41:38,950 Die implikasie? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Wat kan daardie funksie te doen as 'n gevolg gee dit die adres van 'n 961 00:41:45,050 --> 00:41:48,170 veranderlike, in teenstelling met die veranderlike self? 962 00:41:48,170 --> 00:41:49,450 Dit kan verander nie, reg? 963 00:41:49,450 --> 00:41:53,250 As jy het iemand 'n kaart na 'n fisiese adres, kan hulle daar te gaan en te doen 964 00:41:53,250 --> 00:41:54,750 wat hulle wil by daardie adres. 965 00:41:54,750 --> 00:41:55,800 Dieselfde idee hier. 966 00:41:55,800 --> 00:41:59,950 As ons slaag om sscanf, die adres van die twee stukke van die geheue, selfs hierdie klein 967 00:41:59,950 --> 00:42:03,585 bietjie stukke van die geheue, C1 en C2, maar ons vertel dit die adres van hulle, 968 00:42:03,585 --> 00:42:05,170 sscanf kan dit verander. 969 00:42:05,170 --> 00:42:08,530 >> So sscanf se doel in die lewe, as ons lees die man-bladsy is om te lees wat die 970 00:42:08,530 --> 00:42:13,420 gebruiker getik in, hoop vir die gebruiker met getik in 'n karakter en miskien 971 00:42:13,420 --> 00:42:16,470 'n ander karakter, en wat die gebruiker getik, die eerste karakter gaan 972 00:42:16,470 --> 00:42:19,310 Hier is die tweede karakter gaan hier. 973 00:42:19,310 --> 00:42:22,470 Nou, as 'n eenkant, dit, en jy sal weet net dit van die dokumentasie, 974 00:42:22,470 --> 00:42:25,570 die feit dat ek 'n leë ruimte is daar beteken net dat ek gee nie om as 975 00:42:25,570 --> 00:42:28,440 die gebruiker treffers van die spasie balk om 'n paar keer voor hy of sy neem 'n 976 00:42:28,440 --> 00:42:30,400 karakter, ek gaan om te ignoreer enige wit ruimte. 977 00:42:30,400 --> 00:42:32,510 Dus, ek weet uit die dokumentasie. 978 00:42:32,510 --> 00:42:36,570 >> Die feit dat daar 'n tweede% c gevolg deur wit spasie is eintlik 979 00:42:36,570 --> 00:42:37,410 doelbewuste. 980 00:42:37,410 --> 00:42:41,190 Ek wil in staat wees om op te spoor indien die gebruiker verfrommeld of nie saam te werk. 981 00:42:41,190 --> 00:42:45,630 So ek hoop dat die gebruiker getik in een karakter, dus ek hoop 982 00:42:45,630 --> 00:42:50,640 dat sscanf gaan net die terugkeer waarde 1, want, weer, as ek lees 983 00:42:50,640 --> 00:42:55,400 die dokumentasie, sscanf se doel die lewe is om terug te keer na die aantal 984 00:42:55,400 --> 00:42:59,170 veranderlikes wat gevul met toevoer van die gebruiker. 985 00:42:59,170 --> 00:43:02,270 >> Ek geslaag het in twee veranderlikes adresse, C1 en C2. 986 00:43:02,270 --> 00:43:06,420 Ek hoop egter dat slegs een van hulle kry vermoor, want as sscanf 987 00:43:06,420 --> 00:43:11,130 opbrengste 2, wat is vermoedelik Die implikasie logies? 988 00:43:11,130 --> 00:43:14,600 Dat die gebruiker het nie net gee my 'n karakter soos ek vir hom of haar. 989 00:43:14,600 --> 00:43:17,860 Hulle het waarskynlik getik minste twee karakters. 990 00:43:17,860 --> 00:43:22,430 So as ek plaas nie die tweede % C, ek het net een gehad het, wat 991 00:43:22,430 --> 00:43:25,370 eerlik sou wees meer intuïtief benadering, ek dink 'n eerste oogopslag, 992 00:43:25,370 --> 00:43:30,220 jy gaan nie in staat wees om op te spoor As die gebruiker is gee jou meer 993 00:43:30,220 --> 00:43:31,780 insette as wat jy eintlik wou hê. 994 00:43:31,780 --> 00:43:34,100 So, dit is 'n implisiete vorm foutkontroles. 995 00:43:34,100 --> 00:43:35,640 >> Maar let op wat ek hier doen. 996 00:43:35,640 --> 00:43:39,970 Sodra ek is seker dat die gebruiker het my een karakter, Ek bevry die lyn, doen 997 00:43:39,970 --> 00:43:44,450 die teenoorgestelde van getstring, wat op sy beurt gebruik malloc, en dan sal ek terugkeer 998 00:43:44,450 --> 00:43:51,030 C1, die karakter wat ek hoop die gebruiker verskaf en slegs verskaf. 999 00:43:51,030 --> 00:43:54,680 So 'n vinnige bijhorend alleen nie, maar enige vrae oor getChar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Ons sal terug te kom na 'n paar van die ander. 1002 00:43:59,590 --> 00:44:03,770 >> Wel, laat ek gaan voort en dit doen - veronderstel nou, net om te motiveer ons 1003 00:44:03,770 --> 00:44:08,910 bespreking in 'n week plus tyd, hierdie is 'n lêer genaamd structs.h. 1004 00:44:08,910 --> 00:44:11,440 En weereens, dit is net 'n voorsmakie van iets wat voorlê. 1005 00:44:11,440 --> 00:44:13,090 Maar let op dat 'n baie van hierdie is kommentaar. 1006 00:44:13,090 --> 00:44:17,440 So laat my beklemtoon slegs die interessante deel vir nou. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 daar is dat dieselfde navraag weer. 1009 00:44:19,700 --> 00:44:23,100 typedef ons gebruik string te verklaar as 'n spesiale data tipe. 1010 00:44:23,100 --> 00:44:27,490 Jy kan gebruik om typedef splinternuwe te skep data tipes wat nie bestaan ​​het toe 1011 00:44:27,490 --> 00:44:28,570 C is uitgevind. 1012 00:44:28,570 --> 00:44:32,520 Byvoorbeeld, int kom met C. kar kom met C. dubbel kom met C. Maar 1013 00:44:32,520 --> 00:44:34,000 daar is geen idee van 'n student. 1014 00:44:34,000 --> 00:44:37,230 En tog sou dit baie handig wees om te wees staat om 'n program wat winkels te skryf 1015 00:44:37,230 --> 00:44:40,440 in 'n veranderlike, 'n student se ID nommer, hul naam, en hul huis. 1016 00:44:40,440 --> 00:44:42,890 Met ander woorde, drie stukke van data, soos 'n int en 'n 1017 00:44:42,890 --> 00:44:44,420 string en 'n ander string. 1018 00:44:44,420 --> 00:44:48,220 >> Met typedef, wat is redelik kragtige oor hierdie en die navraag sturct vir 1019 00:44:48,220 --> 00:44:53,660 struktuur, julle, die programmeerder in 2013, eintlik kan definieer jou eie die 1020 00:44:53,660 --> 00:44:57,530 data tipes wat nie jaar bestaan gelede, maar wat pas by jou doeleindes. 1021 00:44:57,530 --> 00:45:01,910 En so hier, in reëls 13 tot 19, ons is waarby 'n nuwe tipe data, soos 1022 00:45:01,910 --> 00:45:04,320 'n int, maar noem dit student. 1023 00:45:04,320 --> 00:45:09,310 En binnekant van hierdie veranderlike gaan Drie is dit - 'n int, 'n string, 1024 00:45:09,310 --> 00:45:09,930 en 'n string. 1025 00:45:09,930 --> 00:45:13,040 So jy kan dink wat werklik hier gebeur het, selfs al is dit 'n 1026 00:45:13,040 --> 00:45:17,160 bietjie van 'n vereenvoudiging vir vandag, 'n student is in wese gaan 1027 00:45:17,160 --> 00:45:19,450 om te lyk soos hierdie. 1028 00:45:19,450 --> 00:45:22,580 Sy gaan 'n stuk van wees geheue met 'n ID, 'n naam 1029 00:45:22,580 --> 00:45:25,580 veld, en 'n huis gebied. 1030 00:45:25,580 --> 00:45:30,670 En ons sal in staat wees om die stukke te gebruik geheue en toegang tot hulle soos volg. 1031 00:45:30,670 --> 00:45:38,870 >> As ek gaan in struct0.c, hier is 'n relatief lank, maar ná 'n 1032 00:45:38,870 --> 00:45:42,630 patroon, van die kode wat gebruik hierdie nuwe truuk. 1033 00:45:42,630 --> 00:45:45,790 So, laat my trek jou aandag na die interessante dele tot bo-op. 1034 00:45:45,790 --> 00:45:49,670 Skerp definieer studente 3, verklaar 'n konstante genoem studente en ken 1035 00:45:49,670 --> 00:45:53,450 dit arbitrêr die nommer 3, net so ek het drie studente met 1036 00:45:53,450 --> 00:45:54,830 hierdie program vir nou. 1037 00:45:54,830 --> 00:45:55,960 Hier kom Main. 1038 00:45:55,960 --> 00:45:58,860 En kennis, hoe kan ek verklaar 'n verskeidenheid van studente? 1039 00:45:58,860 --> 00:46:00,480 Wel, ek het net gebruik dieselfde sintaks. 1040 00:46:00,480 --> 00:46:02,110 Die woord student is natuurlik 'n nuwe. 1041 00:46:02,110 --> 00:46:04,790 Maar student, klas, bracket studente. 1042 00:46:04,790 --> 00:46:06,720 >> So ongelukkig is daar is 'n baie van hergebruik van terme hier. 1043 00:46:06,720 --> 00:46:07,660 Dit is net 'n nommer. 1044 00:46:07,660 --> 00:46:09,040 So dit is soos om te sê drie. 1045 00:46:09,040 --> 00:46:11,430 Klas is net wat ek wil die veranderlike te bel. 1046 00:46:11,430 --> 00:46:12,840 Ek kon dit noem studente. 1047 00:46:12,840 --> 00:46:15,880 Maar klas, is dit nie 'n klas in 'n objekgeoriënteerde Java soort manier. 1048 00:46:15,880 --> 00:46:17,220 Dit is net 'n klas van studente. 1049 00:46:17,220 --> 00:46:20,590 En die data tipe van elke element in die skikking is student. 1050 00:46:20,590 --> 00:46:23,040 So, dit is 'n bietjie anders en uit om iets te sê 1051 00:46:23,040 --> 00:46:25,250 soos hierdie, dit is net - 1052 00:46:25,250 --> 00:46:29,500 Ek sê gee my drie studente en noem dat die verskeidenheid klas. 1053 00:46:29,500 --> 00:46:29,800 >> Alle regte. 1054 00:46:29,800 --> 00:46:30,680 Nou hier is 'n vier-lus. 1055 00:46:30,680 --> 00:46:33,480 Hierdie man se bekende - iteraat van nul op tot drie. 1056 00:46:33,480 --> 00:46:35,160 En hier is die nuwe stuk van sintaksis. 1057 00:46:35,160 --> 00:46:37,710 Die program gaan my gevra, die mens, om te gee dit 'n student 1058 00:46:37,710 --> 00:46:39,200 ID, wat 'n int. 1059 00:46:39,200 --> 00:46:44,650 En hier is die sintaksis wat jy kan stoor iets in die ID-veld by 1060 00:46:44,650 --> 00:46:48,630 plek klas bracket I. So hierdie kode is nie nuut nie. 1061 00:46:48,630 --> 00:46:51,450 Dit beteken net gee my die agtste student in die klas. 1062 00:46:51,450 --> 00:46:52,940 Maar dit is 'n nuwe simbool. 1063 00:46:52,940 --> 00:46:56,320 Tot nou toe het ons kan nie gebruik dot, ten minste in die kode soos hierdie. 1064 00:46:56,320 --> 00:47:01,490 Dit beteken gaan na die struct bekend as 'n student en sit iets daar. 1065 00:47:01,490 --> 00:47:05,670 Net so, in die volgende lyn, 31, gaan voort te sit en wat die gebruiker tik 1066 00:47:05,670 --> 00:47:10,530 vir 'n naam hier en wat hulle doen vir 'n huis, dieselfde ding, gaan voort en 1067 00:47:10,530 --> 00:47:13,230 sit dit in. huis. 1068 00:47:13,230 --> 00:47:15,955 >> So, wat beteken hierdie program uiteindelik doen? 1069 00:47:15,955 --> 00:47:17,220 Jy kan sien 'n bietjie teaser daar. 1070 00:47:17,220 --> 00:47:24,780 Laat my gaan voort en maak nie structs 0 dot streep struct 0, student se ID 1, 1071 00:47:24,780 --> 00:47:28,250 sê David Mather, student ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 en die enigste ding wat hierdie program het, Dit is net heeltemal arbitrêre, is 1075 00:47:38,380 --> 00:47:40,980 Ek wou iets te doen met die data, nou dat ek het geleer hoe om te 1076 00:47:40,980 --> 00:47:43,450 gebruik structs, is ek moes net Hierdie ekstra lus hier. 1077 00:47:43,450 --> 00:47:45,260 Ek Itereer oor die skikking van die studente. 1078 00:47:45,260 --> 00:47:49,170 Ek gebruik word om ons, miskien nou reeds bekende vriend, string vergelyk, stircomp te 1079 00:47:49,170 --> 00:47:53,780 tjek is 8 student se huis gelyk aan Mather? 1080 00:47:53,780 --> 00:47:56,760 En indien wel, net druk iets arbitrêr hou, ja, dit is nie. 1081 00:47:56,760 --> 00:47:59,430 Maar weereens, net gee my geleenthede te gebruik en hergebruik en 1082 00:47:59,430 --> 00:48:02,270 onthou hierdie nuwe dot notasie. 1083 00:48:02,270 --> 00:48:03,250 >> So wat omgee, reg? 1084 00:48:03,250 --> 00:48:06,270 Kom met 'n student program is ietwat arbitrêr nie, maar dit blyk uit 1085 00:48:06,270 --> 00:48:09,800 wat ons kan doen nuttige dinge met hierdie, byvoorbeeld soos volg. 1086 00:48:09,800 --> 00:48:14,600 Dit is 'n baie meer ingewikkeld struct in C. Dit het 'n dosyn of meer velde, 1087 00:48:14,600 --> 00:48:15,880 ietwat kripties vernoem. 1088 00:48:15,880 --> 00:48:20,110 Maar as jy al ooit gehoor van 'n grafiese lêer formaat genoem bitmap, BMP, is dit 1089 00:48:20,110 --> 00:48:22,830 blyk dat die bitmap lêer formaat mooi lyk baie soos dat hierdie. 1090 00:48:22,830 --> 00:48:24,200 Dit is 'n dom bietjie Smiley gesig. 1091 00:48:24,200 --> 00:48:27,840 Dit is 'n klein beeld wat ek het ingezoomd op redelik groot, sodat ek kon sien elke 1092 00:48:27,840 --> 00:48:30,410 van die individuele kolle of pixels. 1093 00:48:30,410 --> 00:48:33,800 Nou, dit blyk ons ​​kan verteenwoordig 'n swart dot met, sê, die nommer 0. 1094 00:48:33,800 --> 00:48:35,520 En 'n wit kol met die nommer 1. 1095 00:48:35,520 --> 00:48:39,140 >> So met ander woorde, as jy wil 'n te trek Smiley gesig en red die beeld in 'n 1096 00:48:39,140 --> 00:48:42,680 rekenaar, is dit voldoende om nulle te slaan en Diegene wat lyk soos hierdie, waar, 1097 00:48:42,680 --> 00:48:45,250 weer, dié is wit en nulle is swart. 1098 00:48:45,250 --> 00:48:48,290 En saam, as jy effektief 'n gord van ene en nulle, jy het 'n 1099 00:48:48,290 --> 00:48:51,030 rooster van pixels, en as jy gaan lê hulle uit, jy het 'n oulike 1100 00:48:51,030 --> 00:48:52,560 bietjie Smiley gesig. 1101 00:48:52,560 --> 00:48:58,150 Nou, bitmap lêer formaat, BMP, is effektief dat onder die enjinkap, 1102 00:48:58,150 --> 00:49:00,970 maar met meer pixels skielik dat jy kan eintlik verteenwoordig kleure. 1103 00:49:00,970 --> 00:49:05,170 >> Maar wanneer jy meer gesofistikeerde lêer formate soos BMP en JPEG en GIF 1104 00:49:05,170 --> 00:49:09,360 waarmee jy dalk vertroud wees, diegene lêers op die skyf tipies nie net 1105 00:49:09,360 --> 00:49:13,760 het nulle en ene vir die pixels, maar hulle het 'n paar metadata so goed - 1106 00:49:13,760 --> 00:49:16,960 meta in die sin dat dit nie regtig data, maar dit is handig te hê. 1107 00:49:16,960 --> 00:49:21,370 So hierdie velde hier impliseer, en ons sal sien dit in meer detail in P-set 1108 00:49:21,370 --> 00:49:25,810 5, wat voor die nulle en kinders wat verteenwoordig die pixels in 'n beeld, 1109 00:49:25,810 --> 00:49:29,110 daar is 'n klomp van die metadata soos die grootte van die beeld en die 1110 00:49:29,110 --> 00:49:30,250 breedte van die beeld. 1111 00:49:30,250 --> 00:49:32,910 En sien ek pluk af 'n paar arbitrêre dinge hier - 1112 00:49:32,910 --> 00:49:34,260 breedte en hoogte. 1113 00:49:34,260 --> 00:49:36,160 Bietjie tel en 'n paar ander dinge. 1114 00:49:36,160 --> 00:49:37,840 So daar is 'n paar metadata in 'n lêer. 1115 00:49:37,840 --> 00:49:41,470 >> Maar deur te verstaan ​​hoe lêers word gelê op hierdie manier, kan jy eintlik 1116 00:49:41,470 --> 00:49:45,890 dan manipuleer beelde, herstel beelde van die skyf, die grootte van beelde. 1117 00:49:45,890 --> 00:49:47,560 Maar jy kan nie noodwendig versterk hulle. 1118 00:49:47,560 --> 00:49:48,480 Ek nodig het 'n foto. 1119 00:49:48,480 --> 00:49:52,840 So het ek terug na RJ hier, wat jy gesien het, op die skerm 'n geruime tyd gelede. 1120 00:49:52,840 --> 00:49:57,160 En as ek oopmaak Keynote hier, is dit wat gebeur as jy probeer om te vergroot en 1121 00:49:57,160 --> 00:49:59,380 verbeter RJ. 1122 00:49:59,380 --> 00:50:01,480 Hy is nie om 'n beter regtig. 1123 00:50:01,480 --> 00:50:06,240 Nou Keynote is 'n soort van vervaag dit 'n bietjie, net om te glans oor die 1124 00:50:06,240 --> 00:50:11,040 feit dat RJ nie veral kry verbeterde wanneer jy zoom in 1125 00:50:11,040 --> 00:50:13,310 En as dit op hierdie manier, sien die blokkies? 1126 00:50:13,310 --> 00:50:15,490 Ja, jy kan beslis sien die vierkante op 'n projektor. 1127 00:50:15,490 --> 00:50:17,690 >> Dit is wat jy kry wanneer jy verbeter. 1128 00:50:17,690 --> 00:50:22,570 Maar in die begrip van hoe ons RJ of die Smiley gesig is geïmplementeer sal laat ons 1129 00:50:22,570 --> 00:50:24,950 eintlik skryf kode wat manipuleer hierdie dinge. 1130 00:50:24,950 --> 00:50:29,970 En ek het gedink ek wil eindig op hierdie noot, met 55 sekondes van 'n verhoog wat is, 1131 00:50:29,970 --> 00:50:31,230 Ek waag, sê eerder misleidend. 1132 00:50:31,230 --> 00:50:32,990 >> [Video speel] 1133 00:50:32,990 --> 00:50:34,790 >> -Hy lieg. 1134 00:50:34,790 --> 00:50:38,310 Oor wat, ek weet nie. 1135 00:50:38,310 --> 00:50:41,200 >> -So, wat weet ons? 1136 00:50:41,200 --> 00:50:45,280 >> -Dit op 09:15 Ray Santoya was by die OTM. 1137 00:50:45,280 --> 00:50:47,830 >> -So die vraag is wat Hy is besig om 09:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Skiet van die nege millimeter na iets. 1139 00:50:50,750 --> 00:50:52,615 Miskien het hy gesien hoe die sniper. 1140 00:50:52,615 --> 00:50:54,760 >> -Of was saam met hom. 1141 00:50:54,760 --> 00:50:56,120 >> -Wag nie. 1142 00:50:56,120 --> 00:50:57,450 Gaan terug een. 1143 00:50:57,450 --> 00:50:58,700 >> -Wat sien jy? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> Bring-sy gesig, vol skerm. 1146 00:51:09,490 --> 00:51:09,790 >> -Sy bril. 1147 00:51:09,790 --> 00:51:11,040 >> -Daar is 'n weerspieëling. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Dit is die Neuvitas bofbal span. 1150 00:51:23,520 --> 00:51:24,530 Dit is hul logo. 1151 00:51:24,530 --> 00:51:27,040 >> -En hy praat met elkeen se dra dat die baadjie. 1152 00:51:27,040 --> 00:51:27,530 >> [Einde video-vertoning] 1153 00:51:27,530 --> 00:51:29,180 >> David J. MALAN: Dit sal wees Probleem Stel 5. 1154 00:51:29,180 --> 00:51:30,720 Ons sal jou volgende week sien. 1155 00:51:30,720 --> 00:51:32,330 >> Man Spreker: By die volgende CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [KRIEKE tjirp] 1157 00:51:39,240 --> 00:51:41,270 >> [Speel van musiek]