[За възпроизвеждане на музика] ROB BODEN: Добре. И така, първото нещо, което на първо място, на видео от познато лице. [VIDEO PLAYBACK] -Добре. Това е CS50, и това е началото на три седмици. Съжалявам, че не би могъл да бъде там с теб днес, но ми позволи да се въведе Собствена Rob Boden CS50 е. [END възпроизвеждане на видео] [Аплодисменти и CHEERS] ROB BODEN: The филмография в че видеото е фантастично. Добре. Така че, на първо място, има и друг обяд. Това е утре в 01:15 часа. Няма по обяд в петък. Той е с Quora. И Томи все още не е тук, но един от хората там е бивш ръководител CF, Tommy McWilliam. Така че той е забавен човек. Трябва да дойдеш. Добре. Така миналата седмица, ние започнахме да се разпадне за това, което наистина е низ. Познаваме се още от началото, че това е една поредица от знаци. Но миналата седмица, ние се ровят в факта, че това, което е наистина поредица от знаци, добре, сега ние имаме масиви от символи. И ние знаем, че низ, това е масив на героите, в самия край, имаме този специален нищожна байт, това 0 наклонена черта, която показва края на низа. И така низ е масив от герои, но ние можем да имаме повече от само един набор от знаци, ние може да има набор от всеки вид на нещо, което искаме. Така че, ако си спомняте от миналата седмица, Ages програма, която David въведени наистина бързо. Така че първото нещо, което ще направите, е да поиска от потребителя за число, на брой хора в помещението. След като имаме това число, ние сме обявяване масив. Забележете тази скоба синтаксис. Ще свикнете с това. Така че ние сме за обявяване на масив от цели числа наречен възрасти, и там са п числа в този масив. Така че този модел точно тук, този 4 Int I е равна на 0, аз е по-малко от N, аз плюс плюс, че също ще бъде модел че ще ви бъде много свикнали. Защото това е доста много как сте винаги ще обхождане на масиви. Така че не забравяйте, че н е дължина на нашия масив. И така, тук, ние многократно пита за възрастта на човек, с когото в стаята. След това, ние слезем, и за каквото и произволна причина, ние след това разпечатате на колко години те ще да бъде година от сега. И работи тази програма, да направи възрасти, точкова черта възрасти. Така броят на хората в помещението, нека да кажем, че има три. И казват, първият човек, е 13, Следващата е на 26 г., а последната е 30. Така че след това тя ще обхождане на тези три хора, принтират 14, 27, и 31. Така че не забравяйте, че когато ние декларираме масив с размер N, индексите в тази масив, масив има ценности и индекси 0, 1, 2, чак до п минус 1. Така че, когато каза, че има трима души в помещението, и ние поставяме тук първата итерация чрез този контур, аз ще бъде 0. Така че в индекс 0. Ние сме присвояване на първо възрастта потребителят въведе. След това в следващия един, ние навлизаме в второ н потребителят въведе и в до две, последната п. Така че забележите, че масив на площ три няма нищо в индекса три. Това не е валиден. Добре. Така че, да се върна тук. Така че сега, че сме се справиха с масиви, имаме някаква интимност. Сега отиваме да се премине към командния линия аргументи, които ще бъдат доста от значение за този проблем набор. Така че до сега, когато съм обявена вашата основна функция, ние сме каза вътр основната невалидна. Така нищожен просто означава, че ние не се подминават всякакъв аргументи за тази функция. Сега отиваме да се види, че основният могат да се вземат някои аргументи. Тук ние ги наричаме вътр argc и струнни ARGV скоби. Скобите, за пореден път, което показва, че си имаме работа с масиви. Така че тук, низ ARGV скоби, ние сме занимаваща се с масив от низове. Така argc, че това ще се посочва колко аргументи ние имаме премина към тази програма. И да видим какво означава това, нека да затворите този. OK. Така че до този момент, ние сме се правят всеки програма като дот черта възрасти. Ние може също така, в командния ред, минало премине аргументи, като по този начин на термина, команда линия аргументи. Така че първият аргумент, здравей свят. Така че тук, argc ще бъде три. Това е броят на аргументите в командния ред. Argc е винаги най-малко една, от точка наклонена черта възрасти, себе си, се смята за един от Аргументите на командния ред. Тогава здравей е първият. Ако дот черта възрасти е нулев, а след това здравей е първото, и свят е вторият аргумент командния ред. Така че низ ARGV, ние ще видим, съдържа низове, точкова черта възрасти, здравей, и свят. И, по искане на Давид, отиваме да играе видео въвеждането че. [VIDEO PLAYBACK] -До сега в програмите с които сме се писмено, ние декларираме Основният като Int основната невалидна. И през цялото това време, че има нищожен просто са били уточнява, че програма не поема никаква аргументи командния ред. С други думи, когато един потребител изпълнява програма, той или тя може да даде команда аргументи, с написването допълнително думи или фрази, след като програмата е име на подканата. Е, ако искате вашата програма да вземат аргументи от командния ред, един или повече такива думи, ние трябва да се замени анулира с няколко аргумента. Така че нека да направим това. Включи CS50.h. Включи стандарт io.h. Int главната. И сега, вместо празнота, аз отивам да укажете вътр нарича argc, и масив от низове, наречени ARGV. Сега, argc и ARGV са просто конвенции. Можехме да нарича тези аргументи почти всичко, което искаме. Но това, което е важно, е, че е argc едно цяло число, защото по дефиниция, е ще съдържа броя на аргументите, на брой думи в общия че потребителят е въвел в своя ред. ARGV Междувременно аргумент вектор, е Ще действително да бъде масив съхраняване всички думи, които потребителят е написа на негово или нейно ред. Да пристъпя да направя нещо сега с един или повече от тези аргументи командния ред. По-специално, да вървим напред и печат каквито дума видовете потребителски след името на програмата в командния ред. Open скоба. Close скоба. ФОРМАТ процента и наклонена черта и запетая. И сега аз трябва да кажа ФОРМАТ каква стойност да се включите в този контейнер. Искам първо думата, която потребителят има въвели след името на програмата, и така аз отивам да се уточни ARGV скоба 1, в близост скоби, точка и запетая. Сега, защо скоба 1, а не скоба 0? Е, оказва се, автоматично се съхраняват в ARGV 0 ще бъде действителното име на програмата. Така че първата дума, че потребителят след името на програмата е, чрез конвенция, ще бъде съхранява в ARGV 1. Нека сега да състави и стартирате тази програма. Направете ARGV 0, точка наклонена черта ARGV 0. И сега една дума като здрасти. Enter. И ние я имаме, здравей. [END възпроизвеждане на видео] ROB BODEN: Добре. Затворете това. Така че, като се погледнете в тази програма, че ние просто се запозна с нас, добре, просто да се покаже, ако ние отпечатате ARGV 0, марка, сега какво е, ARGV 0, точка наклонена черта ARGV 0. Така че, както се очаква, това е отпечатване на името на програмата, тъй като ARGV 0 е винаги ще бъде най- името на програмата. Но нека да направим нещо малко по-интересно. Така че в комплекта проблем, ще бъде запознават с тази функция, atoi. Така че това, което ние използваме atoi за? Това ще да конвертирате низ в цяло число. Така че, ако премине на низа, едно, две, три, да atoi, че ще конвертирате, че до цяло число, едно, две, три. Така че ние ще конвертирате първата аргумент командния ред до цяло число, и след това просто да отпечатате това число. Така че, общо взето, ние сме вид reimplementing getint, само число се вписват в командата Онлайн вместо в програмата интерактивно. Така че след това, което прави ARGV 0, нека да направим това тук, и затворете това. Така работи ARGV 0, и нека да въведете число, едно две три четири едно две. Така че това ще отпечата число, един две три четири едно две. Има някои тънкости да atoi, че ще престанат да се грижат за нищо отвъд валиден цифров знак, но това няма значение. И така, какво мислите се случва ако направя това? Сегментация вина. Така че, защо е това? Ако погледнем назад в нашата програма, ние сме конвертиране ARGV 1, първият аргумент след името на програмата, с число. Но няма аргумент след името на програмата. Така че тук, ние виждаме, че това е бъги програма, тъй като, ако се опитаме да го изпълним без никакви аргументи, тя просто ще се срине. Така че друг общ модел, който ще видим е нещо подобно, ако argc е по-малко от две, което показва, че не е имало най-малко име и програмата първият аргумент, а след това ние ще направим нещо като ФОРМАТ, не е достатъчно аргументи командния ред. Това вероятно не е добра, за да отпечатате, това е може би нещо, като трябва да въведете цяло число в командния ред. Аз просто ще го свършва дотук. И след това се върнете една. Така че не забравяйте, че в края на нашия програма, ако се върнем 0, че нещо показва успех. И главната също автоматично връща 0, ако не го направиш. Така че тук, ние сме едно пренастройване да се посочи че това не е успех. И вие можете да се върнете каквото искате, просто, 0 означава успех, а нещо друго показва недостатъчност. Така че нека да стартирате тази версия на нещата. Така че сега, ако не въведете командния ред аргумент, че ще каже правилно нас, не е достатъчно, на командния ред. Още не довърши изречението. Иначе, ако ние всъщност го давате един, тя може да приключи програмата. Така че това е начина, по който ще използва argc в За да се потвърди броя на аргументи от командния ред, които реално са прехвърлени. Така че нека да направим тази програма е малко по- сложно, и погледнете в секунда повторение на нещата. Така че сега, ние сме не само отпечатването на първият аргумент командния ред. Ето, ние сме итерации от вътр I равни 0, аз е по-малко от argc, аз плюс плюс, и печат ARGV, индекс аз. Така този модел, отново, това е същото модел, както преди, освен вместо на свикване на променливата н, ние използваме argc. Така че това е итерации над всеки индекс в масива, и отпечатване на всяка елемент в този масив. И така, когато стартирате тази програма, добре, Не въвеждайте никаква команда линия аргументи, така че само разпечатки името на програмата. Ако въведете един куп неща, тя ще отпечатате един, всеки по своя собствена линия. OK. Така че нека да вземе това една стъпка по-нататък. И вместо да отпечатвате всеки аргумент по своя собствена линия, нека да отпечатате всяко характер на всеки аргумент по своя собствена линия. Така че не забравяйте, че е ARGV масив от низове. Така че това, което е низ, но набор от символи? Така че това означава, че ARGV е наистина масив от набор от символи. Така че, като се възползва от това, нека да пренебрегнем този за сега. Нека просто да разгледа низ ARGV 0. Така че, ако искаме да донесе на всеки знак на ARGV 0 на отделен ред, а след това аз искам да направи модела сме свикнали, аз е по-малко от дължината на масива, които тук се strlen на, това е не това, което искам да направя, низ S е равна ARGV 0. Така че е по-малко от дължината на нашия масив, който в този случай е масив на героите, аз плюс плюс. И така, както видяхме миналата седмица, той е идеален ако се движим, че strlen извън на състоянието, тъй като п ще се добавят на strlen на S всеки път, когато отидете през примката, и това е Няма да се променя. Така че ние ще го равно на п тук настроен. OK. Така че сега, ние сме итерации над всеки индекс в масива. И така, ако искаме да отпечатате всяко характер в този масив, сто в е флага искаме да използваме за знаците. И сега скоба аз ще бъде на низ, индекс характер аз, така че ако низ бяха здравей. тогава е 0 ще бъде ч, S скоба 1 ще бъде д, и така нататък. Така че сега ние искаме да се съчетаят тези две неща. Искаме да отпечатате всяко характер на всеки аргумент на командния ред. Така че ние ще трябва вложени за цикъл. И обикновено, първият брояч Аз съм, следващата ще бъде к, п ще бъде strlen на ARGV Аз, Аз е по-малко от N, аз плюс плюс. И сега вместо печат ARGV аз, така ARGV скоба аз ще индекс - че ще бъде на I-ия командния ред аргумент, ARGV I, J ще бъде jth характер на аргумента, I-та. Ще се отърва от този тук сега тъй като ние го сложи в тази примка. Така че е еквивалентна на струнни и равни ARGV аз, а след това и скоба к. Е, ние не трябва да се декларира тази променлива и. Вместо това, ние просто ще се съчетаят тези две в това, което сме имали, ARGV I, J. SPEAKER 1: [недоловим]. ROB BODEN: Добър разговор. Така че това е счупен. Ако аз всъщност го прокара, Бихме са осъзнали това. Така че на гишето ме интересува в този конкретен за контур е J, итератора. Така щеше да се сблъскате с проблеми, Вероятно един безкраен цикъл, ако ние не е определил това. Ето защо ние сме също така говори за отстраняване на грешки и днес. OK. Така че нека да стартирате тази програма. И нека действително добавите отделен ФОРМАТ точно тук, че просто ще се отпечата друга линия, тъй като това означава, че когато ние стартирате програмата, ще има празно линия между всеки един от героите на всеки аргумент командния ред. Е, ще видим какво означава това. Oop. Имаш някакъв бъг. Грешка неявно деклариране библиотека функция strlen. Така че се връщам в нашата програма, I Забравих да хеш включва string.h. Така string.h ще бъде заглавния файл, който обявява функцията strlen. OK, той съставя. Сега, нека да го стартирате. Така че точно това. Това ще отпечата ни име на програма, здравей свят. Това ще да отпечатате всяко нещо, всеки характер, по своя собствена линия. OK. Така че нека действително се възползвам от тази една стъпка по-нататък. И вместо да се използва string.h, нека мисля за това как бихме приложат собствената ни strlen функция. Така че аз веднага ще дам функция подпис. Така че нека да се обади в my_strlen, и това е Ще отнеме низ като аргумент, и ние очакваме да се върне на Продължителността на този низ. Е, къде е този човек? Да. OK. Така че не забравяйте, от по-рано, че слайда беше също от миналата седмица, че масив от знаци, добре, низ, така че нека да кажем, че това е нашата низ ите. Така че, ако S е низ, здравей, след това, H-E-L-L-O, в паметта, че ще да, и след това обратно наклонена черта 0 характер. Е, как да стигнем до дължината на S? Е, този трик се търсят за тази хлабина 0 характер, тази нищожна терминатор. Така че алгоритъма се случва да бъде нещо като няколко достатъчно знаци, които - нека да има тази ръка представляват някои брояч, нека наречем това Int дължина. Така че, като се започне от тук, ние сме ще обхождане на нашия низ. Така че първият знак, че е H, и това не е обратно наклонена черта 0, така че Дължината е 1. ITERATE към следващия знак, E, и това не е обратно наклонена черта 0. Дължина е 2. L, 3. L, 4. О, 5. И най-накрая, стигаме обратно наклонена черта 0, и така че това означава, добре, този низ е приключила. Така че нека да се върнем 5. Така че действително прилагане на това, на първо място, ми н дължина е равна на 0, дясната ми ръка. И ние отиваме, за да превъртате - SPEAKER 1: [недоловим] ROB BODEN: О, да стрелят. Добър избор. Boom. Така н дължина е равна на 0. Така че сега, докато е с дължина не равен и след това, наклонена черта 0. Така че не забравяйте, тази наклонена черта 0, това е действителния характер, и това показва, края на низа. Точно както, също така, наклонена черта п е действително характер. Обратно наклонена черта 0 ще посочи на края на нашия низ. Аз не искам да слагам, че там. И макар и индексирани с дължина, не е равна на нула терминатор, тогава ние просто ще увеличите дължина. Така че след това, в края на нашата програма, дължина е в крайна сметка ще да бъде 5 в този случай. И ние просто ще се върне дължина. OK. Така че сега тук, аз не правя направи my_strlen. Нека да го компилирате да се уверите, всичко върви гладко. Правех в 2? Или е, че един? Това трябва да направим. Добре. Така че това е ARGV 2. Работи като очакваното, въпреки че беше, че едно аз съм го направил в? Да. OK. Тази версия на неща, които не са имали ФОРМАТ на новата линия след това, но тя не прави никаква разлика. OK. Така че работи както се очаква. Сега ние дори да комбинирате една стъпка по-нататък, където известие тук, добре, на първо място, ние сме измъкна strlen на ARGV аз, и тогава ние сме итерации над всеки герой в тази поредица. Така че вместо да правиш това, какво ще стане ако ние просто комбинирате тази логика на изчакване докато не удари наклонена черта 0 полето в това за цикъл? Така обхождане докато ARGV I, J прави не е равно наклонена черта 0. Така че нека да го стартирате първия. Добре. Така че тук, на това условие се казва - нека да изчистите това. Така че сега, нека това бъде нашата ARGV. Така че, когато аз просто избяга тази програма преди, ARGV е масив от низове. И така, ако аз го изпълним с точка наклонена черта ARGV 2, здравей свят, тогава ARGV се е дължина 3, за ARGV нула, здравей, и свят. И вътре на всеки от тези показатели е самия масив, където това ще бъде точка, това ще бъде наклонена черта, аз не знам ако това е правилната посока, аз Не мисля, че беше. A-R-V тире, се нуждаят от повече пространство. Да се ​​нарязва на този масив. A-R-V тире 0, и след това обратно наклонена черта 0. И тогава в безпорядък ще бъде здравей. Да речем, H-E наклонена черта 0. И най-накрая, W-O наклонена черта 0. Така че алгоритъмът, че ние просто пише, Вложеният за линии, това, което те са правите, е, ние първо трябва на противодействие аз и тогава J. Това би било по-лесно с кода в екран: Нека да се върнем към това. OK. Така че забележите, че аз е итератор, че е итерации над всяка команда аргумент линия. И J е итератор итерации над всеки един от героите в тази аргумент командния ред. Така че това, което този съкровената ФОРМАТ прави е, ние сме ФОРМАТ ARGV 0 0, ФОРМАТ ARGV 0 1, ФОРМАТ ARGV 0 2 0 3 0 4 0 5, 6 0, но сега, ARGV 0 7 ще равен наклонена черта 0. Така че след това ние се оттегляме, че за линия, и сега аз да повтаря едно. И сега ние ще печат ARGV 1 0, 1 1 ARGV - Е, сега, тъй като аз нарязани здравей кратко, ARGV 1 2 отново ще бъде наклонена черта 0. И така, аз и нарастване продължи, и така нататък, докато не отпечатате всички свят, и тези, които са три на командния ред аргументи, а ние ще излезете от най-външния контур, и завърши нашата програма. OK. Така че нека да се върна тук. Така че ще спечелят някои познаване командния ред аргументи за това Особен проблем настроен. Сега, отстраняване на грешки. Така че, най-вероятно вече трябваше да направя някои грешки с предишния проблем настроен. И един много лесен начин за отстраняване на грешки, на първо място, нека да разгледаме програма, бъги. Е, ходене чрез тази програма, ние ще поиска от потребителя за число, вземете че число, и след това, произволно, ние имаме една линия, докато, че е просто ще декрементира аз, докато тя е равна на 10. Нека просто да приемем, аз съм въвеждане цяло число по-голямо от 10. Така декрементира аз, докато тя е равна на 10. И след това имаме още един, докато контур че, докато аз не е равно на 0, ние сме ще декрементира аз от 3. Така че, ако ви видя на намерението на бъг тук, е, че това ще декрементира аз да да бъде 10, а след това тази линия, докато воля намаляване и от 10, 7, 4, 1, отрицателна 2, отрицателна 5, и така нататък, на отрицателна безкрайност, тъй като аз ще всъщност никога не се равнява на 0. И след това в края на тази програма, имаме функцията Foo което е става за печат, че аз. Така че това е кратък и тривиален програма, и грешката е очевидна, особено след като току-що каза каква е била грешката. Но целта тук е, добре, това може да всъщност изглежда като някои от вашите решения от алчни от последните проблем настроен, и може би ви е нужно някои безкраен цикъл във вашата програма, и вие нямате представа какво го причинява. Така че е много полезна техника за отстраняване на грешки е просто да добавите printfs целия си код. Така че тук аз искам ФОРМАТ извън първа линия, докато. И тук искам ФОРМАТ, и аз просто ще отпечатате аз. Аз дори ще направя първата линия, докато, аз. Отвън, докато вторият цикъл. За пореден път, отпечатайте вътре от тук, стойността аз. И нека да стартирате тази. Така точка наклонена черта отстраняване на грешки. Въведете цяло число. Нека да направим 13. И бум. Ние виждаме, че ние сме безкрайно обикаляне вътре в секунда, докато примката. Така че сега ние знаем какво е бъг. Но ФОРМАТ отстраняване на грешки е напълно страхотно, но след като си програми получават по-дълго и по-сложно, има по-сложни решения Първи Нещата труд. Така че нека да се премахнат всички тези printfs. И нека да сме сигурни, че не е направил чупи нищо. OK. Така че програмата отиваме да се въведе, се нарича GDB, за GNU Debugger. Ами, всъщност, да се премахне за отстраняване на грешки второ, и да трасира отново. Ами, всъщност първо, един добър урок в аргументите командния ред. Забележете, че това звъня команда, която е съставяне всичко се предава в командния ред, тези аргументи командния ред. Така че как точно ще се използва аргументи на командния ред, тъй като ние преди, и както щете в PSET 2, това е как звъня ги използва. Така че забележите, че този първи флаг, тире ggdb3, че това, което казва, е, звъня, трябва да компилирате този файл с намерение, че ние в крайна сметка ще трябва да го развенчава. Така че, стига да имат този флаг, Тогава ще можем да GDB отстраняване на грешки. И тя ще се отвори на GNU Debugger. Така че има много команди че трябва да свикнеш. Първо едно, че най-вероятно ще веднага се нуждаете е Run. Така че това, което се управлява смяташ да правиш? Ще започнем нашата програма. Така тичайте, като се започне програма, програмата ни пита за цяло число, 13. И след това е безкрайно обикаляне като Очаква се, освен махнах printfs, така че ние дори не видя това. Излезли нормално. Oh. Това е възможно, че тя обви всички обратно, обратно към - пренебрегвайки факта, че. Да приемем, че не излезете нормално. Има сложен отговор на това. Така че сега, че не е много полезно. Така че просто работи нашата програма вътре в този дебъгер не ни помага по никакъв начин, тъй като ние може просто да се направи дот наклонена черта отстраняване на грешки от извън GDB. Така командата която най-вероятно ще - и аз ще напусна това. Control-D или се откажат, и двамата работят. Така че нека да го отворите отново. Друга команда, която най-вероятно ще веднага искам да свикнеш е Break. Така че ние ще се счупи на главната за сега, и след това ще ти обясня това. Е, тук виждаме ние зададете точка на прекъсване в този ред в debug.c. Така че това, което пауза средства е, че когато тип писта, програмата ще продължат да вървят, докато Ударих точка на прекъсване. Така че, когато удари план, програмата започва, и след това тя се разпада веднага след като го влиза в основната функция. Пробив главната ще бъде нещо вие доста често правя. И сега, за да ви запозная до още няколко команди. Забележете, че той казва, че проби по линия 11, който е ФОРМАТ, въведете цяло число. Така че командата Next ще бъде как отиваме на следващия ред код. Това ще ни позволи да се оттегли чрез нашата програма ред по ред. Така че следващия. Сега ред 12, отиваме за да получите цяло число. Next. А ако просто удари Въведете отново, тя ще ремонтирам последното нещо, което си направил. Така че аз не трябва да въведете Следващата всеки път. Така че, въведете цяло число, 13. Така че сега, линия 14, докато аз е по-голяма от 10, а аз ще правя по-нататък. И ние виждаме, ние ще декрементира аз. Така че ние ще декрементира аз отново. Така че сега, друга полезна команда Print. Така Print ще разпечатате стойността на променливата. Да се ​​изведат стойност на променлива аз. Нека да отпечатате аз. Ще кажа, че е 11. Сега ние Next отново, докато и е по-голямо от 10. Така че аз все още е по-голяма от 10, тъй като това е 11. аз минус минус. Нека да отпечатате отново. Както се очакваше, това е 10. Така че сега, в непосредствена близост. Той се връща към състоянието, е по-голяма от 10, но сега е 10, така че това не е по-голямо от 10, така че можем да очакваме да падне от примката време. И сега сме под тази линия на код. И друга команда, List, е просто ще за да се покаже предишната и следващата няколко реда код, в случай, че загубих себе си. Така че ние просто излезе тази линия, докато, и сега сме навлезли тази докато линия, линия 18. Така че, докато аз не е равно на 0. И по-нататък, аз се равнява аз минус 3, а ние ще забележите, това просто ще продължим. И ние можем да отпечатате аз. Всяка команда вид има бързи клавиши. Така че р е кратък за Print. Така че ние можем р аз. Просто продължавайте да държите н, или продължаваш да правиш Next. Печат и отново. Виждате ли сега, че е отрицателна 167. Така че това ще продължи вечно, но не наистина завинаги, тъй като току-що видяхте, то всъщност ще свърши в някакъв момент. Така, че е началото GDB. Но нека да направим още едно нещо в GDB. Ъ-ъ, отстраняване на грешки. Така че, в този конкретен случай, безкраен цикъл се случи да бъде в рамките на основната функция. И за сега, просто приемете, че аз съм ще се премести в безкраен цикъл в функцията Foo. Само не забравяйте, че в края на този програма, добре, това е първоначално призовава Foo, която беше просто ще отпечата аз. Но сега ние се обаждате Foo, което е ще декрементира аз, докато тя е 0, и след това да отпечатате тази променлива. OK. Запиши това. Направете отстраняване на грешки. И сега, GDB отстраняване на грешки. OK. Така че, ако аз просто Run тогава аз няма да да е в състояние действително да засили чрез моя програмата ред по ред. Така че нека да се прекъсне най-основната, и след това въведете план. Така че проверете това, ФОРМАТ, въведете цяло число, да получите числото, 13. Така че ние ще продължим да Декрементирането докато не е по-голямо от 10. След това отиваме да падне в докато контур, и стигнем до линията - нека си го отваря в отделен прозорец. Така че ние декрементирани докато аз вече не беше по-голяма от 10, и след това ние нарича функцията, Foo. Така че това, което се е случило веднага след като се удари функция Foo, добре, Обадих Foo, и След това вече нямах контрол над GDB. Така че веднага след като се удари Next в този ред, нещата продължиха, докато това се случи, когато програмата отпадна, когато - Предполагам, че това не е съществувала в крайна сметка. Видя го спрем за малко все пак. Така че защо аз губя контрол над програмата в този момент? Е, когато пиша по-нататък, че отива да буквалния следващия ред на код, който ще се изпълни. Така че, след като ред 21, на следващия ред на код че ще изпълни е ред 22, което е, излизане от главния. Така че аз не искам просто да отида на следващия ред на код. Искам да отида в функция, Foo, и след това да преминете през тези редове код. Така че, имаме алтернатива. Да се ​​откажат от това отново. Пробив главната. Ъ-ъ, един, следващия, следващия, 13, в непосредствена близост, следващото, следващото, внимателно, преди да удари линия Foo. OK. Така че сега, ние сме на ред 21, където ние наричаме Foo. Ние не искаме да въведете следващата, тъй като това Просто ще се обадя на функция Foo, и преминете към следващия ред код. Това, което искате да използвате, е стъпка. Така че има разлика между Step и следващо място, където Step стъпки в функционира, и Next отива върху функцията. Той просто изпълнява целостта на функцията и продължава да работи. Така стъпка ще ни донесе във функцията, Foo. И ние виждаме тук, сега, ние сме обратно в тази линия, докато това е на теория, ще продължи завинаги. И ако ви удари стъпка, когато не е дори функция да се обадя, а след това е идентичен с Next. Така че това е само когато сте на линия, която призовава функция, която Стъпка ще се различава от Next. Така стъпка ще ни доведе тук. Стъпка, стъпка, стъпка, стъпка, стъпка, стъпка, и Просто ще безкраен цикъл завинаги. Така че може да се използва за тази, като начин за идентифициране на безкрайни цикли, е просто държим този клавиш, за да въведете да видим къде можете да заседнат. Има по-добри начини да се направи това, но за сега, че е напълно достатъчно. И стилистично, че да съответстват Style 50, което трябваше да направя това. OK. Така че една последна команда, за да се въведе. Е, нека GDB дебъгване инча Така че, вместо да се счупи при главния, ако I знам функцията Foo е и проблем, тогава може да има само каза, почивка в Foo, вместо. Да кажем, че почивката двата основни и Foo. Така че можете да настроите възможно най-много точки на прекъсване колкото искате. Когато пиша план, това ще да спират на - О, нека да компилирате, тъй като Промених нещата. Ще видите тази линия, Внимание, източник файл е по-скорошна от изпълним. Така че това означава, че аз просто отидох в тук и да се промени това, че да съответстват Style 50, но не съм прекомпилирате програмата. Така GDB ме кара да се наясно с това. Аз ще напусна, направи отстраняване на грешки отново, удари GDB отстраняване на грешки. OK. Така че сега, обратно на това, което правя. Пробив главната, почивка Foo. Сега ако стартирате програмата, така че е ще продължи, докато удря точка на прекъсване. Това прекъсване се случва да бъде първият милион към основната. Сега, вместо да правиш следващото, следващото, следващото, следващото, следващото, докато не удари Foo, I да въведете продължи, което ще продължи докато не се удари в следващата точка на прекъсване. Трябва да въведете число на първо място. Продължи ще продължи, докато не удари на Следващата точка на прекъсване, което е, че функция на Foo. Така Run ще тече, докато не удари точка на прекъсване, но пък изпишете само тичам, когато сте се започне програмата, и след това, от този момент нататък, това е продължи. Ако аз просто направих пробие основната и след това се завтече, че ще прекъсне в Основната, и след това да продължите. Тъй като аз не разполагат с критичната точка на Foo, въведете цяло число, след това сега съм не ще да се прекъсне най-Foo. Тя просто ще безкрайност контур до това. OK. Така че това е Intro да GDB. Вие трябва да започнете да го използвате в проблемните комплекти. Тя може да бъде много полезен да се идентифицират грешки. Ако действително само, ред по ред, отидете чрез кода си, и сравни това, което е всъщност се случва с това, което се очаква да се случи, то това е доста трудно да пропуснете вашите грешки. OK. Така че миналата седмица Дейвид възпитали таен ключ, криптография неща за на първият път, когато ние не искаме пароли просто да се съхраняват на нашия компютър по някакъв обикновен текстов файл, където някой може да дойде и просто го отворите и да ги чете. В идеалния случай, те ще бъдат криптирани по някакъв начин. И в Проблем Set 2, ще се занимава с един метод за криптиране, или, добре, два метода, но те не са толкова големи. Ако го направите хакерската издание, ти си Също така няма да се занимава с декодиране на някои неща. Така че въпросът сега е, добре, дори и ако ние имаме най-силната криптиране алгоритъм в света, ако изберете особено лошо парола, след това го няма да ви помогне много, тъй като хората все още ще бъде в състояние да го разбера. Дори ако видя криптирана низ и тя изглежда като каша от боклук това не означава нищо за тях, ако те все още просто трябва да опитате няколко пароли за да го разбера, тогава вие не са много сигурни. Така че гледането на видео, което прави тази точка. [VIDEO PLAYBACK] -Helmet, можете Fiend. Какво става? Какво правиш с дъщеря ми? -Позволете ми да ви представя брилянтния млад пластичен хирург, д-р Филип Schlotkin, най-голямото носа работа човек в целия вселената и Бевърли Хилс. -Ваше Височество. -Nose работа? Не разбирам. Тя вече имаше операция на носа. Беше сладък шестнадесет подарък. -No. Това не е това, което си мислите. Това е много, много по-лошо. Ако не ми дадеш комбинацията за въздушния щит, д-р Schlotkin ще даде дъщеря си обратно стария си нос. -No. Откъде взехте това? -Добре. Аз ще кажа. Аз ще кажа. Не, татко. Не, не трябва. -Прав си, мила моя. Ще ми липсва новия си нос. Но аз няма да му кажа, комбинацията, без значение какво. -Много добре. Д-р Schlotkin, направете си най-лошото. -За мен е удоволствие. [TOOLS СЕ заточени] -No. Изчакайте. Изчакайте. Аз ще кажа. Аз ще кажа. -Знаех си, че ще работи. Добре. Дайте го на мен. -Комбинацията е един. -One. -One. -Two. -Two. -Two. -Три. -Три. -Три. -Four. -Four. -Four. -Five. -Five. -Five. -Така комбинацията е един, две, три, четири, пет. Това е най-тъпото комбинацията Която съм чувал през живота си. Това е едно от нещата, идиот би имала върху багажа му. -Благодаря ви, Ваше Височество. -Какво си направил? -Обърнах се на разстояние от стената. -Не, не си. Можете изключен целия филм. -Сигурно съм натиснал грешен бутон. -Ами, сложи я отново. Поставете филма отново. -Да, сър. Да, сър. -Да вървим, Арнолд. Хайде, Гретхен. Разбира се, вие знаете, че все пак ще Трябва да ви таксуваме за това. [END възпроизвеждане на видео] ROB BODEN: Добре. Така че сега, че ние сме вече говори за сигурността в някои отношения, хубав Малко филм плакат, така че в неотдавнашно ден, тези въпроси с НСА мониторинг всичко. Тя може да бъде трудно да се чувстват като теб има някакъв вид на правото на неприкосновеност на онлайн свят, въпреки че не мога да кажа вие повечето от детайлите на Prism. Така се движи отвъд призма, ние не отиваме да се говори за това, сега мисля за вашия лаптоп. Така че тук, искам да превключите до реалното ми сметка, с моя малък пингвин. Така че аз имам набор парола, както и че парола е каквото си искам да бъде. Но не забравяйте, че това, което аз съм сеч в с, така че това влизане бърза, е някоя програма. Това е някаква програма, която беше написана от един човек. И така, това лице, ако те са особено злонамерени, те биха могли казах, добре, така че ако паролата че аз въведете е равна на моята действителната парола, или това е равно до някаква специална парола - David е страхотно или нещо такова - след това да ги пусне вътре Така че един злонамерен програмист може да има достъп до всички ваши Macs, или Windows, или нещо подобно. Така че не е много по-голям проблем, тъй като, Искам да кажа, това е влизане програма която е доставена с OS X, стотици или хиляди хора имат преразглежда този код. И така, ако в кода си някъде, вие казват, че ако този низ се равнява на равни David е страхотно, вход, след това някой е Ще бъде, като, изчакайте. Това не е правилно. Това не трябва да е тук. Така че това е един от начините да стигнем неща да бъде защитен вид. Но помисли дори програми че ти пиша. Да речем, че е написал програмата за вход. Така че това влизане програма, която сте написали, така очевидно, че сте добър програмист. Вие не започваш да се постави всеки злонамерен ако х е равно на е равно на Дейвид е страхотен в кода си. Но тази програма, това, което правите използвате, за да съставят тази програма? Нещо като звъня. И какво, ако лицето, което се е случило с напиши звъня специален двукорпусен в звъня нещо подобно, ако аз съм съставянето на идентифицирайте програма, след това въведете този код в програмата за вход, която казва, ако х е равно равнява David е страхотно? Така че все още не съвсем, но ние имаме едни и същи Въпросът тук, където звъня, добре, хиляди, ако не и десетки хиляди хора, са се занимавали с звъня, да има погледна към своите реда код и каза, Всичко е наред, няма нищо лошо тук. Очевидно е, че никой не се справя всичко това злонамерен. Но това, което е самата звъня, като, Ами ако се съберат звъня? Какво става, ако имам някакъв компилатор, че компилира звъня, че вмъква в звъня този специален хак, който казва, добре, когато компилирате звъня, тогава изпълним ли да се следва специално да потърсите във вътрешността на програмата за влизане и вложка тази парола, се равнява на равни Dave е страхотно? Така че не забравяйте, че вашият самия компилатор трябва да бъде съставен в някакъв момент. Така че, ако това, което сте избрали да съставят звъня с, себе си е злонамерен, а след това може да се завинти на цялата начин за установяване на ред. Така че тук, ние имаме Ken Thompson и Денис Ричи. Така че това е една икона снимка. Денис Ричи е от дясната страна. Той е голям - почти пише C. Така че можете да му благодаря за този клас. Ken Thomson е в ляво. В две от тях в общи линии пише UNIX. Е, те са основни донори в UNIX. Имаше някои други. Така Кен Томпсън, в някакъв момент, той печели наградата на Тюринг. И наградата Тюринг, винаги съм чувал тя съотнесени този начин, това е най- Нобеловата награда по компютърни науки. Така в наградата Тюринг, той трябва да даде му реч. И той дава тази много известна реч сега, наречена Размисли върху Доверявайки Trust, който сме вързали За да на сайта на курса. И в тази реч, казва той, добре, затова написах UNIX, и сега всички ви хора използват UNIX. Сега, не забравяйте, че днес е Linux пряк потомък на UNIX. OS X пряко използва UNIX. Windows не прави толкова много, но много на идеи бяха взети от UNIX. Така той отива на сцената и казва: Всичко е наред, аз написах UNIX. И точно затова вие знаете, аз съм можете да влезете във всеки един от вашите компютри. Тъй като сложих една от тези специални ако х равнява се равнява на Ken Thomson е страхотно, тогава аз съм позволено да влезнете. Така че хората са като, добре, Как го направи това? Разгледахме програмата за вход и нищо не е там. Той е като, добре, аз модифициран компилатор , за да влезете в програмата за вход така че програмата за влизане сега ще има че х е равно равнява Ken Thompson е страхотно. И те казват, добре, че не е вярно. Търсим най-компилатора, и компилатор няма никакви линии на код подобно. Той е като, добре, но това, което сте съставянето на компилатора с? И те мислят, а той е, като, добре, Аз съм този, който ви е дал на компилатора използвате, за да съставят компилатора, така че компилирате компилатор, че себе си е злонамерен, и ще прекъсне програмата за вход. Така че, общо взето, в този момент, има никакъв начин не бихте могли да потърсите при източника код на програмата за вход за да видите какво не е наред. Вие дори не може да погледне в изходния код на компилатора за да видите какво не е наред. Може би трябва да погледнем в машината код, действителната двоичен на компилиран компилатор, за да видите, чакай, това реда код не трябва да са тук. Но Кен Томпсън го взе една крачка допълнително и каза, добре, има тези специални програми, които всъщност да ви помогне да прочетете двоичен на програми, и така, ако някой е използвал тази програма да се прочетете двоичен, те ще видят те реда код. Той модифициран тези програми, за да се каже, всичко, Добре, ако търсите най- компилатор, не показват това конкретно набор от двоичен. Така че след това трябва да се вземат, че една стъпка допълнително и в общи линии, които могат да имат предприети няколко нива на околните, и в някакъв момент, никой не е действително ще бъде проверка. Така че поуката от историята е, че си няма да се пише Звъня в този клас. Ти започваш да се използва за катерене Звъня много в този клас. За всичко, което знам, звъня е злонамерена програма, която се саботират всеки една програма, което някога сте компилиран. И да ви оставя на това много зловещо обърнете внимание, ще видите в сряда. [APPLAUSE] SPEAKER 2: На следващото CS50. SPEAKER 3: Да не си посмяла да кажа, че. Можете да направите това. Вие сте направили това и преди, можете да направите това днес, можете да направите това утре. Вие сте били прави това в продължение на години. Просто отидете там и да направим това. Можете да направите това. [За възпроизвеждане на музика]