[Музика грає] ROB BODEN: Добре. Так, перше, що по-перше, відео від знайомого обличчя. [Відеовідтворення] -Все в порядку. Це CS50, і це початок тижня три. Шкода, що я не міг бути там з вами сьогодні, але дозвольте мені представити CS50 власної Роб Боден. [КІНЕЦЬ відеовідтворення] [Оплески, що переходять в овацію] ROB BODEN: фільмографія в що відео є фантастичним. Добре. Отже, спочатку, є інший обід. Це завтра в 1:15. Там немає ніякого обіду в цю п'ятницю. Саме з Quora. І Томмі ще не тут, але один з люди там є колишній глава CF, Томмі McWilliam. Так що він веселий хлопець. Ви повинні прийти. Добре. Так минулого тижня, ми почали розвалюється про те, що рядок насправді. Ми знали з самого початку, що це послідовність символів. Але минулого тижня, ми занурилися в той факт, що те, що насправді є послідовність персонажі, ну, у нас тепер є масиви символів. І ми знаємо, що це рядок, це масив символів, в самому кінці, у нас є цей спеціальний нульовий байт, це зворотний слеш 0, що вказує на кінець рядок. І тому рядок являє собою масив персонажі, але ми можемо мати більш просто масив символів, ми можемо мати масив будь тип речі ми хочемо. Так що, якщо ви пам'ятаєте з минулого тижня, Програма століття, що Давид ввів дуже швидко. Так перше, що ми збираємося зробити, це запитати користувача для цілого числа, кількість людей в кімнаті. Як тільки у нас є, що ціле, ми оголошенні масиву. Зверніть увагу, цей синтаксис кронштейн. Ви збираєтеся, щоб звикнути до цього. Таким чином, ми оголошенні масиву цілих чисел називається вік, і є п цілі числа в цьому масиві. Так ця картина прямо тут, це 4 внутр я дорівнює 0, я менше п, я плюс плюс, що також збирається бути зразком що ви отримаєте дуже звикли. Тому що дуже багато, як ви завжди буде перебору масивів. Так що пам'ятайте, що п довжина нашого масиву. І ось, ми неодноразово з проханням для віку людина, якого я в кімнаті. Після цього, ми йдемо вниз, і з тих чи інших довільне причина, ми тоді роздрукувати скільки років вони збираються бути через рік. І виконує цю програму, давайте зробити віків, точка косою віків. Так кількість людей у ​​кімнаті, скажімо є три. І сказати, перша людина, становить 13, Наступний становить 26, а останній 30. Так то він буде перебирати цих трьох люди, роздрукувати 14, 27, і 31. Так що пам'ятайте, що, коли ми заявляємо, масив розміру п, індекси в тому, що Масив, масив має значення і індекси 0, 1, 2, на всьому шляху до н мінус 1. Тому, коли ми сказали, що було три людини в кімнаті, і ми ставимо тут перша ітерація через це цикл, я буде 0. Так в індексі 0. Ми присвоюємо перший З віком, коли користувач вводить. Тоді наступного, ми входимо Другий н користувач вводить, а в поряд з двома, останніх п. Так помітити, що масив розміру три не має нічого в індексі три. Це не відноситься. Добре. Так, повертаючись тут. Отже, що ми мали справу з масивами, ми трохи знайомі. Тепер ми збираємося перейти до команди аргументи командного рядка, які будуть досить ставлення до цієї проблеми набору. Так до сих пір, всякий раз, коли у Вас є оголосили про свою головної функції, ми сказав тап_п недійсними. Так недійсними просто означає, що ми не проходячи будь Аргументи цієї функції. Тепер ми збираємося, щоб побачити, що основні може зайняти кілька аргументів. Тут ми називаємо їх внутр агдс і струнні ARGV дужки. Дужки, в черговий раз, що вказує на що ми маємо справу з масивами. Так от, рядок ARGV дужки, ми справу з масивом рядків. Так агдс, що відбувається, щоб вказати, скільки аргументів ми в пройшов в цю програму. І бачити, що це означає, давайте закриємо це. ОК. Так до сих пір, ми запускаємо кожен програма, як точкових віків косою. Ми можемо також, в командному рядку, повз передати аргументи таким чином, термін, команда, аргументи командного рядка. Таким чином, перший аргумент, привіт світ. Так от, агдс буде три. Це кількість аргументів в командному рядку. ARGC завжди принаймні 1, так як точка скоротити вік, себе, вважається одним з аргументи командного рядка. Тоді привіт є першим. Якщо точка вік слеш є нульовою, то Привіт є першим, і світ Другий рядок аргумент командного. Так рядок агду, ми збираємося, щоб побачити, містить рядки, точка слеш вік, привіт, і світ. І, за запитом Давида, ми збираємося для відтворення відео, уявляючи, що. [Відеовідтворення] НЕ-До цих пір в програмах ми написано, ми заявляємо Основним як тап_п недійсними. І весь цей час, що порожнеча є просто був уточнивши, що Програма не приймати будь аргументи командного рядка. Іншими словами, коли користувач запускає Програма, він чи вона може забезпечити команду аргументи командного рядка, прописавши додаткові слова чи фрази після програми назвати в командному рядку. Ну, якщо ви хочете, щоб ваша програма приймати аргументи командного рядка, один або більше таких слів, ми повинні замінити анулюванню з парою аргументів. Так давайте зробимо це. Увімкніть CS50.h. Увімкніть стандартний io.h. Int основною. І тепер, замість того, порожнеча, я збираюся вказати Int назвою агдс і масив рядків званих агду. Тепер, агдс і агду є просто конвенцій. Ми могли б назвати ці аргументи Найбільш все, що ми хочемо. Але важливо те, що агдс є внутр тому, за визначенням, це міститиме кількість аргументів, кількість слів у цілому, що користувач ввів в його або її рядку. агду, тим часом, аргумент вектор, є збирається бути насправді масив зберігання всі слова про те, що користувач має набрали по його або її рядку. Перейдемо зробити щось зараз з одним або більше з цих аргументи командного рядка. Зокрема, давайте йти вперед і друк які б не були слово користувач вводить після імені програми в командному рядку. Відкрити кронштейн. Закрити кронштейн. Printf відсотків із зворотного косою і кома. А тепер я повинен сказати Printf яке значення для підключення до цієї заповнювача. Я хочу перше слово, яке користувач повинен набрали після імені програми, і тому я збираюся вказати агду кронштейн 1, недалеко дужка, крапка з комою. Тепер, чому кронштейн 1, а не кронштейн 0? Ну, виявляється, автоматично зберігаються в ARGV 0 буде справжнє ім'я програми. Таким чином, перше слово, яке користувач вводить після ім'я програми є, по Конвенція, буде зберігається в ARGV 1. Давайте тепер скомпілювати і запустити цю програму. Зробити ARGV 0, точка слеш ARGV 0. А тепер слово як привіт. Enter. І у нас це є, привіт. [КІНЕЦЬ відеовідтворення] ROB BODEN: Добре. Закрити це. Так поглянути на цю програму, що ми тільки що представила нам, ну просто показати, якщо ми друкуємо агду 0, зробити, тепер що це таке, агду 0, точка слеш агду 0. Так що, як очікується, це виведення на друк Назва програми, так як агду 0 завжди буде Назва програми. Але давайте зробимо щось трохи більш цікавим. Таким чином, в безлічі проблем, ви будете познайомився з цією функцією, atoi. Так що ж нам використовувати atoi для? Це збирається перетворити рядок в ціле число. Так що якщо я передати рядок, один, два, три, щоб atoi, який буде конвертувати, що до цілого, один, два, три. Так що ми збираємося перетворити перший Аргумент командного рядка в ціле число, а потім просто роздрукувати, що ціле число. Так в основному, ми начебто повторної реалізації GetInt, просто ціле вводиться по команді лінія, а не в програмі в інтерактивному режимі. Отже, що робить ARGV 0, давайте зробимо це тут, і закрийте це. Так працює ARGV 0, і давайте введіть ціле число, один два три чотири один два. Так це буде вивести ціле, один два три чотири один два. Є деякі тонкощі, щоб atoi, що це буде перестати турбуватися ні про що за дійсного числового символу, але це не має значення. Так що ж ви думаєте, що відбувається якщо я зроблю це? Сегментація вина. Так чому ж? Якщо ви подивитеся на нашу програму, ми перетворення ARGV 1, перший аргумент після імені програми, в ціле число. Але немає аргумент, переданий після імені програми. Так от, ми бачимо, що це баггі Програма, оскільки, якщо ми спробуємо запустити його без будь-яких аргументів, він просто буде крах. Так ще одна поширена картина, то ви побачите, буде щось на зразок, якщо агдс менше не два, із зазначенням, що не було принаймні, ім'я програми і Перший аргумент, то ми зробимо щось як Е, мало аргументи командного рядка. Це, ймовірно, не хороший для друку, це, напевно, щось, як ви повинні ввести ціле число в командному рядку. Я просто закінчити його там. А потім повернути 1. Так що пам'ятайте, що наприкінці нашої Програма, якщо ми повернемося 0, такого роду вказує на успішне завершення. А головне автоматично повертає 0, якщо ви не робите. Так от, ми перенастроювання 1, щоб вказати що це не успіх. І ви можете повернутися, що ви хочете, просто, 0 вказує на успішне завершення, і небудь ще вказує на помилку. Так що давайте запустити цю версію речей. Так що тепер, якщо ми не введіть командний рядок аргумент, це буде правильно сказати нам, мало командного рядка. Чи не закінчити фразу. Інакше, якщо ми насправді передати йому один, він може завершити програму. Так що це, як ви будете використовувати ARGC в Для того щоб перевірити кількість аргументи командного рядка, що насправді пройшло. Так давайте зробимо цю програму трохи більше складно, і подивитися на секунду ітерація речей. Так що тепер, ми не просто друк Перший рядок аргумент командного. Тут ми ітерації від десяткового я рівних 0, я менше агдс, я плюс плюс, і друк агду, індекс р. Так ця картина, знову ж таки, це те ж саме картина, як і раніше, за винятком того, замість того, щоб виклику змінну п, ми використовуємо ARGC. Так що це перебір кожного індексу в масиві, і друк кожного елемент у цьому масиві. І ось, коли ми запустимо цю програму, добре, Я не ввести будь командного рядка аргументи, так що просто друкує назва програми. Якщо я входжу купу речей, воно буде роздрукувати один, кожен на окремому рядку. ОК. Отже, давайте ще один крок. І замість того, щоб друкувати кожен аргумент на окремому рядку, давайте друкувати кожен характер кожного аргументу на окремому рядку. Тому пам'ятайте, що агду є масив рядків. Так що це рядок, але масив символів? Так це значить, що агду дійсно Масив масив символів. Так, скориставшись, що, давайте звертати на нього уваги. Давайте просто розглянемо рядки ARGV 0. Так що якщо ми хочемо принести кожен символ агду 0 на окремому рядку, то я хочу зробити шаблон ми звикли, я це менше, ніж довжина масиву, які тут, в STRLEN з, це не те, що я хочу зробити, рядок з одно агду 0. Так що я менше довжини нашого масив, який в даному випадку являє собою масив символів, я плюс плюс. І так, як ми бачили минулого тижня, він ідеально підходить якщо ми будемо рухатися, що STRLEN межами стану, так як п додаватиме STRLEN з с кожного разу ми йдемо через петлю, і це не змінюватиметься. Так ми встановимо його рівним п над тут. ОК. Так що тепер, ми ітерації кожен індекс у масиві. Так от, якщо ми хочемо надрукувати кожен характер в цьому масиві, відсотків з є прапор ми хочемо використовувати для персонажів. А тепер планка я буде рядок, індекс символу я, так що, якщо Рядок були привіт. Тоді S 0 буде H, S кронштейн 1 буде е і так далі. Так що тепер ми хочемо об'єднати ці дві речі. Ми хочемо, щоб надрукувати кожен символ кожного аргументу командного рядка. Таким чином, ми будемо мати вкладеними циклу. І зазвичай, перший лічильник Я, на наступний буде J, п буде STRLEN з ARGV г, г менше п, я плюс плюс. І тепер замість печатки агду I, так агду кронштейн я збирається індексу - що буде г-я командного рядка Аргумент, агду I, J збирається бути JTH характер г-я аргумент. Я позбутися цього тут зараз так як ми покласти його в цьому циклі. Так еквівалентно рівних струни з агду я, а потім з кронштейн J. Ну, ми не повинні оголосити ця змінна с. Замість цього, ми просто поєднати ці два в те, що у нас було, агду I, J. Виступаючий 1: [нерозбірливо]. ROB BODEN: Гарне слово. Так що це не працює. Якщо я насправді запустив його, ми б це зрозуміли. Так лічильник мене хвилює У даному конкретному за цикл у, ітератор. Таким чином, ви б зіткнутися з проблемами, ймовірно, нескінченний цикл, якщо ми не зафіксовано, що. Ось чому ми також говоримо про налагодження сьогодні. ОК. Так що давайте запустити цю програму. І давайте насправді додати окремий Printf прямо тут, що буде просто роздрукувати інша лінія, так як це означає, коли ми запустити програму, там буде пусто лінія між кожним характером кожен рядок аргумент командного. Ну, ми побачимо, що це означає. ООП. Є деякі помилки. Помилка неявно оголосивши Бібліотечна функція STRLEN. Так повертаючись в нашу програму, я забув хеш включають string.h. Так string.h буде Файл заголовка, який оголошує функція STRLEN. Добре, він компілює. Тепер, давайте запустимо його. Так саме це. Це збирається роздрукувати наші Ім'я програми, привіт світ. Це збирається друкувати кожну річ, кожен характер, в окремому рядку. ОК. Так що давайте насправді прийняти це ще один крок вперед. І замість того щоб використовувати string.h, давайте думати про те, як ми б реалізувати наше власне STRLEN функція. Так що я буду негайно дати функція підпис. Так що давайте називати в my_strlen, і це збирається взяти рядок як аргумент, і ми очікуємо, щоб повернутися Довжина цього рядка. Так, де цей хлопець? Так. ОК. Так що пам'ятаєте з попереднього слайда, був також з минулого тижня, що масив символів, ну, це рядок, так скажемо це наша рядок с. Так що якщо з це рядок, привіт, а потім, Н-Е-Л-Л-О, в пам'яті, що відбувається, щоб бути, і то це зворотна коса риска 0 характер. Так як же нам отримати довжину з? Ну, трюк шукає цей люфту 0 характер, цей нуль термінатор. Таким чином, алгоритм Збирається має бути щось, як мало досить символів, які - давайте ця рука представляють деякі лічильник, давайте назвемо цю довжину Int. Так, починаючи з тут, ми збирається перебрати нашої рядка. Таким чином, перший символ, це H, і це не зворотний слеш 0, так що довжина дорівнює 1. Перебір до наступного символу, E, і це не зворотну косу риску 0. Довжина становить 2. L, 3. L, 4. O, 5. І, нарешті, ми досягаємо зворотну косу риску 0, і так, щоб кошти, ну, цей рядок закінчилася. Так давайте повернемося 5. Тому насправді реалізації, що, по-перше, моя довжина п дорівнює 0, моя права рука. І ми збираємося для ітерації - Виступаючий 1: [нерозбірливо] ROB BODEN: О, чорт. Гарне слово. Бум. Так довжина п дорівнює 0. Так що тепер, довжина в той час як з не рівні, а потім, зворотний слеш 0. Так що пам'ятайте, цей зворотний слеш 0, це Фактичний символ, і це означає, кінець рядка. Так само, як, також, коса риса н є актуальною характер. Зворотна коса риса 0 збирається вказують кінець нашої рядка. Я не хочу, щоб покласти, що там. І в той час з індексуються довжиною не дорівнює нульове закінчення, то ми тільки збираємося, щоб збільшити довжину. Отже, наприкінці нашої програми, довжина в кінцевому підсумку буде бути 5 в цьому випадку. І ми будемо просто повернути довжину. ОК. Так що тепер тут, я не зробити my_strlen. Давайте скомпілювати його, щоб переконатися, все проходить гладко. Чи був я роблю в 2? Чи в тому, що 1? Це має зробити. Добре. Так що це агду 2. Працює, як очікувалося, хоча було те, що один я зробив це в? Так. ОК. Ця версія речей не було Е нова лінія після, але це не має ніякого значення. ОК. Так працювало як очікувалося. Тепер ми можемо навіть поєднати це ще один крок далі, коли повідомлення тут, ну, по-перше, ми хапаючи StrLen з ARGV я, а потім ми ітерації кожен символ в цьому рядку. Таким чином, замість того, щоб робити, що, що, якщо ми просто об'єднати цю логіку очікування поки ми потрапили зворотну косу риску 0 право в цей цикл? Так ітерації в той час як агду I, J робить не рівні зворотний слеш 0. Так що давайте запустити його в першу чергу. Добре. Так от, це умова кажучи - давайте прояснимо, що. Так що тепер, нехай це буде наша агду. Тому, коли я просто побіг цю програму раніше, агду є масив рядків. Так от, якщо я запускаю його з точковою слеш ARGV 2, привіт світ, то агду саме по собі є довжина 3, для ARGV нулю, привіт, і світ. А всередині кожного з цих показників, Сам масив, де це буде точка, то це буде слеш, я не знаю, якби це було правильне напрям, я не думаю, що це було. -R-V тире, потрібно більше місця. Давайте нарізати цьому масиві. -R-V тире 0, а потім зворотний слеш 0. А потім безладно буде привіт. Скажімо, Н-Е зворотну косу риску 0. І, нарешті, W-O зворотний слеш 0. Таким чином, алгоритм, який ми тільки що написав, вкладених циклів, то, що вони робити є, ми спочатку повинні протистояти I, а потім J. Це було б простіше з кодом на екран, Давайте повернемося до цього. ОК. Так помітити, що я це ітератор це ітерації по кожної команди лінія аргумент. І J є ітератор ітерації протягом кожного символу в тому, що лінія аргумент командного. Так що ж це внутрішній Е робить Тобто, ми Printf агду 0 0, Е агду 0 1, Е агду 0 2 0 3, 0 4, 0 5, 0 6, але тепер, агду 0 7 збирається дорівнює зворотний слеш 0. Отже, ми вийти, що для циклу, і тепер я ітерація 1. І тепер ми збираємося друку агду 1 0, агду 1 січня - добре, тепер, так як я вирізав привіт Коротше кажучи, агду 2 січень знову буде зворотний слеш 0. І так, збільште I і продовжити, і так далі, поки ми не роздрукувати всі світ, і ті три командного рядка аргументи, і ми будемо виходити з зовнішній контур, і завершити нашу програму. ОК. Так що давайте повертатися сюди. Таким чином, ви отримаєте деяке знайомство з аргументи командного рядка на цьому Особлива проблема встановити. Тепер, налагодження. Таким чином, ви, напевно, вже мав зробити деякі налагодження з ваш попередній Проблема встановити. І один дуже простий спосіб налагодження, Спочатку давайте подивимося на програми баггі. Ну, прогулюючись по цій програмі, ми збираємося попросити у користувача ціле число, захопити, що ціле, а потім, довільно, у нас є якийсь час циклу, що тільки збирається зменшувати я поки це не дорівнює 10. Давайте просто припустимо, я введення цілим числом, більшим ніж 10. Так зменшення я поки це не дорівнює 10. А потім у нас є ще час циклу , Що, хоча я не дорівнює 0, ми збирається зменшувати I на 3. Так що якщо ви бачите намір помилка тут, це, що це буде зменшувати я в бути 10, а потім це поки петля воля декремент я з 10, до 7, до 4, до 1, до негативного 2, на негативний 5, і так далі, мінус нескінченності, так як я буду ніколи не рівні 0. А потім в кінці цієї програми, у нас є функція Foo, який відбувається друк, що я. Так що це короткі і тривіально програма, і помилка очевидна, особливо після того як я просто сказав, що помилка була. Але мета тут, ну, це може насправді виглядає деякі з ваших рішення від жодного від останнього Проблема встановити, і, можливо, у вас є деякі нескінченний цикл у вашій програмі, і ви не маєте жодного уявлення, чим це викликано. Так дуже корисним методом налагодження це просто додати printfs у всьому коді. Так от я хочу Printf межами першу чергу, а петля. І тут я хочу Printf, і я просто роздрукувати I. Я навіть зробити в першу чергу той час як цикл, я. Зовні, другий в той час як петля. Ще раз, роздрукувати всередині звідси, значення я. І давайте запустимо цей. Так точка слеш налагодження. Введіть ціле число. Давайте зробимо 13. І бум. Ми бачимо, що ми зациклення всередині другого час циклу. Так що тепер ми знаємо, що помилка є. Але Е налагодження абсолютно чудово, але як тільки ваші програми отримати більш і більш складними, існує більш складні рішення отримувати все запрацювало. Так що давайте видалити всі ці printfs. І давайте переконався, що я не зробив зламати що-небудь. ОК. Таким чином, програма, яку ми збираємося ввести називається GDB, для GNU Debugger. Ну, насправді, давайте приберемо налагодження для по-друге, і зробити налагодження знову. Ну, насправді перший, хороший урок в аргументи командного рядка. Зверніть увагу, що це Clang команда, яка є компіляції все передається в командному рядку, це аргументи командного рядка. Так як саме ви збираєтеся використовувати аргументи командного рядка, як ми раніше, і як ви будете в PSET 2, от як Clang використовує їх. Так зауважити, що це перший прапор, тире ggdb3, що це говорить є, Clang, ви повинні скомпілювати цей файл з Мета, що ми в кінцевому підсумку потрібно налагоджувати його. Так що, поки у вас є цей прапор, то ми можемо GDB налагоджувати. І це буде відкрити GNU відладчик. Таким чином, є багато команд що вам потрібно звикнути. Спочатку один, що ви, мабуть, відразу потрібно Run. Так що ж Запустіть збираєтеся робити? Це збирається почати нашу програму. Так біжіть, починаючи програму, програму просить нас для цілого числа, 13. А потім цей нескінченний зациклення як Очікується, крім я видалив printfs, тому ми навіть не бачимо, що. Вийшов нормально. О. Цілком можливо, що це загорнуті всі навпаки, до - ігноруючи це. Припустимо, це не вийти нормально. Там у складній відповідь на це питання. Так що тепер, це не дуже корисно. Так просто працює нашу програму всередині це відладчик не допомогти нам у будь-якому чином, так як ми могли тільки що зробили точка слеш налагодження ззовні GDB. Так команда одна, що ви, ймовірно, - і я кину це. Control-D або кинути курити, і роботу. Так давайте відкриємо його знову. Інша команда, що ви, мабуть, відразу хочу звикнути до того, Перерва. Таким чином, ми зламаю на головну на даний момент, а потім я поясню, що. Ну, ось ми бачимо, ми встановити точку зупину на цій лінії в debug.c. Так що перерва кошти є те, що, коли я введіть біг, програма буде НЕ продовжувати працювати доти, Я вдарив точку зупину. Тому, коли я вдарив біг, програма починає, а потім він розпадається, як тільки це входить в основну функцію. Перерва основний буде щось Ви досить часто робити. І тепер, щоб познайомити вас щоб ще кілька команд. Зауважте тут, то це говорить, що ми порушив на лінії 11, який Е, введіть ціле число. Так команда Наступна буде, як ми йдемо в наступному рядку коду. Це буде, щоб дозволити нам крок через нашу програму рядок за рядком. Так що наступного. Тепер лінія 12, ми збираємося щоб отримати ціле. Наступна. І якщо ви просто натисніть Enter знову, воно буде повторити останнє, що ви зробили. Так що я не потрібно вводити Наступний кожного разу. Так введіть ціле число, 13. Так що тепер, рядок 14, в той час як я більше ніж 10, і я буду робити далі. І ми бачимо, що ми збираємося зменшити I. Так що ми збираємося для зменшення я знову. Так що тепер, ще один корисний команда друку. Так Роздрукувати збирається роздрукувати Значення змінної. Давайте виявити значення змінної I. Давайте друкувати I. Це буде сказати, що я на 11. Тепер ми ще раз Далі, в той час як я більше 10. Так що я як і раніше більше, ніж 10, так як це 11. я мінус мінус. Давайте друкувати я знову. Як і очікувалося, це 10. Так що тепер, поруч. Це повертаючись до стану, я це більше 10, але я тепер 10, так що це не більше 10, тому ми очікуємо, це випасти з той час циклу. І тепер ми нижче цього рядка коду. І інша команда, Список, просто буде для відображення попереднього і наступного пару рядків коду, в випадку, якщо ви втратили себе. Так що ми просто вийшли цю той час як цикл, і тепер ми вступили в цьому в той час як цикл, лінія 18. Таким чином, хоча я не дорівнює 0. І, далі, я дорівнює I мінус 3, і ми будемо Відзначимо, це буде просто продовжувати йти. І ми можемо надрукувати I. Кожна команда роду має ярлики. Так р короткий для друку. Таким чином, ми можемо P I. Просто утримуйте п, або продовжувати робити Далі. Роздрукувати я знову. Ви бачите зараз він негативний 167. Так що це буде тривати вічно, але не дійсно назавжди, так як ви тільки що бачили, це насправді кінець в деякій точці. Так що, починаючи GDB. Але давайте зробимо ще одну річ в GDB. Е-е, налагодження. Таким чином, в даному конкретному випадку нескінченний цикл, виявилося, всередині основна функція. І на даний момент, просто визнати, що, що я рухатиметься нескінченний цикл в функція Foo. Тільки пам'ятайте, що, в кінці цього Програма, також, це було спочатку виклику Foo, який був просто в друк I. Але тепер ми називаємо Фу, який є збирається зменшувати I, поки це не 0, а потім роздрукувати цю змінну. ОК. Зберегти це. Зробити налагодження. А тепер, GDB налагодження. ОК. Так що, якщо я просто запустити то я не збираюся бути в змозі фактично покроково мій Програма лінія за лінією. Так давайте розберемо на основний, а потім введіть перспективі. Так пройти через це, Е, введіть ціле число, отримати ціле, 13. Таким чином, ми збираємося продовжувати зменшуючи поки я не більше 10. Тоді ми йдемо, щоб провалитися в той час як цикл, і дістатися до лінії - давайте відкриємо його в окремому вікні. Таким чином, ми не зменшується, поки я вже не більше 10, і тоді ми називається функцією, Foo. Так що ж відбулося, як тільки я потрапив Функція Foo, ну, я подзвонив Фу, і не те я вже не мав контролю над GDB. Тому, як тільки я вдарив Далі в цій лінії, речі продовжували, поки це не сталося, де вийшла програма, коли - припустити, що це не було зрештою. Ви бачили це призупинити на деякий час все ж. Так чому ж я втрачаю контроль над програма в цей момент? Ну, коли я друкую наступний, який йде в буквальний Наступний рядок коду, що буде виконувати. Таким чином, після лінії 21, в наступному рядку коду , Який буде виконувати це лінія 22, який, виходячи з основної. Так що я не хочу, щоб просто піти у наступному рядку коду. Я хочу піти в функцію, Фу, а потім ще й покроково ці рядки коду. Таким чином, для цього у нас є альтернатива. Давайте кинути це знову. Перерва основною. Е-е, 1, поруч, поруч, 13, поруч, Далі, наступний, обережно, перш ніж ми потрапили рядки Foo. ОК. Так що тепер, ми в рядку 21, де ми називаємо Foo. Ми не хочемо, щоб ввести наступний, так що просто викликати функцію Фу, і перейти до наступного рядка коду. Що ми хочемо використовувати це Крок. Так що є різниця між кроці А поруч, де Крок кроки в функціонувати, і Наступна йде на себе функцію. Це просто виконує повноту функція, і продовжує йти. Так Крок збирається привести нас у функцію, Foo. І ми бачимо тут, зараз, коли ми повернулися в це в той час як цикл, який це, по ідеї, збирається тривати вічно. І якщо ви потрапили Крок, коли це навіть не функція викликається, то це ідентичний Далі. Так що це тільки тоді, коли ви знаходитесь на лінії, яка викликає функцію на цей крок збирається відрізнятися від Next. Так Крок принесе нам тут. Крок, крок, крок, крок, крок, крок, і ми просто нескінченний цикл назавжди. Так що ви можете звикнути до того, як ваш спосіб ідентифікації нескінченні цикли, є просто тримаючи цю клавішу введення, щоб побачити, де ви застрягли. Є ефективніші способи зробити це, але на даний момент, тобто цілком достатньо. І стилістично, щоб відповідати стилю 50, я повинен був зробити це. ОК. Так що остання команда ввести. Ну, давайте GDB налагоджувати дюйма Тому замість того, ламаючи при основній, якщо я знати функцію Foo також Проблема, то я, можливо, просто сказав, перерва на Foo, замість цього. Скажімо, я розірвати на як основний і Foo. Таким чином, ви можете встановити стільки точок зупину як ви хочете. Коли я друкую працювати, це буде зупинятися на - ох, давайте перекомпілювати, так як Я змінив речі. Ви побачите цей рядок, попередження, джерело файл більш нове, ніж виконуваний файл. Так це значить, що я просто пішов сюди і змінив їх у відповідність із стилі 50, але я не перекомпілювати програма. Так GDB робить мене в курсі. Я кину, зробити налагодження знову, вдарив GDB налагоджувати. ОК. Так що тепер, до того, що я робив. Перерва основний, перерва Foo. Тепер, якщо я запускаю програму, так що це збирається продовжити, поки не потрапляє зупину. Це зупину відбувається з бути першим в основний. Тепер, замість того, щоб робити наступний, наступний, наступний, наступний, наступний, поки я не потрапив Фу, я можна ввести продовжувати, яка триватиме поки ви не потрапили наступної точки зупину. Я повинен ввести ціле першим. Продовжити буде продовжуватися, поки я не потрапив наступної точки, яка є те, що функція харчової. Так Run працюватиме, поки ви натиснете зупину, але ви тільки тип запуску, коли ви починаєте програму, а потім, з тих пір, це продовжувати. Якби я просто зробив брейк основний і потім побіг, він буде перерва в Основний, а потім продовжити. Оскільки у мене немає точки зупину на Foo, введіть ціле, то тепер я не збирається зламати в харчовій. Це просто буде до нескінченності цикл, поки що. ОК. Так от Введення в GDB. Ви повинні почати використовувати його в ваших проблемних множин. Це може бути дуже корисно визначити помилки. Якщо ви насправді просто, лінія за лінією, перейдіть за кодом, і порівняти те, що є насправді відбувається з тим, що ви очікуєте відбудеться, то це досить важко не помітити ваші помилки. ОК. Так минулого тижня Девід виховувався цей секретним ключем речі для перший раз, коли ми не хочемо паролі просто зберігатися на нашому комп'ютер в деякому простому текстовому файлі, де хтось може приїхати і просто відкрити його і прочитати їх. В ідеалі, вони будуть зашифровані в деякому роді. І в задачі встановити 2, ви будете мати справу з одного способу шифрування, або, ну, два методи, але вони не настільки великі. Якщо ви робите хакер видання, ви також збирається мати справу з розшифровки деякі речі. Тож питання тепер у тому, добре, навіть якщо у нас є стійке шифрування Алгоритм у світі, якщо ви обираєте особливо бідних пароль, то вона не допоможе вам дуже багато, так як люди ще зможуть зрозуміти це. Навіть якщо подивитися зашифровану рядок і це виглядає як безлад сміття що нічого не означає для них, якщо вони ще просто потрібно спробувати кілька паролів щоб зрозуміти це, то ви не надто безпечно. Так перегляді відео, робить цю точку. [Відеовідтворення] -Шолом, ви злодій. Що відбувається? Що ти робиш з моєю дочкою? -Дозвольте мені представити блискучий молодий пластичний хірург, доктор Філіп Schlotkin, найбільшу ніс робота чоловік в усій Всесвіту, і Беверлі-Хіллз. -Ваше Високість. -Ніс робота? Не розумію. Вона вже була робота носа. Це був солодкий шістнадцять присутня. -Ні. Це не те, що ви думаєте. Це набагато, набагато гірше. Якщо ви не даєте мені комбінацію, щоб повітря щит, доктор Schlotkin буде дати свою дочку назад свій старий ніс. -Ні. Де ти це взяв? -Все в порядку. Я скажу. Я скажу. Ні, тато. Ні, ви не повинні. -Ви маєте рацію, моя дорога. Я буду сумувати за вашої нової ніс. Але я не скажу йому комбінацію, незважаючи ні на що. -Дуже добре. Доктор Schlotkin, справа ваша. -Із задоволенням. [ІНСТРУМЕНТИ точать] -Ні. Зачекайте. Зачекайте. Я скажу. Я скажу. -Я знав, що це буде працювати. Добре. Віддай його мені. Поєднання-один. -Один. -Один. -Два. -Два. -Два. -Три. -Три. -Три. -Чотири. -Чотири. -Чотири. -П'ять. -П'ять. -П'ять. -Так поєднання є одним, два, три, чотири, п'ять. Це сама дурна комбінація Я коли-небудь чув у своєму житті. Це та річ, ідіот буде мати на своєму багажі. -Спасибі, ваша високість. -Що ти зробив? -Я вимкнув стіну. -Ні, ти не зробив. Ви вимкнули весь фільм. -Мабуть, я натиснув не ту кнопку. -Ну, поклав його назад на. Покладіть відеофільм на. -Так, сер. Так, сер. -Ходімо, Арнольд. Приходьте, Гретхен. Звичайно, ви знаєте, я буду як і раніше повинні виставити рахунок за це. [КІНЕЦЬ відеовідтворення] ROB BODEN: Добре. Так що тепер ми вже говоримо про безпеки в деяких відносинах, хороший трохи постер фільму, тому останнім часом днів, ці питання з АНБ моніторингу все. Це може бути важко, щоб відчувати, що ви є свого роду приватного життя в Онлайновий світ, хоча я не міг сказати Вас більше деталей PRISM. Так виходить за рамки PRISM, ми не збираємося щоб говорити про те, що, в даний час думаю про своєму ноутбуці. Так тут, я хочу, щоб перейти до моєї реальної увагу, з моєю маленькою пінгвіна. Так у мене є набір паролів, і що пароль, що я хочу, щоб це було. Але пам'ятайте, що те, що я входу в с, так що це Ввійти підкажіть, є якась програма. Це якась програма, яка була написано кілька людей. І так, що людина, якщо вони особливо шкідливим, вони могли вже говорили, все в порядку, так що, якщо пароль що я входжу дорівнює мій реальний пароль, або він дорівнює в деякій спеціального пароля - Девід є дивним або щось - то нехай їх сюди Так шкідливий програміст може мати доступ до всіх ваших Mac, або Вікна, або що-небудь. Так що це не велика проблема, так як, Я маю на увазі, це Ввійти програма який поставляється з OS X, сотні або тисячі людей мають відгуки цей код. Так от, якщо, в коді десь, ви кажуть, що якщо цей рядок дорівнює рівних Девід є дивним, Логін, то хтось буде, як, почекайте. Це не правильно. Це не повинно бути тут. Так ось один із способів отримати речі бути свого роду безпечним. Але думати про навіть програм що ви пишете. Припустимо, ви написали програму входу в систему. Так що це Ввійти програма, що ви написали, так що, очевидно, ви хороший програміст. Ви не збираєтеся поставити будь шкідливий якщо х = дорівнює Девід є дивним в код. Але ця програма, то, що ви використовувати для компіляції цієї програми? Щось на зразок Clang. Так що якщо людина, яка, виявилося, написати Clang спеціальне упакованим в Clang щось на зразок, якщо я компіляції увійдіть програму, а потім введіть цей код в програму авторизації, яка каже, якщо х дорівнює дорівнює Девід є дивним? Так що не зовсім ще, але у нас є те ж саме видавати тут, де Clang, ну, тисячі, якщо не десятки тисяч люди, дивилися на Clang, є подивився на її рядків коду і сказав: Все в порядку, немає нічого погано тут. Очевидно, що ніхто не робить нічого цей шкідливий. Але те, що брязкотом себе, начебто, що, якщо я компіляції Clang? Що робити, якщо у мене є компілятор, який компілює Clang, який вставляє в Clang цей спеціальний хак, який говорить, все гаразд, коли я компіляції Clang, то виконуваний я отримую повинні спеціально шукати всередині програми входу в систему і вставки цей пароль, дорівнює рівних Дейв є дивним? Тому пам'ятайте, що ваш компілятор сам повинен бути скомпільований в якийсь момент. Так що, якщо те, що ви обираєте для компіляції Clang с, саме по собі є шкідливим, то ви може бути п'яним всю шлях вниз лінії. Так от, у нас є Кен Томпсон і Денніс Рітчі. Так що це є знаковим фото. Денніс Рітчі знаходиться справа. Він є одним з основних - в значній мірі писав С. Таким чином, ви можете подякувати йому за цього класу. Кен Томсон знаходиться на лівій стороні. Два з них в основному писав UNIX. Ну, вони були основними причинами в UNIX. Були деякі інші. Так Кен Томпсон, в якийсь момент, він виграє премію Тьюринга. І премію Тьюринга, я завжди чув це посилання таким чином, що це Нобелівська премія інформатики. Так на премію Тьюринга, він повинен дати своїй промові. І він дає цьому дуже знаменитої промови зараз, називається Роздуми на довірі Довіра, яку ми пов'язані Щоб на сайті курсу. І в цій промові, за його словами, все в порядку, тому я написав UNIX, і тепер все Ви люди використовують UNIX. Тепер, пам'ятайте, що сьогодні Linux є прямий нащадок UNIX. OS X безпосередньо використовує UNIX. Вікна не так багато, але багато ідей були взяті з UNIX. Тому він йде на сцену і каже: Все в порядку, я написав UNIX. І тільки так ви, хлопці, знаєте, я можливість увійти в кожен жодного з ваших комп'ютерів. Так як я поклав один з них спеціальним, якщо х дорівнює дорівнює Кен Томсон є дивним, Потім я дозволив для входу. Таким чином, люди, як, ну, Як ти це зробив? Ми дивилися на програми входу і нічого не їсти. Він, як, ну, я змінив компілятору , Щоб увійти в програму авторизації так що програма Ввійти тепер доведеться що х одно одно Кен Томпсон є дивним. І вони говорять, добре, що це не так. Ми дивимося на компілятором, а компілятор не має лінії Код в цьому роді. Він як, в порядку, але те, що ви компіляції компілятор з? І вони думають, і він, як, ну, Я той, хто дав тобі компілятор ви використовуєте для компіляції компілятор, тому ви компілюєте компілятор, що Сам шкідливим і буде ламати програми входу в систему. Так в основному, в цій точці, є немає, як ви могли подивитися на джерело Код програми входу в систему щоб побачити, що це неправильно. Ви не могли навіть дивитися в вихідний код компілятора щоб побачити, що це неправильно. Ви повинні були б дивитися на машини Код, в двійковому форматі з складений компілятор, щоб побачити, почекайте, це рядків коду не повинно бути тут. Але Кен Томпсон взяв ще один крок далі і сказав, ну, є ці спеціальні програми, які насправді допомогти вам читати двійковий програм, і тому, якщо хтось використовував цю програму, щоб читати двійковий, вони побачили б ці рядків коду. Він змінив ці програми, щоб сказати, все Добре, якщо ви дивитеся на компілятор, не показують саме цей набір бінарних. Тоді ви повинні прийняти це крок далі і в принципі, що може мати прийняті кілька рівнів абстракції, і в якийсь момент, ніхто не насправді буде перевіряти. Таким чином, мораль цієї байки така, що ти не збираюся писати Брязкотом в цьому класі. Ви збираєтеся використовувати сходження Брязкотом багато в цьому класі. Для всіх ви знаєте, Clang є шкідливою програма, яка саботує кожен одна програма ви коли-небудь компіляції. І, щоб залишити вас на що дуже зловісним Відзначимо, побачимося в середу. [Оплески] СПІКЕР 2: На наступному CS50. СПІКЕР 3: Не смій говорити, що. Ви можете зробити це. Ви зробили це раніше, ви можете зробити це сьогодні, ви можете зробити це завтра. Ви робили це протягом багатьох років. Просто піти туди і зробити це. Ви можете зробити це. [Музика грає]