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 >> [Музыка Воспроизведение]