1 00:00:00,000 --> 00:00:01,110 >> [Muziek] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J. MALAN: Oke. 4 00:00:11,650 --> 00:00:15,610 Dit is CS50, en dit het einde van week vier. 5 00:00:15,610 --> 00:00:19,420 En een van de onderwerpen van vandaag is dat van digitale recherche, 6 00:00:19,420 --> 00:00:20,989 de kunst van het herstellen van gegevens. 7 00:00:20,989 --> 00:00:22,780 Inderdaad, hoewel je bent in het midden 8 00:00:22,780 --> 00:00:25,070 op dit moment van de Vrede bij Drie en Breakout, volgende week, 9 00:00:25,070 --> 00:00:27,880 de nadruk zal liggen op Juist dit domein. 10 00:00:27,880 --> 00:00:30,686 >> Dus een van de coolste banen die ik ooit hadden was terug in de graduate school, 11 00:00:30,686 --> 00:00:33,560 toen ik werkte voor de lokale Middlesex County District Attorney's 12 00:00:33,560 --> 00:00:34,950 kantoor, het doen van forensisch werk. 13 00:00:34,950 --> 00:00:37,450 Dus in wezen, het Massachusetts State Police, bij gelegenheid, 14 00:00:37,450 --> 00:00:40,100 bij het werken aan de gevallen zou brengen in dingen als harde schijven 15 00:00:40,100 --> 00:00:42,185 en diskettes en geheugenkaarten en dergelijke. 16 00:00:42,185 --> 00:00:44,060 En ze zouden hen overhandigen voor mij en mijn mentor, 17 00:00:44,060 --> 00:00:48,070 en ons doel was om bewijs te vinden, of er een, op deze media. 18 00:00:48,070 --> 00:00:50,700 Nu, zou je gezien hebben glimpen van deze wereld van forensisch onderzoek 19 00:00:50,700 --> 00:00:53,000 in de media, televisie en films. 20 00:00:53,000 --> 00:00:55,730 Maar de baan die ik had, en durf te stellen dat de wereld, 21 00:00:55,730 --> 00:00:57,550 is niet helemaal zoals je het zou zien. 22 00:00:57,550 --> 00:01:00,794 Laten we eens kijken naar wat je waarschijnlijk hebt gezien. 23 00:01:00,794 --> 00:01:01,460 [VIDEO AFSPELEN] 24 00:01:01,460 --> 00:01:02,930 -OK. 25 00:01:02,930 --> 00:01:05,380 Nu, laten we eens goed naar je. 26 00:01:05,380 --> 00:01:06,850 >> [Muziek] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> Wacht even het. 29 00:01:12,932 --> 00:01:13,657 Lopen dat terug. 30 00:01:13,657 --> 00:01:14,733 >> Wacht even. 31 00:01:14,733 --> 00:01:15,233 Ga naar rechts. 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -Er. 34 00:01:16,870 --> 00:01:17,369 Bevriezen dat. 35 00:01:17,369 --> 00:01:17,930 -Full-Scherm. 36 00:01:17,930 --> 00:01:18,376 >> -OK. 37 00:01:18,376 --> 00:01:18,875 Bevriezen dat. 38 00:01:18,875 --> 00:01:20,160 -Tighten Op dat, wil je? 39 00:01:20,160 --> 00:01:22,126 >> -vector In op die man door het achterwiel. 40 00:01:22,126 --> 00:01:24,435 >> -ZOOM In hier op deze plek. 41 00:01:24,435 --> 00:01:28,580 >> -Met De juiste apparatuur, het afbeelding kan worden vergroot en verscherpt. 42 00:01:28,580 --> 00:01:29,330 >> Wat is dat? 43 00:01:29,330 --> 00:01:30,780 >> -Het is een verbetering programma. 44 00:01:30,780 --> 00:01:32,170 >> Kun je duidelijk dat je geen? 45 00:01:32,170 --> 00:01:33,070 >> Ik weet het niet. 46 00:01:33,070 --> 00:01:34,150 Laten we verbeteren het. 47 00:01:34,150 --> 00:01:35,440 >> -Verbeter Sectie A6. 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 Ik verbeterde het detail, en-- 50 00:01:38,562 --> 00:01:40,020 Ik denk dat er genoeg te verbeteren. 51 00:01:40,020 --> 00:01:40,976 Los om mijn scherm. 52 00:01:40,976 --> 00:01:42,559 >> Ik verbeterde de bezinning in haar ogen. 53 00:01:42,559 --> 00:01:44,322 -Laten Deze lopen door video enhancement. 54 00:01:44,322 --> 00:01:45,210 >> -Edgar, Kunt u dit verbeteren? 55 00:01:45,210 --> 00:01:45,710 >> -Hang Op. 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -Ik Gewerkt aan deze reflectie. 58 00:01:49,458 --> 00:01:50,402 >> Reflectie -Er's van iemand. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 -Er is een weerspiegeling van de man gezicht. 61 00:01:52,870 --> 00:01:53,694 >> -het Reflectie! 62 00:01:53,694 --> 00:01:54,610 -Er is een reflectie. 63 00:01:54,610 --> 00:01:55,880 -ZOOM In op de spiegel. 64 00:01:55,880 --> 00:01:57,860 U kunt een reflectie zien. 65 00:01:57,860 --> 00:01:59,630 >> Kun je het beeld te verbeteren van hier? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Kun je het te verbeteren? 68 00:02:01,210 --> 00:02:02,190 Kun je het te verbeteren? 69 00:02:02,190 --> 00:02:03,066 Kunnen we dit verbeteren? 70 00:02:03,066 --> 00:02:03,898 Kun je het te verbeteren? 71 00:02:03,898 --> 00:02:04,740 Wacht even op een tweede. 72 00:02:04,740 --> 00:02:05,281 Ik zal verbeteren. 73 00:02:05,281 --> 00:02:06,470 -ZOOM In de deur. 74 00:02:06,470 --> 00:02:06,970 -maal 10. 75 00:02:06,970 --> 00:02:08,009 -zoom. 76 00:02:08,009 --> 00:02:08,509 -Verplaatsen In. 77 00:02:08,509 --> 00:02:09,340 -Meer. 78 00:02:09,340 --> 00:02:10,094 Wacht, stop. 79 00:02:10,094 --> 00:02:10,750 -stop. 80 00:02:10,750 --> 00:02:11,250 -PAUSE Het. 81 00:02:11,250 --> 00:02:13,542 -Draai Ons 75 graden rond de verticale, alstublieft. 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -stop. 84 00:02:16,127 --> 00:02:19,330 Ga terug naar de kant de deur weer. 85 00:02:19,330 --> 00:02:21,420 >> Hebbes een beeld enhancer die kan bitmap? 86 00:02:21,420 --> 00:02:24,420 >> Misschien hebben we de Pradeep Singh kan gebruiken Werkwijze om in de ramen. 87 00:02:24,420 --> 00:02:25,902 >> -De Software is state of the art. 88 00:02:25,902 --> 00:02:26,866 >> -De Eigenwaarde is uitgeschakeld. 89 00:02:26,866 --> 00:02:29,758 >> -Met De juiste combinatie van algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Hij is genomen verlichting algoritmen naar het volgende niveau, 91 00:02:32,168 --> 00:02:34,110 en ik kan ze gebruiken om versterken deze foto. 92 00:02:34,110 --> 00:02:36,840 >> Lock op en vergroten de z-as. 93 00:02:36,840 --> 00:02:37,351 >> -Verbeter. 94 00:02:37,351 --> 00:02:37,850 Verbeteren. 95 00:02:37,850 --> 00:02:38,720 -Verbeter. 96 00:02:38,720 --> 00:02:40,070 -Freeze En verbeteren. 97 00:02:40,070 --> 00:02:43,420 [END VIDEO AFSPELEN] 98 00:02:43,420 --> 00:02:45,830 DAVID J. MALAN: Dus dat zijn alle woorden, maar ze waren niet 99 00:02:45,830 --> 00:02:47,870 toegepast in zinnen correct. 100 00:02:47,870 --> 00:02:52,370 En inderdaad in de toekomst op elk ogenblik alsjeblieft, hoor je iemand zeggen dat het woord, 101 00:02:52,370 --> 00:02:54,250 "Verbeteren", grinniken maar een klein beetje. 102 00:02:54,250 --> 00:02:57,190 Want als je probeert te verbeteren, Zo, dit is wat er gebeurt. 103 00:02:57,190 --> 00:02:58,580 >> Dus hier is een prachtige foto. 104 00:02:58,580 --> 00:02:59,720 Dit is eigen Daven CS50's. 105 00:02:59,720 --> 00:03:03,740 En stel dat we wilden focussen op de twinkeling in zijn ogen, 106 00:03:03,740 --> 00:03:05,870 of de reflectie van de slechte kerel die duidelijk was 107 00:03:05,870 --> 00:03:07,820 gevangen door de bewakingscamera. 108 00:03:07,820 --> 00:03:10,330 Dit is wat er gebeurt als je inzoomen op een beeld dat 109 00:03:10,330 --> 00:03:14,060 slechts een eindig aantal bits verbonden. 110 00:03:14,060 --> 00:03:15,420 >> Dat is wat je zou krijgen. 111 00:03:15,420 --> 00:03:19,190 En inderdaad, in het oog van Daven's is maar vier, misschien zes pixels 112 00:03:19,190 --> 00:03:22,110 dat componeren precies wat werd er glimmende. 113 00:03:22,110 --> 00:03:25,890 Dus Probleemverzameling Vier zal uiteindelijk u deze wereld te verkennen, met name 114 00:03:25,890 --> 00:03:28,090 door de aard van iets wij noemen file i / o, waar 115 00:03:28,090 --> 00:03:31,000 i / o is gewoon een mooie manier om zeggen input en output. 116 00:03:31,000 --> 00:03:34,280 >> Tot nu toe zijn alle interacties we met een computer hebt gehad 117 00:03:34,280 --> 00:03:36,770 grotendeels lid van de toetsenbord en het scherm, 118 00:03:36,770 --> 00:03:40,770 maar niet zo veel met de harde schijf, of opslaan van bestanden buiten de degene die je 119 00:03:40,770 --> 00:03:41,620 zelf schrijven. 120 00:03:41,620 --> 00:03:44,570 Uw programma's tot nu toe hebben niet is het creëren en opslaan, 121 00:03:44,570 --> 00:03:46,270 en updaten van hun eigen bestanden. 122 00:03:46,270 --> 00:03:47,150 >> Nou, wat is een bestand? 123 00:03:47,150 --> 00:03:48,105 Nou, zoiets als een JPEG. 124 00:03:48,105 --> 00:03:50,520 Dit is een afbeelding die je misschien hebben of uploaden naar Facebook, 125 00:03:50,520 --> 00:03:51,690 of zie overal op het web. 126 00:03:51,690 --> 00:03:54,460 Inderdaad, die foto hebben we net zaag van Daven was een JPEG. 127 00:03:54,460 --> 00:03:57,570 En wat interessant over bestanden als JPEG 128 00:03:57,570 --> 00:04:02,170 is dat zij kunnen worden geïdentificeerd typisch, door bepaalde bitpatronen. 129 00:04:02,170 --> 00:04:05,200 >> Met andere woorden, wat is het dat onderscheidt een JPEG van een GIF 130 00:04:05,200 --> 00:04:08,109 van een PING uit een Word- document uit een Excel-bestand? 131 00:04:08,109 --> 00:04:09,900 Nou, het is gewoon anders bitpatronen. 132 00:04:09,900 --> 00:04:12,820 En die verschillende patronen zijn meestal aan het begin van deze bestanden. 133 00:04:12,820 --> 00:04:18,200 >> Zodat wanneer uw computer opent een Word doc, of wanneer een computer opent een JPEG, 134 00:04:18,200 --> 00:04:20,940 lijkt typisch bij de eerste paar bits in het bestand. 135 00:04:20,940 --> 00:04:24,059 En als het herkent een patroon, het zegt, oh, dit is een beeld. 136 00:04:24,059 --> 00:04:25,850 Laat me weer aan de gebruiker als grafisch. 137 00:04:25,850 --> 00:04:27,870 Of, oh, dit ziet eruit als een Word-doc. 138 00:04:27,870 --> 00:04:30,480 Laat me laten zien aan de gebruiker als een essay. 139 00:04:30,480 --> 00:04:33,020 >> Dus bijvoorbeeld, JPEG, het blijkt, zijn 140 00:04:33,020 --> 00:04:35,460 vrij gesofisticeerde onder de motorkap. 141 00:04:35,460 --> 00:04:40,140 Maar de eerste drie bytes elkste JPEG u volgende drie cijfers. 142 00:04:40,140 --> 00:04:44,680 Dus byte nul, een, en twee, in de meeste elke JPEG, 255, dan is het aantal 143 00:04:44,680 --> 00:04:46,675 216, dan is het nummer 255. 144 00:04:46,675 --> 00:04:48,990 >> En wat je zult in staat zijn te gaan doen volgende week 145 00:04:48,990 --> 00:04:52,920 is eigenlijk eronder porren de motorkap van bestanden zoals JPEG 146 00:04:52,920 --> 00:04:57,210 en als bitmap-bestanden, en het zien van wat is er altijd voor zo lang 147 00:04:57,210 --> 00:04:58,650 als je met behulp van een computer geweest. 148 00:04:58,650 --> 00:05:01,860 >> Maar wat is er meestal niet geschreven als decimale getallen als deze. 149 00:05:01,860 --> 00:05:04,620 Informatici niet hebben de neiging in decimalen te spreken. 150 00:05:04,620 --> 00:05:06,139 Ze niet echt in binaire spreken. 151 00:05:06,139 --> 00:05:07,930 Typisch, als we willen om cijfers uit te drukken, 152 00:05:07,930 --> 00:05:10,710 we eigenlijk gebruiken hexadecimale, die u zich wellicht herinnert 153 00:05:10,710 --> 00:05:13,027 van, zeg, Probleemverzameling Een, die uitgedaagd 154 00:05:13,027 --> 00:05:14,610 u na te denken over een ander systeem. 155 00:05:14,610 --> 00:05:17,170 >> We natuurlijk vertrouwd met decimaal, nul tot negen. 156 00:05:17,170 --> 00:05:18,215 We spraken over binary. 157 00:05:18,215 --> 00:05:20,710 En we hebben niet echt veel here gebruiken 158 00:05:20,710 --> 00:05:22,470 op uit, want computers zullen gebruiken. 159 00:05:22,470 --> 00:05:24,900 Maar programmeurs zal zeer Vaak, maar niet altijd, 160 00:05:24,900 --> 00:05:29,360 Gebruik hexadecimaal, wat betekent gewoon je hebt 16 letters in je alfabet, 161 00:05:29,360 --> 00:05:31,330 in plaats van twee of 10. 162 00:05:31,330 --> 00:05:34,530 >> Dus hoe kan je tellen tot hogere dan negen in hexadecimale? 163 00:05:34,530 --> 00:05:41,120 Ga 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, alleen volgens afspraak. 164 00:05:41,120 --> 00:05:43,540 Maar wat is belangrijk is dat elke Deze is een symbool. 165 00:05:43,540 --> 00:05:44,340 Er is geen 10. 166 00:05:44,340 --> 00:05:48,400 Er is geen 11, per se, omdat elke van uw cijfers, net als in decimale 167 00:05:48,400 --> 00:05:51,940 en net als in binaire, moet gewoon zijn een enkel teken, volgens afspraak. 168 00:05:51,940 --> 00:05:55,280 >> Dat is dan het alfabet we tot onze beschikking voor hexadecimaal. 169 00:05:55,280 --> 00:05:58,600 Dus wat doet een JPEG eruit als je waren uit te schrijven die eerste drie 170 00:05:58,600 --> 00:06:01,980 bytes niet als decimale maar bijvoorbeeld hexadecimaal? 171 00:06:01,980 --> 00:06:03,640 En waarom is hex al wat nuttig? 172 00:06:03,640 --> 00:06:05,290 >> Nou ja, een snelle blik op een voorbeeld. 173 00:06:05,290 --> 00:06:09,030 Dus als ik schrijf uit de bits die vertegenwoordigen deze decimaal numbers-- 174 00:06:09,030 --> 00:06:12,450 Dit is misschien een beetje roestig zijn nu van een paar weken terug, 175 00:06:12,450 --> 00:06:14,820 maar de linker en juiste zijn vrij gemakkelijk. 176 00:06:14,820 --> 00:06:17,990 255 was het grootste aantal dat we kunnen vertegenwoordigen met acht bits. 177 00:06:17,990 --> 00:06:18,820 Het was allemaal enen. 178 00:06:18,820 --> 00:06:21,320 Dus het enige dat is mild Interessanter is de middelste. 179 00:06:21,320 --> 00:06:24,700 En als je soort te doen uit de wiskunde, zal je afleiden dat, inderdaad, 180 00:06:24,700 --> 00:06:27,949 dat patroon van een en nullen vertegenwoordigt 216. 181 00:06:27,949 --> 00:06:30,240 Dus laten we gewoon bepalen voor nu dat deze correct zijn. 182 00:06:30,240 --> 00:06:31,730 Maar waarom is dit interessant? 183 00:06:31,730 --> 00:06:33,970 >> Welnu, een byte, uiteraard is acht bits. 184 00:06:33,970 --> 00:06:38,980 En het blijkt dat als je denkt een byte twee stukjes vier bits, 185 00:06:38,980 --> 00:06:39,500 als deze. 186 00:06:39,500 --> 00:06:41,000 Laat me even wat ruimte toe te voegen. 187 00:06:41,000 --> 00:06:42,550 Dus voordat na. 188 00:06:42,550 --> 00:06:46,520 Ik heb net wat witte ruimte toegevoegd omwille hier visualisatie's. 189 00:06:46,520 --> 00:06:51,840 Hoe kunnen wij nu vertegenwoordigen, zeg, hexadecimale elke quad bits, 190 00:06:51,840 --> 00:06:52,880 elk stel van vier bits? 191 00:06:52,880 --> 00:06:56,420 >> Dus bijvoorbeeld links nu hebben we 1111 in binaire. 192 00:06:56,420 --> 00:07:00,420 Wat is dat nummer in decimale, als je uit de wiskunde? 193 00:07:00,420 --> 00:07:03,780 Je hebt degenen die plek, de tweeën plaats, de fours plaats, en de achten plaats. 194 00:07:03,780 --> 00:07:04,341 >> Publiek: 15. 195 00:07:04,341 --> 00:07:05,340 DAVID J. MALAN: Het is 15. 196 00:07:05,340 --> 00:07:08,340 Dus als we acht plus vier plus twee plus een, krijgen we 15. 197 00:07:08,340 --> 00:07:11,790 Dus ik kon beneden schrijven 15 1111, maar het hele punt here 198 00:07:11,790 --> 00:07:13,190 is hexadecimaal, niet decimaal. 199 00:07:13,190 --> 00:07:17,310 Dus in plaats van naar beneden te schrijven 15, 1-5, Ik ga om te schrijven dat in hex, 200 00:07:17,310 --> 00:07:22,311 die, als je terugdenkt, als je nul tot en met f, wat 15 gaat worden? 201 00:07:22,311 --> 00:07:22,810 PUBLIEK: f. 202 00:07:22,810 --> 00:07:24,434 DAVID J. MALAN: Zo blijkt uit het is f. 203 00:07:24,434 --> 00:07:29,140 En je kunt werken dat uit door te zeggen, goed, als er een is 10, dan OK, f 15. 204 00:07:29,140 --> 00:07:33,250 Dus inderdaad, we kunnen herschrijven dezelfde reeks nummers f f. 205 00:07:33,250 --> 00:07:35,750 En dan, als we een beetje van wiskunde, we afleiden dat dat d. 206 00:07:35,750 --> 00:07:38,650 Acht is vrij eenvoudig, omdat we een een op de achten plaats. 207 00:07:38,650 --> 00:07:40,620 En dan hebben we nog een paar f f's. 208 00:07:40,620 --> 00:07:44,669 >> Dus wat mensen hebben de neiging om te doen volgens afspraak wanneer zij gebruik maken van hexadecimale is ze gewoon 209 00:07:44,669 --> 00:07:47,710 schrijf dit een beetje kort en bondig, zich te ontdoen van de meeste van die witte ruimte. 210 00:07:47,710 --> 00:07:50,890 En alleen maar om super duidelijk te zijn lezers dat dit hexadecimale, 211 00:07:50,890 --> 00:07:54,670 de eenvoudige conventie onder mensen wordt je schrijft nul 212 00:07:54,670 --> 00:07:58,000 x, die geen andere betekenis heeft dan een visuele identificatie van, 213 00:07:58,000 --> 00:07:59,590 hier komt een hexadecimaal getal. 214 00:07:59,590 --> 00:08:04,210 >> En dan zet je de twee cijfers, f f in dit geval, dan d een, dan is f f. 215 00:08:04,210 --> 00:08:06,700 Zo lang verhaal kort, hexadecimale gewoon de neiging 216 00:08:06,700 --> 00:08:11,990 nuttig zijn omdat elk van de cijfers, nul tot en met f, perfect lijnen 217 00:08:11,990 --> 00:08:13,880 met een patroon van vier bits. 218 00:08:13,880 --> 00:08:18,080 >> Dus als je twee hexadecimale cijfers, nul tot en met F, opnieuw en opnieuw, 219 00:08:18,080 --> 00:08:20,256 dat geeft je perfect acht bits of een byte. 220 00:08:20,256 --> 00:08:22,380 Dus dat is de reden waarom het de neiging om zijn gewoonlijk nuttig. 221 00:08:22,380 --> 00:08:24,990 Er is geen intellectuele inhoud echt verder dan dat, 222 00:08:24,990 --> 00:08:27,010 andere dan de werkelijke nut. 223 00:08:27,010 --> 00:08:29,310 >> Nu JPEG's zijn niet de enige bestandsformaten voor afbeeldingen. 224 00:08:29,310 --> 00:08:33,230 U herinnert zich nog wel dat er bestanden als dit in de wereld, 225 00:08:33,230 --> 00:08:34,830 althans van een paar jaar terug. 226 00:08:34,830 --> 00:08:37,580 >> Dus dit was eigenlijk in Windows XP geïnstalleerd 227 00:08:37,580 --> 00:08:39,960 op miljoenen pc's over de hele wereld. 228 00:08:39,960 --> 00:08:43,000 En dit was een bitmap-bestand, BMP. 229 00:08:43,000 --> 00:08:47,690 En een bitmap-bestand, zoals u zult zien krijgen week, betekent gewoon een patroon van punten, 230 00:08:47,690 --> 00:08:51,710 pixels als ze worden opgeroepen, een kaart op beetjes, echt. 231 00:08:51,710 --> 00:08:55,160 >> Dus wat is interessant, hoewel, over dit bestandsformaat, BMP, is 232 00:08:55,160 --> 00:08:58,590 dat onder de motorkap, het meer dan drie bytes 233 00:08:58,590 --> 00:09:01,020 die samen de header, dus te spreken, de eerste paar happen. 234 00:09:01,020 --> 00:09:03,330 Het ziet er eigenlijk een beetje ingewikkeld op het eerste gezicht. 235 00:09:03,330 --> 00:09:04,704 En je zult dit zien in de P set. 236 00:09:04,704 --> 00:09:06,810 En het krijgen van iets bijzondere van deze nu 237 00:09:06,810 --> 00:09:10,720 is niet zo belangrijk, omdat alleen het feit dat aan het begin van elk bitmap 238 00:09:10,720 --> 00:09:13,823 bestand, een grafisch formaat, er is een hele hoop nummers. 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> Nu Microsoft, de auteur van dit formaat, 241 00:09:16,720 --> 00:09:18,820 neigt deze bellen dingen niet ints en chars 242 00:09:18,820 --> 00:09:22,259 en praalwagens maar woorden en d woorden en verlangt en bytes. 243 00:09:22,259 --> 00:09:23,800 Dus ze zijn gewoon verschillende soorten data. 244 00:09:23,800 --> 00:09:25,170 Ze zijn verschillende namen voor hetzelfde ding. 245 00:09:25,170 --> 00:09:26,740 Maar je zult zien dat er in P Set Four. 246 00:09:26,740 --> 00:09:31,450 >> Maar dit is slechts zeggen dat als een menselijke dubbelklikt op een aantal BMP-bestand op zijn 247 00:09:31,450 --> 00:09:35,015 of haar harde schijf, en een venster opent up hem of haar dat beeld blijkt, 248 00:09:35,015 --> 00:09:38,500 dat gebeurde omdat de operationele systeem waarschijnlijk gemerkt niet alleen 249 00:09:38,500 --> 00:09:41,460 het BMP-bestand extensie in de bestandsnaam, 250 00:09:41,460 --> 00:09:45,010 maar ook het feit dat er een aantal conventie om het patroon van stukjes 251 00:09:45,010 --> 00:09:47,490 aan het begin van die bitmap-bestand. 252 00:09:47,490 --> 00:09:50,270 >> Maar laten we nu focussen op zo'n ingewikkeld bestand, 253 00:09:50,270 --> 00:09:52,120 maar in plaats daarvan op iets als dit. 254 00:09:52,120 --> 00:09:55,190 Stel hier in GEdit, I alleen maar het begin 255 00:09:55,190 --> 00:09:57,070 van een programma dat is vrij simpel. 256 00:09:57,070 --> 00:09:58,860 Ik heb een aantal omvat boven. 257 00:09:58,860 --> 00:10:02,120 Nu heb ik # include "structs.h", maar Ik ga terug naar die komen in een moment. 258 00:10:02,120 --> 00:10:03,974 Maar dit is handig voor nu. 259 00:10:03,974 --> 00:10:05,890 Dit is een programma dat gaat implementeren 260 00:10:05,890 --> 00:10:07,335 zoals de database van de registrar. 261 00:10:07,335 --> 00:10:09,710 Dus een database van studenten, en elke student in de wereld 262 00:10:09,710 --> 00:10:13,190 heeft een naam en een huis en waarschijnlijk ook enkele andere dingen, maar we zullen het simpel houden. 263 00:10:13,190 --> 00:10:15,140 Iedere student heeft een naam en een huis. 264 00:10:15,140 --> 00:10:17,700 >> Dus als ik wilde een schrijven programma waarvan het doel in het leven 265 00:10:17,700 --> 00:10:19,860 was gewoon te herhalen uit nul op maximaal drie, 266 00:10:19,860 --> 00:10:22,070 als er drie studenten aan de Harvard University. 267 00:10:22,070 --> 00:10:25,350 En ik wil gewoon te krijgen, met behulp van GetString, naam van elke student en huis, 268 00:10:25,350 --> 00:10:26,600 en dan gewoon af te drukken die uit. 269 00:10:26,600 --> 00:10:28,630 >> Dit is een soort als Week One, Week Twee dingen nu, 270 00:10:28,630 --> 00:10:30,810 waar ik wil gewoon een voor lus of iets dergelijks. 271 00:10:30,810 --> 00:10:34,500 En ik wil GetString een paar noemen keer, en vervolgens afdrukken f een paar keer. 272 00:10:34,500 --> 00:10:37,340 Dus hoe zou ik dit doen, hoewel, wanneer zowel een naam en een huis 273 00:10:37,340 --> 00:10:39,070 betrokken zijn voor elke leerling? 274 00:10:39,070 --> 00:10:42,830 >> Dus mijn eerste instinct zou zijn om zoiets te doen. 275 00:10:42,830 --> 00:10:49,620 Ik zou eerst zeggen, nou, geef me, zeggen, een array van strings uitgescholden. 276 00:10:49,620 --> 00:10:51,530 En ik wil niet dat een hardcode drie hier. 277 00:10:51,530 --> 00:10:53,064 Wat wil ik daar te zetten? 278 00:10:53,064 --> 00:10:55,730 Zodat studenten, want dat is gewoon een constante aangegeven bovenaan, 279 00:10:55,730 --> 00:10:57,860 zodat ik niet hoeft te hardcoden drie op meerdere plaatsen. 280 00:10:57,860 --> 00:11:00,859 Op deze manier kan ik het veranderen een plaats, en dat een wijziging van invloed overal. 281 00:11:00,859 --> 00:11:04,470 En dan zou ik doen reeks studenten gehuisvest. 282 00:11:04,470 --> 00:11:10,250 >> En nu, ik zou zoiets doen for (int i = 0; i 00:11:14,390 Dus ik typ snel, maar dit is waarschijnlijk bekend syntax nu. 284 00:11:14,390 --> 00:11:17,030 >> En nu, dit was meer recente. 285 00:11:17,030 --> 00:11:22,890 Als ik zoek in de ie gezet naam van de student, ik denk dat ik dit doe. 286 00:11:22,890 --> 00:11:26,480 En dan, geen namen maar huizen beugel i. 287 00:11:26,480 --> 00:11:29,930 Ik doe dit, GetString, en laat me terug te gaan en bevestig deze lijn. 288 00:11:29,930 --> 00:11:30,430 Eens? 289 00:11:30,430 --> 00:11:31,200 Oneens? 290 00:11:31,200 --> 00:11:32,366 Het is niet erg gebruiksvriendelijk. 291 00:11:32,366 --> 00:11:33,890 Ik heb niet de gebruiker wat te doen horen. 292 00:11:33,890 --> 00:11:36,520 >> Maar nu, als ik ook wilde later, laten we 293 00:11:36,520 --> 00:11:40,060 zeg, printen deze dingen out-- dus TODO later. 294 00:11:40,060 --> 00:11:42,330 Ik ga verder met doen dit-- dit misschien wel wil 295 00:11:42,330 --> 00:11:45,970 een correcte uitvoering van de het krijgen van namen en huizen, drie 296 00:11:45,970 --> 00:11:48,870 daarvan totaal van elk van een gebruiker. 297 00:11:48,870 --> 00:11:51,280 >> Maar dit is niet erg goed ontwerp, toch? 298 00:11:51,280 --> 00:11:55,220 Wat als een student heeft niet alleen een naam en een huis, maar ook een ID-nummer, 299 00:11:55,220 --> 00:11:57,770 en een telefoonnummer, en een e-mailadres, 300 00:11:57,770 --> 00:12:00,280 en misschien een home page, en misschien een Twitter handvat, 301 00:12:00,280 --> 00:12:03,730 en een willekeurig aantal andere details gekoppeld aan een student of een persoon, 302 00:12:03,730 --> 00:12:04,610 meer in het algemeen. 303 00:12:04,610 --> 00:12:07,720 Hoe zouden we beginnen te voegen functionaliteit om dit programma? 304 00:12:07,720 --> 00:12:14,080 >> Nou, ik voel me als de eenvoudigste manier zou zijn om zoiets te doen, laten we zeggen, 305 00:12:14,080 --> 00:12:16,490 int ids STUDENTEN. 306 00:12:16,490 --> 00:12:18,380 Dus ik kan al hun ID's daar te zetten. 307 00:12:18,380 --> 00:12:22,240 En dan, iets zoals telefoonnummers, 308 00:12:22,240 --> 00:12:24,400 Ik ben niet zeker hoe om te vertegenwoordigen dat gewoon nog niet. 309 00:12:24,400 --> 00:12:30,280 Dus laten we verder gaan en gewoon bellen Dit twittert STUDENTEN, die 310 00:12:30,280 --> 00:12:33,550 is een beetje vreemd, maar-- en een hoop meer velden. 311 00:12:33,550 --> 00:12:36,360 >> Ik ben begonnen om effectief kopiëren en plakken hier. 312 00:12:36,360 --> 00:12:39,416 En dit gaat behoorlijk groeien vrij snel logge, toch? 313 00:12:39,416 --> 00:12:42,290 Zou het niet mooi zijn als er bekend in de wereld een datastructuur 314 00:12:42,290 --> 00:12:45,600 niet als een int of een string, maar iets hoger, een abstractie, zodat 315 00:12:45,600 --> 00:12:47,570 te spreken, die bekend staat als een student? 316 00:12:47,570 --> 00:12:50,220 C kwam niet met ingebouwde functionaliteit voor studenten, 317 00:12:50,220 --> 00:12:52,260 maar wat als ik wilde het zo geven? 318 00:12:52,260 --> 00:12:55,640 >> Nou, het blijkt, ik ga het openen van een bestand structs.h hier genoemd, 319 00:12:55,640 --> 00:12:57,090 en kunt u precies dat doen. 320 00:12:57,090 --> 00:12:58,290 En we gaan beginnen dit nu te doen. 321 00:12:58,290 --> 00:13:01,490 En onder de motorkap van P Set Drie, heb je al dit nu doet. 322 00:13:01,490 --> 00:13:05,920 Er is niet zoiets als een g rect of een g ovale in de programmeertaal C. 323 00:13:05,920 --> 00:13:10,570 >> Mensen van Stanford geïmplementeerd die typen gegevens door het gebruik van deze aanpak hier, 324 00:13:10,570 --> 00:13:13,900 verklaren hun eigen nieuwe data typen met behulp van een nieuw zoekwoord 325 00:13:13,900 --> 00:13:16,744 genoemd struct en andere een zogenaamde typedef. 326 00:13:16,744 --> 00:13:19,660 Inderdaad, hoewel de syntax ziet er een beetje anders uit stuff 327 00:13:19,660 --> 00:13:23,550 we al eerder gezien, in principe, het is super simpel. 328 00:13:23,550 --> 00:13:25,297 >> Dit betekent gewoon "gedefinieerd type. ' 329 00:13:25,297 --> 00:13:27,255 Dat gaat om een ​​te zijn structuur en een structuur 330 00:13:27,255 --> 00:13:29,400 is net als een container voor meerdere zaken. 331 00:13:29,400 --> 00:13:31,780 En die structuur gaat naar een string genaamd naam hebben, 332 00:13:31,780 --> 00:13:33,210 en een string genaamd huis. 333 00:13:33,210 --> 00:13:37,520 En laten we zeggen, gewoon voor het gemak, dit hele datastructuur student. 334 00:13:37,520 --> 00:13:40,320 >> Dus het moment dat je naar de puntkomma, je hebt nu 335 00:13:40,320 --> 00:13:43,280 gemaakt van uw eigen gegevens soort genaamd student 336 00:13:43,280 --> 00:13:46,420 dat nu staat naast int, en vlotter, en char, en touw, 337 00:13:46,420 --> 00:13:50,270 en G rect en G ovaal en een afmeting van andere dingen die mensen hebben uitgevonden. 338 00:13:50,270 --> 00:13:53,340 >> Dus wat is handig over dit nu is dat als ik terug te gaan 339 00:13:53,340 --> 00:13:57,430 naar struct 0 en eindigen deze implementatie, die ik schreef 340 00:13:57,430 --> 00:14:02,080 op voorhand hier, merken dat alle van de onvermijdelijke rommeligheid dat 341 00:14:02,080 --> 00:14:05,490 stond op het punt om te beginnen gebeurt als ik toegevoegd telefoonnummers en twittert en alle 342 00:14:05,490 --> 00:14:07,370 die andere dingen te een student's definitie, 343 00:14:07,370 --> 00:14:11,810 nu is het bondig verpakt als slechts een scala aan studenten. 344 00:14:11,810 --> 00:14:15,500 >> En elk van die studenten nu heeft meerdere dingen erin. 345 00:14:15,500 --> 00:14:16,930 Dus dat laat alleen een vraag. 346 00:14:16,930 --> 00:14:19,700 Hoe krijg je op de naam, en het huis, en de ID, 347 00:14:19,700 --> 00:14:21,640 en wat anders is binnenkant van de student? 348 00:14:21,640 --> 00:14:22,930 Super simpel, als goed. 349 00:14:22,930 --> 00:14:25,730 Nieuwe syntaxis, maar een simpel idee. 350 00:14:25,730 --> 00:14:29,239 >> Je gewoon index in de array, zoals wij deden vorige week en deze. 351 00:14:29,239 --> 00:14:31,030 En wat is duidelijk de nieuw stuk van syntax? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 Gewoon., Wat betekent "naar binnen gaan van de structuur en krijgt het gebied genaamd 354 00:14:35,880 --> 00:14:39,030 naam, krijgt het veld met de naam huis, krijgen het veld genaamd student. " 355 00:14:39,030 --> 00:14:41,940 >> Dus in P Set Drie, als je nog mee bezig, 356 00:14:41,940 --> 00:14:44,020 en de meeste mensen nog steeds worden, beseffen dat als je 357 00:14:44,020 --> 00:14:46,130 beginnen met dingen als g rects en g ovalen 358 00:14:46,130 --> 00:14:50,201 en andere dingen die niet lijken te komen uit Week nul, een, of twee, 359 00:14:50,201 --> 00:14:52,950 beseffen dat dat komt omdat Stanford een aantal nieuwe typen data verklaard. 360 00:14:52,950 --> 00:14:56,160 >> En inderdaad, dat is precies wat we zullen doen, maar ook, in P Set Vier, wanneer 361 00:14:56,160 --> 00:14:59,880 we beginnen om te gaan met dingen zoals afbeeldingen, bitmaps, en nog veel meer. 362 00:14:59,880 --> 00:15:02,882 Dus dat is gewoon een teaser en een mentaal model voor wat er komen gaat. 363 00:15:02,882 --> 00:15:04,590 Nu, ik procrastinated een beetje vanmorgen. 364 00:15:04,590 --> 00:15:09,560 Ik was nogal nieuwsgierig om te zien wat Microsoft behang eigenlijk 365 00:15:09,560 --> 00:15:10,310 ziet eruit als vandaag. 366 00:15:10,310 --> 00:15:15,200 En het blijkt dat iemand in 2006 eigenlijk ging om bijna precies 367 00:15:15,200 --> 00:15:19,210 dezelfde plek te fotograferen in werkelijkheid wat lijkt op dat deze dagen. 368 00:15:19,210 --> 00:15:21,380 Het veld is nu een beetje overwoekerd. 369 00:15:21,380 --> 00:15:24,850 >> Dus nu spreken van beelden, laten we terug te brengen Daven hier 370 00:15:24,850 --> 00:15:26,890 op het scherm en Nicholas, en gewoon herinneren 371 00:15:26,890 --> 00:15:30,540 dat als je wilt om met ons mee voor de lunch deze vrijdag, ga dan naar onze gebruikelijke URL 372 00:15:30,540 --> 00:15:31,440 hier. 373 00:15:31,440 --> 00:15:33,530 >> Dus waar hebben we laten staan ​​op maandag? 374 00:15:33,530 --> 00:15:35,140 Introduceerden we dit probleem, toch? 375 00:15:35,140 --> 00:15:37,610 Dit was schijnbaar een correct uitvoering van de swap, 376 00:15:37,610 --> 00:15:40,460 waarbij u het nemen van twee integers, een met de naam van een, een zogenaamde b, 377 00:15:40,460 --> 00:15:44,130 ze te verwisselen, net als Laura deed hier op het podium met de melk en het water, 378 00:15:44,130 --> 00:15:46,820 door een tijdelijke variabele, of een lege beker, 379 00:15:46,820 --> 00:15:50,540 zodat we in een b en een in kon zetten b zonder het maken van een puinhoop van dingen. 380 00:15:50,540 --> 00:15:51,560 We gebruikten een variabele. 381 00:15:51,560 --> 00:15:52,870 Het heet temp. 382 00:15:52,870 --> 00:15:55,520 >> Maar wat was het fundamentele probleem met deze code op maandag? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 Wat was het probleem hier? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 Yeah. 387 00:16:00,605 --> 00:16:01,970 >> Publiek: Het neemt meer ruimte in beslag. 388 00:16:01,970 --> 00:16:04,719 >> DAVID J. MALAN: neemt meer ruimte, want ik ben met behulp van een variabele, 389 00:16:04,719 --> 00:16:05,400 en dat is OK. 390 00:16:05,400 --> 00:16:07,300 Dat is waar, maar ik ben gaan om te zeggen dat is OK. 391 00:16:07,300 --> 00:16:10,030 Het is slechts 32 bits in het grand regeling van de dingen, dus geen big deal. 392 00:16:10,030 --> 00:16:10,655 Andere gedachten? 393 00:16:10,655 --> 00:16:12,572 Publiek: Het wisselt alleen de variabelen lokaal. 394 00:16:12,572 --> 00:16:13,571 DAVID J. MALAN: Precies. 395 00:16:13,571 --> 00:16:15,090 Het wisselt alleen de variabelen lokaal. 396 00:16:15,090 --> 00:16:18,173 Omdat elke keer dat je belt een function-- toen ik de trays uit Annenberg 397 00:16:18,173 --> 00:16:19,840 laatste keer, je hebt de belangrijkste op de bodem. 398 00:16:19,840 --> 00:16:23,560 Zodra u een functie genaamd noemen swap, swap niet x en y te krijgen, 399 00:16:23,560 --> 00:16:24,400 de oorspronkelijke waarden. 400 00:16:24,400 --> 00:16:26,392 Wat doet swap get, hebben we beweren? 401 00:16:26,392 --> 00:16:27,100 PUBLIEK: Exemplaren. 402 00:16:27,100 --> 00:16:28,090 DAVID J. MALAN: Dus kopieën van hen. 403 00:16:28,090 --> 00:16:31,120 Dus het wordt een en twee, als je herinneren aan het voorbeeld van de vorige keer, 404 00:16:31,120 --> 00:16:34,730 maar een kopie van een en twee die met succes zijn verwisseld. 405 00:16:34,730 --> 00:16:38,550 Maar helaas op het einde, deze waarden zijn nog steeds hetzelfde. 406 00:16:38,550 --> 00:16:41,880 Dus we kunnen zien met onze nieuwe vriend, hopelijk GDB, 407 00:16:41,880 --> 00:16:45,180 dat u of de TF's en Ca's hebben is je begeleiden in de richting van het volgende. 408 00:16:45,180 --> 00:16:51,210 >> Dus geen swap recall lijkt like-- laten openstellen dit-- ziet er als volgt. 409 00:16:51,210 --> 00:16:54,160 We geïnitialiseerd x om een, y tot twee. 410 00:16:54,160 --> 00:16:55,620 Had een hoop druk f's. 411 00:16:55,620 --> 00:16:58,080 Maar dan, de belangrijkste oproep hier was om te wisselen, wat 412 00:16:58,080 --> 00:17:00,260 is precies de code we zag net een moment geleden. 413 00:17:00,260 --> 00:17:03,180 Dat is juist op het eerste gezicht, maar functioneel, 414 00:17:03,180 --> 00:17:06,800 Dit programma werkt niet, omdat het maakt niet permanent x en y wisselen. 415 00:17:06,800 --> 00:17:10,190 >> Dus laten we dit zien, snel warm hier met GDB, een ./noswap. 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 Een bos van de overweldigende informatie die Ik zal ontdoen van met Control L te krijgen voor nu. 418 00:17:15,200 --> 00:17:17,516 En nu, ik ga ga je gang en voer het uit. 419 00:17:17,516 --> 00:17:19,349 En helaas, dat was niet bruikbaar. 420 00:17:19,349 --> 00:17:22,355 Het liep het programma binnenkant van deze programma genaamd GDB, een debugger, 421 00:17:22,355 --> 00:17:23,730 maar het liet me niet rond te snuffelen. 422 00:17:23,730 --> 00:17:26,229 >> Dus hoe kan ik eigenlijk pauzeren uitvoering binnen dit programma? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 Dus breken. 425 00:17:28,329 --> 00:17:32,340 En ik kon breken op elke regelnummer, een, 10, 15. 426 00:17:32,340 --> 00:17:35,530 Maar ik kan ook symbolisch breken door te zeggen pauze belangrijkste. 427 00:17:35,530 --> 00:17:38,980 En dat gaat om een ​​pauze te stellen punt, blijkbaar op lijn 16 in de belangrijkste. 428 00:17:38,980 --> 00:17:40,050 En waar is lijn 16? 429 00:17:40,050 --> 00:17:42,960 Laten we gaan naar de code en gaan tot noswap. 430 00:17:42,960 --> 00:17:46,930 En inderdaad, de stippellijn 16 is de allereerste in het programma. 431 00:17:46,930 --> 00:17:52,130 >> Dus nu, als ik ga je gang en het type lopen deze keer, Enter, het gepauzeerd. 432 00:17:52,130 --> 00:17:53,080 Dus laten we eens rond te snuffelen. 433 00:17:53,080 --> 00:17:55,716 Print x-- waarom is x nul? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 En negeren de dollar teken. 436 00:17:57,830 --> 00:17:59,725 Dat is alleen voor liefhebber gebruik van het programma. 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 Waarom is x nul op dit moment? 439 00:18:03,140 --> 00:18:03,640 Yeah. 440 00:18:03,640 --> 00:18:07,061 >> Publiek: Het onderbroken vlak voor regel 16, niet echt op lijn 16. 441 00:18:07,061 --> 00:18:08,060 DAVID J. MALAN: Precies. 442 00:18:08,060 --> 00:18:11,630 GDB, standaard, heeft onderbroken uitvoering net voor lijn 16. 443 00:18:11,630 --> 00:18:14,820 Dus het is niet uitgevoerd, wat betekent x is van een onbekende waarde. 444 00:18:14,820 --> 00:18:17,150 En we hadden geluk dat het iets schoon als nul. 445 00:18:17,150 --> 00:18:20,310 Dus nu als ik typ volgende, nu is uitgevoerd 16. 446 00:18:20,310 --> 00:18:22,000 Het is me te wachten om uit te voeren 17. 447 00:18:22,000 --> 00:18:23,400 Laat me gaan en druk op x. 448 00:18:23,400 --> 00:18:24,094 Het is een. 449 00:18:24,094 --> 00:18:25,260 Laat me gaan en druk y. 450 00:18:25,260 --> 00:18:26,176 Wat moet ik nu? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> PUBLIEK: [onverstaanbaar] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J. MALAN: Een beetje luider. 454 00:18:29,165 --> 00:18:30,040 >> PUBLIEK: [onverstaanbaar] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J. MALAN: Niet helemaal een consensus. 457 00:18:32,120 --> 00:18:34,760 Dus ja, we zien een aantal vuilnis waarde. 458 00:18:34,760 --> 00:18:37,862 Nu, y 134514064 er. 459 00:18:37,862 --> 00:18:39,320 Nou, het is gewoon een garbage waarde. 460 00:18:39,320 --> 00:18:41,350 Mijn programma gebruikt RAM voor verschillende doeleinden. 461 00:18:41,350 --> 00:18:42,350 Er zijn andere functies. 462 00:18:42,350 --> 00:18:44,040 Andere mensen schreef in mijn computer. 463 00:18:44,040 --> 00:18:46,789 Dus die stukken zijn gebruikt voor andere waarden, en wat ik zie 464 00:18:46,789 --> 00:18:49,470 de resten van sommige eerder gebruik van dat geheugen. 465 00:18:49,470 --> 00:18:53,350 >> Dus geen big deal, want zodra als ik typ volgende en vervolgens afdrukken y, 466 00:18:53,350 --> 00:18:55,640 het is geïnitialiseerd op de waarde die ik wil. 467 00:18:55,640 --> 00:18:57,400 Dus nu, laten we verder gaan een beetje sneller. 468 00:18:57,400 --> 00:18:58,540 N voor de volgende. 469 00:18:58,540 --> 00:18:59,570 Laten we het nog eens doen. 470 00:18:59,570 --> 00:19:00,530 Laten we het nog eens doen. 471 00:19:00,530 --> 00:19:02,404 Maar ik wil niet te raken het hier, want als ik 472 00:19:02,404 --> 00:19:05,110 willen zien wat er gaande is binnen swap, wat is de opdracht? 473 00:19:05,110 --> 00:19:05,520 >> PUBLIEK: stappen. 474 00:19:05,520 --> 00:19:06,436 >> DAVID J. MALAN: stappen. 475 00:19:06,436 --> 00:19:09,800 Dus deze stappen me in een functie, in plaats van erover. 476 00:19:09,800 --> 00:19:12,270 En nu, het is een beetje cryptisch eerlijk gezegd, maar dit is gewoon 477 00:19:12,270 --> 00:19:14,581 vertelde me dat ik in lijn 33 nu. 478 00:19:14,581 --> 00:19:15,580 En laten we dit opnieuw doen. 479 00:19:15,580 --> 00:19:16,080 Print temp. 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 Garbage waarde, negatief deze keer, maar dat is gewoon nog steeds een vuilnisbak waarde. 482 00:19:20,170 --> 00:19:22,810 Dus laten we nu doen, printen temp. 483 00:19:22,810 --> 00:19:27,130 Het geïnitialiseerd op 1, waarbij was de waarde van x, aka een. 484 00:19:27,130 --> 00:19:29,110 >> Nu, waar zijn onze a en x uit? 485 00:19:29,110 --> 00:19:32,510 Nou, bericht in de belangrijkste, we noemde deze waarden x en y. 486 00:19:32,510 --> 00:19:34,740 We vervolgens ze te wisselen volgende. 487 00:19:34,740 --> 00:19:37,010 X kwam eerst, komma y. 488 00:19:37,010 --> 00:19:40,020 En dan, swap kon noemen x en y. 489 00:19:40,020 --> 00:19:42,630 Maar voor de duidelijkheid, het is noemde hen a en b. 490 00:19:42,630 --> 00:19:45,970 Maar a en b zijn nu gaat worden afschriften van respectievelijk x en y. 491 00:19:45,970 --> 00:19:50,660 >> Dus als ik ga terug naar GDB, temp is nu een en is nu een. 492 00:19:50,660 --> 00:19:56,130 Maar als ik nu doen en nu doen afdrukken a, een al verplaatst. 493 00:19:56,130 --> 00:20:00,030 De melk is in de voormalige gegoten glas sinaasappelsap is, of vice versa. 494 00:20:00,030 --> 00:20:04,750 >> En als ik volgende keer doen, en nu als ik uitprinten als een sanity check, 495 00:20:04,750 --> 00:20:07,687 Een nog twee, maar b is nu een. 496 00:20:07,687 --> 00:20:08,770 Eerlijk gezegd, het is er nog steeds. 497 00:20:08,770 --> 00:20:10,670 Kan me niet schelen wat temp is. 498 00:20:10,670 --> 00:20:16,850 Maar zodra ik nu typ, laten we zeggen, blijven teruggaan, nu ben ik aan het einde 499 00:20:16,850 --> 00:20:17,480 het programma. 500 00:20:17,480 --> 00:20:20,730 En helaas, x is nog een en y nog twee. 501 00:20:20,730 --> 00:20:22,272 >> Dus wat was het nut van GDB er? 502 00:20:22,272 --> 00:20:23,980 Het hielp niet me te repareren het probleem per se, 503 00:20:23,980 --> 00:20:26,265 maar hopelijk help me begrijpen door het realiseren van 504 00:20:26,265 --> 00:20:30,000 dat ja, mijn logica is juist, maar mijn code is uiteindelijk niet hebben 505 00:20:30,000 --> 00:20:31,450 een permanent effect. 506 00:20:31,450 --> 00:20:34,570 Dus dat is een probleem dat we ga nu op te lossen vandaag. 507 00:20:34,570 --> 00:20:37,870 >> Maar laten we er door middel van deze. 508 00:20:37,870 --> 00:20:39,230 String is een leugen. 509 00:20:39,230 --> 00:20:41,860 Het ook, niet een gegevenstype die bestaat in C. Het is 510 00:20:41,860 --> 00:20:44,750 is een synoniem voor sommige tijd voor iets anders, 511 00:20:44,750 --> 00:20:47,300 en we kunnen zien dat als volgt. 512 00:20:47,300 --> 00:20:53,282 >> Laat me ga je gang en open een programma genaamd vergelijken-0. 513 00:20:53,282 --> 00:20:56,240 En in plaats van te typen dit een uit, we beginnen te lopen door de code 514 00:20:56,240 --> 00:20:58,040 Ik schreef al, maar het is slechts een paar regels. 515 00:20:58,040 --> 00:20:59,570 Dus dit is te vergelijken-0. 516 00:20:59,570 --> 00:21:02,380 En het eerste wat ik doe wordt steeds een regel tekst. 517 00:21:02,380 --> 00:21:05,610 >> Maar let op wat ik ben doet voor de eerste keer. 518 00:21:05,610 --> 00:21:07,910 Wat is er anders duidelijk over lijn 21? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 Eigenlijk, wacht eens even. 521 00:21:11,402 --> 00:21:12,110 Dit is een kopie van twee. 522 00:21:12,110 --> 00:21:13,568 Dat is ook niet het juiste programma. 523 00:21:13,568 --> 00:21:14,780 Oke, spoiler alert. 524 00:21:14,780 --> 00:21:16,890 Oke, dus laat staan ​​dat. 525 00:21:16,890 --> 00:21:18,520 Dat is het antwoord op een toekomstige vraag. 526 00:21:18,520 --> 00:21:21,450 >> Hier is te vergelijken-0, en ik ben over een tekstregel krijgen. 527 00:21:21,450 --> 00:21:22,435 Programma's veel eenvoudiger. 528 00:21:22,435 --> 00:21:23,560 Dus dit is eenvoudig. 529 00:21:23,560 --> 00:21:28,070 Dit is als Week One, Week Twee stuff op dit moment. reeks s = GetString. 530 00:21:28,070 --> 00:21:29,700 Nu, ik zeg het nog eens hier beneden. 531 00:21:29,700 --> 00:21:31,830 draad t = GetString. 532 00:21:31,830 --> 00:21:35,300 En dan, het laatste wat in dit programma, zoals de naam al doet vermoeden, 533 00:21:35,300 --> 00:21:37,090 wordt ik ga proberen om ze te vergelijken. 534 00:21:37,090 --> 00:21:40,709 >> Als s, de eerste groep, evenaart = t, dan ben ik 535 00:21:40,709 --> 00:21:42,250 gaan zeggen dat je hetzelfde typen. 536 00:21:42,250 --> 00:21:44,291 Anders, ik ga om te zeggen je typt verschillende dingen. 537 00:21:44,291 --> 00:21:45,880 Dus laten compileren en uitvoeren van dit programma. 538 00:21:45,880 --> 00:21:48,481 Dus zorg vergelijken nul. 539 00:21:48,481 --> 00:21:48,980 Ziet er goed uit. 540 00:21:48,980 --> 00:21:50,490 Geen compilatie fouten. 541 00:21:50,490 --> 00:21:52,386 >> Laat me gaan nu vooruit en typ ./compare-0. 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 Laat me gaan en iets te zeggen : Daven en iets: Rob. 544 00:21:59,220 --> 00:22:00,450 En ik typ verschillende dingen. 545 00:22:00,450 --> 00:22:01,250 So far, so good. 546 00:22:01,250 --> 00:22:02,680 Programma lijkt juist te zijn. 547 00:22:02,680 --> 00:22:03,880 >> Maar laten we weer draaien. 548 00:22:03,880 --> 00:22:05,800 Zeg iets: Gabe. 549 00:22:05,800 --> 00:22:07,140 Zeg iets: Gabe. 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 Oke. 552 00:22:09,020 --> 00:22:10,851 Misschien raakte ik spatiebalk of iets funky. 553 00:22:10,851 --> 00:22:11,600 Laten we het nog eens doen. 554 00:22:11,600 --> 00:22:13,020 Dus Zamyla. 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla. 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 Verschillende dingen. 559 00:22:17,330 --> 00:22:19,430 Dus wat is er aan de hand? 560 00:22:19,430 --> 00:22:23,200 >> Dus we hebben deze twee lijnen van code, GetString twee keer genoemd. 561 00:22:23,200 --> 00:22:25,760 En dan ben ik gewoon proberen te vergelijken s en t. 562 00:22:25,760 --> 00:22:28,370 Maar wat echt dan is er gaande? 563 00:22:28,370 --> 00:22:31,180 Nou, mijn handschrift over te slager dit voorbeeld enigszins. 564 00:22:31,180 --> 00:22:34,630 En laten we eigenlijk gooien deze omhoog dan hier, als goed. 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> Dus we hebben een regel als reeks s = GetString. 567 00:22:45,712 --> 00:22:48,295 Dus dat is gewoon de eerste interessante lijn van dat programma. 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 Maar wat al die tijd is geweest gebeurt onder de motorkap? 570 00:22:52,974 --> 00:22:55,890 Nou, aan de linkerkant is string die een soort variabele, 571 00:22:55,890 --> 00:22:56,785 en het heet s. 572 00:22:56,785 --> 00:23:00,019 Dus ik weet dat dit het gebruik van het geheugen, of RAM, in mijn computer of andere manier. 573 00:23:00,019 --> 00:23:02,060 Dus ik ga naar abstract trekken die als een vierkant. 574 00:23:02,060 --> 00:23:04,820 32 bits, zo blijkt, maar meer op dat in de toekomst. 575 00:23:04,820 --> 00:23:06,410 En dan, wat gebeurt hier? 576 00:23:06,410 --> 00:23:08,700 >> Nou, natuurlijk getString krijgt een string van de gebruiker. 577 00:23:08,700 --> 00:23:11,360 En GetString kreeg Zamyla of Gabe of Daven. 578 00:23:11,360 --> 00:23:14,640 Dus laten we kiezen voor de eerste van degenen, die was Daven. 579 00:23:14,640 --> 00:23:19,174 Zo effectief, wat GetString gekregen me in die eerste geval is D-a-v-e-n. 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 En dan, wat anders deed Het geeft me het geheim? 582 00:23:25,045 --> 00:23:25,920 PUBLIEK: [onverstaanbaar] 583 00:23:25,920 --> 00:23:28,720 DAVID J. MALAN: Ja, de / 0 of null karakter. 584 00:23:28,720 --> 00:23:30,550 Dus het effectief gaf me een string. 585 00:23:30,550 --> 00:23:34,550 Maar we al kennen van de vorige ziet dat een string is gewoon een array 586 00:23:34,550 --> 00:23:37,895 van de personages, en het wordt beëindigd door deze speciale sentinel karakter / 0. 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> Maar als dit waar en dit is een vierkant, 589 00:23:42,310 --> 00:23:44,160 Dit is duidelijk een veel grotere rechthoek. 590 00:23:44,160 --> 00:23:46,830 En inderdaad, dat is, Ik eis, slechts 32 bits. 591 00:23:46,830 --> 00:23:49,500 En dit is duidelijk meer dan 32 bits omdat dit waarschijnlijk 592 00:23:49,500 --> 00:23:51,583 acht plus acht plus acht plus acht plus acht, 593 00:23:51,583 --> 00:23:53,320 alleen vanwege bytes ASCII. 594 00:23:53,320 --> 00:23:57,030 Hoe de heck gaan we passen Daven in dit kleine doosje hier? 595 00:23:57,030 --> 00:23:59,880 >> Nou, wat is getString eigenlijk aan het doen? 596 00:23:59,880 --> 00:24:03,680 Nou, dit raster vertegenwoordigt hier geheugen of RAM-geheugen van mijn computer. 597 00:24:03,680 --> 00:24:07,564 Dus laten we willekeurig zeggen dat als elk daarvan vertegenwoordigt een byte, 598 00:24:07,564 --> 00:24:09,730 dan kunnen we denken aan elke byte als hebbende een adres, 599 00:24:09,730 --> 00:24:13,830 zoals 33 Oxford Street, of 34 Oxford Street, of 35 Oxford Street. 600 00:24:13,830 --> 00:24:16,700 >> Dus net als huizen hebben adressen en gebouwen hebben adressen, 601 00:24:16,700 --> 00:24:19,810 hiervoor individuele bytes van geheugen of nummers 602 00:24:19,810 --> 00:24:21,042 die hen uniek te identificeren. 603 00:24:21,042 --> 00:24:22,000 Nu, is arbitrair. 604 00:24:22,000 --> 00:24:25,370 Maar om het simpel te houden, ik ga Gebruik hexadecimale gewoon volgens afspraak, 605 00:24:25,370 --> 00:24:28,200 maar 0x betekent niets anders dan "dit is hexadecimaal." 606 00:24:28,200 --> 00:24:31,030 en ik ga om te beweren dat de "D" eindigt bij Byte Een in het geheugen. 607 00:24:31,030 --> 00:24:34,210 >> Ik heb niets anders aan de hand in geheugen, dus Daven kreeg de eerste plek 608 00:24:34,210 --> 00:24:35,509 bij Byte One. 609 00:24:35,509 --> 00:24:36,800 Dit dan zal 0x2 worden. 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 Dit gaat 0x3. 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 Dit gaat om 0x4 te zijn. 614 00:24:41,800 --> 00:24:43,025 Dit gaat 0x5. 615 00:24:43,025 --> 00:24:44,025 Dit gaat om 0x6 te zijn. 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> Maar zodra je begint te denken over wat het doen van de computer 618 00:24:48,290 --> 00:24:50,710 onder de motorkap, kun je beginnen af ​​te leiden 619 00:24:50,710 --> 00:24:54,960 hoe je, enkele jaren geleden, zou hebben C zelf geïmplementeerd. 620 00:24:54,960 --> 00:24:58,360 Wat is GetString waarschijnlijk returning-- omdat 621 00:24:58,360 --> 00:25:00,946 voelt alsof het niet terug Daven, per se, 622 00:25:00,946 --> 00:25:03,320 want hij is zeker niet van plan te passen in deze kleine box-- 623 00:25:03,320 --> 00:25:05,090 dus wat is GetString waarschijnlijk terugkeren? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> PUBLIEK: [onverstaanbaar] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J. MALAN: De locatie van Daven. 627 00:25:10,540 --> 00:25:12,770 En het is dit gedaan Sindsdien Week One. 628 00:25:12,770 --> 00:25:16,150 Wat GetString is echt terugkeer is niet een string, per se. 629 00:25:16,150 --> 00:25:17,780 Dat is een van de kleine leugentjes om bestwil. 630 00:25:17,780 --> 00:25:22,520 Het is de terugkeer van het adres van de tekenreeks in het geheugen, het unieke adres. 631 00:25:22,520 --> 00:25:24,820 Daven woont op 33 Oxford Street. 632 00:25:24,820 --> 00:25:29,310 Maar beknopter, Gavin woont bij 0x1, Adres Number One. 633 00:25:29,310 --> 00:25:32,280 >> Dus wat wordt gezet in deze doosje daarna, om duidelijk te zijn, 634 00:25:32,280 --> 00:25:35,930 is gewoon het adres van die string. 635 00:25:35,930 --> 00:25:38,110 Dus al die tijd, dit heeft er aan de hand. 636 00:25:38,110 --> 00:25:41,650 Maar wat dit zinspeelt op Nu is dat als alle s heeft 637 00:25:41,650 --> 00:25:44,710 een aantal erin, wiens om je te stoppen, de programmeur, 638 00:25:44,710 --> 00:25:47,970 van het zetten een willekeurig aantal in elke variabele en gewoon springen 639 00:25:47,970 --> 00:25:49,080 tot dat deel van het geheugen? 640 00:25:49,080 --> 00:25:51,320 En inderdaad, we zien wel dat is een bedreiging voor de volgende keer. 641 00:25:51,320 --> 00:25:53,500 >> Maar voor nu, dit voelt onvoldoende. 642 00:25:53,500 --> 00:25:55,630 Als ik zeg, krijg ik een snaar, je geeft me Daven. 643 00:25:55,630 --> 00:25:57,230 Maar je hoeft niet echt geven me Daven. 644 00:25:57,230 --> 00:25:59,310 Alles wat je me geven is het adres Daven's. 645 00:25:59,310 --> 00:26:04,310 Hoe weet ik dan zeker waar Daven begint en ends-- 646 00:26:04,310 --> 00:26:07,140 het verhaal krijgt weird-- waar Daven begint en eindigt, 647 00:26:07,140 --> 00:26:10,435 en dan, de volgende tekenreeks in het geheugen begint? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> Nou, als je het uitdelen mij het begin van Daven, 650 00:26:13,620 --> 00:26:17,230 wezen, hoe weet ik waar het einde van zijn naam is? 651 00:26:17,230 --> 00:26:20,550 Die speciale null karakter, dat is des te belangrijker nu 652 00:26:20,550 --> 00:26:23,040 als strings onder de kap zijn eenvoudig geïdentificeerd 653 00:26:23,040 --> 00:26:25,820 uniek door hun locatie in het geheugen. 654 00:26:25,820 --> 00:26:28,130 Dus al die tijd, dat is wat er gaande is. 655 00:26:28,130 --> 00:26:32,470 >> Dus als we nu naar kijken de code hier, uit te leggen 656 00:26:32,470 --> 00:26:35,790 als je zou de bug in lijn 26. 657 00:26:35,790 --> 00:26:39,560 Waarom is Zamyla en Zamyla anders? 658 00:26:39,560 --> 00:26:41,330 Waarom is Gabe en Gabe anders? 659 00:26:41,330 --> 00:26:42,154 Ja, in de rug. 660 00:26:42,154 --> 00:26:43,390 >> PUBLIEK: Ze hebben verschillende adressen. 661 00:26:43,390 --> 00:26:45,931 >> DAVID J. MALAN: Simpelweg omdat ze hebben verschillende adressen. 662 00:26:45,931 --> 00:26:48,820 Want als je GetString belt nogmaals, dat ik hier snel zal doen, 663 00:26:48,820 --> 00:26:52,870 indien dit de tweede lijn, koord t, zoals ik deed in dat programma, 664 00:26:52,870 --> 00:26:55,030 is gelijk aan een ander gesprek te GetString. 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 De volgende keer dat ik bel GetString, ik ga 667 00:26:58,670 --> 00:27:00,190 een ander deel van het geheugen te krijgen. 668 00:27:00,190 --> 00:27:02,220 >> GetString is toegestaan om het besturingssysteem te vragen 669 00:27:02,220 --> 00:27:03,800 systeem voor meer en meer geheugen. 670 00:27:03,800 --> 00:27:07,894 Het gaat niet om hetzelfde te hergebruiken zes bytes elke keer weer. 671 00:27:07,894 --> 00:27:09,810 Het gaat om een ​​nieuwe te krijgen stuk geheugen, dat 672 00:27:09,810 --> 00:27:12,780 betekent t gaat krijgen een andere waarde dan hier. 673 00:27:12,780 --> 00:27:15,380 >> Dus als ik het doe s is gelijk aan = t, je bent niet te vergelijken 674 00:27:15,380 --> 00:27:17,880 D tegen deze en A tegen deze en V tegen dit. 675 00:27:17,880 --> 00:27:19,588 Je bent dit te vergelijken tegen deze, die 676 00:27:19,588 --> 00:27:24,020 eerlijk gezegd is vrij useful-- useless-- is vrij nutteloos, omdat die echt 677 00:27:24,020 --> 00:27:25,830 cares waar de snaren in het geheugen? 678 00:27:25,830 --> 00:27:26,850 >> En inderdaad, dat hebben we niet. 679 00:27:26,850 --> 00:27:28,980 En we zijn niet van plan om start bijzonder zorgzaam. 680 00:27:28,980 --> 00:27:34,180 Slechts in zoverre problemen kunnen ontstaan en bedreigingen van de veiligheid kan ontstaan 681 00:27:34,180 --> 00:27:36,100 we daadwerkelijk beginnen te schelen. 682 00:27:36,100 --> 00:27:37,230 Dus laten we dit probleem op te lossen. 683 00:27:37,230 --> 00:27:39,650 Blijkt dat, je het te repareren super gewoon. 684 00:27:39,650 --> 00:27:42,600 >> En laten we eigenlijk, voordat ik blijkt dat weer, wat zou 685 00:27:42,600 --> 00:27:47,170 je doen als in een CS50 klasse, en je moest implementeren 686 00:27:47,170 --> 00:27:48,600 een vergelijking tegen twee snaren. 687 00:27:48,600 --> 00:27:51,440 Je kunt duidelijk niet gewoon gebruik maken van s is gelijk aan = t. 688 00:27:51,440 --> 00:27:54,090 Maar gewoon logisch, hoe zou je deze string vergelijken 689 00:27:54,090 --> 00:27:56,370 tegen deze string met behulp van C-code? 690 00:27:56,370 --> 00:27:56,880 Yeah. 691 00:27:56,880 --> 00:27:58,780 >> PUBLIEK: Gewoon doen het lus [onverstaanbaar] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J. MALAN: Perfect. 694 00:28:01,670 --> 00:28:02,900 PUBLIEK: [onverstaanbaar] 695 00:28:02,900 --> 00:28:03,310 DAVID J. MALAN: Ja. 696 00:28:03,310 --> 00:28:05,390 Gewoon gebruik maken van een lus of een while loop of wat dan ook. 697 00:28:05,390 --> 00:28:08,710 Maar toepassen basisidee dat als Dit is een stuk geheugen of een array 698 00:28:08,710 --> 00:28:11,590 en dit is, itereren over allebei tegelijkertijd. 699 00:28:11,590 --> 00:28:12,960 En de letters vergelijken. 700 00:28:12,960 --> 00:28:14,260 >> En je hebt om een ​​te zijn beetje voorzichtig, want je 701 00:28:14,260 --> 00:28:16,247 heb een vinger niet wilt om voorbij de andere 702 00:28:16,247 --> 00:28:18,080 omdat een string langer dan de andere. 703 00:28:18,080 --> 00:28:21,380 Dus je gaat te willen om te controleren op deze bijzondere waarde aan het eind, null. 704 00:28:21,380 --> 00:28:24,017 Maar het is echt, in het einde, zo simpel is dat. 705 00:28:24,017 --> 00:28:26,100 En eerlijk gezegd, hebben we niet nodig om dat wiel opnieuw uit te vinden. 706 00:28:26,100 --> 00:28:27,960 Hier is versie twee. 707 00:28:27,960 --> 00:28:32,910 En wat ik ga zeggen is dat In plaats van het vergelijken s evenaart = t, 708 00:28:32,910 --> 00:28:38,964 Ik ga in plaats daarvan gaan zeggen, of de tekenreeks vergelijking van s komma t de waarde = 0. 709 00:28:38,964 --> 00:28:40,130 Nu, wat is touwtje te vergelijken? 710 00:28:40,130 --> 00:28:43,046 >> Het blijkt, het is een functie die wordt geleverd met een C, waarvan het doel in het leven 711 00:28:43,046 --> 00:28:44,650 is om twee strings te vergelijken. 712 00:28:44,650 --> 00:28:48,300 En roer te vergelijken, als we lezen zijn man pagina of documentatie of CS50 713 00:28:48,300 --> 00:28:50,630 referentie, zal gewoon je vertellen dat roer 714 00:28:50,630 --> 00:28:55,730 vergelijken rendement ofwel een negatief nummer of een positief getal of nul, 715 00:28:55,730 --> 00:28:57,660 waar nul betekent dat ze gelijk. 716 00:28:57,660 --> 00:28:58,570 >> Dus gewoon gissen. 717 00:28:58,570 --> 00:29:00,390 Wat zou het betekenen als roer vergelijken rendement 718 00:29:00,390 --> 00:29:02,110 negatieve waarde of positieve waarde? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 PUBLIEK: Groter dan of kleiner dan. 721 00:29:04,285 --> 00:29:05,570 DAVID J. MALAN: Ja, groter of kleiner dan. 722 00:29:05,570 --> 00:29:08,640 Dus als je wilde een hele afstand bos van strings in een dictionary-- 723 00:29:08,640 --> 00:29:12,975 zo zullen we uiteindelijk beneden de road-- perfecte functie om mogelijk te gebruiken, 724 00:29:12,975 --> 00:29:15,850 omdat het gaat om dat te doen vergelijking van snaren voor je, en zeg 725 00:29:15,850 --> 00:29:20,060 je doet komt voor b, of doet b treden voordat een alfabetisch. 726 00:29:20,060 --> 00:29:21,490 We kunnen precies dat doen. 727 00:29:21,490 --> 00:29:23,620 >> En merkt dat ik deed een andere ding in dit voorbeeld. 728 00:29:23,620 --> 00:29:26,870 Wat is er nog meer veranderd in dit hoofdfunctie? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 Char *. 731 00:29:29,350 --> 00:29:31,150 En dit is dat andere leugentje om bestwil. 732 00:29:31,150 --> 00:29:33,750 Al die tijd, wanneer je hebt het schrijven van touw, 733 00:29:33,750 --> 00:29:38,350 we zijn in het geheim te herschrijven string char * zodat clang eigenlijk 734 00:29:38,350 --> 00:29:39,270 begrijpt u. 735 00:29:39,270 --> 00:29:42,450 >> Met andere woorden, in CS50.h en als we uiteindelijk zullen zien, 736 00:29:42,450 --> 00:29:45,950 we maakten een synoniem genoemd reeks dat is hetzelfde als char *. 737 00:29:45,950 --> 00:29:49,910 En voor nu, maar dat het weet * In deze context tenminste 738 00:29:49,910 --> 00:29:51,286 betekent het adres. 739 00:29:51,286 --> 00:29:52,210 >> Het adres van wat? 740 00:29:52,210 --> 00:29:56,390 Nou, het feit dat ik zei char *, en niet int * of drijven *, 741 00:29:56,390 --> 00:30:00,820 betekent dat char * is het adres van een char. 742 00:30:00,820 --> 00:30:06,770 Dus dit doosje hier, aka snaar, is echt van het type char *, 743 00:30:06,770 --> 00:30:10,490 dat is gewoon een mooie manier om te zeggen, In deze box wordt een adres te gaan. 744 00:30:10,490 --> 00:30:12,430 En wat betekent dat adres verwijzen naar? 745 00:30:12,430 --> 00:30:13,780 Blijkbaar een char. 746 00:30:13,780 --> 00:30:16,410 >> Maar we konden absoluut hebben int * en andere dingen. 747 00:30:16,410 --> 00:30:20,790 Maar voor nu, char * is echt de meest eenvoudig en een plaats. 748 00:30:20,790 --> 00:30:23,310 Dus dit probleem gaat stijgt echter weer. 749 00:30:23,310 --> 00:30:24,830 >> Stel dat ik dit programma open. 750 00:30:24,830 --> 00:30:27,670 Eens kijken of nu kunnen we voorspellen wat is er mis met deze code. 751 00:30:27,670 --> 00:30:31,140 Dus in dit programma, copy-0, ik ben gaan om verder te gaan en opnieuw te bellen 752 00:30:31,140 --> 00:30:34,190 GetString en opslaan van de waarde in s. 753 00:30:34,190 --> 00:30:38,800 >> En dan, waarom doe ik dit, net als een herinnering uit het verleden weken? 754 00:30:38,800 --> 00:30:40,960 Wij deden dat GetString soms null geretourneerd. 755 00:30:40,960 --> 00:30:42,793 Wat betekent het als GetString retourneert nul? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 Er ging iets mis. 758 00:30:46,034 --> 00:30:48,950 Het betekent waarschijnlijk dat de string is te grote, uit het geheugen van de computer. 759 00:30:48,950 --> 00:30:51,724 Het gebeurt super, super, super zelden, maar het zou kunnen gebeuren. 760 00:30:51,724 --> 00:30:53,890 We willen om te controleren op het, en dat is alles wat we doen. 761 00:30:53,890 --> 00:30:57,910 >> Omdat we nu zullen zien, als je dat niet begint te controleren gewoonlijk voor dingen 762 00:30:57,910 --> 00:31:00,870 zoals null, zou je daadwerkelijk van start te gaan 763 00:31:00,870 --> 00:31:03,106 naar adressen in het geheugen, dat zijn ongeldig. 764 00:31:03,106 --> 00:31:05,980 En je gaat om te beginnen met het induceren meer en meer segmentatie fouten. 765 00:31:05,980 --> 00:31:08,360 Of in een Mac of een PC, net waardoor een computer te hangen 766 00:31:08,360 --> 00:31:10,340 of een programma te bevriezen, in potentie. 767 00:31:10,340 --> 00:31:14,930 >> Dus nu, ik beweer in copy-0.c, dat ik ga naar deze strings te kopiëren door middel 768 00:31:14,930 --> 00:31:15,685 van lijn 28. 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 En dan, ik ga conclusie onderaan 771 00:31:18,750 --> 00:31:21,430 hier dat ik ga een van hen wijzigen. 772 00:31:21,430 --> 00:31:22,330 >> Zo merkt dit. 773 00:31:22,330 --> 00:31:24,370 Ik bel onze oude vriend strlen. 774 00:31:24,370 --> 00:31:28,960 En verklaren Engels wat deze lijn 34 aan het doen is? 775 00:31:28,960 --> 00:31:32,480 Wat doet t beugel 0 vertegenwoordigen aan de linkerkant. 776 00:31:32,480 --> 00:31:32,980 Yeah. 777 00:31:32,980 --> 00:31:34,339 >> PUBLIEK: eerste teken van t? 778 00:31:34,339 --> 00:31:35,880 DAVID J. MALAN: eerste teken van t. 779 00:31:35,880 --> 00:31:36,379 Dat is het. 780 00:31:36,379 --> 00:31:40,024 Eerste teken van t, ik wil om de hoofdletters versie toewijzen 781 00:31:40,024 --> 00:31:41,190 van het eerste teken in t. 782 00:31:41,190 --> 00:31:43,200 Dus dit is kapitaliseren de eerste letter. 783 00:31:43,200 --> 00:31:46,340 En dan, het laatste wat ik doe in dit programma is Ik eis hier is 784 00:31:46,340 --> 00:31:50,340 het origineel, s, en hier is de kopie, t. 785 00:31:50,340 --> 00:31:54,610 >> Maar op basis van het verhaal dat we net vertelde over wat snaren werkelijk zijn, 786 00:31:54,610 --> 00:31:57,520 wat is lijn 28 echt doen en wat 787 00:31:57,520 --> 00:31:59,405 de resulterende fout gaan te zijn op het scherm? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> Dus eerst, de eerste vraag 28. 790 00:32:03,500 --> 00:32:09,040 Wat is draad t = s echt aan het doen? 791 00:32:09,040 --> 00:32:16,430 Als we de linker side hier draad t = s; 792 00:32:16,430 --> 00:32:19,400 dat geeft me een doos hier en een doos hier. 793 00:32:19,400 --> 00:32:25,530 En stel dat dit adres is 0x, laten we zeggen, 50 dit keer, willekeurig. 794 00:32:25,530 --> 00:32:28,847 Wat doet draad t = s doen onder de motorkap? 795 00:32:28,847 --> 00:32:30,340 >> PUBLIEK: [onverstaanbaar] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J. MALAN: Het slaat het geheugen pakken daar, dus 0x50 gaat daar. 797 00:32:34,100 --> 00:32:37,980 Dus als nu, ga ik naar de eerste karakter in t en hoofdletters het, 798 00:32:37,980 --> 00:32:39,535 wat moet ik doen om effectief s? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 Ik ben echt hetzelfde te doen, toch? 801 00:32:43,450 --> 00:32:47,680 Want als Adres 0x50-- en gewoon, ik niet veel ruimte op het bord niet hebben hier, 802 00:32:47,680 --> 00:32:51,750 maar aannemen dat dit hier 0x50 beneden, ergens in het geheugen van mijn computer. 803 00:32:51,750 --> 00:32:55,825 >> En ik heb, bijvoorbeeld, Gabe hier in kleine letters, zoals deze. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 En ik heb gezegd t beugel 0 wordt gekapitaliseerd. 806 00:33:01,980 --> 00:33:04,860 Nou, t beugel 0 is de eerste letter in t. 807 00:33:04,860 --> 00:33:07,840 Zo weinig g gaat uitgegroeid tot grote G. Maar het probleem 808 00:33:07,840 --> 00:33:09,410 is, wat doet s wijzen ook op? 809 00:33:09,410 --> 00:33:10,300 >> PUBLIEK: Dezelfde. 810 00:33:10,300 --> 00:33:11,841 >> DAVID J. MALAN: precies dezelfde dingen. 811 00:33:11,841 --> 00:33:16,342 Dus een eenvoudige uitleg misschien, zelfs als de syntax is een beetje raar. 812 00:33:16,342 --> 00:33:17,050 Dus laten we dit doen. 813 00:33:17,050 --> 00:33:20,210 Maak copy-0 en vervolgens ./copy-0. 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 Zeg iets: Gabe. 816 00:33:24,110 --> 00:33:26,760 En helaas, beiden ze zijn nu geactiveerd, 817 00:33:26,760 --> 00:33:29,500 maar voor die ten grondslag liggen aan reden dat we gewoon 818 00:33:29,500 --> 00:33:32,350 nu te maken met adressen. 819 00:33:32,350 --> 00:33:36,470 >> Dus hoe kunnen we beginnen te address-- no pun intended-- 820 00:33:36,470 --> 00:33:39,270 hoe kunnen we inspelen op een dit probleem? 821 00:33:39,270 --> 00:33:44,400 Nou, in copy1.c, de dingen gaan om een ​​beetje ingewikkelder te krijgen. 822 00:33:44,400 --> 00:33:49,310 Maar ik zou een aanspraak conceptueel eenvoudige oplossing. 823 00:33:49,310 --> 00:33:50,852 >> Zo hard op het eerste gezicht te krijgen. 824 00:33:50,852 --> 00:33:53,560 Niet makkelijk voor de eerste te zijn keer dat je het uittypen, misschien, 825 00:33:53,560 --> 00:33:57,440 maar als het probleem is dat gewoon doen t = s gewoon 826 00:33:57,440 --> 00:33:59,694 kopieert het adres, wat, weer als ik kan halen op je, 827 00:33:59,694 --> 00:34:02,110 zal de oplossing voor het daadwerkelijk kopiëren van een string? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> PUBLIEK: We zullen waarschijnlijk Gebruik een lus weer. 830 00:34:06,770 --> 00:34:06,890 >> DAVID J. MALAN: Ja. 831 00:34:06,890 --> 00:34:08,390 Dus gaan we een lus weer nodig. 832 00:34:08,390 --> 00:34:11,800 En omdat als we willen kopiëren een tekenreeks s in andere tekenreeks, 833 00:34:11,800 --> 00:34:14,120 willen we waarschijnlijk om het te doen teken voor teken. 834 00:34:14,120 --> 00:34:17,199 Maar het probleem is, als Dit is oorspronkelijk s, 835 00:34:17,199 --> 00:34:22,159 nu moeten we expliciet beginnen toewijzen van geheugen voor t. 836 00:34:22,159 --> 00:34:24,320 >> Met andere woorden, laten we hertekenen dit een laatste keer. 837 00:34:24,320 --> 00:34:28,659 Als dit touwtje s = GetString. 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 En laten we dit hier, als goed. 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 Dit is GetString. 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 En dan is het beeld iets zoals dat gaat als voorheen, 844 00:34:43,860 --> 00:34:44,360 G-a-b-e / 0. 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 Dat ziet er een beetje iets als dit. 847 00:34:48,960 --> 00:34:53,650 En s daarom noemen we dit 0x50, en dat gaat zijn 51, 52. 848 00:34:53,650 --> 00:34:54,409 >> Dus dit is 0x50. 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 En dan, ik doe touw t. 851 00:34:59,690 --> 00:35:02,450 In het geheugen, dat zal alleen maar geef me een pleintje als dit. 852 00:35:02,450 --> 00:35:04,080 Dus wat is de belangrijkste stap nu? 853 00:35:04,080 --> 00:35:09,870 Als ik wil s kopiëren naar t, wat leeg moeten we hier in te vullen? 854 00:35:09,870 --> 00:35:12,050 Of wat hebben we nodig om doen op hoog niveau? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 Yeah? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 Iemand? 859 00:35:17,020 --> 00:35:17,690 Yeah. 860 00:35:17,690 --> 00:35:19,214 >> PUBLIEK: We moeten [onverstaanbaar]. 861 00:35:19,214 --> 00:35:21,380 DAVID J. MALAN: Ja, we nodig hebt in deze blanco te vullen. 862 00:35:21,380 --> 00:35:24,340 Ik kan niet kopiëren en vervolgens kapitaliseren naam Gabe's 863 00:35:24,340 --> 00:35:28,120 totdat ik vraag het besturingssysteem voor een stuk geheugen 864 00:35:28,120 --> 00:35:30,640 dat minstens zo groot als het origineel. 865 00:35:30,640 --> 00:35:32,130 Dus dat laat ons achter met een vraag. 866 00:35:32,130 --> 00:35:36,080 >> Hoe vraag ik het besturingssysteem niet gewoon voor een eenvoudige kleine pointer-- 867 00:35:36,080 --> 00:35:38,530 zoals deze wordt genoemd, een adres, een pointer-- niet 868 00:35:38,530 --> 00:35:40,980 voor een eenvoudig doosje zoals dit heet een string? 869 00:35:40,980 --> 00:35:44,200 Hoe kan ik de operationele vragen systeem voor een groot deel van het geheugen? 870 00:35:44,200 --> 00:35:48,430 Tot nu toe heb ik alleen gekregen die terug indirect door te bellen GetString. 871 00:35:48,430 --> 00:35:50,740 Dus hoe wordt getString zelfs om zijn geheugen? 872 00:35:50,740 --> 00:35:53,430 >> Nou, het blijkt dat er deze andere functie hier 873 00:35:53,430 --> 00:35:55,160 dat we nu beginnen te gebruiken. 874 00:35:55,160 --> 00:35:59,780 Nu, dit ziet er veel meer cryptische than-- en ik ben de enige die het-- kan zien 875 00:35:59,780 --> 00:36:03,150 deze lijn ziet er veel meer cryptische dan moet het op het eerste gezicht. 876 00:36:03,150 --> 00:36:04,650 Maar laten we plagen uit elkaar. 877 00:36:04,650 --> 00:36:07,950 >> Aan de linkerkant, ik heb char * t. 878 00:36:07,950 --> 00:36:13,280 Dus in het Engels, laten we beginnen met het formuleren van goede zinnen in technisch jargon. 879 00:36:13,280 --> 00:36:19,757 Dus dit is het toewijzen van een variabele van het type char * genaamd t. 880 00:36:19,757 --> 00:36:21,090 Nu, wat betekent dat eigenlijk? 881 00:36:21,090 --> 00:36:23,881 >> Nou, dat betekent, wat ga ik in deze variabele genaamd t te zetten? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 Een adres van een char. 884 00:36:26,402 --> 00:36:28,360 Dus dat is gewoon het eenvoudiger, meer redelijke manier 885 00:36:28,360 --> 00:36:29,930 beschrijven de linkerkant. 886 00:36:29,930 --> 00:36:32,890 Dus dat maakt dit vak hier alleen. 887 00:36:32,890 --> 00:36:34,760 Dus de rechterzijde, Vermoedelijk gaat 888 00:36:34,760 --> 00:36:37,170 te wijzen dat groter stuk van het geheugen hoe? 889 00:36:37,170 --> 00:36:38,340 Dus laten we deze plagen elkaar. 890 00:36:38,340 --> 00:36:41,131 >> Het is overweldigend op het eerste gezicht, maar wat is er aan de binnenkant hier? 891 00:36:41,131 --> 00:36:43,740 Ten eerste is er malloc, die is blijkbaar onze nieuwe vriend, 892 00:36:43,740 --> 00:36:45,450 "Geheugen toe te wijzen." 893 00:36:45,450 --> 00:36:49,560 Dus dit is het argument wordt doorgegeven in, dus het is een vrij grote argument. 894 00:36:49,560 --> 00:36:50,970 Dus laten we deze plagen elkaar. 895 00:36:50,970 --> 00:36:53,410 >> strlen van s, natuurlijk vertegenwoordigt de-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 Publiek: Het aantal tekens. 898 00:36:55,600 --> 00:36:56,710 DAVID J. Malan: Gewoon de aantal tekens in s. 899 00:36:56,710 --> 00:36:59,040 Dus de lengte van s, de oorspronkelijke tekenreeks. 900 00:36:59,040 --> 00:37:00,350 So G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Dus het is waarschijnlijk vier in dit geval. 902 00:37:02,320 --> 00:37:05,485 Waarom doe ik 1 na bellen strlen van s? 903 00:37:05,485 --> 00:37:06,360 PUBLIEK: [onverstaanbaar] 904 00:37:06,360 --> 00:37:07,590 DAVID J. Malan: Voor dat speciale null karakter. 905 00:37:07,590 --> 00:37:11,260 Als je mij vraagt ​​wat is de lengte van Naam Gabe's, ik ga zeggen vier. 906 00:37:11,260 --> 00:37:14,480 Onder de motorkap, maar, moet ik die vijfde byte voor het nul karakter. 907 00:37:14,480 --> 00:37:16,100 Dus dat is de reden waarom ik doe het 1. 908 00:37:16,100 --> 00:37:21,730 >> Nu voor het geval u werkt met deze programma op een andere computer dan, laten we zeggen, 909 00:37:21,730 --> 00:37:24,610 de CS50 apparaat, waarbij de grootte van een char 910 00:37:24,610 --> 00:37:26,350 anders zou kunnen zijn uit mijn eigen computer-- 911 00:37:26,350 --> 00:37:30,590 blijkt dat ik dit mag noemen operator sizeof, vraag gewoon de computer, 912 00:37:30,590 --> 00:37:32,870 wat de grootte van een char op deze computer? 913 00:37:32,870 --> 00:37:37,400 >> En door het vermenigvuldigen van de vijf in dit bijvoorbeeld door de grootte van een char die 914 00:37:37,400 --> 00:37:40,440 Op de meeste computers zal gewoon een, malloc 915 00:37:40,440 --> 00:37:44,830 zal toewijzen voor mij deze grote stuk van het geheugen hier aan de rechterkant. 916 00:37:44,830 --> 00:37:47,140 En het gaat om return-- is een function-- dus het 917 00:37:47,140 --> 00:37:48,265 ga terug naar mij wat? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 Publiek: Het adres? 920 00:37:51,830 --> 00:37:53,709 DAVID J. MALAN: Het adres van wat? 921 00:37:53,709 --> 00:37:55,250 PUBLIEK: Van het geheugen toegewezen? 922 00:37:55,250 --> 00:37:56,450 DAVID J. Malan: Van de geheugen is toegewezen. 923 00:37:56,450 --> 00:37:59,189 Dus ik heb geen idee, eerlijk gezegd, waar dit gaat eindigen. 924 00:37:59,189 --> 00:38:01,480 Ik ga om te stellen dat het zal eindigen op 0x88. 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 Volkomen willekeurig, maar ergens anders dan 0x50, 927 00:38:06,009 --> 00:38:08,800 omdat het besturingssysteem, wat Windows en Mac OS voor mij doen, is 928 00:38:08,800 --> 00:38:11,230 zorg ervoor dat het geven van me verschillende brokken van RAM. 929 00:38:11,230 --> 00:38:14,210 >> Dus dit is de waarde waar deze stuk van het geheugen zou kunnen eindigen. 930 00:38:14,210 --> 00:38:16,060 Dus dit is wat eindigt hier, 0x88. 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 Dus nu duidelijk, ik kan begrijpen dat dit niet hetzelfde als deze, 933 00:38:21,570 --> 00:38:23,960 omdat ze te wijzen op verschillende delen van het geheugen. 934 00:38:23,960 --> 00:38:29,980 Dus als ik nu eigenlijk wil dit kopiëren in, laten we het doen uw voorgestelde oplossing. 935 00:38:29,980 --> 00:38:36,870 >> Laten we gewoon gaan, maak een lus, en doe t beugel i krijgt s beugel i. 936 00:38:36,870 --> 00:38:39,760 Want nu kan ik gebruiken Dit matrix-achtige notatie, 937 00:38:39,760 --> 00:38:43,390 want hoewel malloc zeer generiek wijst me geheugen, 938 00:38:43,390 --> 00:38:45,290 geheugen is gewoon aaneengesloten bytes. 939 00:38:45,290 --> 00:38:47,240 Byte, byte, byte, rug aan rug aan rug. 940 00:38:47,240 --> 00:38:50,030 >> Ik kan zeker als een programmeur behandelen als een matrix, waarin 941 00:38:50,030 --> 00:38:55,090 betekent dat ik kan gebruiken deze eindelijk bekend notatie van slechts enkele vierkante haken. 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> Dus laat ik daar te pauzeren, want Dit is veel tegelijk, zelfs 944 00:39:00,020 --> 00:39:03,530 maar de achterliggende idee om samen te vatten dat tekenreeks, al die tijd, 945 00:39:03,530 --> 00:39:05,550 is geen nieuw soort data per se. 946 00:39:05,550 --> 00:39:10,150 Het is gewoon een zogenaamde pointer, een adres van een personage, 947 00:39:10,150 --> 00:39:12,650 die gewoon betekent dat het een aantal dat door menselijke conventie 948 00:39:12,650 --> 00:39:15,350 hebben we de neiging om te schrijven als 0x iets. 949 00:39:15,350 --> 00:39:18,590 >> Maar het is gewoon een nummer, zoals 33 Oxford Street, 950 00:39:18,590 --> 00:39:20,530 die toevallig ook de te Adres CS gebouw. 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 Eventuele vragen over deze gegevens? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 Yeah? 955 00:39:25,289 --> 00:39:28,530 >> PUBLIEK: Waarom doen we controleren voor t gelijk aan nul? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J. MALAN: Waarom doen we vraagt ​​t gelijk aan nul? 957 00:39:30,740 --> 00:39:33,250 Als we lezen het documentation-- grote question-- voor malloc, 958 00:39:33,250 --> 00:39:37,020 het gaat om te zeggen in kleine lettertjes, soms malloc zou null terug, 959 00:39:37,020 --> 00:39:38,080 net als GetString. 960 00:39:38,080 --> 00:39:41,820 En inderdaad, GetString null geretourneerd indien beurt malloc retourneert null, 961 00:39:41,820 --> 00:39:43,130 omdat GetString gebruikt malloc. 962 00:39:43,130 --> 00:39:46,400 >> En dat zou kunnen gebeuren als de OS, Mac OS, Windows, wat dan ook, is gewoon 963 00:39:46,400 --> 00:39:48,130 uit het geheugen voor u. 964 00:39:48,130 --> 00:39:49,820 Dus dat is wat er gebeurd is. 965 00:39:49,820 --> 00:39:52,910 >> En laat me onthullen een ander ding dat zou wel eens blow your mind 966 00:39:52,910 --> 00:39:55,100 of geheel te ver over de lijn. 967 00:39:55,100 --> 00:39:59,770 Maar laat ik trek de Hetzelfde voor de lus voor het kopiëren, 968 00:39:59,770 --> 00:40:05,480 die een moment geleden, recall was deze. t beugel i krijgt s beugel i. 969 00:40:05,480 --> 00:40:06,740 >> Mooi en gebruiksvriendelijk. 970 00:40:06,740 --> 00:40:09,330 Voelt alsof Week Two opnieuw. 971 00:40:09,330 --> 00:40:14,920 Maar deze versie kan eigenlijk herschreven als deze, die cryptische ziet. 972 00:40:14,920 --> 00:40:18,280 Het is een techniek genaamd pointer rekenkunde, adres rekenkunde. 973 00:40:18,280 --> 00:40:19,600 Maar waarom werkt dit? 974 00:40:19,600 --> 00:40:22,220 >> Nu hinderlijk, de auteurs van C speelt in 975 00:40:22,220 --> 00:40:25,070 het * symbool voor verschillende doeleinden. 976 00:40:25,070 --> 00:40:29,020 We hebben gezien dat al een keer gebruikt, char *, wat betekent "geef me een variabele 977 00:40:29,020 --> 00:40:31,210 dat gaat bevatten het adres van een char. " 978 00:40:31,210 --> 00:40:33,990 Dus char * in die context betekent "geef me een variabele." 979 00:40:33,990 --> 00:40:40,050 >> Helaas, als je de * zonder gebruik een woord aan de voorkant ervan, zoals char, 980 00:40:40,050 --> 00:40:41,905 het is nu wel de dereference operator. 981 00:40:41,905 --> 00:40:43,530 En we zullen meer van dit zien voordat lang. 982 00:40:43,530 --> 00:40:44,930 Maar het betekent gewoon "go there." 983 00:40:44,930 --> 00:40:49,070 Het is hetzelfde als zeggen, als iemand mij overhandigd op een stuk papier "33 Oxford Street," 984 00:40:49,070 --> 00:40:53,830 als ik dat doe "* 33 Oxford Street," dat betekent "Gaan op de weg naar het CS gebouw." 985 00:40:53,830 --> 00:40:57,220 >> Dus * betekent gewoon gaan als er is geen woord aan de voorkant ervan. 986 00:40:57,220 --> 00:40:59,100 Dus wat is t, om duidelijk te zijn? 987 00:40:59,100 --> 00:41:03,250 t is het adres van de brok geheugen dat werd gegeven terug naar mij. 988 00:41:03,250 --> 00:41:06,650 s is het adres van wat duidelijkheid, in het voorbeeld dat we hebben besproken, 989 00:41:06,650 --> 00:41:07,500 van kleine letters Gabe? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s is het adres van-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 Publiek: De string. 994 00:41:12,460 --> 00:41:14,126 DAVID J. MALAN: Van oorspronkelijke naam Gabe's. 995 00:41:14,126 --> 00:41:16,660 Dus het is het adres van Dit stuk van het geheugen. 996 00:41:16,660 --> 00:41:22,220 Dus als ik zeg t + i-- i, bericht, is gewoon onze oude vriend. 997 00:41:22,220 --> 00:41:24,770 Het is gewoon een index variabele dat is itereren van nul op maximaal 998 00:41:24,770 --> 00:41:26,960 de lengte van de tekenreeks s. 999 00:41:26,960 --> 00:41:30,367 Dus het gaat om nul, dan een, dan twee, dan drie, dan vier. 1000 00:41:30,367 --> 00:41:33,200 Dus laten monteren van deze nieuwe Scratch-achtige puzzelstukjes, als je wil, 1001 00:41:33,200 --> 00:41:36,140 hoewel, opnieuw, de syntax is veel meer mysterieuze dan Scratch. 1002 00:41:36,140 --> 00:41:39,522 Dus t is een adres + ik zal me geven 1003 00:41:39,522 --> 00:41:42,480 een getal, want het zijn allemaal nummers die we al tekenen als hex. 1004 00:41:42,480 --> 00:41:43,560 Maar ze zijn gewoon nummers. 1005 00:41:43,560 --> 00:41:49,960 >> Dus als het adres van t wij zeiden was 0x88, wat is 0x88 plus nul. 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 Zelfs als je niet comfortabel met nog een hex, neem een ​​gok. 1008 00:41:53,980 --> 00:41:54,410 >> Publiek: Het origineel. 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J. MALAN: Still 0x88. 1010 00:41:55,850 --> 00:41:58,910 Dus wat doet * 0x88 betekenen? 1011 00:41:58,910 --> 00:42:02,670 Het betekent, "go there", wat betekent effectief, "zet uw vinger hier." 1012 00:42:02,670 --> 00:42:06,930 En nu aan de rechterzijde van deze uitdrukking, * en dan in parens, 1013 00:42:06,930 --> 00:42:11,586 s + i s betekent, dat de pakken hier van de kleine g. 1014 00:42:11,586 --> 00:42:16,220 s + 0 is natuurlijk, s, ongeacht s is. 1015 00:42:16,220 --> 00:42:21,230 >> Dus nu, het is * s, die net als * 33 Oxford Street betekent ga naar het adres 1016 00:42:21,230 --> 00:42:22,010 s. 1017 00:42:22,010 --> 00:42:24,170 Dus hier is deze vinger, rechterhand. 1018 00:42:24,170 --> 00:42:26,050 Dus wat ga ik kopiëren in wat? 1019 00:42:26,050 --> 00:42:30,260 Het ding aan de rechterkant, dat is gabe, weinig g hier, naar hier. 1020 00:42:30,260 --> 00:42:32,750 >> En dus tot gevolg dat eerste iteratie van de lus, 1021 00:42:32,750 --> 00:42:36,200 zoals u voorgesteld, ook al ziet het er crazy ingewikkelder dan iets 1022 00:42:36,200 --> 00:42:42,110 we eerder hebben gezien, is gewoon te zeggen ga hier en kopieer dat personage hier. 1023 00:42:42,110 --> 00:42:44,700 Het geeft je een kaart om beide locaties. 1024 00:42:44,700 --> 00:42:46,130 >> En we zullen veel meer van dit te zien. 1025 00:42:46,130 --> 00:42:50,600 Maar voor nu, de hoop is gewoon om introduceren een aantal van deze fundamentele ideeën. 1026 00:42:50,600 --> 00:42:53,550 En inderdaad, laten we eens kijken naar een definitieve programma hier, 1027 00:42:53,550 --> 00:42:57,480 en dan de beloofde claymation, die zal alles in orde te maken. 1028 00:42:57,480 --> 00:42:57,980 Oke. 1029 00:42:57,980 --> 00:43:01,680 Dus laat me daar gaan we openen up--. 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 Dus laten mij-- we terug kom om deze foto duurde niet lang. 1032 00:43:05,440 --> 00:43:08,360 Laat me hier openen van deze laatste voorbeeld. 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> Dus hier is een super, super programma dat bewerkstelligt 1035 00:43:12,710 --> 00:43:15,050 niets in het leven dat het volgende doet. 1036 00:43:15,050 --> 00:43:18,740 Het verklaart de eerste twee variabelen, x en y, die geen getallen die tijd, 1037 00:43:18,740 --> 00:43:19,240 per se. 1038 00:43:19,240 --> 00:43:20,448 Ze zijn geen gehele getallen, per se. 1039 00:43:20,448 --> 00:43:22,899 Ze zijn blijkbaar int *. 1040 00:43:22,899 --> 00:43:25,690 Dus gewoon iedereen, wat betekent het als uw gegevens soort, de variabele, 1041 00:43:25,690 --> 00:43:26,860 is van het type int * sterren? 1042 00:43:26,860 --> 00:43:30,240 Dat is het adres van een int. 1043 00:43:30,240 --> 00:43:31,990 >> Dus ik heb geen idee waar het is. 1044 00:43:31,990 --> 00:43:35,150 Het betekent gewoon "te zetten, uiteindelijk, het adres van een int hier. " 1045 00:43:35,150 --> 00:43:38,340 0x50, 0x88, waar het ook is in geheugen, wordt een adres te gaan daar. 1046 00:43:38,340 --> 00:43:40,200 En dat is wat y zal zijn, ook. 1047 00:43:40,200 --> 00:43:44,920 >> Als ik nu zeg x = malloc (sizeof (int)), Dit is een mooie manier om te zeggen, 1048 00:43:44,920 --> 00:43:49,000 hey besturingssysteem, via malloc, geef mij genoeg geheugen voor de grootte 1049 00:43:49,000 --> 00:43:52,370 van een int, die waarschijnlijk zal worden 32 bits of vier bytes. 1050 00:43:52,370 --> 00:43:53,680 >> Dus wat doet malloc terugkeren? 1051 00:43:53,680 --> 00:43:55,250 Malloc keert een adres. 1052 00:43:55,250 --> 00:43:57,020 Dus wat gaat krijgen opgeslagen in x? 1053 00:43:57,020 --> 00:44:00,600 Het adres van de brok van geheugen, de vier bytes, dat malloc 1054 00:44:00,600 --> 00:44:03,360 net gevonden voor mij door te vragen het besturingssysteem. 1055 00:44:03,360 --> 00:44:08,240 >> Nu ondertussen, regel vier hier, het * x = 42. 1056 00:44:08,240 --> 00:44:09,990 Gewoon om duidelijk te zijn, wat gebeurt daar beneden? 1057 00:44:09,990 --> 00:44:11,530 Aan de linkerkant, * x. 1058 00:44:11,530 --> 00:44:13,610 dat is net als * 33 Oxford Street. 1059 00:44:13,610 --> 00:44:15,523 Dus * x betekent wat? 1060 00:44:15,523 --> 00:44:16,450 >> PUBLIEK: Ga naar. 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J. MALAN: Ga naar dat adres. 1062 00:44:17,908 --> 00:44:20,466 Overal waar dat stuk van geheugen, naar het. 1063 00:44:20,466 --> 00:44:21,979 En zet wat er, uiteraard? 1064 00:44:21,979 --> 00:44:22,520 Publiek: 42. 1065 00:44:22,520 --> 00:44:23,580 DAVID J. MALAN: 42. 1066 00:44:23,580 --> 00:44:25,650 Oke, * y, hetzelfde idee. 1067 00:44:25,650 --> 00:44:26,860 Ga naar het adres in y. 1068 00:44:26,860 --> 00:44:31,740 Zet het getal 13 er, maar wat is y op dit moment? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 Publiek: Er is geen geheugen voor y. 1071 00:44:34,630 --> 00:44:35,710 DAVID J. MALAN: Er is geen geheugen voor y. 1072 00:44:35,710 --> 00:44:38,215 Dus wat doet y waarschijnlijk bevatten, zoals we hebben gezegd? 1073 00:44:38,215 --> 00:44:38,520 >> PUBLIEK: Garbage. 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J. MALAN: Sommige garbage waarde. 1075 00:44:39,480 --> 00:44:41,320 Nu, garbage waarde nog een getal. 1076 00:44:41,320 --> 00:44:43,160 Het kan nog steeds worden verward met een adres. 1077 00:44:43,160 --> 00:44:45,160 Het is alsof iemand krabbelde iets naar beneden, 1078 00:44:45,160 --> 00:44:48,002 en ik verkeerd geïnterpreteerd als betekenis sommige gebouwen in de straat. 1079 00:44:48,002 --> 00:44:50,460 En als je gewoon proberen in te gaan sommige gebouw dat je niet de eigenaar, 1080 00:44:50,460 --> 00:44:53,710 of een stuk van het geheugen moet je niet is gegeven, kan slechte dingen gebeuren. 1081 00:44:53,710 --> 00:44:57,740 Computer kan crashen, of een andere onbepaald gedrag zou kunnen gebeuren. 1082 00:44:57,740 --> 00:45:01,310 >> Dus de intro, dan, om Binky is dit. 1083 00:45:01,310 --> 00:45:04,290 Ik herinner me nog, 20 sommige oneven jaren later, 1084 00:45:04,290 --> 00:45:07,200 waar ik was toen ik eindelijk begrepen pointers. 1085 00:45:07,200 --> 00:45:09,520 >> Dat wil zeggen, als je Laat hier drie minuten 1086 00:45:09,520 --> 00:45:12,170 en denk ik niet begrijpen pointers, realiseren 1087 00:45:12,170 --> 00:45:14,410 Ik heb bedacht voor 20 jaar voor wat gekke reden 1088 00:45:14,410 --> 00:45:17,140 wanneer en waarom het uiteindelijk tot zinken gebracht in, zitten met mijn onderwijs 1089 00:45:17,140 --> 00:45:19,501 collega, Nishat Mehta in de achterkant van Eliot Dining Hall. 1090 00:45:19,501 --> 00:45:21,250 Nu, ik heb onthouden Dit omdat dit 1091 00:45:21,250 --> 00:45:23,920 een van de onderwerpen die ik in bijzonder, worstelde met. 1092 00:45:23,920 --> 00:45:26,470 En dan, uiteindelijk geklikt, zoals ik durf te zeggen een heleboel onderwerpen 1093 00:45:26,470 --> 00:45:27,460 uiteindelijk wil. 1094 00:45:27,460 --> 00:45:32,590 En nu, om dat te laten voelen alle gelukkiger en des te meer overtuigend, 1095 00:45:32,590 --> 00:45:35,360 laten we eens een laatste blik in onze laatste drie minuten hier bij Binky, 1096 00:45:35,360 --> 00:45:37,675 van onze vriend, Nick Parlante van Stanford. 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [VIDEO AFSPELEN] 1099 00:45:41,580 --> 00:45:42,750 >> He, Binky. 1100 00:45:42,750 --> 00:45:43,500 Wakker worden! 1101 00:45:43,500 --> 00:45:45,960 Het is tijd voor pointer plezier. 1102 00:45:45,960 --> 00:45:47,012 >> Wat is dat? 1103 00:45:47,012 --> 00:45:48,723 Meer informatie over pointers? 1104 00:45:48,723 --> 00:45:50,580 Oh, goody! 1105 00:45:50,580 --> 00:45:53,563 >> Nou, om te beginnen, ik denk dat we ga een paar pointers nodig. 1106 00:45:53,563 --> 00:45:54,390 >> -OK. 1107 00:45:54,390 --> 00:45:57,930 Deze code kent twee wijzers, die kunnen wijzen op gehele getallen. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Nou, ik zie de twee wijzers, maar ze lijken niet te wijzen op iets. 1110 00:46:02,140 --> 00:46:02,980 >> Dat klopt. 1111 00:46:02,980 --> 00:46:05,100 Aanvankelijk pointers wijzen niet op om het even wat. 1112 00:46:05,100 --> 00:46:08,030 De dingen die ze wijzen op zijn geroepen pointees, en de oprichting ervan is 1113 00:46:08,030 --> 00:46:09,370 een afzonderlijke stap. 1114 00:46:09,370 --> 00:46:10,220 >> Oh, rechts, rechts. 1115 00:46:10,220 --> 00:46:10,950 Dat wist ik. 1116 00:46:10,950 --> 00:46:12,385 De pointees zijn gescheiden. 1117 00:46:12,385 --> 00:46:14,315 Eh, dus hoe maak je een pointee toewijzen? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK. 1120 00:46:15,960 --> 00:46:18,970 Nou, deze code toewijst een nieuw integer pointee, 1121 00:46:18,970 --> 00:46:20,950 en dit deel sets x om te wijzen op het. 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> He, dat ziet er beter uit. 1124 00:46:23,230 --> 00:46:25,060 Dus maak er iets aan te doen. 1125 00:46:25,060 --> 00:46:25,990 >> -OK. 1126 00:46:25,990 --> 00:46:30,455 Ik zal dereferentie de aanwijzer x om sla het nummer 42 in zijn pointee. 1127 00:46:30,455 --> 00:46:32,830 Voor deze truc, ik heb mijn Toverstaf van dereferentie. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> -Uw Toverstaf van dereferentie? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 Dat-- dat is geweldig. 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> -Dit is wat de code eruit ziet. 1134 00:46:41,080 --> 00:46:44,110 Ik zal gewoon het opzetten van het aantal, en de [POP] 1135 00:46:44,110 --> 00:46:44,700 >> He, kijk. 1136 00:46:44,700 --> 00:46:46,140 Daar gaat. 1137 00:46:46,140 --> 00:46:50,980 >> Dus het doen van een dereferentie op x volgt de pijl om toegang te krijgen tot de pointee. 1138 00:46:50,980 --> 00:46:53,160 In dit geval, een winkel 42 in. 1139 00:46:53,160 --> 00:46:57,710 Hey probeer het te gebruiken om het nummer op te slaan 13 van de andere pointer, y. 1140 00:46:57,710 --> 00:46:58,760 >> -OK. 1141 00:46:58,760 --> 00:47:03,270 Ik zal alleen gaan over hier naar y, en krijgt het nummer 13 set-up. 1142 00:47:03,270 --> 00:47:07,930 En dan neemt u de Wand van Dereferencing en gewoon [BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> Oh! 1144 00:47:08,960 --> 00:47:09,500 >> Oh, hey! 1145 00:47:09,500 --> 00:47:11,090 Dat werkte niet. 1146 00:47:11,090 --> 00:47:15,630 Zeggen, Binky, ik denk niet dat dereferentie y is een goed idee, want je weet, 1147 00:47:15,630 --> 00:47:17,850 het opzetten van de pointee is een afzonderlijke stap. 1148 00:47:17,850 --> 00:47:20,450 En ik denk niet dat we ooit gedaan heeft. 1149 00:47:20,450 --> 00:47:21,480 >> -goede Punt. 1150 00:47:21,480 --> 00:47:21,980 -Ja. 1151 00:47:21,980 --> 00:47:25,680 We toegewezen de aanwijzer y, maar we nooit zet deze om te wijzen op een pointee. 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> -zeer Oplettend. 1154 00:47:28,616 --> 00:47:30,240 Hey, je ziet er goed uit daar, Binky. 1155 00:47:30,240 --> 00:47:33,400 Kunt u het probleem te verhelpen, zodat y punten dezelfde pointee als x? 1156 00:47:33,400 --> 00:47:34,000 >> Tuurlijk. 1157 00:47:34,000 --> 00:47:36,780 Ik zal mijn Toverstaf gebruiken van Pointer Opdracht. 1158 00:47:36,780 --> 00:47:38,740 >> Is dat gaat worden een probleem als voorheen? 1159 00:47:38,740 --> 00:47:39,240 Nee. 1160 00:47:39,240 --> 00:47:40,660 Dit is niet van de pointees raken. 1161 00:47:40,660 --> 00:47:44,450 Het verandert slechts een pointer naar wijzen naar hetzelfde als het andere. 1162 00:47:44,450 --> 00:47:45,450 >> Oh, ik zie het. 1163 00:47:45,450 --> 00:47:48,200 Nu y punten naar dezelfde plaats als x. 1164 00:47:48,200 --> 00:47:48,910 Dus wacht. 1165 00:47:48,910 --> 00:47:49,950 Nu, wordt y vast. 1166 00:47:49,950 --> 00:47:51,120 Het heeft een pointee. 1167 00:47:51,120 --> 00:47:54,510 Dus je kunt proberen de Wand van Opnieuw dereferencing naar de 13 dan verzenden. 1168 00:47:54,510 --> 00:47:56,510 >> Eh, OK. 1169 00:47:56,510 --> 00:47:58,160 Hier gaat. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> He, kijk eens aan. 1171 00:47:59,340 --> 00:48:00,750 Nu dereferencing werken op y. 1172 00:48:00,750 --> 00:48:04,991 En omdat de pointers delen die ene pointee, beiden zien de 13. 1173 00:48:04,991 --> 00:48:05,490 -Ja. 1174 00:48:05,490 --> 00:48:06,870 Delen, wat dan ook. 1175 00:48:06,870 --> 00:48:08,820 Dus gaan we nu plaats wisselen? 1176 00:48:08,820 --> 00:48:09,440 >> Oh, kijk. 1177 00:48:09,440 --> 00:48:10,830 We hebben geen tijd meer. 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> -Just Herinner me de wijzer drie regels. 1180 00:48:13,530 --> 00:48:16,560 Number One, de basisstructuur is dat je een pointer, 1181 00:48:16,560 --> 00:48:18,680 en het verwijst naar een pointee. 1182 00:48:18,680 --> 00:48:20,640 Maar de wijzer en pointee zijn gescheiden, 1183 00:48:20,640 --> 00:48:22,610 en de veel voorkomende fout is het opzetten van een pointer, 1184 00:48:22,610 --> 00:48:25,000 maar om te vergeten om het een pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Number Two, pointer dereferentie vanaf de aanwijzer 1186 00:48:28,170 --> 00:48:31,050 en volgt de pijl boven om toegang te krijgen tot de pointee. 1187 00:48:31,050 --> 00:48:33,400 Zoals we allemaal weten, dit werkt alleen als er 1188 00:48:33,400 --> 00:48:36,270 een pointee, wat voor soort komt terug naar Regel nummer een. 1189 00:48:36,270 --> 00:48:39,000 >> Nummer drie, wijzer opdracht duurt een pointer 1190 00:48:39,000 --> 00:48:42,320 en verandert het om te wijzen op de Hetzelfde pointee als een andere aanwijzer. 1191 00:48:42,320 --> 00:48:44,160 Dus na de opdracht, de twee pointers 1192 00:48:44,160 --> 00:48:45,910 zal wijzen naar dezelfde pointee. 1193 00:48:45,910 --> 00:48:47,990 Soms, dat heet delen. 1194 00:48:47,990 --> 00:48:49,740 En dat is alles wat er is, echt. 1195 00:48:49,740 --> 00:48:50,277 Bye-bye nu. 1196 00:48:50,277 --> 00:48:51,110 [END VIDEO AFSPELEN] 1197 00:48:51,110 --> 00:48:52,568 DAVID J. MALAN: Dat is het voor CS50. 1198 00:48:52,568 --> 00:48:55,110 We zullen volgende week zien. 1199 00:48:55,110 --> 00:48:56,064