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