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