1 00:00:00,000 --> 00:00:10,970 >> [Музыка Прайграванне] 2 00:00:10,970 --> 00:00:12,536 >> Дэвід Дж. малая: Добра. 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 існуе гэты кампілятар, Clang, што Вы былі выкліку праз гэты 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 >> Напрыклад, рэзкае ўключае ў сябе стандартныя Ўводу / высновы. Ч, у значнай ступені толькі сродкі ідуць 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 рэальна працаваць Clang або адмыслова Зрабіце ў большасці выпадкаў. 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 Мы беглі праз гэтую Clang. 51 00:02:30,920 --> 00:02:33,200 Ці мы прапусціў яго праз Зрабіце які бег Clang. 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 запусціць Clang, а не рабіць, што аўтаматызуе ўсе чатыры 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 І МАУ для руху. выклік для тэлефануйце, вельмі нізкім узроўні функцыі. 69 00:03:24,480 --> 00:03:26,380 саб для адымаць. 70 00:03:26,380 --> 00:03:30,370 >> Таму, калі ў вас ёсць пэўная ўнутры працэсара вашага кампутара, што робіць яго 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 памяці ўнутры вашага фактычнага працэсара. 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 І тое, што адбывалася на самай справе адзін раз вы запусціце Clang, або шляхам 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 Тады Clang з'яўляецца пераўтварэнне гэтая зборка Мова да нулёў і адзінак. 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 Бібліятэка радок ці нават 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 Хтосьці ўжо складзены яго і ўключыў . O файла або аб'ектыўнага кода. 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 з Clang. 124 00:06:02,650 --> 00:06:04,960 Вашага кода складаецца і сабраны. 125 00:06:04,960 --> 00:06:09,200 stdio.c 'з кодам складаецца i сабраны, так што гэты самы апошні 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 Inside 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 месцы, 1: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 Гэта збіраецца быць у 5: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 ідэнтыфікуюцца але невідавочныя людзей, месца або рэчы, то кожны год я 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 Ці вы для P-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 Калі вы калі-небудзь назіралі за некаторымі добрымі або Тэлевізар дрэнна, напэўна яны ў значнай ступені 204 00:09:33,680 --> 00:09:36,280 разглядаць аўдыторыю як технофобы , Якія сапраўды ня 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 >> [Прайграванне відэа] 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 >> -Трымайце яго. 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 Замарозіць гэта. 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 Замарозіць гэта. 230 00:10:24,154 --> 00:10:25,140 >> Зацягнуць на што, а? 231 00:10:25,140 --> 00:10:27,090 >> -Вектар у на гэтага хлопца на заднім коле. 232 00:10:27,090 --> 00:10:29,730 >> -Павялічыць прама тут, на гэтым месцы. 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 >> -Павышэнне раздзеле A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Я падвысіла дэталях і - 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 >> -Давайце запусцім гэта праз Video Enhancement. 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 >> -Я працую над гэтым адлюстраваннем. 248 00:10:54,290 --> 00:10:55,560 >> Хто-то-адлюстравання. 249 00:10:55,560 --> 00:10:56,440 >> Рэфлексія. 250 00:10:56,440 --> 00:10:57,940 >> -Там у адлюстраванні асобы чалавека. 251 00:10:57,940 --> 00:10:58,860 >> -Адлюстраванне. 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 >> -Стоп. 269 00:11:15,740 --> 00:11:16,290 >> -Паўзу. 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 >> -Можа быць, мы можам выкарыстоўваць Прадип 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 >> -Enhance. 282 00:11:42,760 --> 00:11:43,060 >> -Enhance. 283 00:11:43,060 --> 00:11:43,760 >> -Enhance. 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 >> [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] 287 00:11:47,910 --> 00:11:51,470 >> Дэвід Дж. малая: Так пастаўленай задачы 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 І графічна, мы бачым, што з кожным Функцыя называецца паслядоўным, калі 311 00:12:48,810 --> 00:12:52,520 званкі званкі C B 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 вярнуцца, калі Фу, гэта іншае функцыі, робіцца выкананне. 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 І Malloc, размеркавання памяці, з'яўляецца функцыі, якія мы можам выкарыстоўваць, каб вылучыць 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 Давіда. 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 Струнны гэта проста сінонім мы ў зразумеў, для чаго? 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 - V-I-D Enter, дзе D - 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 - 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 што гэта месца памяці займаюць асноўны і, магчыма, аргумент З і 412 00:17:42,230 --> 00:17:46,790 Arg V і ўсё астатняе, у праграме, калі GetString называецца, 413 00:17:46,790 --> 00:17:51,120 Меркавана GetString атрымлівае кавалак памяці тут. 414 00:17:51,120 --> 00:17:53,940 А потым D - V-I-D-то заканчваецца ў гэтую функцыю. 415 00:17:53,940 --> 00:17:55,320 І я збіраюся спрашчаць. 416 00:17:55,320 --> 00:18:00,050 Але давайце выкажам здагадку, што яго D - 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 - 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 больш функцый, ці, як вы размяркоўваеце памяць у кучы з Malloc як ад 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 І проста дзеля задавальнення, я пайду наперад і скажу, Е "Прывітанне ад 468 00:20:51,050 --> 00:20:52,340 Foo ". 469 00:20:52,340 --> 00:20:52,890 >> ОК. 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 ОК. 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 Вырашыце гэтую Роб. 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 Добра, стаяць да спаткання. 494 00:21:48,970 --> 00:21:49,950 Цяпер я адчуваю сябе лепш. 495 00:21:49,950 --> 00:21:51,390 ОК. 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 ОК. 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 ОК. 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 Цяпер, калі я атрымаў язду друку UPS, мы бачым яго адразу ж. 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 Базавы варыянт, які быў некаторы жорстка зададзены выпадку, сказаў у некаторых сітуацыях 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 Пару тыдняў таму для Sigma функцыі, і калі мы атрымліваем дадзеныя 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 Мы ніколі не былі calll функцыі, як 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 або ПК. 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 Куча - 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 - 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 Уцечка - 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 Калі ласка, увядзіце Дэвіда зноў. 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 І ён кажа, што, па-відаць, Malloc на лініі - 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 Але Malloc з'яўляецца першым вінаватым. 637 00:27:35,110 --> 00:27:38,630 Там у блогу ў Malloc. 638 00:27:38,630 --> 00:27:39,810 >> Усё ў парадку? 639 00:27:39,810 --> 00:27:40,450 ОК, няма. 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 мому Malloc. 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 Давайце выкажам здагадку, што той, хто пісаў Malloc было вакол дастаткова доўга, што гэта 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.c лініі 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 Але вы можаце істотна думаць бясплатна як супрацьлегласць Malloc. 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 Давіда. 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 Куча рэзюмэ - 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 >> Так ідзе ўверх, а ня з задачай ўсталяваць 4, але з задачай ўсталяваць 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 Мы апублікуем гэта пазней сёння ў ZIP зыходнага кода сёння. 693 00:29:58,380 --> 00:30:01,610 І заўважце, што ў мяне ёсць функцыя называецца F, які не прымае да аргументаў і 694 00:30:01,610 --> 00:30:02,800 нічога не вяртае. 695 00:30:02,800 --> 00:30:07,240 У радку 20, я мабыць аб'яву паказальнік на цэлалікавых і назваўшы яго х. 696 00:30:07,240 --> 00:30:09,570 Я задаю з'яўляецца вяртанне Значэнне Malloc. 697 00:30:09,570 --> 00:30:14,590 І гэтак жа, каб быць ясным, колькі байтаў раніцы Я, верагодна, вяртання з Malloc 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 Так Malloc вяртаецца адрас кавалак памяці і захоўвання, што 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 прыцягнуць ўвесь прастакутнік, прадстаўляе ўсе мае аператыўнай памяці. 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 Для F, я збіраюся даць яму кавалачак памяці ў стэку. 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 Але ў F, у мяне ёсць лакальная зменная, які называецца х. 721 00:31:15,730 --> 00:31:20,410 Так што я збіраюся ісці наперад і даць F ўчастак памяці, назваўшы яго х. 722 00:31:20,410 --> 00:31:24,680 >> А цяпер Malloc у 10 разоў 4, Так Malloc 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 Гэта адрас першага байта памяці, што я прашу для Malloc. 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 І Быка нецікава. 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 >> ОК. 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 Буфер проста азначае кавалак памяці. 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 Int - 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 Радку 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 Я мог бы зрабіць бясплатна х, так каб аддаць гэтай памяці. 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 >> ОК. 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 Ключавое слова, аб'ява тыпу, для вызначэння тыпу. 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 хэштэг ў пачатку яго. 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 Мы не можам вярнуць значэнне NULL. 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 два знака, C1 і C2. 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 азначае сканавання адфарматаваных Радок, ERGO 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 карыстач націскае клавішу прабелу некалькі разоў, перш чым ён або яна прымае 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 >> Той факт, што ёсць другая C% за імі ідуць белыя прасторы на самай справе 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 Так што, калі я замест гэтага не было другога % З, я проста быў адзін, які 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 Як толькі я ўпэўнены, што карыстальнік даў мне адзін характар, я вызваліць лінію, робячы 997 00:43:39,970 --> 00:43:44,450 супрацьлегласць GetString, які ў сваю чаргу выкарыстоўвае Malloc, а затым я вярнуся 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 ЬурейеЕ - 1008 00:44:18,020 --> 00:44:19,700 ёсць тое, што ж ключавое слова зноў. 1009 00:44:19,700 --> 00:44:23,100 ЬурейеЕ мы выкарыстоўваем, каб абвясціць радок як адмысловы тып дадзеных. 1010 00:44:23,100 --> 00:44:27,490 Вы можаце выкарыстоўваць ЬурейеЕ на стварэнне прынцыпова новай тыпы дадзеных, не існуе, калі 1011 00:44:27,490 --> 00:44:28,570 C быў прыдуманы. 1012 00:44:28,570 --> 00:44:32,520 Напрыклад, унутр пастаўляецца з С. сімвалаў пастаўляецца з двайны 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 ў зменнай, нумар пасведчання асобы студэнта, іх назвы, і іх дамы. 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 >> З ЬурейеЕ, што даволі магутным Пра гэта і ключавое слова для 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 А вось галоўную. 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, які з'яўляецца унутр. 1059 00:46:39,200 --> 00:46:44,650 А вось сінтаксіс, з якімі вы можаце захоўваць нешта ў поле ідэнтыфікатара ў 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 Дазвольце мне ісці наперад і робяць структур 0 кропка слэш структуры 0, ID студэнта 1, 1071 00:47:24,780 --> 00:47:28,250 Дэвід сказаў Мазер, студэнцкі білет 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, студэнцкі білет 3. 1073 00:47:32,070 --> 00:47:35,010 Ларэн 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 выкарыстоўваць структуры, гэта я толькі што гэтая дадатковая пятля тут. 1077 00:47:43,450 --> 00:47:45,260 Я ітэрацыі па масіве студэнтаў. 1078 00:47:45,260 --> 00:47:49,170 Я выкарыстаў нашы, магчыма, ужо знаёмыя адзін, параўнанне радкоў, каб 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 Гэта значна больш складаная структура у С. ёсць дзесятак ці больш палёў, 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 >> Такім чынам, іншымі словамі, калі вы хочаце прыцягнуць Смайлік і захаваць гэты вобраз у 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 маленькі смайлік. 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 або Смайлік рэалізуецца дазволіць нам 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 >> [Прайграванне відэа] 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 >> -Гэта ў 09:15 Ray Сантойя было ў банкамаце. 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 >> [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] 1153 00:51:27,530 --> 00:51:29,180 >> Дэвід Дж. малая: гэта быць праблематыка 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 >> [Музыка Прайграванне]