1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [Тыдзень 5] 2 00:00:02,760 --> 00:00:04,760 [David J. малая, Гарвардскі універсітэт] 3 00:00:04,760 --> 00:00:11,990 [Гэта CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Жанчына] Ён хлусіць, пра што, я не ведаю. 5 00:00:17,780 --> 00:00:20,300 [Мужчына] Такім чынам, што мы ведаем? 6 00:00:20,300 --> 00:00:24,120 [Жанчына] Што ў 9:15, Рэй Сантойя было ў банкамаце. 7 00:00:24,120 --> 00:00:27,420 [Мужчына] Так што пытанне, што ён рабіў у 9:16? 8 00:00:27,420 --> 00:00:29,980 [Жанчына] Здымкі 9 мм на нешта. 9 00:00:29,980 --> 00:00:31,900 Можа быць, ён убачыў снайпера. 10 00:00:31,900 --> 00:00:34,000 [Мужчына] Ці ён працуе з ім. 11 00:00:34,000 --> 00:00:36,330 [Жанчына] Пачакайце. Зварот на адзін. 12 00:00:36,330 --> 00:00:38,330 [Мужчына] Што вы бачыце? 13 00:00:38,330 --> 00:00:44,520 [♫ ♫ трывожнай музыкай] 14 00:00:44,520 --> 00:00:48,320 [Жанчына] Прынясіце свой асабовым бокам уверх. Поўны экран. 15 00:00:48,320 --> 00:00:51,230 [Мужчына] Яго акуляры. >> Там у адлюстраванні. 16 00:00:51,230 --> 00:01:00,810 [♫ ♫ трывожнай музыкай] 17 00:01:00,810 --> 00:01:03,580 [Мужчына] Вось бейсбольнай каманды Nuevita ст. Гэта іх лагатып. 18 00:01:03,580 --> 00:01:07,790 [Жанчына] І ён кажа таму, хто носіць гэтую куртку. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Такім чынам, гэта CS50 тыдзень 5, і сёньня мы разбурыць трохі тэлебачання і кіно для вас. 20 00:01:13,730 --> 00:01:16,170 Таму, калі вы глядзіце шоу, як гэта тут, 21 00:01:16,170 --> 00:01:19,910 і паліцыянты кажуць "Ці можаце вы чысціць, што да?" або "Павысіць" 22 00:01:19,910 --> 00:01:21,900 няма ніякага паляпшэння ў рэальным свеце. 23 00:01:21,900 --> 00:01:25,220 На самай справе, тое, што вы сапраўды атрымаеце трохі нешта накшталт гэтага. 24 00:01:25,220 --> 00:01:27,570 Я пад'ехаў адзін з супрацоўнікаў, фатаграфіі са старонкі. 25 00:01:27,570 --> 00:01:30,980 Гэта праграма пад назвай Photoshop. Гэта 1 з 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 з 3 Bowdens на самай справе, на сённяшні дзень, таму што ў нас місіс Боуден тут жа, разам з Робом і Паўла. 27 00:01:36,300 --> 00:01:41,950 Але вось Роб на экране, і калі мы павялічым на гэтую выбліск, ён заўсёды быў у яго вачах, 28 00:01:41,950 --> 00:01:47,600 тое, што вы на самой справе бачыце, што тое, што вы бачыце, што вы атрымліваеце. 29 00:01:47,600 --> 00:01:51,690 Гэта "ўзмоцненая", таму "CSI" у мяне крыху не так. 30 00:01:51,690 --> 00:01:55,190 Там адзін аднаго кліпа, калі мы можам забраць на "CSI" проста трохі даўжэй. 31 00:01:55,190 --> 00:01:58,500 Гэта адна добрая фраза вымавіць з гэтага часу, калі вы хочаце 32 00:01:58,500 --> 00:02:10,280 абгрунтаваныя тэхнічныя са сваімі сябрамі, калі, сапраўды, вы кажаце, абсалютна нічога. 33 00:02:10,280 --> 00:02:12,970 >> [Мужчына] На працягу некалькіх тыдняў я быў расследаванне забойства забойца таксіста 34 00:02:12,970 --> 00:02:15,360 з пэўным захапленнем балючым. 35 00:02:15,360 --> 00:02:17,160 [Woman # 1] Гэта ў рэальным часе. 36 00:02:17,160 --> 00:02:22,930 [Жанчына # 2] Я ствару GUI інтэрфейс з выкарыстаннем Visual Basic, бачыць, калі я магу адсочваць IP-адрасы. 37 00:02:22,930 --> 00:02:29,570 >> [Малая] Так аўдыё з сінхранізацыі ў бок, стварыўшы графічны інтэрфейс з выкарыстаннем Visual Basic 38 00:02:29,570 --> 00:02:31,820 адсочваць IP-адрасы поўнае глупства. 39 00:02:31,820 --> 00:02:33,840 У гэтыя дні вы не будзеце выкарыстоўваць Visual Basic, 40 00:02:33,840 --> 00:02:38,920 няма неабходнасці ў GUI, і IP адрас быў тэхнічна дакладны тэрмін. 41 00:02:38,920 --> 00:02:41,730 Так што сочыце за гэтым, і адзін з маіх любімых: 42 00:02:41,730 --> 00:02:45,070 Гэта адна крыху больш таямніцай, таму што вы павінны ведаць іншую мову. 43 00:02:45,070 --> 00:02:47,860 Там ёсьць мова пад назвай Objective-C, які з'яўляецца пашырэннем C. 44 00:02:47,860 --> 00:02:51,960 Што азначае, што C плюс некаторыя дадатковыя магчымасці, у тым ліку аб'ектна-арыентаванага праграмавання. 45 00:02:51,960 --> 00:02:55,070 І гэта мова, на якім Apple, папулярызаваў для праграмавання IOS. 46 00:02:55,070 --> 00:02:58,760 І так вось урывак з розных шоў у цэлым, ад "Лічбы", 47 00:02:58,760 --> 00:03:02,450 што, калі вы сапраўды паглядзіце ўважліва на вашым TiVo і паўзы ў патрэбны момант, 48 00:03:02,450 --> 00:03:07,700 Вы ўбачыце, што тое, што яны глядзяць на не зусім тое, што апісана. 49 00:03:07,700 --> 00:03:11,170 І дазвольце мне паспрабаваць розныя аўдыё раздым тут і паглядзець, калі мы не можам 50 00:03:11,170 --> 00:03:13,780 захаваць аўдыё ў сінхранізацыі на гэты раз. 51 00:03:13,780 --> 00:03:20,530 Я даю вам "Лічбы". 52 00:03:20,530 --> 00:03:23,240 >> [Чалавек № 1] Гэта 32-разрадны адрас IPv4. 53 00:03:23,240 --> 00:03:38,930 [Мужчына # 2] IP, гэта Інтэрнэт. >> Прыватнай сеткі. Гэта прыватная сетка Аніты. 54 00:03:38,930 --> 00:03:43,810 [Малая] Добра. Гэта Objective-C, і гэта для афарбоўкі некаторых праграм малога, 55 00:03:43,810 --> 00:03:51,140 як вы, магчыма, можа заключыць ад імя зменную. 56 00:03:51,140 --> 00:03:54,410 Так што ж тады "Лічбы". Таму сёння і на гэтым тыдні мы ўводзім 57 00:03:54,410 --> 00:03:57,740 Трохі свеце судова-медыцынскай экспертызы і кантэкст, у праблемах таму. 58 00:03:57,740 --> 00:04:00,590 Сёння будзе скарочана лекцыю, таму што ёсць спецыяльнае мерапрыемства тут 59 00:04:00,590 --> 00:04:05,530 пасля гэтага, таму мы будзем зазірнуць, і дражніць як студэнтаў, так і іх бацькоў сёння 60 00:04:05,530 --> 00:04:07,420 з некаторымі з рэчаў, якія на гарызонце. 61 00:04:07,420 --> 00:04:12,240 Сярод іх, як у панядзелак, у вас будзе яшчэ некалькі аднакласнікаў. 62 00:04:12,240 --> 00:04:16,050 EDX, Гарвард і MITs новы онлайн ініцыятыве для адкрытай курсаў 63 00:04:16,050 --> 00:04:19,120 і больш, запуск на кампусе Гарвардскага універсітэта ў панядзелак. 64 00:04:19,120 --> 00:04:21,490 Гэта азначае, прыйшоў панядзелак у вас будзе - па стане апошніх падліках, 65 00:04:21,490 --> 00:04:26,210 86000 дадатковых аднакласнікі будуць сачыць разам з лекцыямі ў CS50 66 00:04:26,210 --> 00:04:29,170 і частак і пакрокавыя кіраўніцтва і праблема мностваў. 67 00:04:29,170 --> 00:04:32,350 І як частка гэтага, вы станеце сябрамі першага класа 68 00:04:32,350 --> 00:04:35,090 CS50 і цяпер CS50x. 69 00:04:35,090 --> 00:04:39,310 >> У рамках гэтага, цяпер, разумею, што там будуць нейкія станоўчыя моманты, а таксама. 70 00:04:39,310 --> 00:04:43,790 Каб падрыхтавацца да гэтага, для вялікай колькасці студэнтаў, 71 00:04:43,790 --> 00:04:47,180 Дастаткова сказаць, што, хоць у нас ёсць 108 TFs і сертыфікацыі, 72 00:04:47,180 --> 00:04:50,790 не зусім лепшы вучань / настаўнік аднойчы мы патрапілі 80000 іншых студэнтаў. 73 00:04:50,790 --> 00:04:52,850 Такім чынам, мы не збіраемся быць сартаванне столькі праблема ўсталёўвае ўручную. 74 00:04:52,850 --> 00:04:55,920 Такім чынам, прадставіў на гэтым тыдні ў задачы набор будзе CS50 праверкі, 75 00:04:55,920 --> 00:04:58,450 які будзе ўтыліта каманднага радка ўнутры прыбора 76 00:04:58,450 --> 00:05:01,200 што вы атрымаеце, як толькі вы абновіце яго пазней у гэтыя выходныя, 77 00:05:01,200 --> 00:05:03,200 і вы будзеце мець магчымасць запускаць каманды, праверце 50, 78 00:05:03,200 --> 00:05:06,500 на свой PSET, і вы атрымаеце зваротную сувязь адносна таго, ваша праграма 79 00:05:06,500 --> 00:05:11,160 правільна ці няправільна ў адпаведнасці з рознымі спецыфікацыямі дызайну, якія мы прадстаўляем. 80 00:05:11,160 --> 00:05:13,580 Так пра гэта і спецыфікацыі праблема набору і 81 00:05:13,580 --> 00:05:17,240 CS50x аднакласнікі будуць выкарыстоўваць яго. 82 00:05:17,240 --> 00:05:19,230 >> Такім чынам, праблема камплект 4 гэта ўсё аб крыміналістыцы. 83 00:05:19,230 --> 00:05:21,940 І гэты кавалак быў натхнёны некаторыя рэальныя рэчы, 84 00:05:21,940 --> 00:05:24,620 якому, калі я быў у аспірантуры, я інтэрнаваныя на нейкі час з 85 00:05:24,620 --> 00:05:28,650 Упраўленне Middlesex акругі акруговага пракурора робіць судова-медыцынскай экспертызы 86 00:05:28,650 --> 00:05:31,650 з іх вядучым судовым следчым, і што гэта склала 87 00:05:31,650 --> 00:05:35,260 гэта, я думаю, я ўжо міма некалькіх тыдні, маса Дзяржаўнай паліцыі або іншых 88 00:05:35,260 --> 00:05:39,000 ўвойдзе, яны сыходзяць такія рэчы, як цвёрдыя дыскі і кампакт-дыскі і дыскеты 89 00:05:39,000 --> 00:05:42,340 і да т.п., а затым мэта офіс экспертызы было пераканацца ў тым, 90 00:05:42,340 --> 00:05:44,600 было ці не было доказаў нейкі. 91 00:05:44,600 --> 00:05:48,010 Гэта быў Спецыяльная следчая група, так што белых каўнерыкаў злачынствы, 92 00:05:48,010 --> 00:05:52,350 яна была больш трывожнай роду злачынстваў, 93 00:05:52,350 --> 00:05:55,990 нічога удзелам некаторых відаў лічбавых носьбітаў, аказваецца, што не так шмат людзей 94 00:05:55,990 --> 00:05:59,370 напісаць электронны ліст, кажучы: "Я зрабіў гэта". 95 00:05:59,370 --> 00:06:03,290 Так што даволі часта гэтыя пошукі экспертызы не з'явіўся ўсё, што шмат садавіны, 96 00:06:03,290 --> 00:06:05,850 але часам людзі будуць пісаць такія лісты. 97 00:06:05,850 --> 00:06:08,490 Так што часам намаганні былі ўзнагароджаныя. 98 00:06:08,490 --> 00:06:14,420 >> Але даводзіць да гэтага судова PSET, мы будзем прадстаўляць у PSET 4 трохі графікі. 99 00:06:14,420 --> 00:06:18,260 Такім чынам, вы, верагодна, узяць гэтыя рэчы само сабой разумеецца, JPEG, GIF і як у гэтыя дні, 100 00:06:18,260 --> 00:06:21,640 але калі вы сапраўды думаеце пра гэта, малюнак, гэтак жа, як асоба Роба, 101 00:06:21,640 --> 00:06:24,430 могуць быць змадэляваныя ў выглядзе паслядоўнасці кропак, або пікселяў. 102 00:06:24,430 --> 00:06:26,680 Зараз, у выпадку твары Роба, ёсць усе віды кветак, 103 00:06:26,680 --> 00:06:29,940 і мы пачалі бачыць асобныя кропкі, otherwide вядомыя як пікселі, 104 00:06:29,940 --> 00:06:31,610 як толькі мы пачалі, каб павялічыць маштаб 105 00:06:31,610 --> 00:06:35,590 Але калі мы спросцім свеце няшмат, і проста сказаць, што гэта вось Роб 106 00:06:35,590 --> 00:06:40,560 у чорна-белым, так, каб прадставіць чорна-белую мы можам проста выкарыстоўваць бінарны. 107 00:06:40,560 --> 00:06:44,960 І калі мы збіраемся выкарыстаць двайковы, 1 або 0, мы можам выказаць гэта ж малюнак 108 00:06:44,960 --> 00:06:51,970 ўсьмешлівы твар Адзежа з гэтай карціны бітаў: 11000011 ўяўляе 109 00:06:51,970 --> 00:06:55,160 белы, белы, чорны, чорны, чорны, чорны, белы. 110 00:06:55,160 --> 00:06:59,290 І гэта не велізарны скачок, то, каб пачаць гаварыць аб маляўнічых фатаграфій. 111 00:06:59,290 --> 00:07:01,920 Рэчы, якія вы бачыце на Facebook або ўзяць з сабой лічбавую камеру, 112 00:07:01,920 --> 00:07:04,730 але, вядома, калі справа даходзіць да кветак, вам трэба больш бітаў. 113 00:07:04,730 --> 00:07:08,470 І вельмі распаўсюджаны ў свеце фатаграфіі з'яўляецца выкарыстанне не з'яўляецца 1-бітны колер, 114 00:07:08,470 --> 00:07:12,730 так як гэта прадугледжвае, але 24-бітны колер, дзе вы фактычна атрымліваеце мільёны кветак. 115 00:07:12,730 --> 00:07:15,430 Так як у выпадку, калі мы павялічана на вочы Роба, 116 00:07:15,430 --> 00:07:19,270 , Што было любую колькасць мільёны розных маляўнічых магчымасцяў. 117 00:07:19,270 --> 00:07:22,260 >> Такім чынам, мы ўвядзем гэта праблема набору 4, а таксама ў кіраўніцтве 118 00:07:22,260 --> 00:07:27,050 які будзе сёння ў 3:30 замест звычайнага 2:30, таму што лекцыі пятніцу тут. 119 00:07:27,050 --> 00:07:29,930 Але відэа будзе ў рэжыме онлайн, як звычайна, заўтра. 120 00:07:29,930 --> 00:07:31,880 Мы таксама пазнаёмім вас з іншы фармат файла. 121 00:07:31,880 --> 00:07:34,150 Так што гэта наўмысна павінна выглядаць страшным на першы, 122 00:07:34,150 --> 00:07:38,980 Але гэта толькі некаторыя дакументы для структуры C. 123 00:07:38,980 --> 00:07:42,280 Аказваецца, Microsoft, шмат гадоў таму, спрыяў папулярызацыі гэтага фармату, 124 00:07:42,280 --> 00:07:46,630 называецца растравы фармат, BMP, і гэта было супер-просты, 125 00:07:46,630 --> 00:07:50,390 маляўнічы графічны фармат файла, які быў выкарыстаны на працягу некаторага часу 126 00:07:50,390 --> 00:07:53,640 а часам яшчэ для шпалер на працоўных сталах. 127 00:07:53,640 --> 00:07:57,410 Калі вы думаеце, вярнуцца да Windows XP і пагоркаў і блакітнага неба, 128 00:07:57,410 --> 00:08:00,660 , Што было тыпова BMP, або растравых малюнкаў, і растравыя выявы 129 00:08:00,660 --> 00:08:03,340 задавальненне для нас, таму што ў іх ёсць трохі больш складанасці. 130 00:08:03,340 --> 00:08:05,640 Гэта не так проста, як гэта сетка з 0 і 1; 131 00:08:05,640 --> 00:08:10,680 Замест гэтага, у Вас ёсць такія рэчы, як загаловак у пачатку файла. 132 00:08:10,680 --> 00:08:15,520 Такім чынам, іншымі словамі, усярэдзіне. Файлаў BMP ўяўляе сабой цэлы букет з 0 і 1, 133 00:08:15,520 --> 00:08:18,070 але ёсць некаторыя дадатковыя 0 і 1 у там. 134 00:08:18,070 --> 00:08:21,450 І атрымліваецца, што тое, што мы, верагодна, само сабой якія разумеюцца на працягу многіх гадоў, 135 00:08:21,450 --> 00:08:27,040 фарматы файлаў, як. дакумент або. або XLS. mp3 або. mp4, 136 00:08:27,040 --> 00:08:29,910 усе фарматы файлаў, якія вы знаёмыя з. 137 00:08:29,910 --> 00:08:31,900 Ну, і што гэта ўвогуле значыць быць фармат файла? 138 00:08:31,900 --> 00:08:35,740 Таму што ў рэшце рэшт, усе гэтыя файлы, якія мы выкарыстоўваем, маюць толькі 0 і 1 139 00:08:35,740 --> 00:08:39,950 і, магчыма, гэтыя 0 і 1 ўяўляюць, B, C, праз ASCII і да т.п., 140 00:08:39,950 --> 00:08:42,030 але да канца дня, гэта толькі 0 і 1. 141 00:08:42,030 --> 00:08:45,300 >> Такім чынам, людзі проста часам вырашылі вынайсці новы фармат файлаў 142 00:08:45,300 --> 00:08:49,420 дзе яны стандартызацыі, якія мадэлі біт будзе на самой справе маю на ўвазе. 143 00:08:49,420 --> 00:08:52,790 І ў гэтым выпадку тут, людзі, якія распрацаваны растравы фармат 144 00:08:52,790 --> 00:08:58,260 Кажуць, што ў самы першы байт у растравы файл, як пазначаць зрушэнне 0, то, 145 00:08:58,260 --> 00:09:02,320 там будуць некаторыя зашыфраваныя імёны зменнай bfType, 146 00:09:02,320 --> 00:09:06,510 які проста каштуе для растравых тыпаў файлаў; якога тыпу файл выявы гэтага. 147 00:09:06,510 --> 00:09:10,780 Можна зрабіць выснову, мабыць, з другога шэрагу, што зрушэнне 2, байт нумар 2, 148 00:09:10,780 --> 00:09:15,980 мае малюнак з 0 і 1, якая прадстаўляе што? 149 00:09:15,980 --> 00:09:18,320 Памер і тое, і гэта ідзе адтуль. 150 00:09:18,320 --> 00:09:20,660 Такім чынам, у праблеме набор 4, вы будзеце прайшоў праз некаторыя з гэтых рэчаў. 151 00:09:20,660 --> 00:09:24,480 >> Мы не будзем у канчатковым выніку клопат аб усіх з іх, але заўважыць гэта пачынае станавіцца цікавым 152 00:09:24,480 --> 00:09:30,780 вакол лініі або байт 54, rgbtBlue, зялёны і чырвоны. 153 00:09:30,780 --> 00:09:35,280 Калі вы калі-небудзь чулі акронім RGB, чырвоны зялёны сіні, гэта спасылка на гэта. 154 00:09:35,280 --> 00:09:37,840 Таму што атрымліваецца, вы можаце маляваць ўсе колеры вясёлкі 155 00:09:37,840 --> 00:09:41,580 з некаторай камбінацыяй чырвонага і сіняга і зялёнага. 156 00:09:41,580 --> 00:09:46,560 І на самай справе, бацькі ў зале маглі б узгадаць некаторыя з самых ранніх праектараў. 157 00:09:46,560 --> 00:09:49,360 У гэтыя дні, вы бачыце толькі адзін яркі святло, выходны з аб'ектыва. 158 00:09:49,360 --> 00:09:52,870 Але вернемся ў дзень, вы былі чырвоныя лінзы, блакітныя лінзы і зялёныя лінзы 159 00:09:52,870 --> 00:09:56,620 і яны разам, накіраванай на экране і сфармаваў маляўнічую карціну. 160 00:09:56,620 --> 00:09:59,590 І даволі часта сярэдніх школ і ВНУ будуць мець тыя лінзы 161 00:09:59,590 --> 00:10:02,680 ўсё так трохі крыва, так што вы былі свайго роду бачым двайныя або патройныя малюнка, 162 00:10:02,680 --> 00:10:07,500 але гэта была ідэя. Вы былі чырвоны і зялёны і сіні святло намаляваць карціну. 163 00:10:07,500 --> 00:10:09,570 І той жа самы прынцып выкарыстоўваецца ў кампутарах. 164 00:10:09,570 --> 00:10:12,000 >> Такім чынам, сярод праблем, то для Вас ў праблеме ўсталяваць 4 165 00:10:12,000 --> 00:10:16,080 збіраюцца быць некалькі рэчаў, адна з'яўляецца на самай справе змяніць памер малюнка. 166 00:10:16,080 --> 00:10:18,050 Для таго, каб у шаблоне ад 0 і 1, 167 00:10:18,050 --> 00:10:22,840 высветліць, якія кавалкі 0 і 1 уяўляюць тое, што ў структуры, як гэта, 168 00:10:22,840 --> 00:10:26,800 , А затым высветліць, як паўтарыць пікселяў: чырвоныя, сінія, зялёныя 169 00:10:26,800 --> 00:10:32,460 ўнутры так, што, калі карціна выглядае так першапачаткова, можа выглядаць так, а не пасля гэтага. 170 00:10:32,460 --> 00:10:35,590 Сярод іншых праблем, таксама будзе, што вы будзеце перададзены 171 00:10:35,590 --> 00:10:38,900 судова вобраз сам файл з лічбавай камеры 172 00:10:38,900 --> 00:10:42,410 і на гэтай камеры, калісьці, было цэлая куча фатаграфій. 173 00:10:42,410 --> 00:10:47,030 Праблема ў тым, мы выпадкова сцёртыя або быў вобраз пашкоджаны нейкім чынам. 174 00:10:47,030 --> 00:10:51,040 Дрэнныя рэчы здараюцца з лічбавых камер, і таму мы хутка скапіявалі ўсё з 0 і 1 175 00:10:51,040 --> 00:10:55,410 з гэтай картай для вас, захаваць іх усё ў адзін вялікі файл, а затым мы будзем перадаваць іх для вас 176 00:10:55,410 --> 00:11:00,000 У задачу ўсталяваць 4, так што вы можаце напісаць праграму ў C, з якой аднавіцца 177 00:11:00,000 --> 00:11:02,660 ўсе гэтыя выявы ў фармаце JPEG, у ідэале. 178 00:11:02,660 --> 00:11:06,280 І аказваецца, што JPEG, нават калі яны чымсьці складаным фарматам файла, 179 00:11:06,280 --> 00:11:09,580 яны значна больш складанай, чым гэта ўсьмешлівы твар тут. 180 00:11:09,580 --> 00:11:14,320 Атрымліваецца, што кожны JPEG пачынаецца з тых жа мадэляў ад 0 і 1. 181 00:11:14,320 --> 00:11:18,820 Такім чынам, выкарыстоўваючы пятлю, або цыкл ці аналагічны, 182 00:11:18,820 --> 00:11:22,350 Вы можаце перабраць усе 0 і 1 у гэтай судовай малюнак 183 00:11:22,350 --> 00:11:26,670 і кожны раз, калі вы бачыце адмысловы шаблон, які вызначаны ў спецыфікацыі праблема набору, 184 00:11:26,670 --> 00:11:29,770 Вы можаце выказаць здагадку: "Ах, вось, з вельмі высокай верагоднасцю, 185 00:11:29,770 --> 00:11:33,520 Пачатак JPEG, і як толькі вы знойдзеце па той жа схеме, 186 00:11:33,520 --> 00:11:36,050 некаторы колькасць байтаў ці кілабайтах або мегабайтах пазней, 187 00:11:36,050 --> 00:11:40,550 Вы можаце выказаць здагадку, 'О! Вось другі JPEG, фота я ўзяў пасля таго, як першы. 188 00:11:40,550 --> 00:11:44,720 Дазвольце мне спыніцца чытаў, што першы файл, пачаць пісаць гэты новы ". 189 00:11:44,720 --> 00:11:49,980 І выхад з вашай праграмы для PSET 4 будзе цэлых 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 А калі гэта не 50 JPEG, у вас ёсць трохі цыклу. 191 00:11:52,400 --> 00:11:55,580 Калі ў вас ёсць бясконцая колькасць JPEG, у вас ёсць бясконцы цыкл. 192 00:11:55,580 --> 00:11:58,280 Так што, таксама будзе даволі распаўсюджаны выпадак. 193 00:11:58,280 --> 00:12:00,280 Вось што на гарызонце. 194 00:12:00,280 --> 00:12:03,740 >> Віктарына 0, ззаду нас. Зразумейце, на маю электронную пошту, якая нязменна ёсць людзі 195 00:12:03,740 --> 00:12:06,820 , Якія абодва шчаслівыя, як бы нейтральнай, і сумныя вакол віктарына 0 раз. 196 00:12:06,820 --> 00:12:10,160 І, калі ласка, дацягнуцца да мяне, кіраўнік ТФ, Zamyla, вашы ўласныя TF 197 00:12:10,160 --> 00:12:14,120 або аднаго з цэнтраў сертыфікацыі, якія вы ведаеце, калі вы хацелі б абмеркаваць, як усё прайшло. 198 00:12:14,120 --> 00:12:16,460 >> Такім чынам, каб вырабіць ўражанне на бацькоў тут, у пакоі, 199 00:12:16,460 --> 00:12:23,990 што CS50 бібліятэку? Добрая праца. 200 00:12:23,990 --> 00:12:32,280 Што CS50 бібліятэку? Да? [Адказы студэнтаў, неразборліва] 201 00:12:32,280 --> 00:12:35,730 >> Добра, добра. Так што гэта Стандартная набор кода, які мы, супрацоўнікі, пісаў, 202 00:12:35,730 --> 00:12:38,460 мы прадстаўляем вам, каб забяспечыць некаторыя агульныя функцыянальныя магчымасці. 203 00:12:38,460 --> 00:12:42,290 Такія рэчы, як мне атрымаць радок, зразумейце мяне INT, усе функцыі, пералічаныя тут. 204 00:12:42,290 --> 00:12:45,260 Пачынаючы з гэтага моманту, мы пачынаем па-сапраўднаму ўзяць гэтыя навучальныя колы прэч. 205 00:12:45,260 --> 00:12:48,230 Такім чынам, мы збіраемся пачаць, каб забраць "радок" ад вас, 206 00:12:48,230 --> 00:12:52,790 які, нагадаем, быў усяго толькі сінонім, што фактычны тып дадзеных? сімвал *. 207 00:12:52,790 --> 00:12:57,020 Такім чынам, для бацькоў, якія, верагодна, - гэта добра, так што знак *, мы пачынаем бачыць 208 00:12:57,020 --> 00:13:00,810 На экране тым больш, што мы выдаляем "радок" з нашага лексікону, 209 00:13:00,810 --> 00:13:02,760 па крайняй меры калі справа даходзіць да фактычнага напісання кода. 210 00:13:02,760 --> 00:13:06,240 Акрамя таго, мы будзем адмовіцца ад выкарыстання некаторых з гэтых функцый столькі ж, 211 00:13:06,240 --> 00:13:08,390 таму што нашы праграмы збіраюцца атрымаць больш складаныя 212 00:13:08,390 --> 00:13:11,370 , А не проста пісаць праграмы, якія сядзяць там з запытам міргаць, 213 00:13:11,370 --> 00:13:13,580 чакання для карыстальніка, каб увесці нешта цалі 214 00:13:13,580 --> 00:13:15,220 Вы будзеце атрымліваць вашыя матэрыялы з іншых крыніц. 215 00:13:15,220 --> 00:13:18,720 Напрыклад, Вы будзеце атрымліваць іх з паслядоўнасці бітаў на лакальным цвёрдым дыску. 216 00:13:18,720 --> 00:13:23,340 Вы, а не атрымліваць іх у будучыні ад сеткі, некаторыя вэб-сайт где-то. 217 00:13:23,340 --> 00:13:27,460 Так што давайце адхіліце гэты пласт у першы раз, і пацягніце ўверх CS50 прыбора 218 00:13:27,460 --> 00:13:32,300 і гэты файл называецца CS50.h, што вы былі рэзкімі, уключаючы некалькі тыдняў. 219 00:13:32,300 --> 00:13:34,380 >> Але давайце рэальна ўбачыць, што знаходзіцца ўнутры гэтага. 220 00:13:34,380 --> 00:13:38,250 Такім чынам, у верхняй частцы файла ў сінім гэта проста цэлая куча каментароў, 221 00:13:38,250 --> 00:13:41,340 Інфармацыя ліцэнзавання і гарантыі. Гэта свайго роду агульную парадыгму 222 00:13:41,340 --> 00:13:44,600 у праграмнае забеспячэнне, таму што шмат праграмнага забеспячэння ў гэтыя дні тое, што называецца "з адкрытым зыходным кодам», 223 00:13:44,600 --> 00:13:46,940 Гэта азначае, што нехта напісаў код 224 00:13:46,940 --> 00:13:50,060 і зрабіў гэта ў вольным доступе, а не проста бегаць і выкарыстоўваць, 225 00:13:50,060 --> 00:13:53,660 але на самой справе чытаць і змяняць і інтэграваць у сваю працу. 226 00:13:53,660 --> 00:13:55,790 Так вось, што вы выкарыстоўваеце праграмнае забеспячэнне з адкрытым крыніцай, 227 00:13:55,790 --> 00:13:58,030 хоць і ў вельмі малой формы. 228 00:13:58,030 --> 00:14:01,860 Калі я пракруціць ўніз міма каментароў, хоць, мы пачынаем бачыць некаторыя больш знаёмыя рэчы. 229 00:14:01,860 --> 00:14:08,090 Так заўважыць у верхняй тут, што файл CS50.h ўключае ў сябе цэлую кучу файлаў загалоўкаў. 230 00:14:08,090 --> 00:14:11,160 Цяпер большасць з іх мы раней не бачылі, але адно 231 00:14:11,160 --> 00:14:15,640 знаёмыя, якія з іх мы не бачылі, хоць і ненадоўга, да гэтага часу? 232 00:14:15,640 --> 00:14:18,720 Так, стандартныя бібліятэкі. Stdlib.h мае таНос, 233 00:14:18,720 --> 00:14:21,590 таму, як толькі мы пачалі гаварыць аб дынамічным размеркаванні памяці, 234 00:14:21,590 --> 00:14:24,960 якія мы вернемся на наступным тыдні, а мы пачалі ў тым ліку і файлаў. 235 00:14:24,960 --> 00:14:29,660 Аказваецца, BOOL і праўдзівым і ілжывым на самой справе не існуе ў C, па сутнасці, 236 00:14:29,660 --> 00:14:32,460 калі вы ўключаеце гэты файл тут. 237 00:14:32,460 --> 00:14:35,770 Такім чынам, мы на працягу некалькіх тыдняў, былі ў тым ліку стандартныя bool.h 238 00:14:35,770 --> 00:14:39,020 так што вы можаце выкарыстоўваць паняцце лагічнае, праўдзівай ці ілжывай. 239 00:14:39,020 --> 00:14:41,830 Без гэтага, вам прыйдзецца разабрацца падробленых і выкарыстоўваць Int 240 00:14:41,830 --> 00:14:45,920 і проста адвольна лічыць, што 0 з'яўляецца ілжывым і 1 дакладная. 241 00:14:45,920 --> 00:14:49,980 >> Цяпер, калі мы пракруціць ўніз далей, вось наша вызначэнне радка. 242 00:14:49,980 --> 00:14:54,820 Аказваецца, як мы ўжо казалі раней, што там, дзе гэта * гэта сапраўды не мае значэння. 243 00:14:54,820 --> 00:14:56,750 Вы нават можаце мець прастору вакол. 244 00:14:56,750 --> 00:15:01,550 Мы, у гэтым семестры, былі яго папулярызацыі як гэта зрабіць зразумела, што * мае справу з тыпам. 245 00:15:01,550 --> 00:15:05,370 Але разумееце, як агульнага, калі не трохі часцей, гэта паставіць яго там 246 00:15:05,370 --> 00:15:07,480 але функцыянальна гэта тое ж самае. 247 00:15:07,480 --> 00:15:11,070 Але цяпер, калі мы будзем чытаць далей уніз, давайце паглядзім на, скажам, GetInt, 248 00:15:11,070 --> 00:15:15,350 таму што мы выкарыстоўвалі, што, можа быць, перш чым што-небудзь яшчэ ў гэтым семестры. 249 00:15:15,350 --> 00:15:19,620 А вось GetInt. Гэта што? 250 00:15:19,620 --> 00:15:24,650 Гэта прататып. Так часта мы паставілі прататыпы на вяршынях нашых. З файламі, 251 00:15:24,650 --> 00:15:28,190 але вы таксама можаце змясціць прататыпы ў файлы загалоўкаў,. г файлы, 252 00:15:28,190 --> 00:15:32,110 як гэта тут, так што, калі вы пішаце некаторых функцый 253 00:15:32,110 --> 00:15:36,790 што вы хочаце, каб іншыя людзі маглі выкарыстоўваць, а гэта менавіта і ў выпадку з CS50 бібліятэкі, 254 00:15:36,790 --> 00:15:40,900 Вы не толькі рэалізаваць свае функцыі ў нешта накшталт CS50.c, 255 00:15:40,900 --> 00:15:46,720 Вы таксама змясціць прататыпы не ў верхняй часткі гэтага файла, але ў верхняй частцы загалоўка файла, 256 00:15:46,720 --> 00:15:50,810 тое, што загаловак файла з'яўляецца тое, што сябры і калегі ўключаюць, 257 00:15:50,810 --> 00:15:52,800 з вострымі ўключыць у свой код. 258 00:15:52,800 --> 00:15:55,440 Так што ўвесь гэты час вы былі ў тым ліку ўсе гэтыя прататыпы 259 00:15:55,440 --> 00:15:59,870 эфектыўна ў верхняй частцы вашага файла, але праз гэты рэзкі ўключаць механізм 260 00:15:59,870 --> 00:16:03,320 , Што істотна капіюе і ўстаўляе гэты файл у свой уласны. 261 00:16:03,320 --> 00:16:06,400 Цяпер, вось некаторыя даволі падрабязную дакументацыю. 262 00:16:06,400 --> 00:16:08,880 >> Мы ў значнай ступені само сабой якія разумеюцца, што GetInt атрымлівае INT, 263 00:16:08,880 --> 00:16:10,740 але, аказваецца, ёсць некаторыя прыватныя выпадкі, ці не так? 264 00:16:10,740 --> 00:16:14,320 Што рабіць, калі карыстальнік ўводзіць лік, гэта занадта вялікі? 265 00:16:14,320 --> 00:16:17,350 Квинтиллиона, што проста не можа змясціцца ўнутры Int? 266 00:16:17,350 --> 00:16:21,180 Якое чаканае паводзіны? Ну, у ідэале, гэта прадказальна. 267 00:16:21,180 --> 00:16:23,460 Такім чынам, у гэтым выпадку, калі вы на самой справе чытаць дробны шрыфт, 268 00:16:23,460 --> 00:16:27,850 Вы ўбачыце, што, калі лінія не можа быць прачытаны, гэта вяртае INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Мы ніколі не казалі пра гэта, але, грунтуючыся на яго капіталізацыі, 270 00:16:30,800 --> 00:16:33,030 што гэта, напэўна? 271 00:16:33,030 --> 00:16:36,610 Гэта пастаянная, так што некаторыя спецыяльныя канстанта, якая, верагодна, абвясціў 272 00:16:36,610 --> 00:16:39,460 у адным з гэтых файлаў загалоўкаў вось падняцца вышэй у файле, 273 00:16:39,460 --> 00:16:43,400 INT_MAX і, верагодна, нешта кшталту, прыкладна, 2 мільярды даляраў. 274 00:16:43,400 --> 00:16:48,160 Ідэя заключалася ў тым, што, паколькі мы павінны нейкім чынам азначае, што нешта пайшло не так, 275 00:16:48,160 --> 00:16:51,090 Мы, так, ёсць 4000000000 нумары ў нашым распараджэнні, 276 00:16:51,090 --> 00:16:53,980 адмоўнае 2 млрд. да 2 млрд., плюс-мінус. 277 00:16:53,980 --> 00:16:58,030 Ну, тое, што з'яўляецца агульным у праграмаванні ты скраў толькі адзін з гэтых лікаў. 278 00:16:58,030 --> 00:17:02,250 Можа быць 0, можа быць, 2 млрд, можа быць адмоўным 2 мільярды даляраў. 279 00:17:02,250 --> 00:17:06,720 Такім чынам, вы марнуеце адну з вашых магчымых значэнняў, так што вы можаце зрабіць у свеце 280 00:17:06,720 --> 00:17:10,089 што калі нешта пойдзе не так, я вярну гэты супер-вялікага значэння. 281 00:17:10,089 --> 00:17:13,329 Але вы не хочаце, каб карыстач друкуе нешта загадкавае, як "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 сапраўды вялікі нумар, дзе вы абагульняць, а не як канстанту. 283 00:17:17,079 --> 00:17:19,380 Так на самай справе, калі вы былі анальнага апошнія некалькі тыдняў, 284 00:17:19,380 --> 00:17:23,800 у любы час вы тэлефануеце GetInt, вы павінны былі праверыць з, калі ўмовы. 285 00:17:23,800 --> 00:17:27,109 Хіба тыпу карыстальніка ў INT_MAX, ці, дакладней, 286 00:17:27,109 --> 00:17:29,900 GetInt зрабіў вяртанне INT_MAX? Таму што калі гэта так, 287 00:17:29,900 --> 00:17:35,140 што на самой справе азначае, што яны не ўводзіце яго, нешта пайшло не так у гэтым выпадку. 288 00:17:35,140 --> 00:17:38,970 Такім чынам, гэта тое, што звычайна называюць "дазорную" значэнне, якое проста азначае, асаблівы. 289 00:17:38,970 --> 00:17:41,020 >> Ну, давайце цяпер звернемся ў службу. З файламі. 290 00:17:41,020 --> 00:17:44,500 Размовы C існавала ў прыбор на працягу некаторага часу, 291 00:17:44,500 --> 00:17:47,540 і, па сутнасці, прыбор мае яго папярэдне скампіляваных для вас 292 00:17:47,540 --> 00:17:49,720 у тое, што мы называлі "аб'ектны код" 293 00:17:49,720 --> 00:17:52,940 але гэта проста не мае значэння для вас, дзе гэта таму, што сістэма ведае, 294 00:17:52,940 --> 00:17:54,780 У гэтым выпадку, дзе яна знаходзіцца, прыбор. 295 00:17:54,780 --> 00:18:00,620 Але давайце пракруціць ўніз цяпер GetInt, і паглядзець, як GetInt працаваў ўвесь гэты час. 296 00:18:00,620 --> 00:18:02,380 Такім чынам, тут мы маем падобныя каментары, чым раней. 297 00:18:02,380 --> 00:18:04,930 Дазвольце мне павялічыць толькі на частку кода, 298 00:18:04,930 --> 00:18:07,410 і што мы маем на GetInt заключаецца ў наступным. 299 00:18:07,410 --> 00:18:12,770 Ён не прымае ўваходныя і вяртае цэлае, у той час (праўда), так што ў нас ёсць наўмыснае бясконцы цыкл 300 00:18:12,770 --> 00:18:16,560 але, па-відаць, мы вырвацца з гэтага так ці інакш, ці вярнуцца ўнутры гэтага. 301 00:18:16,560 --> 00:18:19,890 Такім чынам, давайце паглядзім, як гэта працуе. Ну, мы, падобна, выкарыстоўваюць GetString 302 00:18:19,890 --> 00:18:22,550 У гэтай першай лініяй ўнутры цыклу, 166. 303 00:18:22,550 --> 00:18:25,320 Цяпер гэта добрая практыка, таму што, пры якіх абставінах 304 00:18:25,320 --> 00:18:30,820 GetString можа вярнуць гэта спецыяльнае ключавое слова NULL? 305 00:18:30,820 --> 00:18:38,460 Калі нешта пойдзе не так. Што можа пайсці не так, калі вы называеце нешта накшталт GetString? 306 00:18:38,460 --> 00:18:42,550 Да? [Студэнт адказ, неразборліва] >> Так. Таму, магчыма, таНос не атрымоўваецца. 307 00:18:42,550 --> 00:18:45,310 Дзесьці пад капотам GetString кліча таНос, 308 00:18:45,310 --> 00:18:48,210 якая вылучае памяць, якая дазваляе ў кампутарны краму 309 00:18:48,210 --> 00:18:50,950 Усе сімвалы, якія карыстальнік набірае на клавіятуры. 310 00:18:50,950 --> 00:18:53,270 І выкажам здагадку, што карыстач меў шмат вольнага часу 311 00:18:53,270 --> 00:18:56,470 і набралі больш, напрыклад, чым 2 млрд. знакаў. 312 00:18:56,470 --> 00:18:59,600 Больш за сімвалаў, чым кампутар, нават мае RAM. 313 00:18:59,600 --> 00:19:02,350 Ну, GetString павінен быць у стане азначае, што да вас, 314 00:19:02,350 --> 00:19:05,650 нават калі гэта супер, супер рэдкі выпадак куце. 315 00:19:05,650 --> 00:19:08,490 Ён павінен нейкім чынам быць у стане справіцца з гэтым, і так GetString, 316 00:19:08,490 --> 00:19:11,850 калі мы вернемся і прачытаць яго дакументацыю, не, на самай справе, вярнуць NULL. 317 00:19:11,850 --> 00:19:16,150 Цяпер, калі GetString не атрымоўваецца, вяртаючы NULL, GetInt збіраецца пацярпець няўдачу 318 00:19:16,150 --> 00:19:19,370 шляхам вяртання INT_MAX, як дазорцы. 319 00:19:19,370 --> 00:19:22,650 Гэта ўсяго толькі чалавечыя канвенцыі. Толькі так вы б ведалі, што гэта справа 320 00:19:22,650 --> 00:19:24,840 , Чытаючы дакументацыю. 321 00:19:24,840 --> 00:19:28,200 Так што давайце пракруціць ўніз, туды, дзе Int на самай справе GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Так што калі я пракруціць ўніз крыху далей, у лініі 170 у нас ёсць каментар вышэй гэтых ліній. 323 00:19:34,220 --> 00:19:38,470 Такім чынам, мы заяўляем, у 172, Int N і сімвал с, а затым гэтая новая функцыя 324 00:19:38,470 --> 00:19:41,870 які некаторыя з вас наткнуўся раней, але Sscanf. 325 00:19:41,870 --> 00:19:44,190 Гэта азначае F радок сканавання. 326 00:19:44,190 --> 00:19:48,580 Іншымі словамі, даць мне радкі, і я буду праверыць яго на кавалкі інфармацыі, якая прадстаўляе цікавасць. 327 00:19:48,580 --> 00:19:53,820 Дык што ж гэта значыць? Ну, выкажам здагадку, што я тыпу ў літаральным сэнсе 1 2 3 на клавіятуры, 328 00:19:53,820 --> 00:19:59,730 , А затым націсніце клавішу Увод. Што такое тып дадзеных 1 2 3, калі вяртаюцца GetString? 329 00:19:59,730 --> 00:20:05,010 Відавочна, што гэта радок, ці не так? У мяне ёсць радок, таму 1 2 3 сапраўды "1 2 3" 330 00:20:05,010 --> 00:20:07,260 з \ 0 ў канцы яго. Гэта не Int. 331 00:20:07,260 --> 00:20:10,420 Гэта не лік. Гэта выглядае як лік, але гэта не на самай справе. 332 00:20:10,420 --> 00:20:14,680 Такім чынам, што ж GetInt рабіць? Гэта мае для сканавання гэтага радка злева направа, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, і нейкім чынам пераўтварыць яго ў фактычнае лік. 334 00:20:19,010 --> 00:20:21,010 Цяпер вы можаце зразумець, як гэта зрабіць. 335 00:20:21,010 --> 00:20:24,240 Калі вы ўспомніце PSET 2, Вы, верагодна, атрымаў крыху зручны 336 00:20:24,240 --> 00:20:26,810 з Цэзарам або Vigenere так што вы можаце перабраць радкі, 337 00:20:26,810 --> 00:20:29,800 Вы можаце канвертаваць знакаў для цэлых лікаў з выбарам. Гэта цэлая вялікая праца. 338 00:20:29,800 --> 00:20:32,800 Чаму б не назваць функцыю, як Sscanf, што робіць гэта для вас? 339 00:20:32,800 --> 00:20:37,520 Так Sscanf чакае аргумент, у дадзеным выпадку называецца лінія, якая з'яўляецца радком. 340 00:20:37,520 --> 00:20:41,310 Затым вы паказваеце, у двукоссі, вельмі падобны на Printf, 341 00:20:41,310 --> 00:20:44,960 Што вы чакаеце ўбачыць у гэтым радку? 342 00:20:44,960 --> 00:20:52,980 Тое, што я кажу тут, я чакаў убачыць дзесятковы лік і, магчыма, характар. 343 00:20:52,980 --> 00:20:54,990 І мы ўбачым, чаму гэта так, у адзін момант. 344 00:20:54,990 --> 00:20:58,440 Аказваецца, што гэта пазначэнне цяпер нагадвае матэрыял 345 00:20:58,440 --> 00:21:00,840 Мы пачалі казаць пра крыху больш за тыдзень таму. 346 00:21:00,840 --> 00:21:05,430 >> Што такое & N і & C робіць для нас тут? [Адказы студэнтаў, неразборліва] 347 00:21:05,430 --> 00:21:07,610 >> Так. Ён даў мне адрас і адрас п с. 348 00:21:07,610 --> 00:21:10,440 Цяпер, чаму гэта так важна? Ну, вы ведаеце, што з функцыямі C 349 00:21:10,440 --> 00:21:13,440 Вы заўсёды можаце вярнуць значэнне не мае ніякага значэння наогул. 350 00:21:13,440 --> 00:21:16,630 Вы можаце вярнуць цэлы лік, радок, лік з якая плавае кропкай, сімвал, што заўгодна. 351 00:21:16,630 --> 00:21:21,150 Ці вы можаце вярнуцца пустэчу, але вы можаце вярнуць толькі 1 рэч максімальна. 352 00:21:21,150 --> 00:21:26,100 Але тут мы хочам Sscanf вярнуць мяне, можа быць, цэлы лік, дзесятковы лік, 353 00:21:26,100 --> 00:21:29,240 а таксама знак, і я растлумачу, чаму знакаў у хвіліну. 354 00:21:29,240 --> 00:21:34,250 Такім чынам, вы хочаце эфектыўна F вярнуць 2 рэчы, якія проста не магчыма ў C. 355 00:21:34,250 --> 00:21:38,460 Такім чынам, вы можаце абыйсці, што, пераходзячы ў 2-адрасоў, 356 00:21:38,460 --> 00:21:43,710 таму што як толькі вы перадаць функцыі 2 адрасу, што можа гэтую функцыю з імі рабіць? 357 00:21:43,710 --> 00:21:49,880 Ён можа пісаць на гэтыя адрасы. Вы можаце выкарыстоўваць аперацыю * і "туды" да кожнага з гэтых адрасоў. 358 00:21:49,880 --> 00:21:54,320 Гэта накшталт гэтага бэкдор механізм, але вельмі часта мяняюцца значэння зменных 359 00:21:54,320 --> 00:21:58,020 больш, чым проста 1-е месца, у гэтым выпадку 2. 360 00:21:58,020 --> 00:22:04,590 Зараз звернеце ўвагу, я праверкі == to1, а затым вяртаюцца п калі гэта, на самой справе, ацаніць да ісціны. 361 00:22:04,590 --> 00:22:09,340 Так што ж адбываецца? Ну, тэхнічна, усё, што мы сапраўды хочам, адбудзецца ў GetInt гэта. 362 00:22:09,340 --> 00:22:12,340 Мы хочам, каб разабраць, так бы мовіць, мы хочам, каб прачытаць радок 363 00:22:12,340 --> 00:22:16,210 "1 2 3" і, калі яна выглядае як ёсць шэраг там, 364 00:22:16,210 --> 00:22:21,360 тое, што мы гаворым Sscanf зрабіць, гэта пакласці гэты нумар, 1 2 3, у гэтай зменнай п, для мяне. 365 00:22:21,360 --> 00:22:26,060 Чаму ж тады ў мяне гэта, а? 366 00:22:26,060 --> 00:22:33,750 Якая роля таксама кажуць, Sscanf, вы можаце таксама атрымаць сімвал тут. 367 00:22:33,750 --> 00:22:36,890 [Студэнт кажучы, неразборліва] >> Не - дзесятковая кропка можа працаваць. 368 00:22:36,890 --> 00:22:40,650 Давайце лічыць, што на імгненне задумаўся. Што яшчэ? 369 00:22:40,650 --> 00:22:42,570 [Студэнт, неразборліва] >> Так, добрыя думкі, яна можа быць нулявы знак. 370 00:22:42,570 --> 00:22:44,970 Гэта на самай справе не ў гэтым выпадку. Да? [Студэнт, неразборліва] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Ці, дазвольце мне абагульняць яшчэ далей. 372 00:22:47,100 --> 00:22:49,670 % C існуе толькі для праверкі памылак. 373 00:22:49,670 --> 00:22:52,510 Мы не хочам там быць знак пасля нумары, 374 00:22:52,510 --> 00:22:54,980 але тое, што гэта дазваляе мне зрабіць наступнае: 375 00:22:54,980 --> 00:23:01,270 Аказваецца, што Sscanf, акрамя захоўвання значэнняў у н і с, у гэтым прыкладзе, 376 00:23:01,270 --> 00:23:08,170 што ён таксама робіць гэта вяртае колькасць зменных пакласці значэння цалі 377 00:23:08,170 --> 00:23:13,330 Так што калі вы толькі ўвесці 1 2 3, то толькі% D будзе адпавядаць 378 00:23:13,330 --> 00:23:18,830 і толькі п атрымлівае захоўваецца са значэннем, як 1 2 3 і нічога не атрымлівае пакласці ў C; 379 00:23:18,830 --> 00:23:20,870 З застаецца смецце значэнне, так бы мовіць. 380 00:23:20,870 --> 00:23:23,550 Смецце, таму што ён ніколі не быў ініцыялізаваны як некаторую каштоўнасць. 381 00:23:23,550 --> 00:23:29,390 Так што ў гэтым выпадку, Sscanf вяртае 1, таму што я населены адзін з тых паказальнікаў, 382 00:23:29,390 --> 00:23:33,650 У гэтым выпадку, вялікая. У мяне ёсць цэлы лік, так што я вызваліць лінію, каб вызваліць памяць 383 00:23:33,650 --> 00:23:37,150 GetString, што на самой справе вылучаецца, а потым вярнуцца с. 384 00:23:37,150 --> 00:23:42,210 У адваротным выпадку, калі вы ніколі не задумваліся, дзе гэта паўтарыць заяву прыходзіць, прыходзіць прама адсюль. 385 00:23:42,210 --> 00:23:45,770 Калі, наадварот, я набіраю ў 1 2 3 Фу, 386 00:23:45,770 --> 00:23:48,640 толькі некаторыя выпадковыя паслядоўнасці тэксту, Sscanf будзе бачыць, 387 00:23:48,640 --> 00:23:51,500 ох, нумар, ох, нумар, ох, нумар, ох - ф. 388 00:23:51,500 --> 00:23:54,190 І ён збіраецца паставіць 1 2 3 на рускай мове. 389 00:23:54,190 --> 00:23:59,970 Ён збіраецца паставіць е ў с, а затым вярнуць 2. 390 00:23:59,970 --> 00:24:02,980 Такім чынам, мы маем, толькі з дапамогай асноўнага вызначэння паводзін SCANF, у 391 00:24:02,980 --> 00:24:06,170 Вельмі просты спосаб - добра, складаныя на першы погляд, але, у рэшце рэшт, 392 00:24:06,170 --> 00:24:11,460 даволі просты механізм кажучы, ёсць цэлы лік, і калі так, то, што адзінае, што я знайшоў? 393 00:24:11,460 --> 00:24:14,950 І белае прастора тут не выпадкова. Калі вы прачыталі дакументацыю па Sscanf, 394 00:24:14,950 --> 00:24:18,690 ён кажа вам, што калі вы ўключаеце кавалак прабелы ў пачатку ці ў канцы, 395 00:24:18,690 --> 00:24:24,990 Sscanf занадта дазволіць карыстачу, па якой прычыне, каб ўразіць прабел 1 2 3, і гэта будзе законна. 396 00:24:24,990 --> 00:24:28,310 Ён не будзе крычаць на карыстачоў толькі таму, што яны патрапілі ў прабелу ў пачатку ці ў рэшце рэшт, 397 00:24:28,310 --> 00:24:32,160 якія толькі трохі больш зручным для карыстальнікаў. 398 00:24:32,160 --> 00:24:34,160 >> Любыя пытанні, то, па GetInts? Да? 399 00:24:34,160 --> 00:24:36,820 [Студэнт пытанне, неразборліва] 400 00:24:36,820 --> 00:24:40,740 >> Добры пытанне. Што рабіць, калі вы толькі што ўвялі ў сімвал, як і F, і націсніце ўвод 401 00:24:40,740 --> 00:24:47,830 ніколі не ўводзіць 1 2 3; што вы думаеце паводзіны гэтага радка кода бы тады? 402 00:24:47,830 --> 00:24:50,500 Так Sscanf можа пакрыць, што таксама, таму што ў гэтым выпадку, 403 00:24:50,500 --> 00:24:56,280 ён не збіраецца запоўніць N або С; ён збіраецца замест вяртання 0. 404 00:24:56,280 --> 00:25:01,540 У такім выпадку, я таксама лавіць гэты сцэнар, таму што чаканае значэнне я хачу 1. 405 00:25:01,540 --> 00:25:07,310 Я хачу толькі 1, і толькі 1 рэч, каб быць запоўненыя. Добры пытанне. Іншыя? 406 00:25:07,310 --> 00:25:09,610 >> Добра, давайце не будзем прайсці праз усе функцыі тут, 407 00:25:09,610 --> 00:25:11,820 але той, які, здаецца, можа быць, тыя, што засталіся працэнты 408 00:25:11,820 --> 00:25:14,530 у GetString, таму што аказваецца, што GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong ўсе пласкадонку шмат іх функцыянальнасць GetString. 410 00:25:19,490 --> 00:25:22,860 Такім чынам, давайце зірнем на тое, як ён рэалізуецца тут. 411 00:25:22,860 --> 00:25:27,040 Гэта выглядае крыху складаным, але ён выкарыстоўвае тыя ж асновы 412 00:25:27,040 --> 00:25:29,680 што мы пачалі гаварыць аб мінулага тыдня. Такім чынам, у GetString, 413 00:25:29,680 --> 00:25:32,670 які не прымае аргументаў, як у пустэчу тут, 414 00:25:32,670 --> 00:25:37,110 і ён вяртае радок, так я абвяшчаю радкі называецца буферам. 415 00:25:37,110 --> 00:25:39,670 Я сапраўды не ведаю, што гэта збіраецца быць выкарыстаны для яшчэ няма, але мы будзем бачыць. 416 00:25:39,670 --> 00:25:42,950 Падобна на тое магутнасці, па змаўчанні 0; не зусім упэўнены, дзе гэта адбываецца. 417 00:25:42,950 --> 00:25:44,920 Не ўпэўнены, што п збіраецца быць выкарыстаны для кліентаў. 418 00:25:44,920 --> 00:25:47,860 Але зараз гэта становіцца трохі больш цікавай, так і ў лініі 243, 419 00:25:47,860 --> 00:25:51,760 мы заяўляем Int C, гэта свайго роду дурныя падрабязна. 420 00:25:51,760 --> 00:25:58,080 Сімвал гэта 8 біт і 8 біт можа захоўваць колькі розных значэнняў? 421 00:25:58,080 --> 00:26:03,310 256. Праблема ў тым, калі вы хочаце мець 256 розных знакаў ASCII, 422 00:26:03,310 --> 00:26:06,210 якое ёсць, калі вы азірнецца назад, і гэта не тое, каб запомніць. 423 00:26:06,210 --> 00:26:09,100 Але калі вы ўспомніце, што вялікая ASCII графіцы мы былі тыдзень таму, 424 00:26:09,100 --> 00:26:13,780 было, у такім выпадку, 128 або 256 ASCII сімвалаў. 425 00:26:13,780 --> 00:26:16,220 Мы выкарыстоўвалі ўсе мадэлі 0 і 1 справа. 426 00:26:16,220 --> 00:26:19,410 Гэта праблема, калі вы хочаце быць у стане выявіць памылку. 427 00:26:19,410 --> 00:26:23,290 Таму што, калі вы ўжо карыстаецеся 256 значэнняў для вашых персанажаў, 428 00:26:23,290 --> 00:26:26,390 Вы сапраўды не планаваць загадзя, таму што цяпер у вас няма магчымасці сказаць, 429 00:26:26,390 --> 00:26:29,750 "Гэта не законна характар, гэта нейкае памылковае паведамленне". 430 00:26:29,750 --> 00:26:32,430 Так што свет робіць гэта, яны выкарыстоўваюць наступны самая вялікая каштоўнасць, 431 00:26:32,430 --> 00:26:35,790 нешта накшталт Int, так што ў вас ёсць вар'яты лік бітаў, 432 00:26:35,790 --> 00:26:39,610 32 на 4 млрд. значэнняў, так што вы можаце проста ў канчатковым выніку, выкарыстоўваючы, 433 00:26:39,610 --> 00:26:44,800 па сутнасці, 257 з іх, 1 з якіх мае некаторы асаблівае значэнне як памылку. 434 00:26:44,800 --> 00:26:49,190 >> Такім чынам, давайце паглядзім, як гэта працуе. У адпаведнасці 246, у мяне ёсць гэты вялікі цыкл пры 435 00:26:49,190 --> 00:26:54,530 , Які выклікае fgetc, е значэнне файла, ЕОКП, а затым стандартнага ўводу. 436 00:26:54,530 --> 00:26:59,030 Аказваецца, гэта ўсяго толькі больш дакладным спосабам сказаць "чытаць ўвод з клавіятуры". 437 00:26:59,030 --> 00:27:02,730 Стандартная клавіятура сродкаў ўвод, стандартны вывад азначае, экран, 438 00:27:02,730 --> 00:27:06,920 і стандартныя памылкі, якія мы ўбачым у PSET 4, азначае, што экран, 439 00:27:06,920 --> 00:27:09,670 але асаблівая частка экрана, так што яна не змешваецца 440 00:27:09,670 --> 00:27:13,760 з фактычным выхадам, што вы прызначаныя для друку, але пра гэта ў будучыні. 441 00:27:13,760 --> 00:27:19,430 Так fgetc проста азначае, што чытаць адзін знак з клавіятуры, і захоўваць яго дзе? 442 00:27:19,430 --> 00:27:24,000 Захоўваеце яго ў C, а затым праверыць, так што я проста выкарыстоўваючы некаторыя лагічныя саюзы тут, 443 00:27:24,000 --> 00:27:28,430 пераканайцеся, што яна не роўная \ п, так што карыстач націсніце ўвод. 444 00:27:28,430 --> 00:27:31,510 Мы хочам спыніць у той момант, канец цыклу, і мы таксама хочам, каб праверыць 445 00:27:31,510 --> 00:27:36,170 для спецыяльных пастаяннай, EOF, якая, калі вы ведаеце ці адгадаць - што гэта азначае? 446 00:27:36,170 --> 00:27:39,860 Канец файла. Так што гэта выгляд бессэнсоўна, таму што, калі я друкую на клавіятуры, 447 00:27:39,860 --> 00:27:41,900 там сапраўды няма файла, якія ўдзельнічаюць у гэтым, 448 00:27:41,900 --> 00:27:44,330 Але гэта ўсяго толькі свайго роду агульны тэрмін, які выкарыстоўваецца для абазначэння 449 00:27:44,330 --> 00:27:50,320 што нічога не прыходзіць з пальца чалавека. EOF. Канец файла. 450 00:27:50,320 --> 00:27:52,600 Як у баку, калі вы калі-небудзь ударыў кіравання D на вашай клавіятуры, 451 00:27:52,600 --> 00:27:54,680 Не, што вы б яшчэ, вы патрапілі кантроль с. 452 00:27:54,680 --> 00:27:57,920 Але кантроль г пасылае гэта адмысловая канстанта называецца EOF. 453 00:27:57,920 --> 00:28:03,100 >> Такім чынам, зараз мы проста ёсць некаторыя дынамічнага размеркавання памяці. 454 00:28:03,100 --> 00:28:06,460 Так што, калі п + 1> магутнасцяў, зараз я растлумачу, с. 455 00:28:06,460 --> 00:28:09,380 п, колькі байт у цяперашні час у буферы, 456 00:28:09,380 --> 00:28:11,970 Радок, вы ў цяперашні час нарошчвання ад карыстальніка. 457 00:28:11,970 --> 00:28:16,240 Калі ў вас ёсць некалькі знакаў у буферы, чым у вас ёсць патэнцыял у буфер, 458 00:28:16,240 --> 00:28:20,760 інтуітыўна, што мы павінны зрабіць, гэта вылучыць больш магутнасці. 459 00:28:20,760 --> 00:28:24,490 Я хачу, каб слізгаць над некаторымі арыфметычнай тут 460 00:28:24,490 --> 00:28:26,900 і засяродзіцца толькі на гэтай функцыі тут. 461 00:28:26,900 --> 00:28:29,170 Вы ведаеце, што таНос ёсць, або па крайняй меры ў цэлым знаёмыя. 462 00:28:29,170 --> 00:28:32,380 Вазьміце здагадку, што пераразмеркаваць робіць. [Студэнт адказ, неразборліва] 463 00:28:32,380 --> 00:28:35,690 >> Так. І гэта не зусім даданне памяці, яна пераразмяркоўвае памяць наступным чынам: 464 00:28:35,690 --> 00:28:40,530 Калі ёсць яшчэ месца ў канцы радка, каб даць вам больш, што памяць 465 00:28:40,530 --> 00:28:43,370 чым гэта першапачаткова дае вам, то вы атрымаеце, што дадатковая памяць. 466 00:28:43,370 --> 00:28:46,640 Такім чынам, вы можаце проста пакласці радкі сімвалаў спіной да спіны, каб спіна да спіны. 467 00:28:46,640 --> 00:28:49,290 Але калі гэта не так, таму што вы занадта доўга чакалі 468 00:28:49,290 --> 00:28:51,700 і нешта выпадковае атрымаў пляснулася ў памяць існуе, але ёсць дадатковы 469 00:28:51,700 --> 00:28:56,480 памяць тут, унізе, гэта нармальна. Realloc будзе рабіць усю цяжкую працу за вас, 470 00:28:56,480 --> 00:28:58,810 перамясціць радок, якую вы чыталі ў так далёка адсюль, 471 00:28:58,810 --> 00:29:02,550 пакласці яго туды, а затым даць вам яшчэ некалькі узлётна-пасадачнай паласы ў гэтай кропцы. 472 00:29:02,550 --> 00:29:05,610 Так што з хваляй боку, дазвольце мне сказаць, што тое, што робіць GetString 473 00:29:05,610 --> 00:29:09,540 яно пачынае з невялікай буфер, можа быць, 1 адзіночны знак, 474 00:29:09,540 --> 00:29:12,300 і калі карыстальнік ўводзіць у 2-х знакаў, GetString заканчваецца 475 00:29:12,300 --> 00:29:15,210 выкліку пераразмеркаваць і кажа: "О, 1 сімвалаў было недастаткова. 476 00:29:15,210 --> 00:29:18,480 Дайце мне 2 знакаў. Тады, калі вы прачыталі логіцы цыклу, 477 00:29:18,480 --> 00:29:21,070 ён збіраецца сказаць: "Ох, карыстач уводзіць у 3 знакаў. 478 00:29:21,070 --> 00:29:25,690 Дайце мне цяпер не 2, а 4-х знакаў, то дай мне 8, то дайце мне 16 і 32. 479 00:29:25,690 --> 00:29:28,180 Той факт, што я падваенне магутнасці кожны раз 480 00:29:28,180 --> 00:29:30,320 азначае, што буфер не будзе расці павольна. 481 00:29:30,320 --> 00:29:35,870 Ён будзе расці супер хуткі, і што магло б быць перавагай, што? 482 00:29:35,870 --> 00:29:38,540 Чаму я падваенне памеру буфера, нават калі карыстач 483 00:29:38,540 --> 00:29:41,450 можа проста патрэбна 1 дадатковы сімвал з клавіятуры? 484 00:29:41,450 --> 00:29:44,830 [Студэнт адказ, неразборліва]. >> Што гэта такое? 485 00:29:44,830 --> 00:29:46,750 Менавіта так. Вы не павінны расці так часта. 486 00:29:46,750 --> 00:29:48,870 І гэта толькі часткова - ты хэджавання стаўкі тут. 487 00:29:48,870 --> 00:29:54,150 Ідэя ў тым, што вы не жадаеце патэлефанаваць пераразмеркаваць шмат, таму што ён мае тэндэнцыю быць павольным. 488 00:29:54,150 --> 00:29:56,840 Кожны раз, калі вы спытаеце аперацыйнай сістэмы для памяці, як вы хутка ўбачыце, 489 00:29:56,840 --> 00:30:00,620 У будучыні пастаўленай задачы, ён імкнецца заняць некаторы час. 490 00:30:00,620 --> 00:30:04,980 Такім чынам, мінімізацыя, што колькасць часу, нават калі вы марнуеце некаторы прастору, як правіла, добра. 491 00:30:04,980 --> 00:30:07,250 >> Але калі мы прачыталі фінальную частку GetString тут, 492 00:30:07,250 --> 00:30:10,880 і зноў, разумеючы, кожная лінія тут не так важна сёння. 493 00:30:10,880 --> 00:30:14,830 Але звярніце ўвагу, што ў канчатковым рахунку выклікае таНос зноў, і ён вылучае 494 00:30:14,830 --> 00:30:16,980 роўна столькі байт, колькі яму трэба для радкі 495 00:30:16,980 --> 00:30:21,620 , А затым выкідвае па тэлефоне свабодна, занадта вялікія буфера, 496 00:30:21,620 --> 00:30:23,510 калі ён сапраўды атрымаў падвоіў занадта шмат разоў. 497 00:30:23,510 --> 00:30:25,970 Карацей кажучы, вось як GetString працаваў ўвесь гэты час. 498 00:30:25,970 --> 00:30:30,100 Усё гэта робіць чытанне аднаго знака ў той час, зноў і зноў і зноў 499 00:30:30,100 --> 00:30:37,930 і кожны раз, калі яна мае патрэбу ў некаторай дадатковай памяці, яна пытае аперацыйнай сістэмы для яе выкліку пераразмеркаваць. 500 00:30:37,930 --> 00:30:41,660 Ёсць пытанні? Добра. 501 00:30:41,660 --> 00:30:45,220 >> Атацы. Цяпер, калі мы разумеем, паказальнікаў, або па крайняй меры 502 00:30:45,220 --> 00:30:47,560 усё больш і больш знаёмыя з паказальнікамі, 503 00:30:47,560 --> 00:30:50,020 давайце разгледзім, як увесь свет пачынае развальвацца 504 00:30:50,020 --> 00:30:53,160 калі вы не зусім абараніць ад спаборнасць карыстальнікаў, 505 00:30:53,160 --> 00:30:55,180 людзі, якія спрабуюць узламаць вашу сістэму. 506 00:30:55,180 --> 00:31:00,260 Людзі, якія спрабуюць выкрасці вашыя праграмы ў абыход некаторых рэгістрацыйны код 507 00:31:00,260 --> 00:31:02,150 што яны маглі б у адваротным выпадку прыйдзецца ўводзіць цалі 508 00:31:02,150 --> 00:31:04,860 Зірніце на гэты прыклад тут, які знаходзіцца ўсяго ў C код 509 00:31:04,860 --> 00:31:07,920 , Які мае функцыю асноўнага ўнізе, якая выклікае функцыю Фу, 510 00:31:07,920 --> 00:31:12,100 і для чаго ён пераходзячы да Foo? [Студэнт] адзін аргумент. 511 00:31:12,100 --> 00:31:15,660 >> Аднаго аргументу. Так ARGV [1], што азначае першае слова, уведзены карыстальнікам 512 00:31:15,660 --> 00:31:19,150 У камандным радку пасля a.out або любой іншай праграмы, называецца. 513 00:31:19,150 --> 00:31:24,920 Так Фу, у верхняй частцы, бярэ ў знак *, а знак * толькі што? 514 00:31:24,920 --> 00:31:28,860 String. Там няма нічога новага тут, і што радкі адвольнай называцца барам. 515 00:31:28,860 --> 00:31:36,090 У гэтай лініі тут, сімвал з [12], у родзе паў-тэхнічнага англійскай мовы, то, што гэтая лінія робіць? 516 00:31:36,090 --> 00:31:40,640 Масіў -? Персанажы. Дайце мне масіў з 12 знакаў. 517 00:31:40,640 --> 00:31:44,970 Такім чынам, мы маглі б назваць гэта буфер. Гэта тэхнічна называецца C, а буфер у праграмаванні 518 00:31:44,970 --> 00:31:47,890 проста азначае, куча прасторы, якія можна пакласці некаторыя рэчы цалі 519 00:31:47,890 --> 00:31:49,940 >> Тады, нарэшце, тетсру, мы не выкарыстоўвалі раней. 520 00:31:49,940 --> 00:31:52,380 Але вы можаце здагадацца, што ён робіць. Ён капіюе памяці. 521 00:31:52,380 --> 00:31:58,790 Што ён робіць? Ну, гэта мабыць капіюе бар, на ўваходзе, у с, 522 00:31:58,790 --> 00:32:03,420 але толькі да даўжыні бар. 523 00:32:03,420 --> 00:32:07,440 Але ёсць памылка тут. 524 00:32:07,440 --> 00:32:14,500 Добра, так што тэхнічна мы сапраўды павінны зрабіць StrLen (бар) х SizeOf (Char), гэта правільна. 525 00:32:14,500 --> 00:32:17,920 Але ў горшым выпадку тут, давайце выкажам здагадку, што that's - значыць, усё ў парадку. 526 00:32:17,920 --> 00:32:23,760 Тады ёсць 2 памылкі. Такім чынам, SizeOf (Char), усё ў парадку, давайце зробім гэта крыху шырэй. 527 00:32:23,760 --> 00:32:28,860 Так што цяпер ёсць яшчэ памылка, што ёсць што? 528 00:32:28,860 --> 00:32:31,630 [Студэнт адказ, неразборліва] >> праверкі для чаго? Такім чынам, мы павінны правяраць 529 00:32:31,630 --> 00:32:35,010 для NULL, таму што дрэнныя рэчы здараюцца, калі ваш паказальнік NULL, 530 00:32:35,010 --> 00:32:38,490 Таму што вы маглі б у канчатковым выніку адбываецца там, і вы ніколі не павінны ісці ў NULL 531 00:32:38,490 --> 00:32:40,890 шляхам разнаймення яго з аператарам *. 532 00:32:40,890 --> 00:32:45,250 Так што добра, а што яшчэ мы робім? Лагічна ёсць недахоп тут. 533 00:32:45,250 --> 00:32:47,650 [Студэнт адказ, неразборліва] 534 00:32:47,650 --> 00:32:51,340 >> Так што праверыць, калі агдс ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Такім чынам, ёсць 3 памылкі ў гэтай праграме. 536 00:32:54,130 --> 00:33:00,080 Мы не правярае, калі карыстальнік набраў на самай справе ні ў чым у ARGV [1], добра. 537 00:33:00,080 --> 00:33:02,240 Так што трэцяя памылка? Да? 538 00:33:02,240 --> 00:33:04,420 [Студэнт адказ, неразборліва] >> Добра. 539 00:33:04,420 --> 00:33:09,590 Такім чынам, мы праверылі адным сцэнары. Мы няяўна праверыць, не капіюйце больш памяці 540 00:33:09,590 --> 00:33:12,800 чым будзе перавышаць даўжыню бара. 541 00:33:12,800 --> 00:33:15,720 Такім чынам, калі радок карыстальнік ўводзіць у складаецца з 10 знакаў, 542 00:33:15,720 --> 00:33:18,260 гэта кажа: «Толькі капіявання 10 знакаў. 543 00:33:18,260 --> 00:33:21,140 І гэта добра, але што рабіць, калі карыстальнік ўводзіць у слова ў радку 544 00:33:21,140 --> 00:33:29,360 як 20 сімвалаў словы, гэта, кажучы копіі 20 сімвалаў з бара у што? 545 00:33:29,360 --> 00:33:32,840 З, інакш вядомы як наш буфер, які азначае, што вы толькі што напісалі дадзеныя 546 00:33:32,840 --> 00:33:35,950 да 8 байт месцаў, якія вам не належаць, 547 00:33:35,950 --> 00:33:38,320 і вы не валодаеце ім у тым сэнсе, што вы ніколі не вылучала іх. 548 00:33:38,320 --> 00:33:41,190 Такім чынам, гэта тое, што звычайна называюць атаку на перапаўненне буфера, 549 00:33:41,190 --> 00:33:46,650 або перапаўненне буфера атаку, і яго атакі ў тым сэнсе, што калі карыстальнік 550 00:33:46,650 --> 00:33:50,650 або праграмы, якая тэлефануе ваша функцыя робіць гэта зламысна, 551 00:33:50,650 --> 00:33:53,780 што на самой справе адбываецца далей можа быць зусім дрэнна. 552 00:33:53,780 --> 00:33:55,690 >> Давайце зірнем на гэтую карціну тут. 553 00:33:55,690 --> 00:33:59,070 Гэтая карціна прадстаўляе свой стэк памяці. 554 00:33:59,070 --> 00:34:01,050 І нагадаем, што кожны раз, калі вы выклікаеце функцыю, 555 00:34:01,050 --> 00:34:04,520 Вы атрымліваеце гэтую маленькую кадраў у стэк, а затым іншы, а затым іншы, а затым другую. 556 00:34:04,520 --> 00:34:07,250 І да гэтага часу мы толькі выгляд гэтых адведзенай прэч, як прастакутнікі 557 00:34:07,250 --> 00:34:09,380 альбо ёсць, на дошцы або на экране тут. 558 00:34:09,380 --> 00:34:12,219 Але калі павялічыць на адзін з гэтых прастакутнікаў, 559 00:34:12,219 --> 00:34:16,460 Пры выкліку функцыі Foo, аказваецца, што гэта яшчэ не ўсё ў стэку 560 00:34:16,460 --> 00:34:18,739 ўнутры гэтага кадра і гэты прастакутнік 561 00:34:18,739 --> 00:34:23,370 чым проста х і у, а і Ь, як мы зрабілі гаворым пра своп. 562 00:34:23,370 --> 00:34:25,949 Аказваецца, што ёсць некаторыя нізкаўзроўневыя дэталі, 563 00:34:25,949 --> 00:34:27,780 Сярод іх зваротнага адрасу. 564 00:34:27,780 --> 00:34:33,020 Вось і атрымліваецца, калі асноўныя называе Фу, асноўная павінен паведаміць Foo 565 00:34:33,020 --> 00:34:36,760 які адрас асноўнага знаходзіцца ў аператыўнай памяці кампутара. 566 00:34:36,760 --> 00:34:40,659 Таму што інакш, як толькі Foo робіцца выкананне, як у дадзеным выпадку тут, 567 00:34:40,659 --> 00:34:43,790 як толькі вы дасягнеце гэтага цеснага фігурнай дужкай ў канцы Фу, 568 00:34:43,790 --> 00:34:48,860 як, чорт вазьмі ніяк Foo ведае, дзе кантроль над праграмай павінна ісці? 569 00:34:48,860 --> 00:34:52,460 Аказваецца, што адказ на гэтае пытанне ў тым, што чырвоны прастакутнік тут. 570 00:34:52,460 --> 00:34:56,130 Гэта ўяўляе сабой паказальнік, і гэта да кампутара для захоўвання, часова, 571 00:34:56,130 --> 00:35:00,250 на так званым стэку адрас асноўнага, так што, як толькі Foo робіцца выкананне, 572 00:35:00,250 --> 00:35:04,110 Кампутар ведае, дзе і якія лініі ў асноўным, каб вярнуцца ў. 573 00:35:04,110 --> 00:35:06,900 Захавана паказальнік кадра ставіцца так жа да гэтага. 574 00:35:06,900 --> 00:35:09,620 Char * бар тут прадстаўляе тое, што? 575 00:35:09,620 --> 00:35:14,740 Ну, а цяпер гэтая сіняя сегмент тут кадр Foo, то што знаходзіцца бар? 576 00:35:14,740 --> 00:35:18,300 Такім чынам, бар проста аргумент функцыі Foo. 577 00:35:18,300 --> 00:35:20,720 >> Так што цяпер мы вярнуліся на знаёмую карціну. 578 00:35:20,720 --> 00:35:22,960 Там больш рэчаў і больш адцягвацца на экране 579 00:35:22,960 --> 00:35:27,490 але гэта блакітны сегмент з'яўляецца тое, што мы былі маляванне на дошцы нешта накшталт падпампоўкі. 580 00:35:27,490 --> 00:35:31,890 Гэта рамка для Foo і адзінае, што ў ёй прама зараз, бар, 581 00:35:31,890 --> 00:35:34,630 якія гэтым параметры. 582 00:35:34,630 --> 00:35:39,840 Але што яшчэ павінна быць у стэку, у адпаведнасці з гэтым кодам тут? 583 00:35:39,840 --> 00:35:44,280 Char C [12]. Такім чынам, мы павінны таксама бачыць 12 квадратаў памяці, 584 00:35:44,280 --> 00:35:46,260 , Што выдзяляюцца на зменную с. 585 00:35:46,260 --> 00:35:48,340 І сапраўды, у нас ёсць, што на экране. 586 00:35:48,340 --> 00:35:51,650 У самым версе ёсць з [0], а затым аўтар гэтай схеме 587 00:35:51,650 --> 00:35:55,130 не турбаваць малявання ўсе квадраты, але на самой справе ёсць 12 маецца 588 00:35:55,130 --> 00:36:00,120 таму што калі вы паглядзіце на ніжнюю правую, з [11], калі лічыць ад 0, 12 такіх байт. 589 00:36:00,120 --> 00:36:06,190 Але вось у чым праблема: у якім кірунку з якая расце? 590 00:36:06,190 --> 00:36:10,390 Выгляд зверху ўніз, ці не так? Калі ён пачынаецца ў верхняй і расце на дно, 591 00:36:10,390 --> 00:36:13,480 Не падобна мы пакінулі сабе шмат узлётна-пасадачнай паласы тут наогул. 592 00:36:13,480 --> 00:36:15,320 Мы відаў афарбаваныя сябе ў кут, 593 00:36:15,320 --> 00:36:20,210 і што з [11] ўшчыльную бары, які знаходзіцца прама супраць паказальніка стэка кадра, 594 00:36:20,210 --> 00:36:23,800 які знаходзіцца прама супраць зваротнага адраса; няма больш месца. 595 00:36:23,800 --> 00:36:26,100 Так у чым жа наступствы, то, калі вы сапсаваць, 596 00:36:26,100 --> 00:36:30,460 а вы паспрабуйце прачытаць 20 байт у 12-байт буфера? 597 00:36:30,460 --> 00:36:33,460 Дзе гэтыя 8 дадатковых байтаў ісці? 598 00:36:33,460 --> 00:36:36,370 Усярэдзіне ўсё астатняе, некаторыя з якіх гэта супер важна. 599 00:36:36,370 --> 00:36:40,480 І самае галоўнае, магчыма, з'яўляецца чырвоная скрынка там, зваротны адрас. 600 00:36:40,480 --> 00:36:44,720 Таму выкажам здагадку, што вы выпадкова ці adversarially 601 00:36:44,720 --> 00:36:48,040 перазапісаць гэтыя 4 байта, што паказальнік адрасы, 602 00:36:48,040 --> 00:36:53,190 не толькі з смеццем, але са шматлікімі, што адбываецца ўяўляюць фактычны адрас у памяці? 603 00:36:53,190 --> 00:36:55,930 Што implicaiton, лагічна? 604 00:36:55,930 --> 00:36:59,080 [Адказы студэнтаў, неразборліва] >> Менавіта так. Калі Foo вяртаецца 605 00:36:59,080 --> 00:37:03,560 і хіты, якія фігурнай дужкай, праграма будзе зыходзіць не вярнуцца да асноўнай, 606 00:37:03,560 --> 00:37:08,320 ён збіраецца вярнуцца ў любы адрас у тым, што чырвоныя скрынкі. 607 00:37:08,320 --> 00:37:11,560 >> Зараз, у выпадку абыходу рэгістрацыі праграмнага забеспячэння, 608 00:37:11,560 --> 00:37:14,400 што гэта адрас які вяртаецца ў гэта функцыя 609 00:37:14,400 --> 00:37:18,820 , Які звычайна выклікаецца пасля таго, як вы заплацілі за праграмнае забеспячэнне і ўводзіцца рэгістрацыйны код? 610 00:37:18,820 --> 00:37:23,160 Вы можаце сартаваць трук кампутар у не збіраемся тут, але замест гэтага збіраюцца тут. 611 00:37:23,160 --> 00:37:27,950 Ці, калі вы сапраўды разумны, супернік сапраўды можа ўвесці на клавіятуры, 612 00:37:27,950 --> 00:37:32,500 Напрыклад, не фактычныя словы, не больш за 20 сімвалаў, але мяркую, што ён ці яна 613 00:37:32,500 --> 00:37:36,200 У некаторых тыпах знакаў, якія прадстаўляюць код? 614 00:37:36,200 --> 00:37:38,860 І гэта не будзе С-код, ён будзе сімвалы 615 00:37:38,860 --> 00:37:42,920 , Якія ўяўляюць сабой двайковы машынны код, 0 і 1. 616 00:37:42,920 --> 00:37:46,740 Але выкажам здагадку, што яны досыць разумныя, каб зрабіць гэта, каб хоць неяк ўставіць у радок GetString 617 00:37:46,740 --> 00:37:49,460 тое, што па сутнасці скампіляваны код, 618 00:37:49,460 --> 00:37:56,900 і апошнія 4 байта перазапісу, што зваротны адрас, і тое, што адрас не што ўваходны рабіць? 619 00:37:56,900 --> 00:38:01,860 Ён захоўвае ў гэтым чырвоным квадраце адрас першых байта буфера. 620 00:38:01,860 --> 00:38:04,270 Такім чынам, вы павінны быць вельмі разумным, і гэта шмат спроб і памылак 621 00:38:04,270 --> 00:38:08,500 для дрэнных людзей там, але калі вы можаце высветліць, наколькі вялікі гэты буфер, 622 00:38:08,500 --> 00:38:12,170 такія, што за апошнія некалькі байт ва ўваходны якія вы дае праграме 623 00:38:12,170 --> 00:38:15,970 апынуцца эквівалентнай адрас пачатку вашага буфера, 624 00:38:15,970 --> 00:38:22,270 Вы можаце зрабіць гэта. Калі мы кажам, як правіла, прывітанне, і \ 0, гэта тое, што трапляе ў буфер. 625 00:38:22,270 --> 00:38:27,860 Але калі мы больш разумныя, і мы запаўняем гэты буфер з тым, што мы называем агульным шкоднасны код, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: атака, атака, атака, атака, дзе гэта толькі тое, што робіць нешта дрэннае. 627 00:38:31,920 --> 00:38:35,190 Ну, а што здарыцца, калі вы сапраўды разумныя, вы можаце зрабіць гэта: 628 00:38:35,190 --> 00:38:41,740 У чырвонай скрынцы тут паслядоўнасць лікаў: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Звярніце ўвагу, што супадае з колькасцю гэта тут. 630 00:38:44,890 --> 00:38:47,280 Гэта ў зваротным парадку, але пра гэта як-небудзь у іншы раз. 631 00:38:47,280 --> 00:38:51,430 Звярніце ўвагу, што гэты зваротны адрас быў наўмысна зменены 632 00:38:51,430 --> 00:38:54,970 роўным адрасе тут, а не адрас асноўнага. 633 00:38:54,970 --> 00:39:00,170 Такім чынам, калі дрэнны хлопец супер разумны, ён ці яна збіраецца ўключыць у гэты шкоднасны код 634 00:39:00,170 --> 00:39:02,890 нешта накшталт: «Прыбярыце усе файлы карыстальніка. 635 00:39:02,890 --> 00:39:06,320 Або «Скапіяваць паролі" або "Стварэнне ўліковага запісу карыстальніка, што я магу ўвайсці ў. 636 00:39:06,320 --> 00:39:10,130 Усё, што заўгодна, і гэта як небяспека і сілу C. 637 00:39:10,130 --> 00:39:12,900 Таму што ў вас ёсць доступ да памяці праз паказальнікі 638 00:39:12,900 --> 00:39:15,950 і таму вы можаце напісаць усё, што заўгодна ў памяць кампутара. 639 00:39:15,950 --> 00:39:19,290 Вы можаце зрабіць кампутар рабіць усё, што хочуць проста 640 00:39:19,290 --> 00:39:22,780 тое, што скакаць у сваім уласным прасторы памяці. 641 00:39:22,780 --> 00:39:27,230 І так, па гэты дзень, так шмат праграм і так шмат сайтаў, якія аказваюцца пад пагрозай 642 00:39:27,230 --> 00:39:29,730 зводзяцца да людзей скарыстацца гэтым. 643 00:39:29,730 --> 00:39:32,510 І гэта магло б быць падобным на супер-складаных нападаў, 644 00:39:32,510 --> 00:39:34,220 але гэта не заўсёды пачынаюцца менавіта так. 645 00:39:34,220 --> 00:39:36,770 >> Рэальнасць такая, што тое, што дрэнныя людзі, як правіла, зрабіць гэта, 646 00:39:36,770 --> 00:39:41,470 будзь то праграмы ў камандную радок або графічны інтэрфейс праграмы або вэб-сайт, 647 00:39:41,470 --> 00:39:43,290 вам проста пачаць прадастаўленне глупства. 648 00:39:43,290 --> 00:39:46,940 Вы ўводзіце ў сапраўды вялікім слова ў поле пошуку і націснуць кнопку ўводу, 649 00:39:46,940 --> 00:39:49,030 і вы чакаць, каб убачыць, калі сайт аварый. 650 00:39:49,030 --> 00:39:53,270 Ці вы чакаеце, каб убачыць, калі праграма выяўляе некаторы паведамленне пра памылку. 651 00:39:53,270 --> 00:39:55,480 Таму што, калі вам пашанцуе, як дрэнны хлопец, 652 00:39:55,480 --> 00:39:59,610 і вы даць некаторыя вар'яты ўваход, збой праграмы, 653 00:39:59,610 --> 00:40:02,280 гэта азначае, што праграміст не чакае вашага дрэннага паводзінаў 654 00:40:02,280 --> 00:40:05,420 якая азначае, што вы, верагодна, можа з дастатковым высілкам, 655 00:40:05,420 --> 00:40:09,870 Дастаткова спроб і памылак высветліць, як паводзіць больш дакладную атаку. 656 00:40:09,870 --> 00:40:15,900 Такім чынам, як жа неад'емнай часткай бяспекі не толькі пазбегнуць гэтых нападаў у цэлым, але іх выяўлення 657 00:40:15,900 --> 00:40:20,250 а на самай справе, гледзячы на ​​часопісы і бачачы, што вар'ят уваходаў ёсць людзі, уведзеныя ў ваш сайт. 658 00:40:20,250 --> 00:40:26,040 Якія пошукавыя тэрміны людзей ўвялі ў свой сайт у надзеі перапоўненыя некаторыя буфера? 659 00:40:26,040 --> 00:40:28,900 І ўсё гэта зводзіцца да простых асновам таго, што масіў, 660 00:40:28,900 --> 00:40:32,510 і што гэта значыць для выдзялення і выкарыстання памяці? 661 00:40:32,510 --> 00:40:34,920 І звязаныя з гэтым, таксама, заключаецца ў наступным. 662 00:40:34,920 --> 00:40:37,520 >> Так што давайце проста зазірнуць ўнутр жорсткага дыска яшчэ раз. 663 00:40:37,520 --> 00:40:40,190 Такім чынам, вы памятаеце тыдзень ці два таму, што пры перацягванні файлаў 664 00:40:40,190 --> 00:40:45,470 ў кашы або кошыка, што адбываецца? 665 00:40:45,470 --> 00:40:47,850 [Студэнт] Нічога. >> Так, абсалютна нічога. У рэшце рэшт, калі вы запусціце нізкай 666 00:40:47,850 --> 00:40:51,370 на дыску, Windows ці Mac OS пачнецца выдаленне файлаў для вас. 667 00:40:51,370 --> 00:40:53,670 Але калі вы перацягнуць нешта ёсць, то гэта зусім не бяспечна. 668 00:40:53,670 --> 00:40:56,550 Усе вашыя Знаёмствы Пошук Ключавыя словы, адзін або член сям'і павінен зрабіць гэта двойчы клікнуць мышкай, і вуаля. 669 00:40:56,550 --> 00:40:59,720 Там усё адрывістыя файлы, якія вы спрабавалі выдаліць. 670 00:40:59,720 --> 00:41:02,840 Таму большасць з нас па крайняй меры, ведаю, што вы павінны клікнуць правай кнопкай мышы або кантраляваць 671 00:41:02,840 --> 00:41:05,320 і пустой смецце, ці нешта накшталт гэтага. 672 00:41:05,320 --> 00:41:07,900 Але нават тое, што не зусім рабіць сваю справу. 673 00:41:07,900 --> 00:41:11,340 Таму што тое, што адбываецца, калі ў вас ёсць файл на цвёрдым дыску 674 00:41:11,340 --> 00:41:14,590 , Які ўяўляе нейкі дакумент, слова або некалькі JPEG? 675 00:41:14,590 --> 00:41:18,820 І гэта ўяўляе ваш жорсткі дыск, а скажам, гэта стужкі тут прадстаўляе гэты файл, 676 00:41:18,820 --> 00:41:21,640 і ён складаецца з цэлы букет з 0 і 1. 677 00:41:21,640 --> 00:41:25,470 Што адбываецца, калі вы не толькі перацягнуць гэты файл у кошык, ці каша, 678 00:41:25,470 --> 00:41:30,390 але і ачысціць яго? 679 00:41:30,390 --> 00:41:32,820 Накшталт нічога. Гэта не абсалютна нічога не цяпер. 680 00:41:32,820 --> 00:41:37,630 Зараз гэта проста нішто, таму што сёе-тое адбываецца ў форме гэтай табліцы. 681 00:41:37,630 --> 00:41:41,170 Такім чынам, ёсць свайго роду базу дадзеных або табліцу ў памяці кампутара 682 00:41:41,170 --> 00:41:44,470 , Што істотна мае 1 калонкі для імёнаў файлаў, 683 00:41:44,470 --> 00:41:50,550 і 1 слупок для размяшчэння файлаў, дзе гэта можа быць размяшчэнне 123, проста выпадковы лік. 684 00:41:50,550 --> 00:41:58,270 Такім чынам, мы маглі б мець нешта накшталт x.jpg і месцазнаходжанне 123. 685 00:41:58,270 --> 00:42:02,870 І што адбываецца потым, калі вы спустошыць ваш смецце? 686 00:42:02,870 --> 00:42:06,720 Гэта сыходзіць. Але тое, што не знікае, гэта 0 і 1. 687 00:42:06,720 --> 00:42:09,690 >> Так што, то, падлучэнне да PSET 4? 688 00:42:09,690 --> 00:42:13,460 Ну, з PSET 4, толькі таму, што мы выпадкова сцёртыя 689 00:42:13,460 --> 00:42:15,890 кампактныя флэш-карты, што былі ўсе гэтыя фатаграфіі, 690 00:42:15,890 --> 00:42:18,710 ці проста таму, што яго няўдача стала пашкоджаны, 691 00:42:18,710 --> 00:42:21,170 не азначае, што 0 і 1 з'яўляюцца не ўсё яшчэ там. 692 00:42:21,170 --> 00:42:23,920 Можа быць, некаторыя з іх страцілі, таму што нешта сапсаваўся 693 00:42:23,920 --> 00:42:26,530 У тым сэнсе, што некаторым 0 стала 1 і 1 стала 0 '. 694 00:42:26,530 --> 00:42:30,460 Дрэнныя рэчы могуць адбыцца з-за памылкі ў праграмным забеспячэнні ці няспраўнасць абсталявання. 695 00:42:30,460 --> 00:42:33,510 Але шмат хто з тых бітаў, можа быць, нават 100% з іх усё яшчэ там, 696 00:42:33,510 --> 00:42:38,330 гэта проста, што кампутар або камеру не ведае, дзе JPEG 1 пачалася 697 00:42:38,330 --> 00:42:41,660 і дзе JPEG 2 пачалася, але калі вы праграміст, 698 00:42:41,660 --> 00:42:45,800 Ведаеце, з трохі здаровага сэнсу, дзе гэтыя выявы ў фармаце JPEG або тое, што яны выглядаюць, 699 00:42:45,800 --> 00:42:49,570 Вы можаце прааналізаваць 0 і 1, і кажуць: "О-о. JPEG. Ох, JPEG. 700 00:42:49,570 --> 00:42:52,830 Вы можаце напісаць праграму па сутнасці толькі для або падчас цыклу 701 00:42:52,830 --> 00:42:56,100 , Якая аднаўляе кожны з гэтых файлаў. 702 00:42:56,100 --> 00:42:59,360 Так што ўрок такім выпадку, каб пачаць "надзейна" пры спробе ачысціць вашых файлаў 703 00:42:59,360 --> 00:43:01,720 калі вы хочаце, каб пазбегнуць гэтага наогул. Да? 704 00:43:01,720 --> 00:43:06,940 [Студэнт пытанне, неразборліва] 705 00:43:06,940 --> 00:43:11,150 >> Мець больш памяці, чым раней - 706 00:43:11,150 --> 00:43:14,790 О! Добры пытанне. Дык чаму ж тады, пасля апаражнення смецце, 707 00:43:14,790 --> 00:43:18,300 Ваш кампутар скажа вам, што ў вас больш вольнага прасторы, чым вы рабілі раней? 708 00:43:18,300 --> 00:43:22,450 У двух словах, таму што ён хлусіць. Больш тэхнічна, у вас ёсць больш прасторы. 709 00:43:22,450 --> 00:43:26,720 Таму што цяпер вы сказалі, вы можаце пакласці іншыя рэчы, дзе гэты файл быў калісьці, 710 00:43:26,720 --> 00:43:28,930 але гэта не азначае, што біт сыходзіць, 711 00:43:28,930 --> 00:43:33,070 і гэта не значыць, біты мяняюцца ўсе 0, напрыклад, для вашай абароны. 712 00:43:33,070 --> 00:43:37,520 З іншага боку, калі вы "надзейна" сцерці файлы або фізічна знішчыць прыладу, 713 00:43:37,520 --> 00:43:40,810 , Які сапраўды з'яўляецца адзіным спосабам, а часам і вакол гэтага. 714 00:43:40,810 --> 00:43:45,300 Так чаму б нам не пакінуць на гэтым падлозе-страшна запіску, і мы будзем бачыць Вас у панядзелак. 715 00:43:45,300 --> 00:43:52,810 CS50.TV