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