Роб Боуден: Прывітанне, я Роб Боуден, і давайце пагаворым аб quiz0. Так, першае пытанне. Гэта пытанне, дзе вам трэба закадаваць лік 127 у бінарных цыбулін. Калі вы хацелі, вы маглі б зрабіць звычайнае пераўтварэнне ад bi-- або, з дзесятковай ў двойкавую. Але што, верагодна, будзе ўзяць шмат часу. Я маю на ўвазе, вы можаце высветліць, што, ОК, 1 знаходзіцца ў там, 2 знаходзіцца ў там, 4 знаходзіцца ў там, 8 знаходзіцца ў там. Лягчэй чынам, 127128 мінус адзін. Гэта крайняя левая лямпачка 128-біт. Так 127 на самай справе проста ўсё з іншых лямпачак, так вось крайняя левая лямпачка мінус 1. Вось менавіта для гэтага пытання. Пытанне адно. Так што з 3 бітамі можна ўяўляюць 8 розных значэнняў. Чаму ж тады, 7 найбольшую неадмоўнае дзесятковы цэлае можна ўявіць? Ну, калі мы можам толькі ўяўляюць 8 розных значэнняў, тое, што мы збіраемся быць прадстаўляюць значэнні ад 0 да 7. 0 займае адно з значэнняў. Пытанне другое. З п бітаў, колькі розных Значэння могуць вы ўяўляеце? Так, з п бітаў, у вас ёсць 2 Магчымыя значэння для кожнага біта. Такім чынам, мы маем два магчымых значэння для першы біт, 2 магчымых значэння для другога, 2 магчыма для трэцяга. І такім чынам, гэта ў 2 разы 2 разы 2, і у канчатковым рахунку, адказ на 2 л. Пытанне трэцяе. Што 0x50 ў двайковай? Так што памятаеце, што шаснаццатковае мае вельмі проста пераўтварэнне ў двайковы. Дык вось, мы проста павінны глядзець на 5 і 0 незалежна. Так што 5 у двайковай сістэме? 0101, гэта 1 біт і 4 біт. Што 0 ў двайковым? Не складана. 0000. Так што проста пакласці іх разам, і гэта поўнае лік у двайковай сістэме. 01010000. І калі вы хочаце, вы маглі б зняць гэтую самую левую нуля. Гэта не мае значэння. Такім чынам альтэрнатыўна, што 0x50 ў дзесятковай? Калі вы хацелі, вы could-- калі вы больш камфортна з двайковай, Вы маглі б узяць гэтую бінарную адказ і пераўтварыць яго ў дзесятковай. Ці мы маглі б проста ўспомніць што шаснаццатковае. Так што 0 у 0-м месцы, і 5 знаходзіцца ў 16 на першае месца. Дык вось, у нас ёсць 5 разоў 16 ст Першы, плюс 0 раз ад 16 да нуля, 80. І калі вы паглядзіце на Назва на пытанне, гэта было CS 80, які быў збольшага намякнуць адказу на гэтую праблему. Пытанне пяць. У нас ёсць гэты драпін скрыпт, які паўтараць 4 разы арахісавае масла жэле. Такім чынам, як жа мы цяпер код, што ў C? Ну, у нас ёсць here-- частка тлустым шрыфтам гэта адзіная частка, трэба было рэалізоўваць. Таму ў нас ёсць 4 завесы, які зацыкленне 4 раз, Printf-кі арахісавае масла жэле, з новага радка, як праблема просіць. Пытанне шэсць, яшчэ адна праблема драпін. Мы бачым, што мы знаходзімся ў назаўжды завесы. Мы кажам, што пераменная I а затым павялічваючы I на 1. Цяпер мы хочам зрабіць, што ў С. Ёсць некалькі спосабаў мы маглі б зрабіць гэта. Тут мы выпадкова закадаваць назаўжды пятля як некаторы час (праўда). Такім чынам, мы аб'яўляем зменную I, проста у нас быў зменную я ў пустым. Абвясьцеце зменную I, і назаўжды у той час як (праўда), мы кажам, зменную я. Так Printf% i-- ці вы маглі б выкарыстоўваць% D. Мы кажам, што зменная, і затым павялічыць яго, я ++. Пытанне сем. Цяпер мы хочам зрабіць нешта вельмі падобнае Марыё кропка з з праблемы ўсталюйце адзін. Мы хочам, каб раздрукаваць гэтыя хэштэг, мы хочам, каб надрукаваць пяць трыма прамавугольніка гэтых хэшаў. Так як мы збіраемся гэта зрабіць? Ну, мы дамо вам цэлы куча кода, і вы проста павінны запоўніць функцыі друку сеткі. Такім чынам, што ж PrintGrid выглядаць? Ну ты міма Шырыня і вышыня. Таму ў нас ёсць знешняе 4 цыкл, які цыклу па ўсіх радках гэты Сетка, што мы хочам, каб раздрукаваць. Тады ў нас ёсць паміж укладзены 4 завесы, гэта друк за кожнага слупка. Такім чынам, для кожнай радкі, мы друкуем для кожны слупок, адзін хэш. Затым у канцы радка мы выводзім адзін новая лінія для пераходу да наступнай радку. І вось менавіта для ўсёй сеткі. Пытанне восем. Функцыя як PrintGrid, як кажуць, ёсць пабочны эфект, але не вяртанне Значэнне. Растлумачце адрозненне. Так што гэта залежыць ад вас памятаць што пабочным эфектам з'яўляецца. Ну, вяртанне value-- мы ведаем PrintGrid ня ёсць вяртаецца значэння, так як тут ён кажа несапраўднымі. Таму ўсё, што не вяртае на самай справе не нічога вяртаць. Так у чым жа пабочны эфект? Ну, гэта пабочны эфект з'яўляецца што-небудзь, што-то захоўваецца пасля канцах функцыянальных што было не толькі што вярнуўся, і гэта было не проста з уваходаў. Так, напрыклад, мы маглі б змяніць глабальную зменную. Гэта было б пабочным эфектам. У дадзеным канкрэтным выпадку, вельмі важна пабочны эфект друкуе на экран. Так, што з'яўляецца пабочным эфектам што PrintGrid мае. Мы друкуем гэтыя рэчы на ​​экран. І вы можаце думаць аб што ў якасці пабочнага эфекту, так гэта тое, што захоўваецца пасля гэтая функцыя сканчаецца. Гэта тое, што выходзіць за рамкі гэтай функцыі, што, у канчатковым рахунку змяняецца, Змесціва экрана. Пытанне дзевяць. Разгледзім праграму ніжэй, да якіх нумары радкоў былі дададзеныя да дзеля абмеркавання. Такім чынам, у гэтай праграме мы проста называючы GetString, захоўваць яго у гэтай зменнай х, а затым друк гэтага зменнай з. Добра. Так растлумачце, чаму лінія адна прысутнічае. #include CS50 кропка ч. Чаму мы павінны #include CS50 кропка гадзіну? Ну мы называем Функцыю GetString, і GetString вызначаецца у бібліятэцы CS50. Так што, калі ў нас не было #include CS50 кропка ч, мы хацелі б атрымаць, што невідавочнае аб'яву памылкі функцыі GetString ад кампілятара. Так што мы павінны ўключаць у сябе library-- мы павінны ўключыць загалоўкавыя файл, альбо кампілятар не будзе прызнаць, што GetString існуе. Растлумачце, чаму лінія двух прысутнічае. Так стандарт ю кропка ч. Гэта сапраўды гэтак жа, як папярэдняй задачы, за выключэннем таго, замест таго, каб мець справу з GetString, мы гаворым пра Printf. Так што, калі мы не кажам, што трэба ўключыць стандартны IO кропка гадзіну, то мы не былі б у стане выкарыстоўваць функцыю PRINTF, таму што кампілятар не ведаю пра гэта. Why-- якое значэнне з анулявання ў чацвёртым радку? Так вось у нас Int асноўны (пустэчу). Вось толькі кажуць, што мы не атрымліваюць якой-небудзь каманднага радка Аргументы асноўнай. Памятаеце, што мы маглі б сказаць Int Асноўныя INT ARGC радок ARGV дужкі. Дык вось, мы проста скажам, пустата сказаць мы ігнаруюць аргументы каманднага радка. Растлумачце, у адносінах да памяці, дакладна што GetString ў адпаведнасці шэсць вяртаецца. GetString вяртаецца блок памяці, масіў знакаў. Гэта сапраўды вяртанне паказальнік на першы знак. Памятаеце, што радок з'яўляецца сімвал зоркі. Так з з'яўляецца паказальнікам на першы характар ​​у любы радок што карыстальнік увёў з клавіятуры. І, што памяць, аказваецца, malloced, так што памяць у кучы. Пытанне 13. Разгледзім ніжэй праграму. Так што ўсё гэта робіць праграма з'яўляецца Printf-кі 1, дзеленай на 10. Таму, калі складаецца i выконваецца гэтая праграма выхады 0.0, нават пры тым, што 1 дзеліцца на 10 складае 0,1. Дык чаму ж гэта 0.0? Ну, гэта таму, што цэлалікавага дзялення. Так 1 уяўляе сабой цэлы лік, 10 з'яўляецца цэлым лікам. Так 1 дзеліцца на 10, усё, трактуецца як цэлыя лікі, і ў C, калі мы робім цэлае падраздзяленне, мы ўсекчы любую дзесятковую кропку. Так 1 дзеліцца на 10, 0, а затым мы спрабуем друкаваць што як паплавок, так нуль друкуецца як паплавок 0.0. І вось чаму мы атрымліваем 0,0. Разгледзім ніжэй праграму. Цяпер мы друку 0,1. Так няма дзялення цэлых, мы проста друк 0,1, але мы яго друку 28 знакаў пасля коскі. І мы атрымліваем гэты 0,1000, цэлы букет нулёў, 5 5 5, бла-бла-бла. Такім чынам, пытанне вось чаму яго друкаваць што, замест таго, каб дакладна 0,1? Так што прычына тут у цяперашні час плавае коскі недакладнасць. Памятаеце, што паплавок знаходзіцца ўсяго ў 32 біт. Такім чынам, мы можам толькі ўяўляць канчатковае лік з ліку з якая плавае коскі з тымі 32 Біты. Ну значыць, у канчатковым рахунку бясконца шмат значэнняў з якая плавае кропкай, і ёсць бясконца шмат плавае Значэння кропак у дыяпазоне ад 0 да 1, і мы, відавочна, у стане ўяўляюць нават больш значэння, чым гэта. Так што мы павінны ісці на ахвяры, каб мець магчымасць прадстаўляць большасць значэнняў. Так значэнне, як 0,1, па-відаць, мы не можам ўявіць, што менавіта. Таму замест таго, што складае 0,1 мы робім лепшае, што мы можам прадставіць гэтую 0.100000 5 май 5. І гэта даволі блізка, але для многіх прыкладанняў вам не прыйдзецца турбавацца аб плавае коскі недакладнасць, таму што мы проста не можам уявіць Усе плавае пункту дакладна. Пытанне 15. Разгледзім код ніжэй. Мы проста друк 1 плюс 1. Дык не Хітрасць тут. 1 плюс 1 роўна 2, і Затым мы друку, што. Гэта проста друкуе 2. Пытанне 16. Цяпер мы друку персанаж 1 плюс характар ​​1. Дык чаму ж гэта не друкаваць адно і тое ж? Ну персанаж 1 плюс характар 1, характар ​​1 мае ASCII значэнне 49. Так што гэта на самай справе кажа 49 плюс 49, і у канчатковым рахунку, гэта будзе друкаваць 98. Так што гэта не друкуе 2. Пытанне 17. Завяршыць рэалізацыю няцотных ніжэй такім чынам, што функцыя вяртае ісціну, калі п няцотная і ілжыва, калі п цотна. Гэта вялікая мэта для мод аператара. Таму наша аргумент п, калі н модулю 2 роўная 1, а што азначае, што п дзеліцца на 2 меў рэшту. Калі п дзеліцца на 2 меў рэшта, што азначае, што п няцотная, таму мы вернемся дакладна. Інакш мы вярнуцца ілжывым. Вы таксама маглі б зрабіць п па модулю 2 роўных нуля, вярнуцца ілжывым, інакш вяртае ісціну. Разгледзім рэкурсіўных функцыю ніжэй. Такім чынам, калі N менш або роўны 1, вяртаюць 1, яшчэ вяртанне п раз е н мінус 1. Дык што ж такое гэтая функцыя? Ну, гэта проста фактарыяла. Гэта прыгожа прадстаўлены як н фактарыяла. Так пытанне 19 цяпер, мы хочам, каб скарыстацца гэтай рэкурсыўнай функцыі. Мы хочам зрабіць гэта итеративный. Так як жа нам гэта зрабіць? Ну для персаналу Рашэнне, і зноў ёсць некалькі спосабаў вы маглі б зрабіць што мы пачынаем з гэтага Int прадукту роўны 1. І на працягу ўсяго гэтага для завесы, мы збіраемся каб быць множання прадукт у канчатковым рахунку, у канчатковым выніку з поўнай фактарыяла. Так што для міжнар я раўняецца 2, я гэта менш або роўна N, I ++. Вы можаце здзівіцца, чаму я роўная 2. Ну, памятаеце, што тут мы павінны пераканацца, што наш базавы варыянт з'яўляецца правільным. Такім чынам, калі N менш або роўна 1, мы проста вяртанне 1. Дык вось тут, у нас пачынаюцца я роўная 2. Ну, калі б я быў адзін, то the-- або калі н былі 1, то для завесы не будзе выконвацца наогул. І так, мы былі б проста вяртанне прадукт, які з'яўляецца 1. Сапраўды гэтак жа, калі н былі што-небудзь менш 1-- калі б гэта было 0, адмоўны 1, whatever-- мы б да гэтага часу вяртаюцца 1, а гэта менавіта тое, што рэкурсіўная версія робіць. Зараз, калі п больш 1, то мы збіраемся рабіць па меншай меры адзін ітэрацыі гэтага цыклу. Так скажам, п 5, то мы збіраюся рабіць раз прадукту роўная 2. Так што цяпер прадукт 2. Цяпер мы збіраемся зрабіць раз прадукт роўны 3. Зараз гэта 6. Раз прадукту роўная 4, зараз гэта 24. Раз прадукту роўная 5, зараз гэта 120. Такім чынам, у канчатковым рахунку, мы вяртаемся 120, якая з'яўляецца правільнай 5 фактарыяла. Пытанне 20. Гэта тое месца, дзе вы павінны запоўніць У гэтай табліцы з любой дадзены алгарытм, усё, што мы бачылі, што падыходзіць гэтыя алгарытмічную прабег раз гэтыя асімптатычна раз бегчы. Так што ўяўляе сабой алгарытм, з'яўляецца амегай 1, але вялікая O п? Так не можа быць бясконца многія адказы тут. Той, які мы бачылі, верагодна, найбольш часта гэта проста лінейны пошук. Такім чынам, у лепшым выпадку, Сцэнар, пункт мы шукаю знаходзіцца на пачатак спісу і так амега 1 крокаў, Першае, што мы правяраем, мы проста неадкладна вярнуцца што мы знайшлі пункт. У горшым выпадку, элемент знаходзіцца ў канцы, або дэталь няма ў спісе наогул. Таму мы павінны шукаць Увесь спіс, усе п элементы, і менавіта таму гэта пра н. Так што цяпер гэта нешта, гэта і амега н лог н, і вялікая O н лог н. Ну самае непасрэднае дачыненне рэч мы бачылі тут зліваюцца роду. Так зліваюцца роду, памятаеце, у канчатковым рахунку, тэта н лог п, дзе тэта вызначаецца калі абодва амега і вялікі вываду аднолькавыя. Абодва п § п. Што-тое, што гэта амега п, і O п квадрат? Ну, раз ёсць некалькі магчымых адказаў. Тут мы, здараецца, кажуць пузырьковый сартавання. Сартаванне ўстаўкамі таксама будзе працаваць тут. Памятаеце, што пузырьковый сартавання ёсць, што аптымізацыя, дзе, калі вы ў стане атрымаць праз увесь спіс без неабходнасці рабіць любыя свопы, то, добра, мы можам адразу ж вярнуцца, што Спіс быў адсартаваны з самага пачатку. Такім чынам, у лепшым выпадку, гэта проста амега п. Калі гэта не проста прыгожа сартуюцца спіс для пачатку, то ў нас ёсць O п квадраце свопы. І, нарэшце, у нас ёсць выбар роду для п квадрат, як амега і вялікі О. Пытанне 21. Што цэлалікавых перапаўненне? Добра зноў, як і раней, у нас ёсць толькі канчатковае лік бітаў ўяўляць сабой цэлы лік, таму магчыма 32 біт. Дапусцім, у нас ёсць цэлы лік. Тады ў канчатковым выніку самая высокая станоўчае лік можна прадставіць складае ад 2 да 31 мінус 1. Так што ж адбываецца, калі мы спрабуем затым павялічыць гэты лік? Ну, мы збіраемся пайсці ад 2 да 31 мінус 1, усё, аж да адмоўнага 2 на 31. Такім чынам, гэты лік перапаўнення калі вы трымаеце павялічваючы, і ў канчатковым выніку вы не можаце атрымаць любую вышэйшую і проста абкручванні ўвесь шлях назад вакол адмоўнае значэнне. А як наконт перапаўнення буфера? Так буфера overflow-- памятаеце, што буфер. Гэта проста кавалак памяці. Нешта накшталт масіва з'яўляецца буферам. Так перапаўненне буфера, калі Вы спрабуеце атрымаць доступ да памяці і пасля заканчэння гэтага масіва. Так што калі ў вас ёсць масіў памерам 5 і вас спрабуюць атрымаць доступ да масіву кранштэйн 5 або кранштэйн 6 або кранштэйн 7, або што-небудзь за межы канец, ці нават што-небудзь below-- кранштэйны масіў адмоўны 1-- ўсе тыя памылкі перапаўнення буфера. Ты дакранаючыся памяці ў дрэнных адносінах. Пытанне 23. Такім чынам, у гэтым вам трэба ажыццявіць STRLEN. І мы кажам вам, што вы можаце Выкажам здагадку, з не будзе нулявым, так што вам не прыйдзецца зрабіць любую праверку на нуль. І існуе мноства спосабаў Вы маглі б зрабіць гэта. Тут мы проста ўзяць проста. Пачнем з прылаўка, п. п лічачы, колькі знакаў ёсць. Такім чынам, мы пачынаем з 0, і тады мы перабраць увесь спіс. Хіба з кранштэйнам 0 роўная нуль тэрмінатар характар? Памятаеце, што мы шукаем нулявая тэрмінатар характар каб вызначыць, як доўга наша радок. Гэта збіраецца спыніць любая адпаведная радок. Так з кранштэйнам 0 роўныя да нулявой сімвал? Калі гэта не так, то мы збіраемся паглядзець на ов кранштэйне 1, S кранштэйна 2. Мы не працягваем, пакуль мы знайсці нулявы тэрмінатар. Пасля таго, як мы знайшлі яго, то п ўтрымлівае агульная даўжыня радка, і мы можам проста вярнуць гэта. Пытанне 24. Так што гэта тое месца, дзе вы павінны зрабіць кампраміс. Так што, адно добра ў адным спосаб, але якім чынам гэта дрэнна? Дык вось, сартаванне зліццём, як правіла, хутчэй, чым пузырьковый сартавання. Сказаўшы that-- добра, ёсць некалькі адказаў тут. Але галоўны з іх, што пузырьковый сартаванне з'яўляецца амегай п для адсартаваныя спісу. Памятаеце, што стол, які мы толькі што бачылі раней. Так бурбалка сартуе амегу н, у лепшым выпадку з'яўляецца яго магчымасць проста перайсці Спіс адразу, вызначыць эй гэта справа ўжо сартуюцца, і вяртанне. ня Зліццё роду, незалежна ад таго, што вы робіце, з'яўляецца амега н лог н. Так для адсартаваныя спісу, бурбалка роду будзе хутчэй. Цяпер тое, што пра звязаных спісаў? Так звязаны спіс можа павялічвацца і памяншацца каб адпавядаць столькі элементаў, колькі неабходна. Сказаўшы that-- так Звычайна прамое параўнанне будзе звязаны спіс з масівам. Такім чынам, нават пры тым, што масівы могуць лёгка нарошчваць і змяняць каб адпавядаць як многія элементы па меры неабходнасці, звязана спіс у параўнанні з array-- ап Масіў мае адвольны доступ. Мы можам індэкс ў любы прыватнасці элемент масіва. Так што для звязанага спісу, мы не можам проста пайсці ў пяты элемент, мы павінны прайсці ад пачатку пакуль мы не атрымаем да пятага элемента. І што адбываецца, каб перашкодзіць нам рабіць што-то накшталт бінарнага пошуку. Гаворачы аб бінарнага пошуку, бінарны пошук як правіла, хутчэй, чым лінейны пошук. Сказаўшы that-- так, адзіна магчымым з'яўляецца тое, што вы не можаце зрабіць бінарны пошук па сувязныя спісы, Вы можаце зрабіць гэта толькі з масівамі. Але, верагодна, яшчэ больш важна, Вы не можаце зрабіць бінарны пошук на масіве, які ня сартуецца. Шчырыя вам можа спатрэбіцца для сартавання масіў, і толькі потым можна вы бінарны пошук. Так што, калі ваша рэч не адсартаваны для пачатку, Затым лінейны пошук можа быць хутчэй. Пытанне 27. Так лічаць праграму ніжэй, які будзе ў наступным слайдзе. І гэта тое месца, дзе мы знаходзімся захоча відавочна паказаць значэння для розных зменных. Такім чынам, давайце зірнем на што. Так выстройваюцца адзін. У нас ёсць інтэрвал х роўны 1. Гэта адзінае, што здарылася. Такім чынам, на першай лініі, мы бачым у нашым Табліца, што ў, а, бы, і TMP ўсе прыцемнена. Дык што ж такое х? Ну мы проста ўсталяваць яго роўным 1. А потым выстройваюцца два, ну, мы бачым, што ў усталяваны ў 2, і табліца ўжо запаўняецца для нас. Так х ўяўляе 1 і Y 2. Цяпер, лінія тры, мы зараз ўнутры функцыі падпампоўкі. Што мы прайсці, каб памяняць? Мы прайшлі Ампэрсанд х для і Ампэрсанд к для б. Дзе праблема раней паказана, што адрас X з'яўляецца 0x10, а таксама адрас у з'яўляецца 0x14. Так і б роўныя 0x10 і 0x14, адпаведна. Зараз на трэцяй лініі, якія хну? Ну, нічога не змянілася аб х і у ў гэтай кропцы. Нават пры тым, што яны ўнутры асноўнага кадра стэка, яны да гэтага часу тое ж самае Значэння раней. Мы не змянілі любую памяць. Так х роўны 1, у роўны 2. Добра. Так што цяпер мы сказалі INT TMP роўна зорка. Такім чынам, на чацвёртай радку, усё, тое ж самае для TMP выключэннем. Мы не змянілі якія-небудзь значэння ні пра што для TMP акрамя. Мы ствараем TMP роўную зорка. Што такое зорка? Ну, а кропкі х, так зоркі збіраецца роўнай х, які з'яўляецца 1. Так што ўсё капіюецца ўніз, і TMP усталёўваецца ў 1. Цяпер наступная радок. Зорка роўны зорны б. Так па лініі five-- добра зноў, усё гэта тое ж самае, за выключэннем усе зоркі з'яўляецца. Што такое зорка? Ну, мы толькі што сказалі, зорка з'яўляецца х. Такім чынам, мы мяняем х на роўную зоркі б. Што такое зорка б? у. б паказвае на у. Так зорка Каб як у. Так мы ўсталёўваем х роўна у, а ўсё астатняе тое ж самае. Такім чынам, мы бачым у наступным шэрагу, што х з'яўляецца цяпер 2, а астатнія проста капіююцца ўніз. Цяпер у наступным радку, зорка б роўная TMP. Ну, мы толькі што сказалі, зорка Ь у, так мы ўсталёўваем у роўна TMP. Усё астатняе тое ж самае, такім чынам, усе капіюецца ўніз. Мы ўсталёўваем ў роўную TMP, які з'яўляецца адзін, а ўсё астатняе тое ж самае. Цяпер, нарэшце, лінія сем. Мы вярнуліся ў галоўнай функцыі. Мы пасля замены скончана. Мы страцілі A, B, і TMP, але ў канчатковым рахунку мы ня змяненнем значэнняў ні пра што ў гэты момант, мы проста скапіяваць хну ўніз. І мы бачым, што х і ў Цяпер 2 і 1 замест 1 і 2. Своп паспяхова выканала. Пытанне 28. Выкажам здагадку, што вы сутыкнуліся з паведамленні пра памылкі ніжэй на працягу працоўнага дня ў наступным годзе, як Каліфорнія або TF. Раскажыце, як выправіць кожны з гэтых памылак. Так вызначана спасылка на GetString. Чаму вы маглі б бачыць гэта? Ну, калі студэнт выкарыстоўвае GetString ў сваім кодзе, яны правільна хэш ўключаны CS50 кропка ч, каб уключыць бібліятэку CS50. Ну, тое, што яны трэба выправіць гэтую памылку? Яны павінны зрабіць працяжнік lcs50 на каманднага радка, калі яны кампіляцыі. Так што, калі яны не праходзяць ляск працяжнік lcs50, яны не будзе мець фактычнае Код, які рэалізуе GetString. Пытанне 29. Ускосна аб'яўленні бібліятэка функцый STRLEN. Ну гэта цяпер, у іх ёсць ня зроблена належнае хэш ўключаюць. У дадзеным канкрэтным выпадку, файл загалоўка яны павінны ўключаць у сябе гэта радок кропка ч, і ў тым ліку радкі кропка ч, у цяперашні час student-- цяпер кампілятар мае доступ да заявы STRLEN, і ён ведае, што ваш код правільна выкарыстоўваючы STRLEN. Пытанне 30. Яшчэ працэнтаў пераўтварэнні чым аргументаў дадзеных. Дык што ж гэта? Ну, памятаеце, што гэтыя працэнты signs-- як яны ставяцца да PRINTF. Такім чынам, у Printf мы маглі б адсоткаў, што мы маглі б надрукаваць што-небудзь як адсоткаў я зваротны слэш н. Ці мы маглі б надрукаваць, як працэнт I, прастору, адсоткаў я, прастора, адсоткаў я. Такім чынам, для кожнага з тых, знакі адсотка, мы павінны перадаць зменную ў канцы Printf. Так што, калі мы кажам, PRINTF дужка адсоткаў я зваротны слэш н цесныя Хлопец, добра, мы кажам, што мы да друку цэлае, але тады мы не праходзяць Printf цэлы лік на самай справе друкаваць. Дык вось больш працэнтаў пераўтварэнні, чым аргументаў дадзеных? Гэта кажа, што ў нас ёсць цэлая куча адсоткаў, і ў нас няма дастатковай колькасці зменных на самай справе запоўніць гэтыя працэнты. І тады, безумоўна, у адказ на пытанне 31, вызначана страціў 40 байт у адным блокаў. Так што гэта памылка Valgrind. Гэта кажа, што дзесьці ў кодзе, ў вас ёсць размеркаванне, якое 40 байт вялікі, так што вы malloced 40 байт, і вы ніколі не вызваліў яго. Хутчэй за ўсё вам проста трэба каб знайсці уцечку памяці, і знайсці, дзе вам трэба вызваліць гэты блок памяці. І пытанне 32, несапраўдным запісу аб памеры 4. Зноў жа гэта памылка Valgrind. Гэта не трэба рабіць з уцечкамі памяці цяпер. Гэта, хутчэй за likely-- Я маю на ўвазе, што гэта свайго роду несапраўдных правоў памяці. І, хутчэй за ўсё, гэта які- роду перапаўненне буфера. Дзе ў вас ёсць масіў, можа быць, цэлалікавых масіў, і давайце кажуць, што гэта з памеру 5, і вы паспрабуйце дакрануцца масіва кранштэйны 5. Так што, калі вы паспрабуеце напісаць, што Значэнне, гэта не кавалак памяці што ў вас сапраўды ёсць доступ да, і так што вы збіраецеся атрымаць гэтую памылку, кажучы недапушчальны запісу памерам 4. Valgrind збіраецца прызнаць ты імкнучыся закрануць памяць недарэчна. І вось менавіта для quiz0. Я Роб Боуден, і гэта CS50.