[Музыка Воспроизведение] Дэвид Дж. МАЛАН: Хорошо. [Смеется] С возвращением. Это CS50. А это в конце недели пять. И до сих пор, у нас в значительной степени принимают как должное, что существует этот компилятор, Clang, что Вы были вызова через этот другой инструмент под названием Сделайте что так или иначе волшебно преобразует исходный код в объектный код, нули и единицы что компьютеры CPU, центральный Процессор, на самом деле понимает. Но, оказывается, есть число, которое происходит под капотом в между входом и выходом. И я хотел бы предложить, что мы плоть , что в несколько более подробно в эти четыре шага, есть нечто, называемое предварительной обработки, то называется компиляция, которую мы видели, то, что называется монтаж, и нечто, называемое связывание. Так до сих пор, в некоторых из наших Программы, которые мы имели резкий включает. В последнее время у нас было несколько резких определяет для констант. Вот и получается, что те вещи, которые начинаются с хэш-символа или символ фунта предварительно процессора директив. Это просто причудливый способ сказать, что это строка кода, которая на самом деле преобразуется во что-то еще, прежде чем Компьютер даже пытаться конвертировать программу в нули и единицы. Например, резкое включает в себя стандартные Ввода / вывода. Ч, в значительной степени только средства идут вперед, захватить содержание файлов stdio.h и вставлять их прямо там. Так что никаких нулей и единиц на тот момент еще. Это действительно просто замену. И это будет сделано во время так называемой стадии предварительной обработки, при реально работать Clang или специально Сделайте в большинстве случаев. Так что все это происходило первый автоматически до сих пор. Затем наступает этап компиляции. Однако мы уже упрощенно компиляции. Компиляция программы на самом деле означает принять его от чего-то, как C, Исходный код мы писали, что на в то, что называется сборкой. Язык ассемблера более низком уровне язык, который, к счастью, мы не будем имеют много повод написать в этом семестре. Но это на самом низком уровне в смысле, что вы в буквальном смысле начать писать складывать и вычитать и размножайтесь, и загрузить из памяти и сохранения в памяти, очень простые инструкции, которые компьютер, под капотом, на самом деле понимает. Наконец, монтаж занимает этот язык к нулей и единиц, что мы были описания до сих пор. И действительно, наконец, есть так называемые стадии компоновки, которые мы см. через минуту, которая сочетает в себе Вашей нулей и единиц и нулей те, другие люди, прежде чем Вы создали. Так что учтите это супер простой программы. Именно с Недели 1. Он просто сказал: Hello World, на экране. Мы бежали через эту Clang. Или мы пропустил его через Сделайте который бежал Clang. И выдается в момент времени, когда некоторых нулей и единиц. Но, оказывается, есть промежуточном этапе. Если я иду сюда - ой, не хочу увидеть его еще. Если я иду сюда, чтобы мой прибор и я открываю hello.c, здесь что же программы. И то, что я собираюсь делать в терминале окна здесь я собираюсь запустить Clang, а не делать, что автоматизирует все четыре эти шаги для нас. И я собираюсь сделать лязг-S и Затем hello.c а затем введите. И я получаю быстрое мигание снова, и это хорошо. И сейчас в немного больший окна, Я собираюсь открыть Gedit здесь. И я собираюсь открыть файл, который, Оказывается, называется эта hello.s содержит, что на языке ассемблера Котором я говорил раньше. И это то, что называется сборки языком, довольно низком уровне инструкций, которые Intel CPU или что это такое, что находится внутри понимает. И МОУ для движения. вызов для звоните, очень низком уровне функции. саб для вычитать. Поэтому, когда у вас есть определенная внутри процессора вашего компьютера, что делает его различны, по сравнению с другими процессорами рынке, какие инструкции он понимает и часто, насколько эффективно он в том, как быстро это при выполнении некоторых этих инструкций. Теперь подробнее об этом, вы можете взять Осенью следующего CS61 в колледже. Но здесь у нас есть, например, несколько идентификаторы, которые могут выглядеть знакомо. hello.c это название программы. . Текста - существует не так много интересного есть только сейчас, напомним, что текст сегменте, по состоянию на понедельник, то, где в памяти вашей программы фактически заканчивается. Так что, по крайней мере смутно знакомые там. Здесь, конечно, упоминание нашей главной функции. Прокрутки вниз, это относится к вещам называемых регистрами, очень маленькие куски памяти внутри вашего фактического процессора. И если я даже прокрутить вниз Кроме того, я вижу какой-то косвенное упоминание о ASCII. И там, действительно, в том, что строки, Привет, запятая, мира. Так короче говоря, это была происходит для вас, автоматически, под капотом всего этого времени. И то, что происходило на самом деле один раз вы запустите Clang, или путем Убедитесь, что вы получаете первое, из исходного кода, так называемый ассемблера. Тогда Clang является преобразование эта сборка Язык до нулей и единиц. И это слайд, который мы начали наше обсуждение в Неделе 0 за - , а затем на 1 неделя. И, наконец, эти нули и единицы в сочетании с нулями и единицами из этих библиотек мы принимали само собой разумеющееся, как Standard I / O или Библиотека строка или даже CS50 библиотеки. Таким образом, чтобы нарисовать эту картину более Визуально, у нас есть hello.c. И это, конечно, использует Е функционировать сказать, привет мир. Этап компиляции занимает его до , что файл, который мы только что видели hello.s, даже хотя это обычно удаляются автоматически. Но это код сборки в середине шага. А потом, когда мы собираем сборки язык, так сказать, что, когда вы получить эти нули и единицы. Таким образом, мы эффективно увеличено на сегодня то, что мы принимаем как должное, значит идти исходным кодом в объектный код. Но, наконец, теперь, когда же картину - давайте засунуть его на левой стороне. И заметьте, что в верхней части имеется Я упомянул stdio.h. Это файл, который мы включили почти во всех программы, которые мы написали. И это файл, содержимое которого получить копию вставили, эффективно на вершине вашего кода. Но, оказывается, что на компьютере Система где-то, есть предположительно stdio.c файл, который кто-то написал лет назад, что реализует все функции, которые были объявлены в stdio.h. Сейчас на самом деле это, вероятно, не на ваши Mac или ПК или даже в CS50 прибор сырой код C. Кто-то уже составлен его и включил . O файла или объектного кода. файл, который связан с общим библиотеке , которая была предварительно установлена ​​и скомпилированные для вас. Но предположим, что действительно существует на нашем компьютере stdio.c параллельно с Clang. Вашего кода составляется и собран. stdio.c 'с кодом составляется и собраны, так что этот самый последний шагу, здесь, внизу, нужно как-то ссылка, так сказать, ваши нулей и единиц с его или ее нулей и единиц в одну Простая программа, которая в конечном счете, называется просто Hello. Так вот все это магия что происходило до сих пор. И будет продолжать принимать эти процессов само собой разумеющееся, но понимаю, есть много пикантных подробностей происходит под там. И это то, что делает ваш компьютер с Intel Inside Особенно отчетливо. Так что на этой ноте, если вы хотели бы присоединиться к нам на обед в эту пятницу, действительно пойдите обычным cs50.net/rsvp месте, 1:15 вечера в эту пятницу. А теперь несколько объявлений. Поэтому у нас есть хорошие новости. И у нас есть плохие новости. Начнем с некоторых хорошая новость. [Стоны] Хорошо. Ну, технически это праздник, поэтому это не столько подарок от нас. Но тогда плохая новость, конечно. [Стоны] Я провел много времени на эти анимации. [Смеется] Там будет рассмотрение сессии следующий понедельник. Это собирается быть в 5:30 вечера. Мы будет напоминать вам о все эти детали по электронной почте на курсы сайт всего за пару дней. Он будет снят и доступны вскоре после этого. Так что если вы не можете сделать, что в понедельник ночью слот, не волнуйтесь. Разделы на следующей неделе также будет сосредоточится на рассмотрении для викторины. Если ваш раздел в понедельник, который Действительно университете праздник, мы будем до сих пор встречаются в разделе. Если вы просто не можете сделать, что раздел, потому что вы собираетесь прочь, это нормально. Посетите воскресенье или во вторник или разделу настроиться на секции Джейсона, который доступны в Интернете. Так, более плохие новости. Так, согласно программе, у нас есть лекции в следующую пятницу. Но хорошая новость - Очевидно, что я провел слишком много времени на это. [Смеется] Мы закрыть Следующие лекции в пятницу. Так что будет подарок для нас, так что вы может действительно быть в хорошей отсрочкой между этой неделе, и две недели спустя. Так что не лекции на следующей неделе, только крошечный маленькая викторина, за которую вы должны быть становится все более взволнован. Итак, давайте обратим внимание на то, что действительно больше визуальных и более захватывающим и, чтобы подготовить почву за то, что будет на горизонте всего за пару недель. После первой викторины, попробуем сделать центре нашего набора задачи к другой домена конкретной проблемы, что и в суде или для безопасности в целом. На самом деле, традиция с этой проблемой Набор для меня одним из обучение членов Содружества и ЦС идти через Кампус принимая некоторые фотографии идентифицируемых но неочевидные людей, места или вещи, то каждый год я каким-то образом удалось случайно удалить или повредить цифровых карт памяти , что находится внутри нашей камеры. Но никакое грандиозное предприятие. Я могу пойти дальше и подключить , что в мой компьютер. Я могу сделать судебно образ его, так сказать, путем копирования и нулей те, от этого карта памяти, будь то своей SD карты или компактные флэш-карты или все, что вы хорошо знакомы. И тогда мы сможем передать это. Поэтому задача впереди, среди прочих вещи для вас, будет писать C код, который восстанавливает целый букет В формате JPEG для меня и показал будет тех людей, мест или вещей. И мы будем также говорить, в этой задаче устанавливать и в грядущие дни, о графики в целом. Мы использовали их, конечно, для вырваться. Но вы вроде само собой разумеющимся существуют эти высокие понятия уровня прямоугольников и овалов. Но под капотом есть пиксели. И вы должны были начать думать о тех. Или вы для P-4 набора должны думать по поводу разрыва между кирпичами, как Вы быстро мяч движется по экран для вырваться. Так что это понятие точки на экране, что это вступают в игру уже. Теперь то, что вы видите, однако, является то, что Вы получаете на экране компьютера. Если вы когда-нибудь наблюдали за некоторыми хорошими или Телевизор плохо, наверняка они в значительной степени рассматривать аудиторию как технофобы , которые действительно не много знаю о вычислениях. И поэтому это очень легко для полиции Детектив сказать, не так ли чисто, что для меня? Или усилить, правильно? Повышение, как гудение слово в Наиболее любое преступление, связанное шоу. А реальность в том, если вы берете очень размытые картины подозреваемый делал что-то плохое, вы не можете просто улучшать ее. Вы не можете увеличивать бесконечно. Вы не можете видеть блеск в чьих-то глаз, совершивших, что конкретное преступление, несмотря на Распространенность этого по телевизору. И вот с этим давайте мотивировать предстоящих задачу, поставленную с взглянуть на несколько концертов, с которыми вы могут быть знакомы. [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] -OK. Теперь давайте получить хороший взгляд на вас. -Держите его. Выполнить свои слова обратно. -Подожди минуту. Переход права. -Там. Заморозить это. -Во весь экран. -OK. Заморозить это. Затянуть на что, а? -Вектор в на этого парня на заднем колесе. -Увеличить прямо здесь, на этом месте. -С правильным оборудованием, отображаемого могут быть увеличены и заточены. -Что это? -Это программа повышения. -Можете ли вы понять, что любые? -Я не знаю. Давайте улучшать ее. -Повышение разделе A-6. -Я повысила деталях и - -Я думаю, что достаточно для повышения. Отпустите ее, чтобы изображение на экране компьютера. -Повышение отражение в ее глаза. -Давайте запустим это через Video Enhancement. -Эдгар, может вы сможете улучшить это? -Подожди. -Я работаю над этим отражением. Кто-то-отражения. Рефлексия. -Там в отражении лица человека. -Отражение. -Там в отражении. -Увеличить на зеркале. -Вы можете увидеть отражение. -Можете ли вы повысить имидж отсюда? -Может вы сможете улучшить его прямо здесь? -Можете ли вы улучшить его? -Можете ли вы улучшить его? -Мы можем увеличить это? -Можете ли вы улучшить его? -Подожди секунду, я буду повышения. -Увеличить в дверь. -X10. -Zoom. [Смеется] -Заселению -Подожди, постой. -Стоп. -Паузу. -Поворот на 75 градусов вокруг вертикальная пожалуйста. [Смеется] -Стоп, и обратно в часть о дверь. -Есть усилитель изображения которые могут растровые? -Может быть, мы можем использовать Прадип Sen Метод видеть в окнах. -Это программное обеспечение является современным. -Значение значка выключен. -При правильном сочетании алгоритмов. -Он взял освещения алгоритмы на следующий уровень, и я могу использовать их, чтобы улучшению данного фотографией. Блокировку на и увеличить Z-оси. -Enhance. -Enhance. -Enhance. От замерзания и повышения. [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] Дэвид Дж. МАЛАН: Так поставленной задачи 5 является то, что лежит впереди. Так мы скоро получить лучшее понимание о том, когда и почему вы можете и наша не может повысить таким образом. Но сначала, давайте вернемся нашего внимания некоторых из блоков мы будем должны быть в состоянии рассказать эту историю. Поэтому напомним, что мы обратили на это фото Понедельник и немного на прошлой неделе. И это описывает структуру вещи в памяти вашего компьютера, когда запуска некоторых программ. Технологий сегменте наверху, напомним, относится фактическому нулей и единиц , которые составляют вашу программу. Там на уровне ниже того, некоторые инициализировать или неинициализированных данных, которые обычно относится к вещам, как константы или строки или глобальных переменных, которые имеют было объявлено заранее. Там в куче, но мы приедем Вернуться к этому немного позже. А тут еще в стеке. Многое, как стопка тарелок в кафетерии, это где получает памяти слоистых и всякий раз, когда слоистых Вы делаете то, что в программе? Что такое стек для использования? Да? Вызов функции. Каждый раз, когда вы вызываете функцию, это уделяется ленты памяти для своих локальные переменные или его параметров. И графически, мы видим, что с каждым Функция называется последовательным, когда звонки звонки C B D звонки, они получают слоистый в стек. И в каждой из этих кусочков память является по существу уникальный объем за это функция, которая, конечно, проблематично, если вы хотите передать от одной функции к другой части данных, которые вы хотите мутировать или изменить. Так что же было наше решение позволяет Функция представлена ​​одним стеком кадр для изменения памяти внутри другого кадра стека? Как эти два разговаривать друг с другом? Таким путем указателей или адресов которые, опять же, просто описать, где в память, в качестве конкретного укуса число, конкретный значение может быть найдено. Так вспомним прошлый раз также мы продолжали историю и посмотрел на довольно багги программы. И эта программа глючит в течение нескольких причин, но самым тревожным является одним , поскольку она не проверить, какие? Да, это не в состоянии проверить входной. Простите? Если это больше, чем 12 символов. Так что очень ловко, при вызове memcopy, который, как следует из названия, просто копии памяти из второго аргумента в свой первый аргумент. Третий аргумент, очень ловко, является проверить, чтобы убедиться, что вы не копировать больше, в данном случае длина Бар, количество символов, в пункт назначения, который эта Массив C. Но проблема в том, что то, C Если само по себе не достаточно большой справиться с этим? Вы собираетесь скопировать номер из байт, которые вы получили. Но что вы на самом деле имеют более байт, чем у вас есть комната для? Ну, эта программа очень просто глупо слепо продолжает брать все, что это дано, привет обратную косую черту 0 замечательно, если строка коротка Достаточно, как и пять символов. Но если это на самом деле или 12 символов 1200 символов, мы видели в последний раз что вы только собираетесь, чтобы полностью перезаписи памяти, не принадлежит вам. И худшем случае, если Вы переписываете, что красная часть там, что мы называли обратный адрес - это только, когда компьютер автоматически, для вас, за сцены, защипами от 32-битное значение, которое напоминает он по какому адресу он должен вернуться, когда Фу, это другой функции, делается выполнение. Это крошки хлеба родов на который возвращается. Если вы перезаписать, что, возможно, если вы плохой парень, может может потенциально взять на себя чей-то компьютер. И вы, безусловно, крах его в большинстве случаев. Теперь эта проблема только усугубляется как мы начали говорить о памяти управления в целом. И Malloc, распределения памяти, является функции, которые мы можем использовать, чтобы выделить памяти, когда мы не знаем заранее что мы, возможно, потребуется некоторое. Так, например, если я вернусь к прибору здесь. И я открываю за последние hello2.c время Напомним этой программе, которая выглядела немного что-то вроде этого, всего три линии - назвать свое имя, затем имя строки, на левой стороне, равно GetString. А потом мы его распечатать, имя пользователя. Так что это было супер просто программой. Чтобы было ясно, позвольте мне идти вперед и сделать привет-2. Я собираюсь сделать точка слэш привет-2. Назови свое имя - Давида. Enter. Здравствуйте Давида. Это похоже на работу OK. Но то, что происходит на самом деле под капотом здесь? Давайте сначала отогните несколько слоев. Струнный это просто синоним мы в понял, для чего? Char звезды. Так что давайте сделать его немного более тайные но более технически правильно, что это это символ звезды, которая означает, что имя, да, является переменной. Но то, что названия магазинов является адресом символ, который чувствует себя немного странно потому что я возвращаюсь строку. Я возвращаюсь несколько символы не символ. Но, конечно, вам нужно всего лишь первый Чара адрес вспомнить, где всю строку в том, что почему? Как же определить, где конец Строка зная самого начала? Обратная косая черта нулю. Так что с этими двумя ключи вам выяснить, Перед началом и концом любая строка есть, до тех пор, пока они правильно составленный с этой нулевой терминатор, что обратная косая черта нулю. Но это вызывает GetString. И оказывается, что GetString все это время был вид обман для нас. Он делал это труд, чтобы быть уверенным, получаю строку от пользователя. Но где, что память было приходят? Если мы вернемся к картине здесь и применять определение от всего минуту назад, что стек, где памяти идет, когда функции вызываются, По этой логике, когда вы вызываете GetString, а затем я печатаю в D--V-I-D Enter, где D--V-I-D обратный слэш нулевой хранится на основе история, которую мы рассказали нам далеко? Это, казалось бы, в стек, правда? При вызове получить строку, которую Вы получите кусочек памяти в стеке. Так что само собой разумеется, что D--V-I-D обратный слеш нуль хранится там в стеке. Но постойте, GetString возвращается эту строку, так сказать, что означает это поднос из кафетерия берется из стека. И мы в прошлый раз говорил, что как только Функция возвращает, и вы берете, что лоток, так сказать, из стека, что Вы можете предположить о остатки что память? Я, конечно, перекроили их как знаки вопроса потому что они фактически стали неизвестные значения. Они могут быть использованы повторно, когда некоторые Следующая функция вызывается. Другими словами, если мы, оказывается, для хранения - Я нарисую быструю картину Здесь стопки. Если мы, случается, рисование нижней моей памяти сегмента, и мы будем говорить что это место памяти занимают основной и, возможно, аргумент С и Arg V и все остальное, в программе, когда GetString называется, Предположительно GetString получает кусок памяти здесь. А потом D--V-I-D как-то заканчивается в эту функцию. И я собираюсь упрощать. Но давайте предположим, что его D--V-I-D обратный слеш нулю. Так что это количество байт, которые используются в рамка для GetString. Но как только GetString возвращений, мы в прошлый раз говорил, что эта память более Здесь все становится - Woops! - все становится эффективно удалены. И мы можем думать об этом сейчас, когда вопрос знаки, потому что кто знает, что происходит, чтобы стать этой памяти. В самом деле, я очень часто вызывают функции кроме GetString. И как только я называю некоторые другие функции, чем GetString, может быть, не в данной программы мы просто смотрели на, но некоторые другие, безусловно, некоторые другие Функция может в конечном итоге уделяется это следующее место в стеке. Поэтому он не может быть, что GetString магазинов D--V-I-D в стек, потому что я немедленно потеряет к нему доступ. Но мы знаем, что они GetString возвращает только что? Это не возвращение к мне шесть символов. То, что это действительно было возвращение мы заключаем, последний раз? Адрес первого. Так или иначе, когда вы назвали GetString, это выделение блока памяти для Строка, тип и пользователи Затем обратный адрес из него. И получается, что, когда вы хотите функция предназначена для размещения памяти в этом пути и вернуться к человеку, который называется эту функцию, адреса что часть памяти, вы абсолютно Не можете положить его в стек в дно, потому что функционально это просто Не собираюсь стать вашим очень быстро, так что вы можете догадаться, где Мы, вероятно, собирается бросить ее вместо этого, так называемого кучи. Так что между нижней частью вашей памяти автора планировка и верхней части памяти автора макет целую кучу сегментов. Одним из них является стек, и правый выше она в куче. И куча это просто другой кусок памяти, которая не используется для функций когда они называются. Он используется для долгосрочной памяти, когда Вы хотите одну функцию, чтобы захватить некоторые памяти и уметь, чтобы повесить на него без потери контроля над ним. Теперь вы можете, возможно, немедленно видеть, что это не обязательно совершенный дизайн. Как ваша программа на выделенную память стек, или, как вы называете все больше и больше функций, или, как вы распределяете память в куче с Malloc как от GetString делает, что четко кажется неизбежной проблемой? Право. Как факт, что эти стрелки направлены друг на друга не сулит ничего хорошего. И в самом деле, мы могли бы очень быстро краху Программа в любое количество способов. На самом деле, я думаю, мы могли бы иметь сделал это случайно один раз. А если нет, давайте сделаем это Теперь намеренно. Позвольте мне идти вперед и написать супер быстро программа под названием dontdothis.c. А теперь я пойду сюда и делайте резких включают stdio.h. Объявим функции Foo берет аргументов, которые не являются обозначается а также недействительными. И единственное, что Foo собирается сделать, это вызов Foo, который, вероятно, не умная идея, но пусть будет так. Ent основные силы. Теперь единственное, что основным будет просто вызвать Foo, а также. И просто ради удовольствия, я пойду вперед и скажу, Е "Привет от Foo ". ОК. Так что если бы я не сделал ни одной ошибки, Сделать dontdothis точка слэш. И давайте сделаем это в большом окне - точка слэш, dontdothis. Пойдем. Ой-ой. Судя по всему, вы можете сделать это. Черт возьми. ОК. Подождите. Оставайтесь на связи. Разве мы - Мы действительно использовали его сделать. [Вздыхает] Я знаю, но я думаю, что мы просто удалил это. Ну, да. Черт возьми. Решите эту Роб. Что? Это очень просто. Да, мы обратились отключения оптимизации. Хорошо, стоять до свидания. Теперь я чувствую себя лучше. ОК. Хорошо. Так что давайте перекомпилировать - Сделать вас dontdothis. Возможно, вам придется переименуйте его в dothis.c через минуту. Там мы идем. Спасибо. ОК. Поэтому тот факт, что я печатал что-то было на самом деле просто замедление процесса с помощью которого мы достигли бы этой точке. ОК. Фу! Так что же происходит на самом деле? Причина есть, так же, как в стороне, является делать что-либо в терминах входных и Выход как правило, медленнее, потому что вы должны написать символы экран, он имеет для прокрутки. Так Короче говоря, если бы я на самом деле случилось так нетерпеливы, мы должны были бы видели это конечный результат, а также. Теперь, когда я получил езду печати UPS, мы видим его сразу же. Так почему же это происходит. Ну, простое объяснение, конечно, является то, что Foo наверное, не стоит быть, называющая себя. Теперь в общих чертах, это рекурсия. И мы думали, что через пару недель назад рекурсивных хорошо. Рекурсия этого волшебного способа выразить себя супер кратко. И он просто работает. Но есть ключевой особенностью всех рекурсивных программ мы говорили о и посмотрел на до сих пор, которые было то, что у них было что? Базовый вариант, который был некоторое жестко заданы случае, сказал в некоторых ситуациях не называйте Foo, что явно не в данном случае. Так что же происходит на самом деле с точки зрения этой картине? Ну, когда называет основным Foo, он получает кусочек памяти. Когда Foo Foo называет, он получает кусочек памяти. Когда Foo Foo называет, он получает кусочек. Он получает срез. Он получает срез. Потому что Foo никогда не возвращался. Мы никогда не Стирание одной из тех, кадров из стека. Так что мы, дующий через кучу, не говоря уж кто знает что еще, и мы выйти из рамок нашей так называемый сегмент памяти. Ошибка сегментации идти ложным. Так что решение есть ясно, не делай этого. Но более этого следует, что, да, там совсем некоторый предел, даже если она не определена, о том, как многие функции, вы можете позвонить в Программа, сколько раз функция может называть себя. Поэтому, даже если мы проповедовали рекурсии так как это потенциально волшебная вещь Пару недель назад для Sigma функции, и когда мы получаем данные структур и CS50, вы увидите другие приложений для него, это не обязательно лучшая вещь. Потому что, если функция вызывает саму себя, называет себя, даже если есть основания случае, если вы не попали, что базовый сценарий для звонков или 1000 10 000 звонков, по Тогда вы, возможно, не будет хватать места на так называемом стеке и нажмите некоторых других сегментов памяти. Так что это тоже дизайн компромисс между элегантностью, а также между устойчивость Вашей частности осуществление. Так что есть еще один недостаток или Другой момент, на то, что мы делали до сих пор. Когда я позвонил GetString - Позвольте мне вернуться в привет-2. Обратите внимание, что я звоню GetString, который возвращает адрес. И мы утверждаем сегодня, что адрес является из кучи. И теперь я, распечатав Строка по этому адресу. Но мы никогда не называли противоположностью GetString. Мы никогда не были calll функции, как ungetstring, где вы руку этой памяти. Но, откровенно говоря, мы, вероятно, должно было быть. Потому что если мы все время спрашиваю компьютере на память, в качестве такого человека, как GetString но никогда не отдавать его, конечно, , что тоже не может не привести к проблемы которого мы не хватить памяти. И в самом деле, мы можем смотреть на эти проблемы с новым инструментом, использование которых немного загадочными, чтобы напечатать. Но позвольте мне идти вперед и плескаться его на экране через минуту. Я собираюсь идти вперед и работать Valgrind с параметром, первая команда линии аргументом является имя этой программы привет-2. И к сожалению, это Выход ужасно комплекс не зря. Итак, мы видим все, что беспорядок. Дэвид высказать свое имя. Так вот программа на самом деле работает. И теперь мы получаем этого выхода. Так Valgrind похож по духу GDB. Это не отладчик как таковой. Но это проверка памяти. Это программа, которая будет работать ваша программу и сказать вам, если бы вы спросили Компьютер для памяти и никогда не передал его назад, тем самым это означает, что у вас есть утечка памяти. И утечки памяти, как правило, плохо. И вы это пользователи компьютеров имеют , вероятно, чувствовал это, есть ли у вас Mac или ПК. Вы когда-нибудь использовали компьютер для в то время, а не в нескольких перезагрузки дней, или вы только что получили много программ, работающих, и эта чертова штука замедляется до полной остановки, или по крайней мере это супер раздражает в использовании, потому что все только что супер медленно. Теперь это может быть любое количество причин. Это может быть бесконечный цикл, ошибка в Код кто-то, или, проще говоря, он может означать, что вы используете больше памяти, или пытаются, чем ваши Компьютер на самом деле. А может быть, есть ошибка в некоторых программ что продолжать просить памяти. Браузеры в течение многих лет были печально известны этом, прося больше и больше памяти но никогда не вручать его обратно. Конечно, если у вас есть только конечное объем памяти, вы не можете спросить бесконечное число раз для часть этой памяти. И то, что вы видите здесь, хотя снова выход Valgrind является излишне сложным, чтобы взглянуть на Во-первых, это самая интересная часть. Куча - используется при выходе. Итак, вот какой объем памяти используемых в кучу на Время моего программа выходила - по-видимому шесть байтов в одном блоке. Так что я собираюсь махать руками на то, что блок. Подумайте, это всего лишь кусок, более технический термин для куска. Но шесть байт - Какие шесть байтов, были все еще в использовании? Именно так. D--V-I-D обратную косую черту нуля, пять письма Название плюс нулевое окончание. Так что это программа Valgrind заметил, что я попросил шесть байтов, по-видимому, способ GetString, но не дал их обратно. И в самом деле, это может быть не так очевидно, если моя программа не три линий, но это 300 строк. Так что мы можем на самом деле дать другую команду линии аргумент Valgrind к сделать его более подробным. Это немного раздражает, чтобы помнить. Но если я делаю - давайте посмотрим. Утечка - Было ли это утечка - даже не помню что это от руки. - Проверка герметичности равное полной. Да, спасибо. - Проверка герметичности равное полной. Enter. То же программы. Введите Дэвида снова. Теперь я вижу, чуть более подробно. Но ниже кучи резюме, которое идентична четыре - ах, это отчасти хорошо. Теперь Valgrind фактически ищет немного сложнее в своем коде. И он говорит, что, по-видимому, Malloc на линии - Мы уменьшения. В строке - мы не видим, какую линию он есть. Но Malloc является первым виновником. Там в блоге в Malloc. Все в порядке? ОК, нет. Верно? Я позвонил GetString. GetString мому Malloc. Так что строка кода видимому виноваты за то, выделил эту память? Давайте предположим, что тот, кто писал Malloc было вокруг достаточно долго, что это не их вина. Так что это, наверное, мое. GetString в cs50.c - так что это файл где-то в компьютере - в линию 286, кажется, быть виновником. Теперь давайте предположим, что была CS50 вокруг в течение приличное количество времени, поэтому мы тоже непогрешимым. И так, наверное, не в GetString что ошибка лежит, а в привет-2.c линии 18. Итак, давайте взглянем на то, что эта линия была 18. Ох. Так или иначе эта линия не обязательно багги, как таковой, но именно по этой причине за этим утечки памяти. Так супер просто, что бы интуитивно быть решение здесь? Если мы просим памяти, никогда не были отдавать его, и это, кажется, проблема, потому что с течением времени мой компьютер может не хватить памяти, может замедлить вниз, плохие вещи могут случиться, ну, что простое интуитивное решение? Просто дайте ему спину. Как вы освободить эту память? Ну, к счастью, это довольно просто просто сказать свободное имя. И мы никогда не делали этого раньше. Но вы можете существенно думать бесплатно как противоположность Malloc. Бесплатный является противоположностью выделение памяти. Так что теперь позвольте мне перекомпилировать. Сделать привет-2. Позвольте мне запустить его снова. Здравствуйте-2 Давида. Так что, похоже на работу в точно так же. Но если я вернусь в Valgrind и повторно запустить что же команда на моей недавно составлена ​​программа, набор текста на мое имя как раньше - Ницца. Куча резюме - используется на выходе - нулевых байт в нулевые блоки. И это супер хорошо, все куча блоков были освобождены. Утечки не возможны. Так идет вверх, не с задачей установить 4, но с задачей установить 5, судебно-медицинской экспертизы и далее, это тоже станет Мера правильности своих программы, или нет у вас есть или не имеют утечек памяти. Но, к счастью, вы можете не только рассуждать через них интуитивно, которая является, пожалуй, легкая для небольших программ но труднее для больших программ, Valgrind, для тех крупных программ, может помочь вам определить конкретной задачи. Но есть одна проблема которые могут возникнуть. Позвольте мне открыть этот файл здесь, который, Опять же, несколько простом примере. Но давайте сосредоточимся на том, что это делает программа. Это называется memory.c. Мы опубликуем это позже сегодня в ZIP исходного кода сегодня. И заметьте, что у меня есть функция называется F, который не принимает аргументов и ничего не возвращает. В строке 20, я видимо объявлении указатель на Целочисленное и назвав его х. Я задаю является возвращение Значение Malloc. И так же, чтобы быть ясным, сколько байтов утра Я, вероятно, возвращения из Malloc в этой ситуации? Вероятно, 40. Где вы это взяли? Ну, если вы помните, что Целочисленное часто 4 байта, по крайней мере, он находится в Прибор, в 10 раз 4, очевидно, 40. Так Malloc возвращается адрес кусок памяти и хранения, что В конечном счете, решение х. Таким образом, чтобы было ясно, что Затем происходит? Ну, позвольте мне вернуться нашим картина здесь. Позвольте мне не просто нарисовать нижнюю часть моего памяти компьютера, позвольте мне идти вперед и привлечь весь прямоугольник, представляет все мои оперативной памяти. Мы скажем, что стек на дно. И есть сегмент текста в неинициализированную данных. Но я просто хочу, чтобы эти абстрактные другие вещи далеко, как точка, точка точка. Я просто хочу, чтобы обратиться к этому в виде кучи в верхней части. А потом в нижней части этой картины, представлять основные, я собираюсь дать ему кусочки памяти в стеке. Для F, я собираюсь дать ему кусочек памяти в стеке. Теперь, я должен посоветоваться с исходный код снова. Какие локальные переменные для главного? Видимо ничего, так что часть не эффективно пустым или даже не как большой как я нарисовал его. Но в F, у меня есть локальная переменная, который называется х. Так что я собираюсь идти вперед и дать F участок памяти, назвав его х. А теперь Malloc в 10 раз 4, Так Malloc 40, где эта память приходят? Мы не нарисовала как это раньше. Но давайте предположим, что это эффективно Исходя из здесь, так что один, два, три, четыре, пять. И теперь мне нужно 40 из них. Так что я просто сделаю точка, точка, точка предложить что есть еще больше памяти возвращались из кучи. Теперь то, что адрес? Давайте выберем наш произвольный решения как всегда - Ox123, хотя это, вероятно, быть что-то совсем другое. Это адрес первого байта памяти, что я прошу для Malloc. Короче говоря, как только выполняется строка 20, что буквально хранить внутри х здесь? Ox123. Ox123. И Быка неинтересно. Это просто означает, вот шестнадцатеричное число. Но то, что ключевым является то, что я магазин в X, которая является локальной переменной. Но его тип данных, опять же, это адрес внутр. Ну, я собираюсь хранить Ox123. Но опять же, если это слишком излишне сложным, если я перечисляю назад, мы можем абстрагироваться от этой довольно разумно и просто говорить, что х указатель на этот кусок памяти. ОК. Теперь вопрос под рукой является следующее - строка 21, оказывается, глючит. Почему? Простите? Он не имеет - сказать, что еще раз. Ну, это не освобождает. Так вот, но второй. Так что есть еще один, но специально в строке 21. Именно так. Эта простая строка кода просто переполнение буфера, переполнение буфера. Буфер просто означает кусок памяти. Но это часть памяти имеет размер 10, 10 целые числа, что означает, если мы Индекс в нее с помощью синтаксического сахара обозначения массива, площадь скобки, вы имеете доступ к х кронштейн 0 х кронштейн 1 х, Кронштейн точка, точка, точка. х кронштейн 9 является самым большим. Поэтому, если я х кронштейн 10, где Я на самом деле происходит в памяти? Ну, если у меня есть 10 Int - давайте на самом деле, всех привлеку из них здесь. Таким образом, это был первый пять. Вот на целых пять. Так х кронштейн 0 здесь. х кронштейн 1 здесь. х кронштейн 9 здесь. х кронштейн 10 здесь, что означает, я говорю, в строке 21, компьютер поставить где число? Число 0, где? Ну, это 0, да. Но только тем, что его 0 это своего рода совпадение. Это может быть количество 50, для всех мы заботимся. Но мы пытаемся положить его на х кронштейн 10, который где это Вопросительный знак рисуется, которая это не очень хорошая вещь. Эта программа вполне может аварии в результате. Теперь, давайте идти вперед и посмотреть, если это , действительно, то, что происходит. Сделать памяти, так как файл называется memory.c. Давайте пойдем дальше и запустить памяти программ. Так что нам повезло, на самом деле, кажется. Нам повезло. Но давайте посмотрим, если теперь запустить Valgrind. На первый взгляд, моя программа может , кажется, совершенно правильно. Но позвольте мне работать с Valgrind - Проверка герметичности равное полной памяти. И теперь, когда я запускаю это - интересно. Неверный написать размером 4 на строке 21 memory.c. Строке 21 memory.c это какой? О, интересно. Но подождите. Размер 4, что в том, что в виду? Я только сделал одну писать, но это размером 4. Почему 4? Это потому, что это Интеллект, который , опять же, четыре байта. Так Valgrind нашли ошибку, что я, взглянув на мой код, этого не сделали. А может быть, ваш TF может или нет. Что Valgrind Но наверняка обнаружили, что Мы сделали ошибку там, даже хотя нам повезло, и компьютер решил, да, я не собираюсь к краху только потому, что вы затронули один байт, один Стоит INT в памяти, который не на самом деле собственные. Ну, что еще здесь глючит. Адрес - это сумасшедший ищет адрес в шестнадцатеричном. Это просто означает, где-то в куче нулевых байтов после того, как блок размером 40 выделяется. Позвольте мне уменьшить масштаб здесь и посмотреть, если это немного более полезной. Интересно. 40 байт, безусловно, потерял к потере Запись 1 из 1. Опять же, больше слов, чем может оказаться весьма кстати. Но на основе выделенной линии где я должен, вероятно, сосредоточить свое внимания другую ошибку? Похоже на строке 20 memory.c. Так что, если мы вернемся к линии 20, это тот, который Вы определили ранее. И это не обязательно коляске. Но мы этого отменил свое эффектов. Так как я могу исправить по крайней мере, одна из тех ошибок? Что я мог сделать после строки 21? Я мог бы сделать бесплатно х, так чтобы отдать этой памяти. И как я могу исправить эту ошибку? Я должен определенно Не дальше, чем 0. Итак, позвольте мне попытаться вновь запустить этот. К сожалению, определенно Не дальше, чем 9. Сделать памяти. Позвольте мне повторно Valgrind в большом окне. А теперь посмотрите. Ниццу. Все блоки кучи были освобождены. Утечки не возможны. А вверху здесь, нет никакого упоминания больше недействительных прав. Просто чтобы получить жадный, и давай увидеть, если еще одна демонстрация не так, как задумывалось - Я повезу минуту назад. И то, что это, пожалуй, 0 излишне заблуждение. Давайте просто сделаем 50, несколько произвольный номер, марку памяти точка слэш памяти - еще повезет. Ничего не разваливается. Предположим, что я просто делаю что-то действительно глупо, и я делаю 100. Позвольте мне переделать памяти, точка слэш памяти - опять повезло. Как насчет 1000? за целые, грубо говоря, где я должен быть? Сделать памяти - черт побери. [Смеется] ОК. Давайте не возиться больше. Повторить памяти. Там мы идем. Хорошо. Так что вы, видимо, индекс 100000 целые за пределы, где вы должны были в памяти, плохие вещи случаются. Так что это, очевидно, не жесткие, быстрые правила. Я был отчасти методом проб и ошибок, чтобы туда попасть. Но это потому, что, короче говоря, память компьютера также будет разделен в эти вещи называются сегментами. А иногда, компьютер на самом деле дал вам немного больше памяти чем вы просите. Но для эффективности, это просто легче получить больше памяти, но только сказать вам, что вы получаете его часть. И если вам повезет иногда, Таким образом, вы можете иметь возможность прикоснуться к памяти, которые не принадлежат вам. У вас нет никакой гарантии, что, какое значение вы положили будет остаться там, потому что компьютер по-прежнему думает, что это не ваша, но это не обязательно будет хит другой сегмент памяти в Компьютер и вызывают ошибку, как это здесь. Хорошо. Любые вопросы, то на память? Хорошо. Давайте посмотрим здесь, то, по крайней то, что мы принимали за предоставлен в течение достаточно долгого времени, что В этом файле cs50.h. Так что это файл. Таковы лишь целая куча комментариев наверху. И вы, наверное, смотрели на это, если Вы пошарил на самом устройстве. Но оказывается, что все время, когда мы привыкли использовать строку как синонимов, с помощью которых мы объявили , что было синонимом с этим Ключевое слово, объявление типа, для определения типа. И мы по сути, говорит, делать натянуть синоним символ звезды. Это средство, с помощью которого стека созданы эти учебные колеса известны как строки. Теперь вот только прототип для GetChar. Мы, возможно, видел его раньше, но это действительно то, что он делает. GetChar не принимает никаких аргументов, возвращает символ. GetDouble не принимает никаких аргументов, возвращает двойной. GetFloat принимает никаких аргументов, возвращается плавающей точкой, и так далее. GetInt находится здесь. getlonglong находится здесь. И GetString находится здесь. И это все. Это фиолетовая линия другая препроцессора Директива из-за хэштэг в начале его. Хорошо. Так что теперь отпусти меня в cs50.c. И мы не будем говорить слишком много времени на это. Но, чтобы дать вам увидеть то, что уже на все это время, отпустить меня в - давайте сделаем GetChar. Так GetChar в основном комментарии. Но это выглядит следующим образом. Так что это фактическая функция GetChar, что мы были принимаем как должное существует. И хотя мы не использовали эту , что часто, если вообще когда-либо, это по крайней мере относительно простым. Так что стоит брать Беглый взгляд на здесь. Так GetChar имеет бесконечный цикл, Таким образом, очевидно намеренно. Затем он вызывает - и это вид хорошее повторное использование кода мы сами написали. Он призывает GetString. Потому что то, что делает это значит получить символ? Ну, вы могли бы также попытаться получить Вся линия текста от пользователя и то просто посмотрите на одну из этих символов. В линии 60, вот немного Немного санитарной проверки. Если GetString вернулся нулевым, давайте не будем продолжать. Что-то пошло не так. Сейчас это несколько раздражает, но В обычных символов C. Макс, вероятно, представляет то, что просто основываясь на его имени? Это постоянная. Это как числовое значение крупнейший символ можно представить с один укус, который, вероятно, число 255, который является самым большим номером представляют восемь бит, начиная с нуля. Так что я использовать это, в этой функции, когда написания этого кода, только потому, что Если что-то пойдет не так, но в GetChar его цель в жизни, чтобы вернуться символ, необходимо каким-то образом быть в состоянии чтобы сигнализировать пользователю, что что-то пошло не так. Мы не можем вернуть значение NULL. Получается, что является нулевым указателем. И опять же, имеет GetChar вернуть символ. Таким образом, Конвенция, если что-то пойдет неправильно, это вы, программист, или в этом случае, мне с библиотекой, у меня было просто решить произвольно, если что-то пойдет не так, я собираюсь возвращает число 255, которая действительно означает, что мы не можем, пользователь может не вводите символ, представленный число 255, потому что у нас было украсть в качестве так называемого дозорном значение представлять проблему. Теперь же выясняется, что характер 255 это не то, то можно будет ввести клавиатуре, так что это не большая проблема. Пользователь не замечает, что Я украл этот персонаж. Но если вы когда-нибудь видели в человеке страниц Компьютерная система ссылкой на некоторые заглавными буквами постоянным, как это говорит, что, в случае ошибки эта постоянная мощь возвращаются, вот и все сделал некоторые человеческие лет назад был произвольно решил вернуть эту особую ценность и называют это постоянной в случае что-то пойдет не так. Сейчас происходит волшебство здесь. Во-первых, я объявляю в линии 67 два символа, C1 и C2. И тогда в линии 68, там на самом деле строка кода, которая является напоминающим о наш друг Е, учитывая, что это действительно есть процентов Cs в кавычки. Но обратите внимание, что здесь происходит. Sscanf означает строка сканирования - означает сканирования отформатированных Строка, ERGO Sscanf. Что это значит? Это означает, что вы передаете Sscanf строку. И все, что линия Пользователь вводит дюйма Переходите на Sscanf строку формата, как это говорит, что SCANF каковы Вы надеетесь, что вводил пользователь дюйма Затем пройти в адреса двух участков памяти, в данном случае потому что у меня есть два заполнителей. Так что я собираюсь дать ему адрес С1 и С2-адрес. И напомнить, что вы даете функции адрес какой-либо переменной, что последствия? Что это может сделать функцию в результате передачи ее адрес переменная, в противоположность сама переменная? Это может изменить его, верно? Если у вас кто-то карту к физическому адрес, они могут пойти туда и сделать что они хотят по этому адресу. Та же самая идея здесь. Если перейти к Sscanf, адрес двух участки памяти, даже эти крошечные мало участков памяти, C1 и C2, но В ней мы указываем адрес из них, Sscanf можете его изменить. Так что цель Sscanf в жизни, если мы читаем Человек странице, читать то, что пользователь вводит, надежда на пользователя, имеющего набрал в характере и, возможно, другой персонаж, и любой пользователь набрали, первый символ идет Здесь, второй символ идет здесь. Теперь, как и в сторону, это, и вы бы Только знаю, что это из документации, тот факт, что я ставлю пробел существует просто означает, что я не волнует, если пользователь нажимает клавишу пробела несколько раз, прежде чем он или она принимает характера, я собираюсь игнорировать любой пробел. Так что, я знаю, от документации. Тот факт, что есть вторая C% за ними следуют белые пространства на самом деле преднамеренным. Я хочу быть в состоянии обнаружить, если пользователь облажался или не сотрудничал. Так что я надеюсь, что пользователь только набран в один символ, поэтому я надеюсь, Sscanf, что только собирается вернуться значение 1, потому что, опять же, если я читаю Документация, Цель Sscanf в жизни для возвращения к числу переменных, которые были заполнены с пользовательского ввода. Я прошел с двумя переменными адреса, C1 и C2. Я надеюсь, однако, что только один из их убивают, потому что если Sscanf возвращает 2, что предположительно подразумевается логически? Чтобы пользователь не просто дать мне один персонаж, как я сказал ему или ей. Они набрали на не менее двух символов. Так что, если я вместо этого не было второго % С, я просто был один, который откровенно была бы более интуитивным подход, я думаю, что первый взгляд, Вы не собираетесь быть в состоянии обнаружить Если пользователь был давая вам больше затрат, чем вы на самом деле хотели. Так что это неявном виде проверки ошибок. Но обратите внимание, что я делаю здесь. Как только я уверен, что пользователь дал мне один характер, я освободить линию, делая противоположность GetString, который в свою очередь использует Malloc, а затем я вернусь C1, символ, который я надеялся, пользователя и требуется лишь при условии. Так быстро увидел только, но По вопросам GetChar? Мы вернемся к некоторым из других. Ну, позвольте мне идти вперед и делать это - Предположим теперь, просто чтобы мотивировать наших обсуждения в неделю плюс время, это находится файл structs.h. И опять же, это только вкус о чем-то, что лежит впереди. Но обратите внимание, что много из этого комментариев. Итак, позвольте мне выделить только интересная часть на данный момент. ЬурейеЕ - есть то, что же ключевое слово снова. ЬурейеЕ мы используем, чтобы объявить строку как особый тип данных. Вы можете использовать ЬурейеЕ на создание принципиально новой типы данных, не существует, когда C был изобретен. Например, внутр поставляется с С. символов поставляется с двойной C. поставляется с С. Но нет никакого понятия студента. И все же было бы очень полезно, чтобы быть в состоянии написать программу, которая хранит в переменной, номер удостоверения личности студента, их названия, и их дома. Другими словами, три части данных, как и Целочисленное строку и другой строки. С ЬурейеЕ, что довольно мощным Об этом и ключевое слово для sturct Структура, программисту в 2013 году, действительно может определить свои собственные типы данных, которые не существовали лет назад, но которые отвечают вашим целям. И вот, в строках с 13 по 19, Мы объявления нового типа данных, как Интеллект, но назвав его студентом. А внутри этой переменной будет Три вещи - Интеллект, строка, и строки. Таким образом, вы можете думать о том, что действительно здесь произошло, даже если это Немного упрощение на сегодняшний день, студент собирается существенно чтобы выглядеть следующим образом. Его будет кусок памяти с ID, имя поле, а дома области. И мы сможем использовать эти куски память и доступ к ним следующим образом. Если я иду в struct0.c, вот относительно долго, но после рисунком, кода, который использует этот новый трюк. Итак, сначала, позвольте мне обратить ваше внимание к интересной части наверху. Sharp определяет студенты 3, объявляет константа, называемая студентов и правопреемников оно произвольно номер 3, всего так у меня есть три студенты, использующие эта программа на данный момент. А вот главную. И обратите внимание, как я заявляю Массив студентов? Ну, я просто использовать тот же синтаксис. Слово студент, очевидно, новое. Но студент, класс, студенты кронштейна. Поэтому, к сожалению есть много повторного использования терминов здесь. Это просто номер. Так что это все равно что сказать три. Класс именно то, что я хочу вызвать переменной. Я могу называть его студентов. Но класс, это не класс в объектно-ориентированный вид Java пути. Это просто класс студентов. И тип данных каждого элемента в этом массиве является студентом. Так что это немного по-другому и говоря что-то от как это, это просто - Я говорю, дайте мне три студента и называют этот массив класса. Хорошо. Теперь вот четыре петли. Этот парень знакомый - итерация от нуля на срок до трех. А вот и новая часть синтаксиса. Программа собирается подсказывают мне, человека, дать ему студента ID, который является внутр. А вот синтаксис, с которыми вы можете хранить что-то в поле идентификатора в Расположение кронштейна класса I. Таким этот синтаксис не нова. Это просто означает, дайте мне восьмой Студент в классе. Но этот символ является новым. До сих пор мы никогда не может использоваться точка, по крайней мере в такой код. Это означает пойти в структуру известного как студент и положить что-то там. Аналогичным образом, в следующей строке, 31, перейдите вперед и положить все, что пользователь набирает для одного имени можно здесь и что они делают для дома, то же самое, идти вперед и положить его в. дома. Так, что это программа в конечном итоге делать? Вы можете увидеть немного Тизер. Позвольте мне идти вперед и делают структур 0 точка слэш структуры 0, ID студента 1, Дэвид сказал Мазер, студенческий билет 2. Rob Kirkland, студенческий билет 3. Лорен Leverit - и единственная вещь, эта программа сделала, который находится всего в совершенно произвольной, является Я хотел сделать что-то с этими данными, Теперь, когда я учил нас, как использовать структуры, это я только что эта дополнительная петля здесь. Я итерации по массиву студентов. Я использовал наши, возможно, уже знакомы друг, сравнение строк, чтобы stircomp проверка восьмом доме студента равным Mather? И если это так, просто напечатать что-нибудь произвольно нравится, да, это так. Но опять же, чтобы просто дать мне возможность в использовании и повторного использования и повторно использовать эту новую точечную нотацию. Так кто заботится, не так ли? Придумывая студентом программы несколько произвольно, но оказывается, что мы можем сделать полезные вещи с это, например, следующим образом. Это гораздо более сложная структура в С. есть десяток или более полей, несколько загадочно назвали. Но если вы когда-нибудь слышали о графике формат называется растровой, BMP, он Получается, что растровый формат файла в значительной степени похоже, что это. Это глупая смайлик. Это маленькое изображение, которое я увеличено на довольно большой, так что я мог видеть каждый отдельных точек или пикселей. Теперь, оказывается, мы можем представить черная точка, скажем, с номером 0. И белая точка с номером 1. Итак, другими словами, если вы хотите привлечь Смайлик и сохранить этот образ в компьютер, достаточно для хранения нулей и те, которые выглядят, как это, где, опять же, из них белые и нулей черные. И вместе, если вы должны эффективно оденьтесь из единиц и нулей, у вас есть сетку пикселей, и если вы лежали их, у вас есть мило маленький смайлик. Теперь, растровый формат файла, BMP, является эффективно, что под капотом, но с большим количеством пикселей сот, что вы может на самом деле представляют цветов. Но когда у вас есть более сложные форматы файлов, как BMP и JPEG и GIF с которыми вы можете быть знакомы, те файлам на дисках обычно не только есть нулей и единиц для пикселов, но они имеют некоторые метаданные, а также - мета в том смысле, что на самом деле не данных, но это полезно иметь. Таким образом, эти поля здесь подразумеваете, и Мы увидим это более подробно в P-набор 5, что до нулей и единиц, что представляют пикселов в изображении, есть куча метаданные, как Размер изображения и ширина изображения. И заметьте, я выщипывание от некоторых произвольных вещей здесь - ширине и высоте. Подсчета битрейтов и некоторые другие вещи. Таким образом, есть некоторые метаданные в файл. Но, понимая, как помещает файлы в этом случае, вы можете фактически затем манипулировать изображениями, восстановления изображения с диска, изменять размер изображений. Но вы можете не обязательно активизации их деятельности. Я нуждался в фотографии. Так я вернулся к RJ здесь, который вы видели на экране некоторое время назад. И если я открываю Keynote здесь, это Что произойдет, если вы попытаетесь для увеличения и повышения RJ. Он не становится лучше на самом деле. Теперь Keynote это своего рода размывание его немного, просто чтобы затушевать То, что RJ не получает особенно возрастает, когда вы увеличить дюйма И если делать это таким образом, см. квадратов? Да, можно определенно видеть квадратов на проекторе. Это то, что вы получаете, когда вы сможете улучшить. Но в нашем понимании того, как RJ или Смайлик реализуется позволит нам на самом деле писать код, который управляет эти вещи. И я думал, что закончится на этой ноте, с 55 секунд, что это повышение, Смею, говорят скорее вводит в заблуждение. [ВОСПРОИЗВЕДЕНИЕ ВИДЕО] -Он лжет. О том, что, я не знаю. -Так что же мы знаем? -Это в 9:15 Ray Сантойя было в банкомате. -Таким образом, вопрос, что он делал в 9:16? -Съемки девять миллиметров на что-то. Может быть, он увидел снайпера. -Или работал с ним. -Подожди. Возврат на один. -Что ты видишь? -Принеси его лицо, полный экран. -Его очки. -Там в отражении. -Это команда Neuvitas бейсбол. Это их логотип. -И он говорит тому, кто это носить эту куртку. [КОНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] Дэвид Дж. МАЛАН: это быть проблематика 5. Мы будем видеть вас на следующей неделе. MALE SPEAKER: На следующей CS50. [Сверчки щебетание] [Музыка Воспроизведение]