1 00:00:00,000 --> 00:00:10,970 >> [За възпроизвеждане на музика] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan: Добре. 3 00:00:12,536 --> 00:00:13,392 >> [СМЯХ] 4 00:00:13,392 --> 00:00:14,240 >> Добре дошъл. 5 00:00:14,240 --> 00:00:14,990 Това е CS50. 6 00:00:14,990 --> 00:00:16,890 А това в края на седмицата пет. 7 00:00:16,890 --> 00:00:20,020 И до сега, ние сме доста много са приемали за даденост, че има 8 00:00:20,020 --> 00:00:23,480 съществува този компилатор, звъня, че сте били позоваването чрез тази 9 00:00:23,480 --> 00:00:27,100 друг инструмент, наречен Уверете се, че по някакъв начин магически превръща вашия изходния код 10 00:00:27,100 --> 00:00:31,350 в обектен код, единиците и нулите че си компютри CPU, централната 11 00:00:31,350 --> 00:00:33,410 процесор, всъщност разбира. 12 00:00:33,410 --> 00:00:36,770 Но се оказва, че има номер, който е става под капака в 13 00:00:36,770 --> 00:00:38,690 между входа и изхода. 14 00:00:38,690 --> 00:00:41,800 >> И бих искал да Ви предложа плът че в малко по-подробно в 15 00:00:41,800 --> 00:00:45,130 тези четири стъпки, има нещо, наречено предварителна обработка, нещо 16 00:00:45,130 --> 00:00:48,300 нарича компилиране, което сме видели, нещо, наречено сглобяване и 17 00:00:48,300 --> 00:00:49,420 нещо, наречено свързване. 18 00:00:49,420 --> 00:00:53,270 Така че до момента, в някои от нашите програми, сме имали остър включва. 19 00:00:53,270 --> 00:00:56,650 Съвсем наскоро имахме някои остри определя за константи. 20 00:00:56,650 --> 00:01:00,660 Така се оказва, че тези неща, които имат за префикс хеш символ или 21 00:01:00,660 --> 00:01:04,150 лирата символ са предварително процесор директиви. 22 00:01:04,150 --> 00:01:07,960 Това е просто един луксозен начин на казвайки, че е линия на кода, който е всъщност 23 00:01:07,960 --> 00:01:12,280 превръща в нещо друго преди компютър, дори се опитват да конвертирате вашите 24 00:01:12,280 --> 00:01:13,800 програма в нули и единици. 25 00:01:13,800 --> 00:01:19,000 >> Например, рязко включва стандартната I / O. Ч, доста много просто означава, отидете 26 00:01:19,000 --> 00:01:24,010 напред, вземете съдържанието на файловете stdio.h и да ги поставите там. 27 00:01:24,010 --> 00:01:25,880 Така че няма нули и единици в този момент все още. 28 00:01:25,880 --> 00:01:27,470 Това е наистина само една смяна. 29 00:01:27,470 --> 00:01:30,790 И това е направено по време на така наречената предварителна обработка етап, когато можете 30 00:01:30,790 --> 00:01:34,230 всъщност тече звъня или специално Уверете се в повечето случаи. 31 00:01:34,230 --> 00:01:36,950 Така че всичко това се случва първо автоматично до този момент. 32 00:01:36,950 --> 00:01:38,800 >> След това идва и компилация стъпка. 33 00:01:38,800 --> 00:01:40,920 Но ние сме били опростени компилация. 34 00:01:40,920 --> 00:01:45,060 Съставяне на програма наистина означава да Вземете го от нещо като C, на 35 00:01:45,060 --> 00:01:48,430 изходния код, ние сме били писмено, надолу за нещо, наречено събрание. 36 00:01:48,430 --> 00:01:52,900 Събрание език е по-ниско ниво език, който, за щастие, няма да 37 00:01:52,900 --> 00:01:55,480 са много по повод на пиша този семестър. 38 00:01:55,480 --> 00:01:59,100 Но това е най-ниското ниво в смисъл, че буквално започна да пиша 39 00:01:59,100 --> 00:02:04,270 събира и изважда и да се размножават и да заредите от паметта и запишете на паметта, 40 00:02:04,270 --> 00:02:08,259 много основни инструкции, че един компютър, под предния капак, 41 00:02:08,259 --> 00:02:09,639 всъщност разбира. 42 00:02:09,639 --> 00:02:14,930 >> На последно място, сглобяване отнема този език с нули и единици, които ние сме били 43 00:02:14,930 --> 00:02:16,190 описва този момент. 44 00:02:16,190 --> 00:02:19,270 И наистина накрая, има така наречената свързваща фаза, които ние ще 45 00:02:19,270 --> 00:02:22,360 виж в един момент, който съчетава Вашите нули и единици с нули и 46 00:02:22,360 --> 00:02:24,870 тези на други хора, преди да сте създали. 47 00:02:24,870 --> 00:02:26,660 >> Така смятат, че това супер проста програма. 48 00:02:26,660 --> 00:02:27,560 Той беше от седмица 1. 49 00:02:27,560 --> 00:02:29,610 Той току-що каза, Hello World, на екрана. 50 00:02:29,610 --> 00:02:30,920 Направихме това чрез звъня. 51 00:02:30,920 --> 00:02:33,200 Или ние се завтече през него Уверете който се проведе звъня. 52 00:02:33,200 --> 00:02:36,170 И изведена в момента, когато някои нули и единици. 53 00:02:36,170 --> 00:02:38,100 Но се оказва, че е междинна стъпка. 54 00:02:38,100 --> 00:02:40,460 Ако отида тук - Извинете, не Искам да го видя, все още. 55 00:02:40,460 --> 00:02:44,800 Ако отида тук, за да си уреди и аз се отворят hello.c, тук 56 00:02:44,800 --> 00:02:46,160 е, че същата програма. 57 00:02:46,160 --> 00:02:48,600 И това, което ще направя в моя терминал прозорец тук е, че ще 58 00:02:48,600 --> 00:02:51,430 тече звъня, а не производител, който автоматизира всички четири 59 00:02:51,430 --> 00:02:52,870 тези стъпки, за нас. 60 00:02:52,870 --> 00:02:58,620 И аз ще направя звън-S и тогава hello.c и след това въведете. 61 00:02:58,620 --> 00:03:00,590 >> И получавам мига бързо отново, което е добре. 62 00:03:00,590 --> 00:03:05,280 И сега в малко по-голям прозорец, Ще се отвори Gedit тук. 63 00:03:05,280 --> 00:03:09,610 И аз отивам да отвори файл, който, Оказва се, се нарича hello.s това 64 00:03:09,610 --> 00:03:11,870 съдържа този асемблер Аз по-рано. 65 00:03:11,870 --> 00:03:15,060 И това е, което се нарича събрание език, сравнително ниско ниво 66 00:03:15,060 --> 00:03:18,470 инструкциите, които ви Intel CPU или каквото и да е, че е вътре 67 00:03:18,470 --> 00:03:19,350 разбира. 68 00:03:19,350 --> 00:03:24,480 И MOV е постъпка. повикване за призовава, на много ниско ниво функция. 69 00:03:24,480 --> 00:03:26,380 под е за изваждане. 70 00:03:26,380 --> 00:03:30,370 >> Така че, когато имате определен CPU вътре на компютъра си, какво прави 71 00:03:30,370 --> 00:03:34,300 различни, в сравнение с други процесори на пазар, който е инструкции, които той 72 00:03:34,300 --> 00:03:39,460 разбира и често колко ефективно го е, колко бързо тя е в изпълнение на някои 73 00:03:39,460 --> 00:03:40,380 на тези инструкции. 74 00:03:40,380 --> 00:03:45,150 Сега за повече по този въпрос, можете да вземете Следващата есен CS61 в колежа. 75 00:03:45,150 --> 00:03:48,170 Но тук имаме, например, няколко идентификатори, които може да ви се стори познато. 76 00:03:48,170 --> 00:03:50,150 hello.c е името на програмата. 77 00:03:50,150 --> 00:03:51,070 >> . Текст - 78 00:03:51,070 --> 00:03:54,190 там не е много на интереси има Просто сега, припомни, че текстът 79 00:03:54,190 --> 00:03:59,190 сегмент, като от понеделник, е мястото, където в паметта на програмата всъщност завършва. 80 00:03:59,190 --> 00:04:01,330 Така че това е най-малко неясно запознати там. 81 00:04:01,330 --> 00:04:03,730 Тук, разбира се, е да се споменава на основната ни функция. 82 00:04:03,730 --> 00:04:07,220 Превъртите надолу, те се отнасят до неща наречените регистри, много малки парченца 83 00:04:07,220 --> 00:04:09,190 вътрешна памет на действителните си CPU. 84 00:04:09,190 --> 00:04:12,930 И ако превъртите надолу дори Освен това, виждам някаква 85 00:04:12,930 --> 00:04:14,240 косвено споменаване на ASCII. 86 00:04:14,240 --> 00:04:17,120 И, наистина, е, че низ, Здравейте, запетая света. 87 00:04:17,120 --> 00:04:20,079 >> Така че, дълга история накратко, това е случва за вас, автоматично, 88 00:04:20,079 --> 00:04:22,140 под капака всичко това време. 89 00:04:22,140 --> 00:04:26,450 И какво се случва наистина е веднъж ви е свършило звъня, или под формата на 90 00:04:26,450 --> 00:04:29,150 Уверете се, сте се първо, от изходния код, на 91 00:04:29,150 --> 00:04:30,700 така наречените асемблер. 92 00:04:30,700 --> 00:04:35,210 После звъня е конвертирането на това събрание език до нули и единици. 93 00:04:35,210 --> 00:04:38,340 И това е слайд, който започнахме нашата дискусия в Седмица 0 по - 94 00:04:38,340 --> 00:04:39,840 и след 1 седмица на. 95 00:04:39,840 --> 00:04:44,030 И накрая, тези нули и единици се комбинират с единиците и нулите 96 00:04:44,030 --> 00:04:47,190 от тези библиотеки, които сме приемали за даденост, като Standard I / O или 97 00:04:47,190 --> 00:04:50,010 String библиотека или дори CS50 на библиотеката. 98 00:04:50,010 --> 00:04:54,200 >> Така че да нарисува тази картина още визуално, ние имаме hello.c. 99 00:04:54,200 --> 00:04:57,220 И това, разбира се, използва ФОРМАТ функционира да кажа, здравей свят. 100 00:04:57,220 --> 00:05:01,810 Съставянето стъпка отнема до този файл, току-що видяхме hello.s, дори 101 00:05:01,810 --> 00:05:04,290 макар, че е обикновено се изтриват автоматично за вас. 102 00:05:04,290 --> 00:05:06,050 Но това е монтаж код в средата стъпка. 103 00:05:06,050 --> 00:05:09,750 И тогава, когато съберем на събрание език, така да се каже, че е, когато 104 00:05:09,750 --> 00:05:10,830 получите тези нули и единици. 105 00:05:10,830 --> 00:05:13,920 Така че ние увеличени ефективно днес това, което сме приемали за даденост, 106 00:05:13,920 --> 00:05:16,430 означава ще изходния код към обектния код. 107 00:05:16,430 --> 00:05:18,850 >> Но накрая, сега, че една и съща картина - нека си го бутам към 108 00:05:18,850 --> 00:05:20,020 от лявата страна. 109 00:05:20,020 --> 00:05:22,880 И имайте предвид, че в началото има Споменах stdio.h. 110 00:05:22,880 --> 00:05:25,030 Това е файл, който сме включили в почти всички 111 00:05:25,030 --> 00:05:26,250 програми, които сме написали. 112 00:05:26,250 --> 00:05:28,830 И това е файл, чието съдържание се поставя копие, 113 00:05:28,830 --> 00:05:30,350 ефективно върха си код. 114 00:05:30,350 --> 00:05:34,170 Но се оказва, че на компютър системата някъде, има вероятно по 115 00:05:34,170 --> 00:05:39,150 stdio.c файл, че някой пише година Преди това изпълнява всички 116 00:05:39,150 --> 00:05:41,870 функции, които са били декларирани в stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Сега в действителност вероятно не е на вашия Mac или вашия компютър или дори в 118 00:05:45,465 --> 00:05:47,660 CS50 уреда е сурова код C. 119 00:05:47,660 --> 00:05:52,710 Някой вече го е съставило и включени . О файл за обектен код или. На 120 00:05:52,710 --> 00:05:56,020 файл, който се позовава на споделена библиотека , който е бил предварително инсталиран и 121 00:05:56,020 --> 00:05:57,240 предварително изготвя за вас. 122 00:05:57,240 --> 00:06:01,950 Но да предположим, че наистина съществува на нашия компютър stdio.c паралелно 123 00:06:01,950 --> 00:06:02,650 с звъня. 124 00:06:02,650 --> 00:06:04,960 Вашият код е да бъдат съставени и сглобени. 125 00:06:04,960 --> 00:06:09,200 stdio.c лидер код се компилират и сглобени, така че тази последната 126 00:06:09,200 --> 00:06:13,730 стъпка, тук долу, ние трябва да по някакъв начин връзка, така да се каже, си нули и единици 127 00:06:13,730 --> 00:06:18,430 с неговите или нейните нули и единици в една проста програма, която в крайна сметка е 128 00:06:18,430 --> 00:06:20,540 наречен просто Hello. 129 00:06:20,540 --> 00:06:23,340 >> Така че това е всичко, на магията, която е се случва до този момент. 130 00:06:23,340 --> 00:06:26,430 И ще продължи да предприема тези процеси за даденост, но осъзнават, 131 00:06:26,430 --> 00:06:28,750 има много пикантни подробности става под там. 132 00:06:28,750 --> 00:06:31,920 И това е, което прави компютър с Intel отвътре 133 00:06:31,920 --> 00:06:33,940 особено важно. 134 00:06:33,940 --> 00:06:37,020 >> Така че на тази бележка, ако искате да присъединете се към нас за обяд в петък, трябва да излизат 135 00:06:37,020 --> 00:06:41,570 на обичайната cs50.net/rsvp място, 13:15 този петък. 136 00:06:41,570 --> 00:06:43,400 И сега няколко съобщения. 137 00:06:43,400 --> 00:06:44,670 Така че ние имаме добри новини. 138 00:06:44,670 --> 00:06:45,970 И ние имаме лоши новини. 139 00:06:45,970 --> 00:06:47,260 Започнете с някои добри новини тук. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Стенеха] 142 00:06:54,510 --> 00:06:54,710 >> Добре. 143 00:06:54,710 --> 00:06:56,670 Е, това е технически почивка, така че това не е толкова много, подарък от нас. 144 00:06:56,670 --> 00:06:58,030 Но лошата новина, разбира се. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Стенеха] 147 00:07:01,880 --> 00:07:03,530 >> Прекарах много време на тези анимации. 148 00:07:03,530 --> 00:07:04,690 >> [СМЯХ] 149 00:07:04,690 --> 00:07:07,000 >> Ще има сесия преглед идния понеделник. 150 00:07:07,000 --> 00:07:08,340 Това ще бъде най-17:30. 151 00:07:08,340 --> 00:07:11,210 Ние ще ви напомни на всички тези детайли по електронната поща на курса 152 00:07:11,210 --> 00:07:13,470 сайт само за няколко дни път. 153 00:07:13,470 --> 00:07:16,610 Той ще бъде заснет и се предоставят скоро след това. 154 00:07:16,610 --> 00:07:19,200 Така че, ако не може да направи, че понеделник Слот за нощ, не се притеснявайте. 155 00:07:19,200 --> 00:07:22,270 Секции това следващата седмица също ще се фокусира върху оценка за тест. 156 00:07:22,270 --> 00:07:25,670 Ако си част е в понеделник, което е наистина университета почивка, ние ще 157 00:07:25,670 --> 00:07:26,920 все още се срещат в раздел. 158 00:07:26,920 --> 00:07:28,890 Ако просто не може да направи това раздел, защото започваш 159 00:07:28,890 --> 00:07:29,860 далеч, това е добре. 160 00:07:29,860 --> 00:07:33,710 Участие в неделя или вторник раздел или мелодия-в раздел на Джейсън, който е 161 00:07:33,710 --> 00:07:35,110 достъпни онлайн. 162 00:07:35,110 --> 00:07:37,490 >> Така че, по-лоши новини. 163 00:07:37,490 --> 00:07:41,960 Така съгласно учебната програма, имаме лекция следващия петък. 164 00:07:41,960 --> 00:07:43,690 Но добрата новина - 165 00:07:43,690 --> 00:07:44,860 Ясно е, че съм прекарал твърде много време в това. 166 00:07:44,860 --> 00:07:45,280 >> [СМЯХ] 167 00:07:45,280 --> 00:07:47,140 >> Ще затвори Следващи лекции в петък. 168 00:07:47,140 --> 00:07:50,590 Така че това ще бъде подарък за нас, така че наистина може да имат хубава почивка в 169 00:07:50,590 --> 00:07:52,990 между тази седмица и от две седмици оттам. 170 00:07:52,990 --> 00:07:57,460 Така че без лекции следващата седмица, само една малка малко викторина, за които трябва да бъде в 171 00:07:57,460 --> 00:07:59,030 става все по-развълнувани. 172 00:07:59,030 --> 00:08:03,870 >> Така че нека сега обърнем вниманието си към нещо, което е наистина по-визуални 173 00:08:03,870 --> 00:08:06,990 и по-вълнуващо и да постави на сцената за това, което ще бъде на хоризонта 174 00:08:06,990 --> 00:08:08,420 само за няколко седмици време. 175 00:08:08,420 --> 00:08:12,160 След първия тест, ще се превърне в Фокусът на проблемни групи в друга 176 00:08:12,160 --> 00:08:16,710 домейн конкретен проблем, че на съдебна медицина или за сигурност като цяло. 177 00:08:16,710 --> 00:08:19,550 >> Всъщност традицията с този проблем комплект е за мен един от най- 178 00:08:19,550 --> 00:08:24,850 преподаване колега или КО да пресечем кампуса, като някои снимки на 179 00:08:24,850 --> 00:08:29,450 разграничими, но не са очевидни хора, места или неща, тогава всяка година I 180 00:08:29,450 --> 00:08:34,520 някак си успяват да случайно изтриване или корумпирани цифровата карта медиите 181 00:08:34,520 --> 00:08:35,720 , че е вътре в нашата камера. 182 00:08:35,720 --> 00:08:36,860 Но не е голяма работа. 183 00:08:36,860 --> 00:08:39,200 Мога да отида напред и да включите че в компютъра ми. 184 00:08:39,200 --> 00:08:43,010 Мога да направя съдебномедицински образ на него, така че да се каже, чрез копиране на нули и 185 00:08:43,010 --> 00:08:46,830 тези край на тази карта с памет, независимо дали си на SD карта или компактна флаш карта или 186 00:08:46,830 --> 00:08:48,100 каквото и да си запознат. 187 00:08:48,100 --> 00:08:49,300 И тогава можем да предаде това. 188 00:08:49,300 --> 00:08:53,190 >> И така, предизвикателство, наред с други неща за вас, ще бъде да напишете 189 00:08:53,190 --> 00:08:58,630 C код, който възстановява цял куп JPEG файловете за мен и ще бъде разкрити 190 00:08:58,630 --> 00:09:00,190 тези хора, места или неща. 191 00:09:00,190 --> 00:09:03,340 И ще говорим в този проблем установени, и в идните дни, за 192 00:09:03,340 --> 00:09:04,440 графики като цяло. 193 00:09:04,440 --> 00:09:06,140 Ние сме ги използвали, а разбира се, за да избухне. 194 00:09:06,140 --> 00:09:09,080 Но ти вид се приема за даденост съществува тези високи понятия ниво 195 00:09:09,080 --> 00:09:10,680 на правоъгълници и овали. 196 00:09:10,680 --> 00:09:12,450 Но под предния капак има пиксела. 197 00:09:12,450 --> 00:09:14,370 И ти трябваше да започне мисля за тези. 198 00:09:14,370 --> 00:09:18,800 Или ще за р-комплект 4 трябва да се мисли за разликата между вашите тухли, как 199 00:09:18,800 --> 00:09:21,990 бързо топката, което се движи по екрана, за да избухне. 200 00:09:21,990 --> 00:09:24,830 Така че това понятие на точки от екрана, това е 201 00:09:24,830 --> 00:09:26,290 влезе в игра вече. 202 00:09:26,290 --> 00:09:29,430 >> Сега това, което виждате, все пак, е това, което можете да получите на екрана на компютъра. 203 00:09:29,430 --> 00:09:33,680 Ако някога сте гледания някоя стока или лошо TV, шансовете са те почти 204 00:09:33,680 --> 00:09:36,280 лечение на публиката като technophobes , които наистина не 205 00:09:36,280 --> 00:09:37,630 знам много за компютри. 206 00:09:37,630 --> 00:09:40,840 И така, това е много лесно за полицията детектив, за да кажа, може да 207 00:09:40,840 --> 00:09:41,710 почистване, че за мен? 208 00:09:41,710 --> 00:09:42,710 Или повишаване, нали? 209 00:09:42,710 --> 00:09:45,550 Подобряване е като бръмча дума в Най-всеки, свързано с престъпления шоу. 210 00:09:45,550 --> 00:09:49,240 А реалността е, ако приемате много размазани снимка на заподозрения правиш 211 00:09:49,240 --> 00:09:51,620 нещо лошо, не можеш Просто го засили. 212 00:09:51,620 --> 00:09:53,080 Вие не можете да я увеличите безкрайно. 213 00:09:53,080 --> 00:09:56,350 Вие не можете да видите в блясъка на някого око, който е извършил това 214 00:09:56,350 --> 00:09:59,860 специално престъпление, въпреки разпространението на тази по телевизията. 215 00:09:59,860 --> 00:10:04,110 >> И така, с това нека да мотивира, че бъдещият проблем, установен с поглед към 216 00:10:04,110 --> 00:10:05,765 няколко концерта, с който могат да бъдат запознати. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEO PLAYBACK] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Сега, нека да се получи добър поглед към вас. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> Го-Hold. 222 00:10:17,766 --> 00:10:18,658 Пусни го обратно. 223 00:10:18,658 --> 00:10:19,550 >> -Чакай малко. 224 00:10:19,550 --> 00:10:21,580 Отиди надясно. 225 00:10:21,580 --> 00:10:21,800 >> -Има. 226 00:10:21,800 --> 00:10:22,690 Freeze това. 227 00:10:22,690 --> 00:10:23,692 >> -Цял екран. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Freeze това. 230 00:10:24,154 --> 00:10:25,140 >> -Притегнете по този въпрос, ще ти? 231 00:10:25,140 --> 00:10:27,090 >> Vector-в на този човек от задно колело. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom в точно тук на това място. 233 00:10:29,730 --> 00:10:33,700 >> -С правилната техника, на изобразената може да бъде разширен и заточени. 234 00:10:33,700 --> 00:10:34,490 >> -Какво е това? 235 00:10:34,490 --> 00:10:35,870 >> -Това е аксесоар програма. 236 00:10:35,870 --> 00:10:36,793 >> -Може ли да се разбере, че до всеки? 237 00:10:36,793 --> 00:10:38,560 >> -Не знам. 238 00:10:38,560 --> 00:10:39,090 Нека да го засили. 239 00:10:39,090 --> 00:10:41,690 >> -Подобряване на раздел А-6. 240 00:10:41,690 --> 00:10:43,510 >> -I подобрени детайла и - 241 00:10:43,510 --> 00:10:44,456 >> -Мисля, че е достатъчно да се повиши. 242 00:10:44,456 --> 00:10:45,402 Освободете го да ми екран. 243 00:10:45,402 --> 00:10:47,300 >> -Подобряване на отражение в очите. 244 00:10:47,300 --> 00:10:49,330 >> -Нека да стартирате тази през видео аксесоар. 245 00:10:49,330 --> 00:10:50,340 >> -Едгар, може ли да подобри това? 246 00:10:50,340 --> 00:10:52,320 >> -Дръж се. 247 00:10:52,320 --> 00:10:54,290 >> -I've работи по този размисъл. 248 00:10:54,290 --> 00:10:55,560 >> -Някой размисъл. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Има размисъл на лицето на мъжа. 251 00:10:57,940 --> 00:10:58,860 >> -The размисъл. 252 00:10:58,860 --> 00:10:59,710 >> -Има размисъл. 253 00:10:59,710 --> 00:11:00,900 >> -Увеличаване на огледалото. 254 00:11:00,900 --> 00:11:03,500 >> -Можете да видите отражение. 255 00:11:03,500 --> 00:11:04,700 >> -Може ли да се изгради образ от тук? 256 00:11:04,700 --> 00:11:05,700 >> -Можеш ли да го подобри точно тук? 257 00:11:05,700 --> 00:11:06,500 >> -Може ли да го подобри? 258 00:11:06,500 --> 00:11:07,380 >> -Може ли да го подобри? 259 00:11:07,380 --> 00:11:08,190 >> -Може ли да подобри това? 260 00:11:08,190 --> 00:11:08,940 >> -Може ли да го подобри? 261 00:11:08,940 --> 00:11:10,280 >> -Изчакай малко, ще подобри. 262 00:11:10,280 --> 00:11:11,570 >> -Увеличаване на вратата. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [СМЯХ] 266 00:11:13,197 --> 00:11:14,360 >> -Преместване инча 267 00:11:14,360 --> 00:11:15,100 >> -Чакай, спри. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> IT-пауза. 270 00:11:16,290 --> 00:11:19,390 >> -Завъртане на 75 градуса около вертикалната моля. 271 00:11:19,390 --> 00:11:19,886 >> [СМЯХ] 272 00:11:19,886 --> 00:11:24,350 >> -Спрете, и обратно към част за вратата отново. 273 00:11:24,350 --> 00:11:26,330 >> -Имате изображение подобрител , които могат да растерна графика? 274 00:11:26,330 --> 00:11:28,990 >> -Може би трябва да използвате Pradeep Sen Начин да се види в прозорците. 275 00:11:28,990 --> 00:11:30,680 >> -Този софтуер е състоянието на техниката. 276 00:11:30,680 --> 00:11:31,676 >> -Иконата стойност е изключен. 277 00:11:31,676 --> 00:11:34,166 >> -С правилната комбинация на алгоритми. 278 00:11:34,166 --> 00:11:38,399 >> -Той е взел осветление алгоритми, за да следващото ниво и да мога да ги използвате, за да 279 00:11:38,399 --> 00:11:38,648 подобрите тази снимка. 280 00:11:38,648 --> 00:11:42,050 >> -Заключване на и разширяване на Z-ос. 281 00:11:42,050 --> 00:11:42,760 >> -Подобряване. 282 00:11:42,760 --> 00:11:43,060 >> -Подобряване. 283 00:11:43,060 --> 00:11:43,760 >> -Подобряване. 284 00:11:43,760 --> 00:11:45,010 >> Замръзване и подобряване. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END възпроизвеждане на видео] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: Така Проблем Set 5 е това, което предстои там. 288 00:11:51,470 --> 00:11:55,260 Така че ние скоро ще получите по-добро разбиране кога и защо можете да 289 00:11:55,260 --> 00:11:57,300 и нашата не може да подобри по този начин. 290 00:11:57,300 --> 00:12:00,090 Но първо, нека да се върне вниманието ни на някои от градивните блокове ще 291 00:12:00,090 --> 00:12:02,250 трябва да бъде в състояние да кажа, че историята. 292 00:12:02,250 --> 00:12:05,580 >> Така се припомни, че ние привлече тази картина на Понеделник и малко по-миналата седмица. 293 00:12:05,580 --> 00:12:09,970 И това описва разположението на нещата в паметта на компютъра, когато 294 00:12:09,970 --> 00:12:11,000 използвате някоя програма. 295 00:12:11,000 --> 00:12:14,310 Технологичният сегмент до върха, изземване, се отнася действителните нули и единици 296 00:12:14,310 --> 00:12:16,000 които съставят програмата си. 297 00:12:16,000 --> 00:12:19,340 Има, по-долу, че някои инициализира или неинициализирани данни, които обикновено 298 00:12:19,340 --> 00:12:22,910 се отнася до неща като константи или струни или глобални променливи, които имат 299 00:12:22,910 --> 00:12:24,200 били обявени предварително. 300 00:12:24,200 --> 00:12:26,500 Има куп, но ще дойдем върна на това след малко. 301 00:12:26,500 --> 00:12:27,410 >> И тогава там е стека. 302 00:12:27,410 --> 00:12:30,660 Много прилича на купчина тави в кафене, това е мястото, където паметта получава 303 00:12:30,660 --> 00:12:33,610 пластове и пластове, когато правиш това, което в програмата? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Какво е стека ползване? 306 00:12:37,730 --> 00:12:39,320 >> Да? 307 00:12:39,320 --> 00:12:40,000 >> Обадете се на функция. 308 00:12:40,000 --> 00:12:42,890 Всеки път, когато се обадя функция, тя е дава частица от паметта за неговото 309 00:12:42,890 --> 00:12:45,020 локални променливи или неговите параметри. 310 00:12:45,020 --> 00:12:48,810 И картинно, ние виждаме, че с всеки последователни функция, наречена, когато A 311 00:12:48,810 --> 00:12:52,520 призовава В извиква C призовава D, те се разслоява върху стека. 312 00:12:52,520 --> 00:12:55,630 И в рамките на всяка от тези парчета памет е по същество уникален обхвата 313 00:12:55,630 --> 00:12:58,590 за тази функция, която, разбира се, Проблематично е, ако искате да се раздават 314 00:12:58,590 --> 00:13:01,850 от една функция в друга Парче на данните, които го искат 315 00:13:01,850 --> 00:13:03,500 да мутира или да се промени. 316 00:13:03,500 --> 00:13:08,060 >> И така, какво е нашето решение да се даде възможност Функцията представлява от един стак 317 00:13:08,060 --> 00:13:11,390 рамка за промяна на вътрешна памет на друга стека кадър? 318 00:13:11,390 --> 00:13:14,590 Как тези двамата разговарят помежду си? 319 00:13:14,590 --> 00:13:18,510 Така чрез указатели или адреси, което, отново, просто опишете къде в 320 00:13:18,510 --> 00:13:22,280 памет, с помощта на определен ухапване номер, специално 321 00:13:22,280 --> 00:13:23,830 стойност може да се намери. 322 00:13:23,830 --> 00:13:26,860 Така спомням последния път, твърде продължихме историята и в нея 323 00:13:26,860 --> 00:13:28,280 доста лоша програма. 324 00:13:28,280 --> 00:13:32,900 И тази програма е бъгав за няколко причини, но най-тревожен е един 325 00:13:32,900 --> 00:13:34,620 тъй като не проверите какво? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Да, тя не успява да се провери на входа. 328 00:13:40,450 --> 00:13:41,870 Съжаляваме? 329 00:13:41,870 --> 00:13:43,880 >> Ако е повече от 12 символа. 330 00:13:43,880 --> 00:13:47,260 Така че, много изящно, когато се обаждате memcopy, които, както подсказва и името, просто 331 00:13:47,260 --> 00:13:50,630 копия памет от втория си довод в първия си аргумент. 332 00:13:50,630 --> 00:13:54,730 Третият аргумент, много изящно, е проверени, за да се уверите, че не 333 00:13:54,730 --> 00:13:59,400 копиране повече от, в този случай, продължителността на бар, броя на символите, 334 00:13:59,400 --> 00:14:03,810 в местоположението, което е тази масив C. Но проблемът е, че това, което 335 00:14:03,810 --> 00:14:07,230 ако C себе си не е достатъчно голям да се справиш с това? 336 00:14:07,230 --> 00:14:09,900 Отиваш да копирате броя на байта, че сте били дадени. 337 00:14:09,900 --> 00:14:13,040 Но какво всъщност трябва повече байта отколкото имате място за? 338 00:14:13,040 --> 00:14:16,770 >> Е, тази програма много глупава просто сляпо продължава да предприеме каквото и да е 339 00:14:16,770 --> 00:14:20,650 предвид, здравей наклонена черта 0 е чудесно, ако низ е кратък 340 00:14:20,650 --> 00:14:22,040 достатъчно, като пет символа. 341 00:14:22,040 --> 00:14:26,470 Но ако това е всъщност 12 знака или 1200 символа, видяхме последния път 342 00:14:26,470 --> 00:14:29,380 че просто ще напълно презапише памет, която 343 00:14:29,380 --> 00:14:30,470 не принадлежи на вас. 344 00:14:30,470 --> 00:14:34,390 И най-лошия случай, ако презапишете червена част там, че се обадихме на 345 00:14:34,390 --> 00:14:35,380 обратен адрес - 346 00:14:35,380 --> 00:14:38,370 това е само когато компютърът автоматично, за вас, зад 347 00:14:38,370 --> 00:14:43,130 сцени, басти като гост на 32-битова стойност, която напомня се на това, което би трябвало адрес 348 00:14:43,130 --> 00:14:47,080 се върне, когато Foo, тази друга функция, се прави изпълняващата. 349 00:14:47,080 --> 00:14:49,320 Това е една троха хляб на видове , за които се връща. 350 00:14:49,320 --> 00:14:52,490 Ако презапишете, потенциално, ако ти си лошо момче, да може 351 00:14:52,490 --> 00:14:54,750 потенциално поеме нечий компютър. 352 00:14:54,750 --> 00:14:58,020 И сигурно ще катастрофата е в повечето случаи. 353 00:14:58,020 --> 00:15:01,690 >> Сега този проблем е само изостря тъй като ние започнахме да говорим за памет 354 00:15:01,690 --> 00:15:03,010 управление като цяло. 355 00:15:03,010 --> 00:15:07,150 И изчистване, за разпределение на паметта, е функция, която можем да използваме, за да разпределят 356 00:15:07,150 --> 00:15:11,260 памет, когато ние не знаем предварително че може да се наложи някои. 357 00:15:11,260 --> 00:15:13,960 Така, например, ако се върна на уреда тук. 358 00:15:13,960 --> 00:15:21,010 И аз се отворят от последния път hello2.c, спомням тази програма тук, който изглеждаше 359 00:15:21,010 --> 00:15:23,500 малко нещо като това, само три линии - 360 00:15:23,500 --> 00:15:27,940 посочва името си, след низ име, в ляво, равен getstring. 361 00:15:27,940 --> 00:15:29,690 И след това да го отпечатате, името на потребителя. 362 00:15:29,690 --> 00:15:31,170 >> Така че това е супер проста програма. 363 00:15:31,170 --> 00:15:34,870 За да бъде ясно, нека да вървим напред и да направи здравей-2. 364 00:15:34,870 --> 00:15:36,680 Отивам да направя точка наклонена черта здравей-2. 365 00:15:36,680 --> 00:15:37,750 Посочете Вашето име - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Здравейте Дейвид. 369 00:15:39,540 --> 00:15:41,060 Това изглежда да работи OK. 370 00:15:41,060 --> 00:15:43,140 Но това, което наистина се случва под капака тук? 371 00:15:43,140 --> 00:15:44,670 Първо нека да свали някои слоеве. 372 00:15:44,670 --> 00:15:48,380 String е просто синоним ние сме осъзнах за какво? 373 00:15:48,380 --> 00:15:49,110 Char звезда. 374 00:15:49,110 --> 00:15:52,740 Така че нека да го правят малко по-мистериозен но технически правилно повече, че това 375 00:15:52,740 --> 00:15:55,570 е знак звезда, което означава, че име, да, е променлива. 376 00:15:55,570 --> 00:15:59,920 Но какво име магазините е адресът на на Чар, който се чувства малко странно 377 00:15:59,920 --> 00:16:01,050 защото аз се връщам низ. 378 00:16:01,050 --> 00:16:03,580 Аз съм се върна множествена символа не е Чар. 379 00:16:03,580 --> 00:16:07,400 >> Но, разбира се, вие се нуждаете само от първия Чар на адрес да се помни, когато 380 00:16:07,400 --> 00:16:08,870 целия низ е така, защото защо? 381 00:16:08,870 --> 00:16:12,700 Как да разбера, когато в края на низ е да се знае от самото начало? 382 00:16:12,700 --> 00:16:13,630 Обратно наклонената черта нула. 383 00:16:13,630 --> 00:16:17,260 Така че с тези две улики ви разбера преди началото и в края на 384 00:16:17,260 --> 00:16:20,280 всеки низ са, толкова дълго, тъй като те са правилно оформена с които нищожна 385 00:16:20,280 --> 00:16:22,110 терминатор, че наклонена черта нула. 386 00:16:22,110 --> 00:16:24,520 >> Но това се обажда getstring. 387 00:16:24,520 --> 00:16:28,020 И се оказва, че getstring през цялото това време е било вид 388 00:16:28,020 --> 00:16:28,820 измама за нас. 389 00:16:28,820 --> 00:16:32,460 Той е правил това на труда, за да се уверите, удар с низ от потребителя. 390 00:16:32,460 --> 00:16:34,580 Но къде е това памет били идва? 391 00:16:34,580 --> 00:16:38,440 Ако се върнем на снимката тук и прилага определението от само 392 00:16:38,440 --> 00:16:42,610 преди малко, че топчето е мястото, където паметта отива, когато функциите се наричат, 393 00:16:42,610 --> 00:16:45,370 по тази логика, когато ти се обадя getstring, и след това въведете 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Въведете, където е D-A-V-I-D наклонена черта нула съхраняват, въз основа на 395 00:16:50,900 --> 00:16:53,480 история сме ни каза досега? 396 00:16:53,480 --> 00:16:55,190 >> Изглежда, че е в стека, нали? 397 00:16:55,190 --> 00:16:58,120 Когато се обадите получите низ получите Малко парче от паметта на стека. 398 00:16:58,120 --> 00:17:01,630 Така че, очевидно е, че D-A-V-I-D наклонена черта нула се съхранява 399 00:17:01,630 --> 00:17:02,770 има в стека. 400 00:17:02,770 --> 00:17:07,680 Но почакайте, getstring връща че низ, така да се каже, което означава, 401 00:17:07,680 --> 00:17:11,700 това е тава от кафенето е взето от стека. 402 00:17:11,700 --> 00:17:14,560 И ние казахме миналия път, че веднага след като функцията връща, и да приемете, че 403 00:17:14,560 --> 00:17:20,109 тава, така да се каже, от стека, което може да ви поеме около останките на 404 00:17:20,109 --> 00:17:21,819 този спомен? 405 00:17:21,819 --> 00:17:25,160 Някак ги преначерта като въпросителни знаци защото те ефективно се 406 00:17:25,160 --> 00:17:26,250 неизвестни стойности. 407 00:17:26,250 --> 00:17:29,500 Те могат да бъдат използвани при някои Следващата функция се нарича. 408 00:17:29,500 --> 00:17:31,870 >> С други думи, ако се случи да бъдат съхраняване - 409 00:17:31,870 --> 00:17:34,350 Ще се направи бърза снимка тук на стека. 410 00:17:34,350 --> 00:17:38,690 Ако се случи да бъде изготвянето на дъното на моята памет сегмент, и ще кажем, 411 00:17:38,690 --> 00:17:42,230 че това е мястото на паметта заета от главната и може би арг C и 412 00:17:42,230 --> 00:17:46,790 арг V и нещо друго в програмата, когато getstring се нарича, 413 00:17:46,790 --> 00:17:51,120 вероятно getstring получава парче памет тук. 414 00:17:51,120 --> 00:17:53,940 И тогава D-A-V-I-D някак озовава в тази функция. 415 00:17:53,940 --> 00:17:55,320 И аз отивам да опростява. 416 00:17:55,320 --> 00:18:00,050 Но нека приемем, че си D-A-V-I-D наклонена черта нула. 417 00:18:00,050 --> 00:18:03,500 Така че това много байта се използват в рамката за getstring. 418 00:18:03,500 --> 00:18:08,270 >> Но веднага след като getstring връща, ние каза миналия път, че тази памет над 419 00:18:08,270 --> 00:18:11,340 тук всичко става - woops! - 420 00:18:11,340 --> 00:18:14,270 всичко се превръща в ефективно изтрити. 421 00:18:14,270 --> 00:18:17,220 И ние можем да мислим за това сега като въпрос марка, защото кой знае 422 00:18:17,220 --> 00:18:18,720 какво ще стане с този спомен. 423 00:18:18,720 --> 00:18:22,130 Всъщност, аз много често наричат ​​функции различни от getstring. 424 00:18:22,130 --> 00:18:24,750 И веднага след като аз наричам някои други функция от getstring, може би не в 425 00:18:24,750 --> 00:18:28,860 тази конкретна програма, ние просто погледна но в друг, със сигурност някои други 426 00:18:28,860 --> 00:18:34,180 функция може да се свърши се дава следващото място в стека. 427 00:18:34,180 --> 00:18:39,410 >> Така че това не може да е толкова getstring магазини D-A-V-I-D в стека, защото бих 428 00:18:39,410 --> 00:18:41,040 веднага губят достъп до нея. 429 00:18:41,040 --> 00:18:43,720 Но ние знаем, те getstring връща само какво? 430 00:18:43,720 --> 00:18:47,220 Това не е връщане към ми шест символа. 431 00:18:47,220 --> 00:18:51,090 Това, което е наистина завръщането си ние заключаваме, последния път? 432 00:18:51,090 --> 00:18:52,480 Адресът на първия. 433 00:18:52,480 --> 00:18:56,650 Така че някак си, когато ми се обади getstring, това е разпределяне на парче памет за 434 00:18:56,650 --> 00:18:59,620 низа, че потребителите тип и след това се връщат адрес на него. 435 00:18:59,620 --> 00:19:02,930 И се оказва, че когато искате да функционира да бъде заделена памет в този 436 00:19:02,930 --> 00:19:08,390 начин и връщането на лицето, което нарича тази функция, адреса на 437 00:19:08,390 --> 00:19:11,870 че парче от паметта, сте абсолютно не може да го постави в стека в 438 00:19:11,870 --> 00:19:14,750 дъното, защото това е просто функционално да не ти стане много 439 00:19:14,750 --> 00:19:17,800 бързо, така че можете да се досещате, където ние вероятно ще го хвърля 440 00:19:17,800 --> 00:19:20,130 Вместо това, така наречената купчина. 441 00:19:20,130 --> 00:19:25,290 >> Така между дъното на паметта на оформление и горната част на паметта на 442 00:19:25,290 --> 00:19:26,820 оформлението са цял куп сегменти. 443 00:19:26,820 --> 00:19:29,270 Един от тях е на стека, и правото по-горе е на куп. 444 00:19:29,270 --> 00:19:33,680 И грамада е просто различен парче памет, която не се използва за функции 445 00:19:33,680 --> 00:19:34,770 когато те се наричат. 446 00:19:34,770 --> 00:19:38,100 Той е използван за по-дълъг срок на паметта, когато искате една функция, за да вземете някои 447 00:19:38,100 --> 00:19:42,700 памет и да може да се придържа към него без да губи контрол над него. 448 00:19:42,700 --> 00:19:45,550 >> Сега бихте могли може би веднага се види, че това не е 449 00:19:45,550 --> 00:19:48,060 непременно перфектен дизайн. 450 00:19:48,060 --> 00:19:51,350 Както вашата програма заделената памет на стека, или като ти се обадя по-и 451 00:19:51,350 --> 00:19:55,540 повече функции или докато се разпредели памет в хийпа с изчистване думата, тъй като 452 00:19:55,540 --> 00:20:00,690 getstring прави, това, което ясно изглежда неизбежен проблем? 453 00:20:00,690 --> 00:20:00,860 >> Точно така. 454 00:20:00,860 --> 00:20:03,150 Подобно на това, че тези стрелки са насочени един към друг 455 00:20:03,150 --> 00:20:04,380 не предвещава нищо добро. 456 00:20:04,380 --> 00:20:08,630 И наистина, бихме могли много бързо катастрофата програма във всяка редица начини. 457 00:20:08,630 --> 00:20:12,050 Всъщност, мисля, че може да се наложи направил това случайно веднъж. 458 00:20:12,050 --> 00:20:14,020 Или ако не, нека го направим умишлено сега. 459 00:20:14,020 --> 00:20:21,330 Позволете ми да отида напред и да пиша супер бързо на програма, наречена dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 И сега аз ще отида в тук и рязко се включват stdio.h. 461 00:20:26,730 --> 00:20:32,620 Да декларират функция Foo отнема без аргументи, което е 462 00:20:32,620 --> 00:20:34,040 обозначен както от невалидни. 463 00:20:34,040 --> 00:20:37,830 >> И единственото нещо, Foo ще направите, е повикване Foo, който вероятно не е 464 00:20:37,830 --> 00:20:39,100 най-умната идея, но така да бъде. 465 00:20:39,100 --> 00:20:40,490 Ent основната невалидни. 466 00:20:40,490 --> 00:20:45,270 Сега единственото нещо, основната ще да направите е да се обадя Foo, както добре. 467 00:20:45,270 --> 00:20:51,050 И просто за забавление, аз ще отида напред тук и да кажа ФОРМАТ "Hello от 468 00:20:51,050 --> 00:20:52,340 Foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Така че, ако не е правил грешки, Направи dontdothis точка наклонена черта. 471 00:21:00,160 --> 00:21:01,960 И да го направим в по-голяма прозореца - 472 00:21:01,960 --> 00:21:03,210 точка наклонена черта, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Хайде. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Ъъъ. 477 00:21:11,890 --> 00:21:13,100 Очевидно, можете да направите това. 478 00:21:13,100 --> 00:21:15,190 Дявол да го вземе. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Изчакайте. 481 00:21:16,580 --> 00:21:17,370 Готовност. 482 00:21:17,370 --> 00:21:18,270 Смятате ние - 483 00:21:18,270 --> 00:21:20,110 Ние го използвате с Уверете. 484 00:21:20,110 --> 00:21:22,050 >> [Въздишки] 485 00:21:22,050 --> 00:21:25,110 >> Знам, но аз мислим просто заличава това. 486 00:21:25,110 --> 00:21:28,410 Ъ-ъ, да. 487 00:21:28,410 --> 00:21:30,660 Дявол да го вземе. 488 00:21:30,660 --> 00:21:32,640 Решете този Rob. 489 00:21:32,640 --> 00:21:34,678 Какво? 490 00:21:34,678 --> 00:21:35,928 Това е много проста. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Да, ние се обърнахме оптимизация на разстояние. 493 00:21:47,360 --> 00:21:48,970 OK, щанд чао. 494 00:21:48,970 --> 00:21:49,950 Сега се чувствам по-добре. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Добре. 497 00:21:51,780 --> 00:21:53,430 >> Така че нека да компилирате това - 498 00:21:53,430 --> 00:21:55,880 Направи ли dontdothis. 499 00:21:55,880 --> 00:22:00,090 Може би трябва да преименувате това да dothis.c в един момент. 500 00:22:00,090 --> 00:22:00,710 Ето. 501 00:22:00,710 --> 00:22:01,240 Благодаря. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Така че фактът, че бях печат нещо беше всъщност само 504 00:22:05,480 --> 00:22:08,150 забавяне на процеса, чрез който ние щяха да стигнат до тази точка. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Пфу! 507 00:22:08,870 --> 00:22:11,180 >> Така че това, което всъщност се случва? 508 00:22:11,180 --> 00:22:14,440 Причината там, само като настрана, е прави нищо по отношение на приноса и 509 00:22:14,440 --> 00:22:17,270 изход е по-бавна, защото трябва да напишете знака на 510 00:22:17,270 --> 00:22:18,600 екрана, това трябва да преминете. 511 00:22:18,600 --> 00:22:21,720 Така че, дълга история кратко, имах действително стана толкова нетърпелив, ние ще трябва 512 00:22:21,720 --> 00:22:23,260 виждал този краен резултат, както добре. 513 00:22:23,260 --> 00:22:26,220 Сега, когато имам път на печат прозорци, ние го видя веднага. 514 00:22:26,220 --> 00:22:28,410 Така че, защо се случва това. 515 00:22:28,410 --> 00:22:31,300 Е, просто обяснение, разбира се, е, че Foo би не трябва да 516 00:22:31,300 --> 00:22:32,500 да се обажда. 517 00:22:32,500 --> 00:22:34,470 >> Сега в общи линии, това е рекурсия. 518 00:22:34,470 --> 00:22:36,970 И ние решихме, че след няколко седмици Преди рекурсивни е добро. 519 00:22:36,970 --> 00:22:40,330 Рекурсията е този магически начин на изразява себе си супер накратко. 520 00:22:40,330 --> 00:22:41,400 И тя просто работи. 521 00:22:41,400 --> 00:22:45,060 Но има една основна характеристика на всички рекурсивните програми за които се говори 522 00:22:45,060 --> 00:22:48,260 около и погледна към този момент, която е, че те са имали какво? 523 00:22:48,260 --> 00:22:52,610 A базовия модел, което е известно твърди кодирани случай, че се казва в някои ситуации 524 00:22:52,610 --> 00:22:56,210 не поставят Foo, което е ясно случая не е така. 525 00:22:56,210 --> 00:22:58,920 >> Така че това, което наистина се случва от гледна точка на тази снимка? 526 00:22:58,920 --> 00:23:01,790 Е, когато основният призовава Foo, тя получава парче от паметта. 527 00:23:01,790 --> 00:23:04,150 Когато Foo Foo призовава, той получава парче памет. 528 00:23:04,150 --> 00:23:06,430 Когато Foo Foo призовава, той получава парче. 529 00:23:06,430 --> 00:23:07,080 Той получава парче. 530 00:23:07,080 --> 00:23:08,120 Той получава парче. 531 00:23:08,120 --> 00:23:09,460 Защото никога не се връща Foo. 532 00:23:09,460 --> 00:23:12,160 Ние никога няма да бъдете изтриване един от тези, рамки от комина. 533 00:23:12,160 --> 00:23:15,930 Така че духаше през куп не, да спомена кой знае още какво, и 534 00:23:15,930 --> 00:23:19,600 ние превишаване пределите на нашата така наречените сегмент на паметта. 535 00:23:19,600 --> 00:23:21,790 Грешка отидете сегментация неверни. 536 00:23:21,790 --> 00:23:24,110 >> Така че разтворът има явно не го прави. 537 00:23:24,110 --> 00:23:28,830 Но по-голямата Изводът е, че, да, има абсолютно известно ограничение 538 00:23:28,830 --> 00:23:32,470 дори и ако не е добре определена, за това как много функции, които можете да се обаждате в 539 00:23:32,470 --> 00:23:34,970 програма, колко пъти на функция може да се обадите. 540 00:23:34,970 --> 00:23:38,430 И въпреки, че сме направили проповядват рекурсия тъй като това потенциално вълшебно нещо, което един 541 00:23:38,430 --> 00:23:41,870 Преди няколко седмици за сигма функция, и когато стигнем данните 542 00:23:41,870 --> 00:23:45,270 структури и CS50, ще видите друг приложения за нея, тя не е 543 00:23:45,270 --> 00:23:46,500 непременно най-доброто нещо. 544 00:23:46,500 --> 00:23:50,070 Защото, ако една функция извиква сама себе си, нарича себе си, дори и да има база 545 00:23:50,070 --> 00:23:54,860 случай, ако не се удари, че базовия модел за 1000 повиквания или 10 000 повиквания, от 546 00:23:54,860 --> 00:23:58,800 това време може да сте изчерпване на стая на вашия т.нар стека и хит 547 00:23:58,800 --> 00:24:00,400 някои други сегменти на паметта. 548 00:24:00,400 --> 00:24:03,950 Така че това също е дизайнерски компромис между елегантност и между 549 00:24:03,950 --> 00:24:06,920 устойчивостта на вашата конкретна изпълнение. 550 00:24:06,920 --> 00:24:10,780 >> Така че има и друг недостатък или Още нещо, за което сме 551 00:24:10,780 --> 00:24:11,720 правил до този момент. 552 00:24:11,720 --> 00:24:12,980 Когато се обадих getstring - 553 00:24:12,980 --> 00:24:15,120 позволете ми да се върна в здравей-2. 554 00:24:15,120 --> 00:24:18,170 Забележете, че се обаждам getstring, която се връща на адрес. 555 00:24:18,170 --> 00:24:20,730 И ние твърдят днес, че адрес е от куп. 556 00:24:20,730 --> 00:24:24,480 И сега аз съм отпечатване на низ на този адрес. 557 00:24:24,480 --> 00:24:27,000 Но никога не сме се нарича обратното на getstring. 558 00:24:27,000 --> 00:24:30,850 Ние никога не сме имали да Танцувам функция като ungetstring, къде си ръка назад 559 00:24:30,850 --> 00:24:31,610 че паметта. 560 00:24:31,610 --> 00:24:33,250 Но честно казано ние вероятно е трябвало да бъде. 561 00:24:33,250 --> 00:24:37,390 Защото, ако продължават да питат на компютъра за паметта, чрез някой като 562 00:24:37,390 --> 00:24:40,830 getstring никога, но го връщат обратно, със сигурност това също е на път да доведе до 563 00:24:40,830 --> 00:24:42,970 проблеми с което ни се свърши паметта. 564 00:24:42,970 --> 00:24:46,140 >> И в действителност, може да се търсят тези проблеми с нов инструмент, чието използване 565 00:24:46,140 --> 00:24:47,640 е малко загадъчен да въведете. 566 00:24:47,640 --> 00:24:50,960 Но нека да вървим напред и да го пръска нагоре на екрана в един момент. 567 00:24:50,960 --> 00:24:56,940 Аз ще отида напред и да тичам Valgrind с параметър, чиято първа команда 568 00:24:56,940 --> 00:25:00,260 Онлайн аргумент е името на тази програма здравей-2. 569 00:25:00,260 --> 00:25:02,650 И за съжаление това е продукция е отвратително 570 00:25:02,650 --> 00:25:04,290 Комплексът без основателна причина. 571 00:25:04,290 --> 00:25:06,280 Така ние виждаме цялата тази бъркотия. 572 00:25:06,280 --> 00:25:07,530 Дейвид е държавна името ми. 573 00:25:07,530 --> 00:25:09,760 Така че това е програмата действително работи. 574 00:25:09,760 --> 00:25:11,180 И сега ние се този изход. 575 00:25:11,180 --> 00:25:13,400 >> Така Valgrind е подобен в духа на GDB. 576 00:25:13,400 --> 00:25:14,950 Това не е дебъгер по себе си. 577 00:25:14,950 --> 00:25:16,270 Но това е памет за проверка. 578 00:25:16,270 --> 00:25:20,140 Това е програма, която ще пускате програма и да ви кажа, ако зададе 579 00:25:20,140 --> 00:25:23,860 компютър за памет и никога не я подаде назад, като по този начин означава, че имате 580 00:25:23,860 --> 00:25:24,570 изтичане на памет. 581 00:25:24,570 --> 00:25:26,240 И изтичане на памет са склонни да бъдат лоши. 582 00:25:26,240 --> 00:25:29,120 И ти е потребителите на компютри имат вероятно се усещат това, дали имате 583 00:25:29,120 --> 00:25:30,300 Mac или PC. 584 00:25:30,300 --> 00:25:33,730 Били ли сте някога използвали компютъра докато не рестартира и в няколко 585 00:25:33,730 --> 00:25:36,820 ден, или просто трябва много програмите, които работят, и проклетото нещо 586 00:25:36,820 --> 00:25:42,360 забавя на смилане спре, или поне това е супер досадно да се използва, защото 587 00:25:42,360 --> 00:25:44,350 всичко просто имам супер бавно. 588 00:25:44,350 --> 00:25:46,260 >> Сега, може да бъде всяка редица причини. 589 00:25:46,260 --> 00:25:49,600 Тя може да бъде един безкраен цикъл, бъг в някой код, или по-просто, това 590 00:25:49,600 --> 00:25:53,250 би могло да означава, че използвате по- памет, или се опитват да, отколкото си 591 00:25:53,250 --> 00:25:54,920 компютър всъщност има. 592 00:25:54,920 --> 00:25:57,770 И може би има грешка в някоя програма които продължават да питат за памет. 593 00:25:57,770 --> 00:26:02,480 Браузъри за година са известни с това, искаме повече и повече памет 594 00:26:02,480 --> 00:26:03,870 , но никога не я подаде обратно. 595 00:26:03,870 --> 00:26:07,220 Разбира се, ако имате само ограничен размера на паметта, не можете да зададете 596 00:26:07,220 --> 00:26:09,990 безкрайно много пъти за част от тази памет. 597 00:26:09,990 --> 00:26:13,070 >> И така, това, което виждате тук, въпреки че отново изход Valgrind е 598 00:26:13,070 --> 00:26:17,490 ненужно сложни, за да погледне Първо, това е най-интересната част. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 в използването на изход. 601 00:26:20,060 --> 00:26:22,810 Така че тук е колко памет е в употреба в купчина в 602 00:26:22,810 --> 00:26:24,300 време програмата ми излезе - 603 00:26:24,300 --> 00:26:27,280 очевидно шест байта в един блок. 604 00:26:27,280 --> 00:26:28,710 Така че аз ще да размахва ръцете си на каква блок е. 605 00:26:28,710 --> 00:26:31,270 Мислете за това е просто парче, по- техническа дума за парче. 606 00:26:31,270 --> 00:26:33,140 Но шест байта - 607 00:26:33,140 --> 00:26:36,870 Какви са шестте байтове, които все още са в употреба? 608 00:26:36,870 --> 00:26:37,390 >> Точно така. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D наклонена черта нула, пет писмо име плюс нула терминатор. 610 00:26:41,520 --> 00:26:46,350 Така че тази програма Valgrind забелязах, че поиска шест байта, както изглежда, от 611 00:26:46,350 --> 00:26:48,950 начин на getstring, но никога не Даде им обратно. 612 00:26:48,950 --> 00:26:52,030 И в действителност, това може да не е толкова Очевидно, ако моята програма не е три 613 00:26:52,030 --> 00:26:53,590 линии, но това е 300 линии. 614 00:26:53,590 --> 00:26:56,920 Така че ние всъщност може да даде друга команда аргумент линия Valgrind да 615 00:26:56,920 --> 00:26:58,290 да стане по-многословен. 616 00:26:58,290 --> 00:26:59,760 Това е малко досадно да се помни. 617 00:26:59,760 --> 00:27:01,580 Но ако го направя - 618 00:27:01,580 --> 00:27:01,930 нека да видим. 619 00:27:01,930 --> 00:27:03,540 Leak - 620 00:27:03,540 --> 00:27:05,030 Беше ли изтече - 621 00:27:05,030 --> 00:27:07,580 дори не си спомням какво е изключен ръка. 622 00:27:07,580 --> 00:27:08,550 >> - Течове проверка равнява пълно. 623 00:27:08,550 --> 00:27:10,180 Да, благодаря ви. 624 00:27:10,180 --> 00:27:12,520 - Течове проверка равнява пълно. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Същата програма се изпълнява. 627 00:27:14,940 --> 00:27:16,180 Въведете David отново. 628 00:27:16,180 --> 00:27:17,660 Сега виждам малко по-подробно. 629 00:27:17,660 --> 00:27:20,890 Но под купчина резюме, в което е идентичен с четири - ах, 630 00:27:20,890 --> 00:27:22,120 това е нещо хубаво. 631 00:27:22,120 --> 00:27:25,460 Сега Valgrind всъщност търсите малко по-трудно в моя код. 632 00:27:25,460 --> 00:27:29,580 И се казва, че, както изглежда, изчистване на ред - 633 00:27:29,580 --> 00:27:30,580 ние отдалечаване. 634 00:27:30,580 --> 00:27:31,980 В ред - 635 00:27:31,980 --> 00:27:32,930 ние не виждаме какво линията е то. 636 00:27:32,930 --> 00:27:35,110 Но изчистване е първият обвиняем. 637 00:27:35,110 --> 00:27:38,630 Има един блог, в изчистване. 638 00:27:38,630 --> 00:27:39,810 >> Ясно ли е? 639 00:27:39,810 --> 00:27:40,450 OK, не. 640 00:27:40,450 --> 00:27:40,940 Така ли е? 641 00:27:40,940 --> 00:27:42,520 Обадих getstring. 642 00:27:42,520 --> 00:27:44,460 getstring очевидно призовава изчистване. 643 00:27:44,460 --> 00:27:47,800 Така че това, което ред код е очевидно е виновен за това, че 644 00:27:47,800 --> 00:27:49,050 разпределени тази памет? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Да приемем, че всеки, който пише изчистване е бил наоколо достатъчно дълго, че това е 647 00:27:55,540 --> 00:27:56,390 не по тяхна вина. 648 00:27:56,390 --> 00:27:57,520 Така че това е може би моето. 649 00:27:57,520 --> 00:28:02,000 getstring в cs50.c - така че е подават някъде на компютъра - 650 00:28:02,000 --> 00:28:05,210 в съответствие 286 изглежда е виновника. 651 00:28:05,210 --> 00:28:08,140 Сега нека предположим, че CS50 е наоколо за прилична сума от време, така че 652 00:28:08,140 --> 00:28:09,720 ние също са безпогрешни. 653 00:28:09,720 --> 00:28:14,080 И така, вероятно не е в getstring че е бъг, а по-скоро в 654 00:28:14,080 --> 00:28:17,810 здравей-2.в линия 18. 655 00:28:17,810 --> 00:28:20,670 >> Така че нека да разгледаме това, че линията е 18. 656 00:28:20,670 --> 00:28:21,130 О. 657 00:28:21,130 --> 00:28:27,130 Някак си тази линия не е задължително бъги, сам по себе си, но това е причината 658 00:28:27,130 --> 00:28:28,630 зад това изтичане на памет. 659 00:28:28,630 --> 00:28:32,140 Така че, просто супер, какво би интуитивно да бъде решение тук? 660 00:28:32,140 --> 00:28:34,710 Ако питате за памет, никога не са били като го обратно, и че изглежда 661 00:28:34,710 --> 00:28:37,940 проблем, тъй като с течение на времето моя компютър могат да изчезнат от паметта, може да забави 662 00:28:37,940 --> 00:28:42,110 надолу, лоши неща може да се случи, е, каква е интуитивният решение? 663 00:28:42,110 --> 00:28:43,140 Просто го върна. 664 00:28:43,140 --> 00:28:44,770 >> Как да се освободи този спомен? 665 00:28:44,770 --> 00:28:49,970 Е, за щастие това е съвсем проста да кажем безплатно име. 666 00:28:49,970 --> 00:28:51,260 И никога не сме го и преди. 667 00:28:51,260 --> 00:28:55,890 Но по същество може да мисли за безплатно като противоположност на изчистване. 668 00:28:55,890 --> 00:28:58,030 безплатно е обратното на разпределяне на паметта. 669 00:28:58,030 --> 00:28:59,540 Така че сега нека да прекомпилирате. 670 00:28:59,540 --> 00:29:02,050 Направи здравей-2. 671 00:29:02,050 --> 00:29:04,620 Нека да го стартирате отново. здравей-2 David. 672 00:29:04,620 --> 00:29:07,290 Така че изглежда да работят в точно по същия начин. 673 00:29:07,290 --> 00:29:11,180 Но ако се върна да Valgrind и изпълнете отново че същата команда на моя наскоро 674 00:29:11,180 --> 00:29:14,720 изготвя програма, пишете в името ми, както и преди - 675 00:29:14,720 --> 00:29:15,370 Ница. 676 00:29:15,370 --> 00:29:16,760 Heap резюме - 677 00:29:16,760 --> 00:29:17,740 в използването на изход - 678 00:29:17,740 --> 00:29:19,370 нули при нулева блокове. 679 00:29:19,370 --> 00:29:21,840 И това е супер хубаво, всички натрупам блокове бяха освободени. 680 00:29:21,840 --> 00:29:23,480 Няма течове са възможни. 681 00:29:23,480 --> 00:29:27,200 >> Така че идва, а не с проблем Set 4, но с проблем Set 5, по съдебна медицина, 682 00:29:27,200 --> 00:29:30,740 и по-нататък, това също ще стане Мярка за правилността на своя 683 00:29:30,740 --> 00:29:33,630 програма, независимо дали сте или не сте или не разполагат с изтичане на памет. 684 00:29:33,630 --> 00:29:36,900 Но за щастие, не само можете да разсъждаваме чрез тях интуитивно, които 685 00:29:36,900 --> 00:29:40,430 е, може би, лесен за малки програми но по-трудно за по-големи програми, 686 00:29:40,430 --> 00:29:43,860 Valgrind, за тези по-големи програми, може да ви помогне да определите 687 00:29:43,860 --> 00:29:45,360 конкретния проблем. 688 00:29:45,360 --> 00:29:47,500 >> Но има и един друг проблем, които могат да възникнат. 689 00:29:47,500 --> 00:29:51,245 Позволете ми да се отворят този файл тук, което е, отново, малко прост пример. 690 00:29:51,245 --> 00:29:53,760 Но нека да се съсредоточи върху това, което прави тази програма. 691 00:29:53,760 --> 00:29:55,190 Това се нарича memory.c. 692 00:29:55,190 --> 00:29:58,380 Ние ще публикуваме това по-късно днес в цип на изходния код на днешния ден. 693 00:29:58,380 --> 00:30:01,610 И забелязвам, че имам нарича функция е, че не приема аргументи и 694 00:30:01,610 --> 00:30:02,800 не връща нищо. 695 00:30:02,800 --> 00:30:07,240 В ред 20, аз съм явно обявяване на указател към Int и наричайки я х. 696 00:30:07,240 --> 00:30:09,570 Аз възлагане е завръщането стойност на изчистване. 697 00:30:09,570 --> 00:30:14,590 И само за да бъде ясно, колко байта съм Аз може би се връща от изчистване 698 00:30:14,590 --> 00:30:17,080 в тази ситуация? 699 00:30:17,080 --> 00:30:18,040 >> Вероятно 40. 700 00:30:18,040 --> 00:30:18,840 Откъде черпиш, че от? 701 00:30:18,840 --> 00:30:22,410 Е, ако си спомняте, че едно цяло число е често 4 байта, най-малко е в 702 00:30:22,410 --> 00:30:25,110 уреда, 10 пъти 4 е очевидно 40. 703 00:30:25,110 --> 00:30:28,920 Така изчистване се връща адрес на парче памет и съхранение, които 704 00:30:28,920 --> 00:30:30,800 справяне в крайна сметка в х. 705 00:30:30,800 --> 00:30:32,570 Така че да е ясно, какво след това се случва? 706 00:30:32,570 --> 00:30:34,990 Е, нека да се върнете обратно да ни снимка тук. 707 00:30:34,990 --> 00:30:38,150 Нека не просто изготвя дъното на душата паметта на компютъра, нека да вървим напред и 708 00:30:38,150 --> 00:30:42,990 изготвя целия правоъгълник, който представлява съвкупност от всички ми RAM. 709 00:30:42,990 --> 00:30:44,790 >> Ще кажа, че топчето е на дъното. 710 00:30:44,790 --> 00:30:47,010 А има и текст сегмент в на неинициализирани данни. 711 00:30:47,010 --> 00:30:49,880 Но аз съм просто ще абстрактни тези, други неща, след като точка, точка точка. 712 00:30:49,880 --> 00:30:53,470 Аз съм просто ще се позове на тази като грамада на върха. 713 00:30:53,470 --> 00:30:57,070 И след това в долната част на тази снимка, да представлява основен, аз ще 714 00:30:57,070 --> 00:30:59,880 да му се даде филийки памет в стека. 715 00:30:59,880 --> 00:31:03,150 За е, аз ще го дам парче на паметта на стека. 716 00:31:03,150 --> 00:31:05,140 Сега, аз имам да се консултира ми изходния код отново. 717 00:31:05,140 --> 00:31:07,170 Какви са локални променливи за основен? 718 00:31:07,170 --> 00:31:10,710 Очевидно нищо, така че парче е ефективно празни или дори не е толкова голям, 719 00:31:10,710 --> 00:31:11,600 както съм го изготвен. 720 00:31:11,600 --> 00:31:15,730 Но е, имам локална променлива, който се нарича х. 721 00:31:15,730 --> 00:31:20,410 Така че аз ще отида напред и да е парче от паметта, като го нарече х. 722 00:31:20,410 --> 00:31:24,680 >> И сега изчистване на 10 пъти 4, Така изчистване 40, къде е, че 723 00:31:24,680 --> 00:31:25,430 памет идва? 724 00:31:25,430 --> 00:31:27,530 Ние не сме привлече снимката подобно преди. 725 00:31:27,530 --> 00:31:31,140 Но да предположим, че това е ефективно идва от тук, така че един, 726 00:31:31,140 --> 00:31:33,170 две, три, четири, пет. 727 00:31:33,170 --> 00:31:34,680 И сега имам нужда 40 от тях. 728 00:31:34,680 --> 00:31:37,540 Така че аз просто ще направя точка, точка, точка, за да показват че има дори и повече памет 729 00:31:37,540 --> 00:31:39,350 връщаща се от куп. 730 00:31:39,350 --> 00:31:40,710 Сега какъв е адреса? 731 00:31:40,710 --> 00:31:42,620 Да избираме произволно справяне както винаги - 732 00:31:42,620 --> 00:31:46,310 Ox123, въпреки че вероятно ще да бъде нещо съвсем различно. 733 00:31:46,310 --> 00:31:50,420 Това е адресът на първия байт памет, която Питам за изчистване. 734 00:31:50,420 --> 00:31:53,630 >> Така че в кратко, след ред 20 изпълнява, това, което е буквално 735 00:31:53,630 --> 00:31:57,170 съхраняват във вътрешността на х тук? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 И Ox е безинтересно. 739 00:32:01,550 --> 00:32:03,200 Това просто означава, тук е шестнадесетично число. 740 00:32:03,200 --> 00:32:06,490 Но това, което е важното е, че това, което съм магазин в X, който е локална променлива. 741 00:32:06,490 --> 00:32:10,260 Но си тип данни, отново, е адрес на вътр. 742 00:32:10,260 --> 00:32:12,710 Е, аз отивам да съхранявате Ox123. 743 00:32:12,710 --> 00:32:16,610 Но отново, ако това е малко прекалено усложнява излишно, ако превъртите 744 00:32:16,610 --> 00:32:21,490 назад, можем абстрактно това далеч доста разумно и просто да кажа, че х е 745 00:32:21,490 --> 00:32:23,910 указател към това парче на паметта. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Сега въпросът под ръка е следното - 748 00:32:26,230 --> 00:32:29,910 линия 21, се оказва, че е бъгав. 749 00:32:29,910 --> 00:32:31,160 Защо? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Съжаляваме? 752 00:32:36,930 --> 00:32:38,640 То не трябва - 753 00:32:38,640 --> 00:32:40,390 казват, че още веднъж. 754 00:32:40,390 --> 00:32:41,240 Е, това не е така безплатно. 755 00:32:41,240 --> 00:32:42,350 Така че това е второто, но. 756 00:32:42,350 --> 00:32:45,000 Така че има един друг, но конкретно по линия 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Точно така. 759 00:32:50,040 --> 00:32:54,980 Този прост ред на кода е просто препълване на буфер, буфер превишаване. 760 00:32:54,980 --> 00:32:57,050 A буфер просто означава, парче от паметта. 761 00:32:57,050 --> 00:33:01,520 Но това парче на паметта е с размер 10, 10 числа, което означава, че ако 762 00:33:01,520 --> 00:33:05,350 Индексът в него с помощта на синтактична захар на масив нотация, на площада 763 00:33:05,350 --> 00:33:09,220 скоби, имате достъп до х скоба 0 х 1 х скоба, 764 00:33:09,220 --> 00:33:10,390 скоба точка, точка, точка. 765 00:33:10,390 --> 00:33:13,270 х скоба 9 е най-голямата. 766 00:33:13,270 --> 00:33:17,680 Така че, ако го направя х скоба 10, когато Всъщност ще в паметта? 767 00:33:17,680 --> 00:33:19,120 >> Е, ако имам 10 вътр - 768 00:33:19,120 --> 00:33:21,070 нека всъщност изготвя всички от тези тук. 769 00:33:21,070 --> 00:33:22,700 Така че това е първият пет. 770 00:33:22,700 --> 00:33:24,660 Ето останалите пет цели числа. 771 00:33:24,660 --> 00:33:29,580 Така х скоба 0 е тук. х конзола 1 е тук. х скоба 9 е тук. х скоба 772 00:33:29,580 --> 00:33:37,960 10 е тук, което означава, казвам, в ред 21, на компютъра да се постави 773 00:33:37,960 --> 00:33:39,400 номер къде? 774 00:33:39,400 --> 00:33:42,010 Броят 0 къде? 775 00:33:42,010 --> 00:33:43,380 Е, това е 0, да. 776 00:33:43,380 --> 00:33:45,460 Но фактът, че си 0 е нещо като съвпадение. 777 00:33:45,460 --> 00:33:47,140 Тя може да бъде броят 50, за всички ни е грижа. 778 00:33:47,140 --> 00:33:50,480 Но ние се опитваме да го сложи на х скоба 10, което е, когато това 779 00:33:50,480 --> 00:33:53,700 въпросителен знак е изготвен, който не е нещо добро. 780 00:33:53,700 --> 00:33:57,070 Тази програма може много добре катастрофа като резултат. 781 00:33:57,070 --> 00:33:59,400 >> Сега, да вървим напред и да видим дали това е, наистина, какво се случва. 782 00:33:59,400 --> 00:34:02,600 Направи памет, тъй като файл се нарича memory.c. 783 00:34:02,600 --> 00:34:05,950 Да вървим напред и да тичам програмата памет. 784 00:34:05,950 --> 00:34:08,239 Така че извадихме късмет, всъщност, изглежда. 785 00:34:08,239 --> 00:34:09,340 Имахме късмет. 786 00:34:09,340 --> 00:34:11,060 Но нека да видим дали можем вече да пускат Valgrind. 787 00:34:11,060 --> 00:34:14,170 На пръв поглед, моята програма може изглежда да е съвсем верен. 788 00:34:14,170 --> 00:34:18,010 Но нека тече Valgrind с - Течове проверка равнява пълно на паметта. 789 00:34:18,010 --> 00:34:20,110 >> И сега, когато стартирате тази - 790 00:34:20,110 --> 00:34:21,030 интересно. 791 00:34:21,030 --> 00:34:26,800 Невалиден пиша с размер 4 на линия 21 от memory.c. 792 00:34:26,800 --> 00:34:29,284 Line 21 от memory.c е коя? 793 00:34:29,284 --> 00:34:30,340 О, интересно. 794 00:34:30,340 --> 00:34:31,080 Но чакайте. 795 00:34:31,080 --> 00:34:32,389 Размер на 4, което е, че предвид? 796 00:34:32,389 --> 00:34:34,969 Аз само не пиша, но е с размер 4. 797 00:34:34,969 --> 00:34:36,889 Защо е 4? 798 00:34:36,889 --> 00:34:39,280 Това е, защото това е едно цяло число, което отново е четири байта. 799 00:34:39,280 --> 00:34:42,510 Така Valgrind открили грешка, че аз, погледна моя код, не съм. 800 00:34:42,510 --> 00:34:45,040 И може би си TF биха или не биха. 801 00:34:45,040 --> 00:34:48,469 Какво Но Valgrind със сигурност установи, че ние сме направили грешка там, дори 802 00:34:48,469 --> 00:34:52,719 въпреки че извадихме късмет, и компютърът реши, нали, аз няма да се срине 803 00:34:52,719 --> 00:34:57,470 само защото сте докоснали един байт, един Int струва на паметта, че не сте 804 00:34:57,470 --> 00:34:58,550 действително си. 805 00:34:58,550 --> 00:35:00,380 >> Е, какво друго е бъгав тук. 806 00:35:00,380 --> 00:35:01,180 Адрес - 807 00:35:01,180 --> 00:35:03,190 Това е луда търсите адрес в шестнадесетичен вид. 808 00:35:03,190 --> 00:35:06,890 Това просто означава, някъде в грамада е нулеви байта след блок на площ 40 809 00:35:06,890 --> 00:35:07,620 се разпределя. 810 00:35:07,620 --> 00:35:10,610 Нека да я увеличите тук и да видим дали това е малко по-полезни. 811 00:35:10,610 --> 00:35:11,410 Интересно. 812 00:35:11,410 --> 00:35:15,600 40 байта определено са загубили до загуба записа 1 от 1. 813 00:35:15,600 --> 00:35:17,840 Отново, повече думи, отколкото е полезно тук. 814 00:35:17,840 --> 00:35:21,350 Но въз основа на маркираните линии, къде трябва да се съсредоточи вероятно ми 815 00:35:21,350 --> 00:35:24,070 внимание за още един бъг? 816 00:35:24,070 --> 00:35:26,570 Прилича на линия 20 от memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Така че, ако се върнем към ред 20, това е един, който сте открили по-рано. 818 00:35:30,990 --> 00:35:33,030 И това не е непременно бъги. 819 00:35:33,030 --> 00:35:35,160 Но ние имаме това обратно своите ефекти. 820 00:35:35,160 --> 00:35:38,790 Е, как да коригира най-малко един от тези грешки? 821 00:35:38,790 --> 00:35:42,240 Какво можех да направя, след ред 21? 822 00:35:42,240 --> 00:35:47,110 Не можех да направя без X, така е да върне този спомен. 823 00:35:47,110 --> 00:35:49,230 И как да го оправя този бъг? 824 00:35:49,230 --> 00:35:52,120 Аз определено трябва да отидете не по-далеч от 0. 825 00:35:52,120 --> 00:35:53,670 Така че нека да се опита да извърши отново това. 826 00:35:53,670 --> 00:35:56,080 Съжаляваме, определено отидете не по-далеч от 9. 827 00:35:56,080 --> 00:35:57,510 Направи памет. 828 00:35:57,510 --> 00:36:00,650 Нека разясняване Valgrind в по-голям прозорец. 829 00:36:00,650 --> 00:36:01,580 А сега погледнете. 830 00:36:01,580 --> 00:36:02,250 Ница. 831 00:36:02,250 --> 00:36:03,270 Всички натрупам блокове бяха освободени. 832 00:36:03,270 --> 00:36:04,270 Няма течове са възможни. 833 00:36:04,270 --> 00:36:07,520 И до тук по-горе, не се споменава повече от невалиден право. 834 00:36:07,520 --> 00:36:09,820 >> Просто, за да получите алчни, и нека виж, ако друга демонстрация 835 00:36:09,820 --> 00:36:11,050 не отива по предназначение - 836 00:36:11,050 --> 00:36:12,560 Аз съм се късметлия преди малко. 837 00:36:12,560 --> 00:36:15,530 И факта, че това е може би е 0 ненужно подвеждащи. 838 00:36:15,530 --> 00:36:20,650 Нека просто да направя 50, а до известна степен спорно брой, марка памет точка наклонена черта памет - 839 00:36:20,650 --> 00:36:21,410 все още се късметлия. 840 00:36:21,410 --> 00:36:22,510 Нищо не се е трясък. 841 00:36:22,510 --> 00:36:26,150 Да предположим, че просто правя нещо наистина глупаво, и аз правя 100. 842 00:36:26,150 --> 00:36:30,360 Нека римейк памет, точка наклонена черта памет - 843 00:36:30,360 --> 00:36:31,075 Извадихме късмет отново. 844 00:36:31,075 --> 00:36:32,800 Какво ще кажеш за 1000? 845 00:36:32,800 --> 00:36:35,370 целочислени отвъд, грубо, къде трябва да бъде? 846 00:36:35,370 --> 00:36:37,410 Направи памет - 847 00:36:37,410 --> 00:36:38,570 Дявол да го вземе. 848 00:36:38,570 --> 00:36:39,920 >> [СМЯХ] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Нека не бърникам вече. 851 00:36:43,920 --> 00:36:45,120 Повтаряне на паметта. 852 00:36:45,120 --> 00:36:45,840 Ето. 853 00:36:45,840 --> 00:36:46,410 Добре. 854 00:36:46,410 --> 00:36:52,500 Така че очевидно сте индекса 100000 целочислени отвъд, където трябва да са били в 855 00:36:52,500 --> 00:36:54,410 памет, се случват лоши неща. 856 00:36:54,410 --> 00:36:56,430 Така че това очевидно не е силен, бърз правило. 857 00:36:56,430 --> 00:36:58,190 Бях вид използване опити и грешка да отида там. 858 00:36:58,190 --> 00:37:02,230 Но това е така, защото, дълга история кратко, на вашия компютър с памет също е разделено 859 00:37:02,230 --> 00:37:03,580 в тези неща, призова сегменти. 860 00:37:03,580 --> 00:37:07,260 И понякога, компютърът действително ви е дал малко повече памет 861 00:37:07,260 --> 00:37:08,400 отколкото си поиска. 862 00:37:08,400 --> 00:37:12,170 Но за ефективност, това е просто по-лесно да получите повече памет, но само да ви кажа 863 00:37:12,170 --> 00:37:13,780 че сте се част от него. 864 00:37:13,780 --> 00:37:16,370 >> И ако имаш късмет, понякога, затова, че може да бъде в състояние да се докоснат 865 00:37:16,370 --> 00:37:17,795 памет, която не принадлежи на вас. 866 00:37:17,795 --> 00:37:21,860 Вие нямате гаранция, че това, което стойността поставите там ще остане там, защото 867 00:37:21,860 --> 00:37:25,080 на компютъра все още мисли, че не е твоя, но това не е непременно ще 868 00:37:25,080 --> 00:37:29,910 да удари друг сегмент на памет в компютър и предизвика такава грешка 869 00:37:29,910 --> 00:37:31,710 този тук. 870 00:37:31,710 --> 00:37:32,060 Добре. 871 00:37:32,060 --> 00:37:37,240 Всякакви въпроси, след това в паметта? 872 00:37:37,240 --> 00:37:37,590 >> Добре. 873 00:37:37,590 --> 00:37:40,610 Нека да разгледаме тук, а след това, в нещо, което съм бил като за 874 00:37:40,610 --> 00:37:48,361 предоставена от доста време, който е в този файл, наречен cs50.h. 875 00:37:48,361 --> 00:37:49,420 Така че това е файл. 876 00:37:49,420 --> 00:37:51,130 Това са само един куп на коментари до върха. 877 00:37:51,130 --> 00:37:53,900 И може да са се занимавали с това, ако ти мушна около уреда. 878 00:37:53,900 --> 00:37:57,000 Но се оказва, че през цялото време, , когато се използва за употреба низ като 879 00:37:57,000 --> 00:38:01,130 синоним, средствата, с които ние декларирахме че е синоним с този 880 00:38:01,130 --> 00:38:03,990 ключовата дума typedef, за определяне типа. 881 00:38:03,990 --> 00:38:07,500 И ние всъщност казва, да низ синоним на Чар звезда. 882 00:38:07,500 --> 00:38:11,190 Това, че средствата, с които стак създадени тези помощни колела, известни като 883 00:38:11,190 --> 00:38:12,040 низа. 884 00:38:12,040 --> 00:38:14,830 >> Сега тук е само прототип за getchar. 885 00:38:14,830 --> 00:38:17,350 Може да сме го виждали и преди, но това е Всъщност това, което прави. getchar 886 00:38:17,350 --> 00:38:19,070 възприема аргументи, връща Чар. 887 00:38:19,070 --> 00:38:21,340 getdouble възприема аргументи, връща двойно. 888 00:38:21,340 --> 00:38:24,440 getfloat възприема аргументи, се връща с плаваща запетая, и така нататък. 889 00:38:24,440 --> 00:38:27,270 getint е тук. getlonglong е тук. 890 00:38:27,270 --> 00:38:28,820 И getstring е тук. 891 00:38:28,820 --> 00:38:29,420 И това е всичко. 892 00:38:29,420 --> 00:38:33,080 Това лилава линия е друг Препроцесорът директива поради 893 00:38:33,080 --> 00:38:35,550 hashtag в началото на това. 894 00:38:35,550 --> 00:38:35,870 >> Добре. 895 00:38:35,870 --> 00:38:38,380 Така че сега да ме пусне в cs50.c. 896 00:38:38,380 --> 00:38:40,400 И ние няма да говоря твърде дълго за това. 897 00:38:40,400 --> 00:38:43,280 Но за да ви дам един поглед на това, което е продължава всичко това 898 00:38:43,280 --> 00:38:46,434 време, пусни ме да - 899 00:38:46,434 --> 00:38:48,250 нека да направим getchar. 900 00:38:48,250 --> 00:38:51,050 Така че getchar е най-вече коментари. 901 00:38:51,050 --> 00:38:52,060 Но това изглежда така. 902 00:38:52,060 --> 00:38:54,800 Така че това е реалната функция getchar, че ние сме били 903 00:38:54,800 --> 00:38:56,055 приемате за даденост съществува. 904 00:38:56,055 --> 00:38:59,370 И въпреки, че не сме се използва този че често, ако изобщо някога, това е най-малко 905 00:38:59,370 --> 00:39:00,470 сравнително прост. 906 00:39:00,470 --> 00:39:02,580 Така че си струва да вземе бърз поглед тук. 907 00:39:02,580 --> 00:39:06,540 >> Така че getchar има един безкраен цикъл, умишлено толкова очевидно. 908 00:39:06,540 --> 00:39:10,050 Той после вика - и това е нещо като хубаво повторно използване на кода, който се пише. 909 00:39:10,050 --> 00:39:11,220 Той призовава getstring. 910 00:39:11,220 --> 00:39:12,460 Защото това, което прави означава да се получи Чар? 911 00:39:12,460 --> 00:39:14,730 Е, че може и да се опита да получи цялата линия на текст от потребителя и 912 00:39:14,730 --> 00:39:16,940 След това просто погледнете едно от тези знаци. 913 00:39:16,940 --> 00:39:19,170 В съответствие 60, тук е малко малко здрав разум проверка. 914 00:39:19,170 --> 00:39:21,610 Ако getstring връща нула, нека да не продължи. 915 00:39:21,610 --> 00:39:22,820 Нещо се обърка. 916 00:39:22,820 --> 00:39:28,120 >> Сега това е малко досадно, но конвенционална в C. Чар макс вероятно 917 00:39:28,120 --> 00:39:29,960 представлява това, което току-що въз основа на неговото име? 918 00:39:29,960 --> 00:39:31,670 Това е постоянна. 919 00:39:31,670 --> 00:39:36,040 Това е като числова стойност на големият Чар можете да представляват, с 920 00:39:36,040 --> 00:39:40,370 една хапка, което вероятно е броят 255, който е най-големият ти номер 921 00:39:40,370 --> 00:39:42,720 представляват осем бита, като се започне от нула. 922 00:39:42,720 --> 00:39:47,460 Така че аз съм използвате тази, в тази функция, когато написването на този код, само защото 923 00:39:47,460 --> 00:39:51,753 ако нещо се обърка в getchar но своята цел в живота е да се върне 924 00:39:51,753 --> 00:39:54,830 Чар, трябва по някакъв начин да бъде в състояние да сигнализира на потребителя, че 925 00:39:54,830 --> 00:39:55,840 нещо се е объркало. 926 00:39:55,840 --> 00:39:56,970 Ние не може да върне нула. 927 00:39:56,970 --> 00:39:58,480 Оказва се, че нищожна е указател. 928 00:39:58,480 --> 00:40:01,030 И отново, getchar има за да се върнете на Чар. 929 00:40:01,030 --> 00:40:04,760 >> Така че на конгреса, ако нещо се обърка, е, програмист, или в 930 00:40:04,760 --> 00:40:08,160 този случай, аз с библиотеката, имах а просто да реши произволно, ако 931 00:40:08,160 --> 00:40:12,230 нещо се обърка, аз отивам да върне броя 255, което е наистина 932 00:40:12,230 --> 00:40:17,240 означава, че не можем да, потребителят може да не объркате характера представено с 933 00:40:17,240 --> 00:40:21,410 номер 255, защото имахме го открадне като така наречените контролни стойност 934 00:40:21,410 --> 00:40:23,410 представлява проблем. 935 00:40:23,410 --> 00:40:27,010 Сега се оказва, че характерът 255 не е нещо, което можете да въведете на 936 00:40:27,010 --> 00:40:28,380 клавиатурата, така че не е голяма работа. 937 00:40:28,380 --> 00:40:30,910 Потребителят не забележите, че Аз съм откраднал този герой. 938 00:40:30,910 --> 00:40:34,620 Но ако някога видя в човека страници на компютърна система някои позоваване на 939 00:40:34,620 --> 00:40:38,560 всички капачки постоянно като този, който казва: в случаи на грешка това постоянно мощ 940 00:40:38,560 --> 00:40:42,720 бъдат върнати, това е всичко, някои човешки направил години е произволно реши да 941 00:40:42,720 --> 00:40:45,680 върнете тази специална стойност и Наричат ​​го постоянно в случай 942 00:40:45,680 --> 00:40:46,840 нещо се обърка. 943 00:40:46,840 --> 00:40:48,580 >> Сега се случва магията тук. 944 00:40:48,580 --> 00:40:52,600 Първо, аз съм деклариране в съответствие 67 два знака, С1 и С2. 945 00:40:52,600 --> 00:40:57,080 И след това в ред 68, всъщност има линия на кода, който е напомня на 946 00:40:57,080 --> 00:41:01,140 нашият приятел ФОРМАТ, имайки предвид, че няма процента Cs в кавички. 947 00:41:01,140 --> 00:41:06,490 Забележете какво се случва тук. sscanf означава низ сканиране - 948 00:41:06,490 --> 00:41:11,690 означава сканирате форматиран низ, значи sscanf. 949 00:41:11,690 --> 00:41:12,590 Какво означава това? 950 00:41:12,590 --> 00:41:16,310 Това означава, че преминава към sscanf низ. 951 00:41:16,310 --> 00:41:18,420 А линията е независимо потребителят пише инча 952 00:41:18,420 --> 00:41:23,520 Вие се премине към sscanf формат низ тази, която разказва какви са scanf 953 00:41:23,520 --> 00:41:25,870 Надяваш ли се потребителят е въвел инча 954 00:41:25,870 --> 00:41:29,730 След това трябва да мине-в адресите на две блокове памет, в този случай, 955 00:41:29,730 --> 00:41:31,150 защото имам две контейнери. 956 00:41:31,150 --> 00:41:34,610 Така че аз ще го дам на адрес С1 и С2 адрес. 957 00:41:34,610 --> 00:41:37,700 >> И припомни, че ви даде функция на адрес на някаква променлива, какво е 958 00:41:37,700 --> 00:41:38,950 Последици? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Какво може да направи тази функция в резултат на което му адреса на 961 00:41:45,050 --> 00:41:48,170 променлива, за разлика от самата променлива? 962 00:41:48,170 --> 00:41:49,450 Тя може да го промени, нали? 963 00:41:49,450 --> 00:41:53,250 Ако имаше някой, на картата на физическа адрес, те могат да отидат там и да направя 964 00:41:53,250 --> 00:41:54,750 каквото си искат на този адрес. 965 00:41:54,750 --> 00:41:55,800 Същата идея тук. 966 00:41:55,800 --> 00:41:59,950 Ако се премине към sscanf, адреса на две блокове памет, дори и тези малки 967 00:41:59,950 --> 00:42:03,585 малки блокове памет, C1 и C2, но ние го кажа адреса от тях, 968 00:42:03,585 --> 00:42:05,170 sscanf да го промените. 969 00:42:05,170 --> 00:42:08,530 >> Така че целта sscanf в живота, ако прочетем на човек страница, е да прочетете това, което 970 00:42:08,530 --> 00:42:13,420 потребителя написали в, надявам за потребителя като въвели в характер и може би 971 00:42:13,420 --> 00:42:16,470 друг характер, и независимо от потребителя написали, първия знак отива 972 00:42:16,470 --> 00:42:19,310 тук, вторият знак се поставя тук. 973 00:42:19,310 --> 00:42:22,470 Сега, като настрана, това, и бихте знам само това от документацията, 974 00:42:22,470 --> 00:42:25,570 факта, че сложих празно място там просто означава, че не ми пука, ако 975 00:42:25,570 --> 00:42:28,440 ръководство удари Space бар няколко пъти, преди той или тя отнема 976 00:42:28,440 --> 00:42:30,400 характер, аз отивам да се игнорира всяко празно пространство. 977 00:42:30,400 --> 00:42:32,510 Така че, аз знам от документацията. 978 00:42:32,510 --> 00:42:36,570 >> Фактът, че има втори в% последван от празно пространство е всъщност 979 00:42:36,570 --> 00:42:37,410 умишлено. 980 00:42:37,410 --> 00:42:41,190 Искам да бъда в състояние да открие, ако потребителят прецаках, нито оказаха съдействие. 981 00:42:41,190 --> 00:42:45,630 Така че аз се надявам, че потребителят само въвели в един символ, затова се надявам 982 00:42:45,630 --> 00:42:50,640 че sscanf само ще върне стойност 1, защото, отново, ако Четох 983 00:42:50,640 --> 00:42:55,400 документацията, целта sscanf в живота е да се върнете в брой 984 00:42:55,400 --> 00:42:59,170 променливи, които се попълват с потребителски вход. 985 00:42:59,170 --> 00:43:02,270 >> Минах през две променливи адреси, C1 и C2. 986 00:43:02,270 --> 00:43:06,420 Надявам се обаче, че само един от тях е убит, защото ако sscanf 987 00:43:06,420 --> 00:43:11,130 връща 2, какво е вероятно Последици логично? 988 00:43:11,130 --> 00:43:14,600 Това ръководство не само ми даде една характер като му казах, или нея. 989 00:43:14,600 --> 00:43:17,860 Те вероятно сте написали в малко два знака. 990 00:43:17,860 --> 00:43:22,430 Така че, ако вместо това не са имали втори % C, аз просто трябваше един, който 991 00:43:22,430 --> 00:43:25,370 честно казано би било по-интуитивно подход, мисля, че на пръв поглед, 992 00:43:25,370 --> 00:43:30,220 че няма да бъде в състояние да открива ако потребителят е ви дава повече 993 00:43:30,220 --> 00:43:31,780 данни, отколкото сте всъщност исках. 994 00:43:31,780 --> 00:43:34,100 Така че това е косвена форма от проверка за грешки. 995 00:43:34,100 --> 00:43:35,640 >> Но забележете какво правя тук. 996 00:43:35,640 --> 00:43:39,970 След като аз съм сигурен, че потребителят ми даде една характер, I освободи линията, прави 997 00:43:39,970 --> 00:43:44,450 обратното на getstring, което от своя страна използва изчистване, а след това се върна 998 00:43:44,450 --> 00:43:51,030 C1, характера, че се надявам на ползвател и само при условие. 999 00:43:51,030 --> 00:43:54,680 Така бърз зърна само, но Въпроси по getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Ще се върнем към някои от другите. 1002 00:43:59,590 --> 00:44:03,770 >> Е, нека да вървим напред и да направите това - Предполагам, че сега, само за да ни мотивира 1003 00:44:03,770 --> 00:44:08,910 обсъждане на седмица плюс времето, това е файл, наречен structs.h. 1004 00:44:08,910 --> 00:44:11,440 И отново, това е просто вкус за нещо, което предстои. 1005 00:44:11,440 --> 00:44:13,090 Но забележете, че много за това е коментари. 1006 00:44:13,090 --> 00:44:17,440 Така че нека да маркирате само интересната част за сега. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 има същата дума отново. 1009 00:44:19,700 --> 00:44:23,100 typedef използваме, за да декларират низ като специален тип данни. 1010 00:44:23,100 --> 00:44:27,490 Можете да използвате typedef да се създаде нова типове данни, които не са съществували, когато 1011 00:44:27,490 --> 00:44:28,570 C е изобретен. 1012 00:44:28,570 --> 00:44:32,520 Например, вътр идва с C. Чар идва с C. двойно идва с C. Но 1013 00:44:32,520 --> 00:44:34,000 че няма понятие за един студент. 1014 00:44:34,000 --> 00:44:37,230 И все пак би било доста полезно да бъде в може да се напише програма, която съхранява 1015 00:44:37,230 --> 00:44:40,440 в променлива, ID номер на студента, своето име, и къщата им. 1016 00:44:40,440 --> 00:44:42,890 С други думи, три парчета на данни, като едно цяло число и 1017 00:44:42,890 --> 00:44:44,420 низ и друг низ. 1018 00:44:44,420 --> 00:44:48,220 >> С typedef, което е доста мощен за това и ключовата дума sturct за 1019 00:44:48,220 --> 00:44:53,660 структура, като програмисти през 2013 г., всъщност може да определи свой собствен на 1020 00:44:53,660 --> 00:44:57,530 типове данни, които не са съществували години преди, но които отговарят на вашите цели. 1021 00:44:57,530 --> 00:45:01,910 И тук, в редове от 13 до 19 г. ние сме за обявяване на нов тип данни, като 1022 00:45:01,910 --> 00:45:04,320 едно цяло число, но като го нарече ученик. 1023 00:45:04,320 --> 00:45:09,310 И вътре в тази променлива ще е три неща - едно цяло число, низ, 1024 00:45:09,310 --> 00:45:09,930 и низ. 1025 00:45:09,930 --> 00:45:13,040 Така че можеш да се сетиш какво е наистина се е случило тук, въпреки че това е 1026 00:45:13,040 --> 00:45:17,160 малко на опростяване за днес студент по същество ще 1027 00:45:17,160 --> 00:45:19,450 да изглежда по този начин. 1028 00:45:19,450 --> 00:45:22,580 Неговата ще бъде парче памет с ID, име 1029 00:45:22,580 --> 00:45:25,580 поле и поле къща. 1030 00:45:25,580 --> 00:45:30,670 И ние ще бъдем в състояние да използват тези парчета памет и достъп до тях, както следва. 1031 00:45:30,670 --> 00:45:38,870 >> Ако отида в struct0.c, тук е относително дълъг, но след 1032 00:45:38,870 --> 00:45:42,630 модел, на кода, който използва този нов трик. 1033 00:45:42,630 --> 00:45:45,790 Така че, първо, нека да насоча вниманието ви до интересните части до върха. 1034 00:45:45,790 --> 00:45:49,670 Sharp определя студенти 3, декларира постоянни наречени студенти и правоприемници 1035 00:45:49,670 --> 00:45:53,450 тя произволно номер 3, само така че имам трима студенти използващи 1036 00:45:53,450 --> 00:45:54,830 тази програма за сега. 1037 00:45:54,830 --> 00:45:55,960 Тук идва Main. 1038 00:45:55,960 --> 00:45:58,860 И забележете, как да се декларират масив от учениците? 1039 00:45:58,860 --> 00:46:00,480 Е, аз просто използвайте същия синтаксис. 1040 00:46:00,480 --> 00:46:02,110 Думата ученик е очевидно нова. 1041 00:46:02,110 --> 00:46:04,790 Но студентите, класа, скоба студенти. 1042 00:46:04,790 --> 00:46:06,720 >> Така че за съжаление има много за повторна употреба на термините тук. 1043 00:46:06,720 --> 00:46:07,660 Това е просто число. 1044 00:46:07,660 --> 00:46:09,040 Така че това е като да кажеш, три. 1045 00:46:09,040 --> 00:46:11,430 Клас е само това, което искам да се обадя на променлива. 1046 00:46:11,430 --> 00:46:12,840 Мога да го наричат ​​учениците. 1047 00:46:12,840 --> 00:46:15,880 Но клас, това не е клас в обектно-ориентирано вид Java на пътя. 1048 00:46:15,880 --> 00:46:17,220 Това е просто един клас ученици. 1049 00:46:17,220 --> 00:46:20,590 И типа данни на всеки елемент в този масив е студент. 1050 00:46:20,590 --> 00:46:23,040 Така че това е малко по-различна и да не каже нещо 1051 00:46:23,040 --> 00:46:25,250 по този начин, това е просто - 1052 00:46:25,250 --> 00:46:29,500 Казвам, дайте ми трима студенти и наричат ​​този клас масив. 1053 00:46:29,500 --> 00:46:29,800 >> Добре. 1054 00:46:29,800 --> 00:46:30,680 Сега тук е четири цикъла. 1055 00:46:30,680 --> 00:46:33,480 Този е запознат - обхождане от нула до три. 1056 00:46:33,480 --> 00:46:35,160 И тук е новото парче на синтаксис. 1057 00:46:35,160 --> 00:46:37,710 Програмата ще ме подкани, на човека, да му се даде студент 1058 00:46:37,710 --> 00:46:39,200 ID, което е Int. 1059 00:46:39,200 --> 00:46:44,650 И тук е синтаксис, с които можете да съхранява нещо в ID областта на 1060 00:46:44,650 --> 00:46:48,630 Местоположение клас скоба I. Така този синтаксис не е нова. 1061 00:46:48,630 --> 00:46:51,450 Това просто означава, дайте ми осми студент в класа. 1062 00:46:51,450 --> 00:46:52,940 Но този символ е нов. 1063 00:46:52,940 --> 00:46:56,320 До този момент, ние сме не може да се използва точка, най-малко в код, подобен на този. 1064 00:46:56,320 --> 00:47:01,490 Това означава, отидете на структура, известна като студент и сложи нещо там. 1065 00:47:01,490 --> 00:47:05,670 По същия начин, в този нов ред, 31, проверете напред и сложи независимо от клавиатурата 1066 00:47:05,670 --> 00:47:10,530 на наименование, тук и това, което правят за къща, на едно и също нещо, давай напред и 1067 00:47:10,530 --> 00:47:13,230 сложи в него. къща. 1068 00:47:13,230 --> 00:47:15,955 >> Така че това, което прави тази програма в крайна сметка да направя? 1069 00:47:15,955 --> 00:47:17,220 Можете да видите малко закачка там. 1070 00:47:17,220 --> 00:47:24,780 Позволете ми да отида напред и да правят structs 0 точка наклонена черта структурата на 0, ID студента 1, 1071 00:47:24,780 --> 00:47:28,250 казват David Mather, студент ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Къркланд, студент ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 и единственото нещо, тази програма е, който е само на напълно произволно, се 1075 00:47:38,380 --> 00:47:40,980 Исках да направя нещо с тези данни, сега, че съм ни научи как да 1076 00:47:40,980 --> 00:47:43,450 използвате structs, е аз просто трябваше тази допълнителна линия тук. 1077 00:47:43,450 --> 00:47:45,260 I обхождане на масив от студенти. 1078 00:47:45,260 --> 00:47:49,170 I използва нашия, може би сега близък приятел, низ сравнение, stircomp да 1079 00:47:49,170 --> 00:47:53,780 Проверката е осмият ученик къща равна на Mather? 1080 00:47:53,780 --> 00:47:56,760 И ако е така, да го разпечатате нещо произволно харесва, да, това е. 1081 00:47:56,760 --> 00:47:59,430 Но отново, просто ми дава възможности за използване и повторно използване и 1082 00:47:59,430 --> 00:48:02,270 повторно тази нова нотацията с точка. 1083 00:48:02,270 --> 00:48:03,250 >> Така че на кого му пука, нали? 1084 00:48:03,250 --> 00:48:06,270 Очаквайте с един студент програма е известна степен условно, но се оказва, 1085 00:48:06,270 --> 00:48:09,800 че можем да направим полезни неща с това, например, както следва. 1086 00:48:09,800 --> 00:48:14,600 Това е много по-сложна структура в C. Той има една дузина или повече полета, 1087 00:48:14,600 --> 00:48:15,880 малко загадъчно име. 1088 00:48:15,880 --> 00:48:20,110 Но ако някога сте чували за графика формат наречен растерна графика, BMP, тя 1089 00:48:20,110 --> 00:48:22,830 Оказва се, че на растерна графика файлов формат почти изглежда, че това. 1090 00:48:22,830 --> 00:48:24,200 Това е глупава усмивка на лицето. 1091 00:48:24,200 --> 00:48:27,840 Това е малко изображение, което съм увеличени в на доста голям, така че можех да видя всяка 1092 00:48:27,840 --> 00:48:30,410 на отделните точки или пиксели. 1093 00:48:30,410 --> 00:48:33,800 Сега се оказва, можем да представляват черна точка с, да речем, на номер 0. 1094 00:48:33,800 --> 00:48:35,520 И една бяла точка с номер 1. 1095 00:48:35,520 --> 00:48:39,140 >> Така че с други думи, ако искате да нарисувате Smiley лицето и да спаси това изображение в 1096 00:48:39,140 --> 00:48:42,680 компютър, е достатъчно да се съхранява и нули тези, които изглеждат така, къде, 1097 00:48:42,680 --> 00:48:45,250 отново, такива са бели и нули са черни. 1098 00:48:45,250 --> 00:48:48,290 И заедно, ако има действителен а опасват от единици и нули, че имате 1099 00:48:48,290 --> 00:48:51,030 мрежа от пиксели, а ако се ги, имате един сладък 1100 00:48:51,030 --> 00:48:52,560 малко Smiley лицето. 1101 00:48:52,560 --> 00:48:58,150 Сега, растерна графика файлов формат, BMP, е ефективно, че под предния капак, 1102 00:48:58,150 --> 00:49:00,970 но с повече пиксели СОТ, че действително могат да представляват цветове. 1103 00:49:00,970 --> 00:49:05,170 >> Но когато имаш по-сложни файлови формати като BMP JPEG и GIF и 1104 00:49:05,170 --> 00:49:09,360 , с които може да сте запознати, тези, файлове на диск обикновено не само 1105 00:49:09,360 --> 00:49:13,760 имат нули и единици за пикселите, но те имат някои метаданни, както и - 1106 00:49:13,760 --> 00:49:16,960 мета в смисъл, че не е много данни, но това е полезно да има. 1107 00:49:16,960 --> 00:49:21,370 Така че тези области тук се предполага, и Ще видим това по-подробно в P-комплект 1108 00:49:21,370 --> 00:49:25,810 5, че преди нули и единици, които представляват пиксели в изображението, 1109 00:49:25,810 --> 00:49:29,110 има един куп метаданни като на размера на изображението и 1110 00:49:29,110 --> 00:49:30,250 ширината на изображението. 1111 00:49:30,250 --> 00:49:32,910 И забележи съм скубане на разстояние около произволни неща тук - 1112 00:49:32,910 --> 00:49:34,260 ширина и височина. 1113 00:49:34,260 --> 00:49:36,160 Брой битови и някои други неща. 1114 00:49:36,160 --> 00:49:37,840 Така че има някои метаданни във файл. 1115 00:49:37,840 --> 00:49:41,470 >> Но с разбирането как файловете са определени в този начин, всъщност можете да 1116 00:49:41,470 --> 00:49:45,890 след това да обработвате изображения, възстановяване на снимки от диск, преоразмерявате изображения. 1117 00:49:45,890 --> 00:49:47,560 Но не е задължително да подобряване тях. 1118 00:49:47,560 --> 00:49:48,480 Имах нужда от снимка. 1119 00:49:48,480 --> 00:49:52,840 Затова се върнах към RJ тук, които сте видяли на екрана, преди известно време. 1120 00:49:52,840 --> 00:49:57,160 И ако се отворят Keynote тук, това е какво се случва, ако се опитате да увеличите и 1121 00:49:57,160 --> 00:49:59,380 повишаване RJ. 1122 00:49:59,380 --> 00:50:01,480 Той не става по-добре наистина. 1123 00:50:01,480 --> 00:50:06,240 Сега Keynote е вид размива го малко, само за да се замазват 1124 00:50:06,240 --> 00:50:11,040 Фактът, че RJ не получава особено засилено, когато увеличите инча 1125 00:50:11,040 --> 00:50:13,310 И ако го направя по този начин, виж площадите? 1126 00:50:13,310 --> 00:50:15,490 Да, определено може да видите квадратите на проектор. 1127 00:50:15,490 --> 00:50:17,690 >> Това е, което ще получите, когато подобри. 1128 00:50:17,690 --> 00:50:22,570 Но в разбирането как нашата RJ или Smiley лицето се реализира ще ни пуснат 1129 00:50:22,570 --> 00:50:24,950 всъщност пишат код, който манипулира тези неща. 1130 00:50:24,950 --> 00:50:29,970 И аз мислех, че ще приключи на тази бележка, с 55 секунди на едно засили това е, 1131 00:50:29,970 --> 00:50:31,230 Смея, да кажем по-скоро подвеждаща. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEO PLAYBACK] 1133 00:50:32,990 --> 00:50:34,790 >> -Той лъже. 1134 00:50:34,790 --> 00:50:38,310 За това, аз не знам. 1135 00:50:38,310 --> 00:50:41,200 >> -Е, какво знаем? 1136 00:50:41,200 --> 00:50:45,280 >> -Това в 9:15 Ray Santoya е на банкомата. 1137 00:50:45,280 --> 00:50:47,830 >> -Така че въпросът е какво правеше той в 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Стрелба деветмм в нещо. 1139 00:50:50,750 --> 00:50:52,615 Може би той видя снайперист. 1140 00:50:52,615 --> 00:50:54,760 >> -Или се работи с него. 1141 00:50:54,760 --> 00:50:56,120 >> -Чакай. 1142 00:50:56,120 --> 00:50:57,450 Върнете се едно. 1143 00:50:57,450 --> 00:50:58,700 >> -Какво виждаш? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Носете си с лицето нагоре, на цял екран. 1146 00:51:09,490 --> 00:51:09,790 >> -Очилата му. 1147 00:51:09,790 --> 00:51:11,040 >> -Има размисъл. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Това е бейзбол Neuvitas отбор. 1150 00:51:23,520 --> 00:51:24,530 Това е тяхното лого. 1151 00:51:24,530 --> 00:51:27,040 >> -И той говори на всеки, който е носиш това яке. 1152 00:51:27,040 --> 00:51:27,530 >> [END възпроизвеждане на видео] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: Това ще бъде Проблем Set 5. 1154 00:51:29,180 --> 00:51:30,720 Ние ще се видим следващата седмица. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: На следващото CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Щурците свиреха] 1157 00:51:39,240 --> 00:51:41,270 >> [За възпроизвеждане на музика]