[Музыка играет] 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 1 - хорошо, теперь, так как я вырезал привет Короче говоря, агду 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: Не смей говорить, что. Вы можете сделать это. Вы сделали это раньше, вы можете сделать это сегодня, вы можете сделать это завтра. Вы делали это в течение многих лет. Просто пойти туда и сделать это. Вы можете сделать это. [Музыка играет]