[Музика Відтворення] Девід Дж. мала: Добре. [Сміється] З поверненням. Це 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. [Цвіркуни щебетання] [Музика Відтворення]